diff --git a/.config/tsconfig.base.json b/.config/tsconfig.base.json new file mode 100644 index 000000000..1353ccb02 --- /dev/null +++ b/.config/tsconfig.base.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "lib": ["ESNext"], + "module": "esnext", + "moduleResolution": "bundler", + "noEmit": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "pretty": true, + "sourceMap": true, + "strict": true, + "target": "ES2022" + }, + "exclude": ["dist", "node_modules", "test/types"] +} diff --git a/.config/tsconfig.plugin.json b/.config/tsconfig.plugin.json new file mode 100644 index 000000000..ad39326a7 --- /dev/null +++ b/.config/tsconfig.plugin.json @@ -0,0 +1,13 @@ +{ + // Important: this config is symlinked into package directories as `tsconfig.json`. + // The `extends` path must therefore be relative to the symlink location (e.g. packages//). + "extends": "../../.config/tsconfig.base.json", + "compilerOptions": { + "noEmit": false, + "outDir": "dist", + "rootDir": "src", + "declaration": true, + "declarationMap": true + }, + "include": ["src/**/*"] +} diff --git a/.config/vitest.config.mts b/.config/vitest.config.mts new file mode 100644 index 000000000..7cfda11c6 --- /dev/null +++ b/.config/vitest.config.mts @@ -0,0 +1,14 @@ +import { defineConfig } from 'vitest/config'; +import path from 'node:path'; + +export default defineConfig({ + test: { + // Store snapshots next to each test in a .snapshots folder + resolveSnapshotPath: (testPath, snapExt) => + path.join(path.dirname(testPath), '.snapshots', path.basename(testPath) + snapExt) + }, + resolve: { + // Allow importing the current package under test via `~package` + alias: [{ find: /^~package$/, replacement: path.resolve(process.cwd()) }] + } +}); diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 1223058ec..b2e799ae7 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -26,6 +26,20 @@ Any code change should be submitted as a pull request. Our guidelines for Pull R - Before submitting your Pull Request, please lint your changes by running `pnpm lint` in the root directory - If any checks fail for your Pull Request, please resolve them. Always feel free to ask for help if unable to resolve issues with checks +## Testing packages + +Some packages use Vitest for tests. When converting or running tests locally inside a package directory (e.g. `packages/alias`): + +- Tests import the package under test via `~package`. A shared config at `.config/vitest.config.mts` provides a runtime alias that resolves `~package` to the current working directory. +- Snapshots are written alongside each test under a local `.snapshots` directory. + +Example (from a package directory): + +``` +pnpm build +pnpm test +``` + ## Code review process The bigger the pull request, the longer it will take to review and merge. Try to break down large pull requests in smaller chunks that are easier to review and merge. diff --git a/package.json b/package.json index 590353bed..a999adca9 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "devDependencies": { "@dot/versioner": "^0.3.1", "@rollup/plugin-typescript": "^9.0.1", - "@types/node": "14.18.30", + "@types/node": "^20.19.0", "@types/source-map-support": "^0.5.4", "@typescript-eslint/eslint-plugin": "^5.38.0", "@typescript-eslint/parser": "^5.38.0", @@ -39,7 +39,8 @@ "prettier-plugin-package": "^1.3.0", "source-map-support": "^0.5.21", "ts-node": "10.9.1", - "typescript": "^4.8.3" + "typescript": "catalog:", + "vitest": "^4.0.2" }, "ava": { "files": [ @@ -77,5 +78,5 @@ "test/" ] }, - "packageManager": "pnpm@9.4.0" + "packageManager": "pnpm@9.5.0" } diff --git a/packages/alias/package.json b/packages/alias/package.json index 9051cad88..6ff43ba23 100755 --- a/packages/alias/package.json +++ b/packages/alias/package.json @@ -13,34 +13,30 @@ "author": "Johannes Stein", "homepage": "https://github.com/rollup/plugins/tree/master/packages/alias#readme", "bugs": "https://github.com/rollup/plugins/issues", - "main": "./dist/cjs/index.js", - "module": "./dist/es/index.js", + "type": "module", "exports": { - "types": "./types/index.d.ts", - "import": "./dist/es/index.js", - "default": "./dist/cjs/index.js" + "types": "./dist/index.d.ts", + "import": "./dist/index.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.19.0" }, "scripts": { - "build": "rollup -c", + "build": "tsc --project tsconfig.json", "ci:coverage": "nyc pnpm test && nyc report --reporter=text-lcov > coverage.lcov", "ci:lint": "pnpm build && pnpm lint", "ci:lint:commits": "commitlint --from=${CIRCLE_BRANCH} --to=${CIRCLE_SHA1}", - "ci:test": "pnpm test -- --verbose", + "ci:test": "pnpm test -- --reporter=verbose", "prebuild": "del-cli dist", "prepare": "if [ ! -d 'dist' ]; then pnpm build; fi", "prerelease": "pnpm build", "pretest": "pnpm build", "release": "pnpm --workspace-root package:release $(pwd)", - "test": "ava", - "test:ts": "tsc --noEmit" + "test": "vitest --config ../../.config/vitest.config.mts run" }, "files": [ "dist", "!dist/**/*.map", - "types", "README.md", "LICENSE" ], @@ -51,7 +47,7 @@ "alias" ], "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + "rollup": ">=4.0.0" }, "peerDependenciesMeta": { "rollup": { @@ -60,19 +56,9 @@ }, "devDependencies": { "@rollup/plugin-node-resolve": "^15.0.0", - "@rollup/plugin-typescript": "^9.0.1", "del-cli": "^5.0.0", - "rollup": "^4.0.0-24", - "typescript": "^4.8.3" + "rollup": "^4.0.0", + "typescript": "catalog:" }, - "types": "./types/index.d.ts", - "ava": { - "files": [ - "!**/fixtures/**", - "!**/output/**", - "!**/helpers/**", - "!**/recipes/**", - "!**/types.ts" - ] - } + "types": "./dist/index.d.ts" } diff --git a/packages/alias/rollup.config.mjs b/packages/alias/rollup.config.mjs deleted file mode 100755 index 2a28aaaf6..000000000 --- a/packages/alias/rollup.config.mjs +++ /dev/null @@ -1,7 +0,0 @@ -import { readFileSync } from 'fs'; - -import { createConfig } from '../../shared/rollup.config.mjs'; - -export default createConfig({ - pkg: JSON.parse(readFileSync(new URL('./package.json', import.meta.url), 'utf8')) -}); diff --git a/packages/alias/src/index.ts b/packages/alias/src/index.ts index 51503848c..2276194c2 100755 --- a/packages/alias/src/index.ts +++ b/packages/alias/src/index.ts @@ -1,8 +1,46 @@ -import path from 'path'; +import path from 'node:path'; -import type { Plugin } from 'rollup'; +// Public types are exported directly from source so tsc can emit declarations +import type { Plugin, PluginHooks } from 'rollup'; -import type { ResolvedAlias, ResolverFunction, ResolverObject, RollupAliasOptions } from '../types'; +// Narrow to explicit callable form instead of the global `Function` type. +type MapToFunction = T extends (...args: any[]) => any ? T : never; + +export type ResolverFunction = MapToFunction; + +export interface ResolverObject { + buildStart?: PluginHooks['buildStart']; + resolveId: ResolverFunction; +} + +export interface Alias { + find: string | RegExp; + replacement: string; + customResolver?: ResolverFunction | ResolverObject | null; +} + +export interface ResolvedAlias { + find: string | RegExp; + replacement: string; + resolverFunction: ResolverFunction | null; +} + +export interface RollupAliasOptions { + /** + * Instructs the plugin to use an alternative resolving algorithm, + * rather than the Rollup's resolver. + * @default null + */ + customResolver?: ResolverFunction | ResolverObject | null; + + /** + * Specifies an `Object`, or an `Array` of `Object`, + * which defines aliases used to replace values in `import` or `require` statements. + * With either format, the order of the entries is important, + * in that the first defined rules are applied first. + */ + entries?: readonly Alias[] | { [find: string]: string }; +} function matches(pattern: string | RegExp, importee: string) { if (pattern instanceof RegExp) { @@ -40,7 +78,7 @@ function getEntries({ entries, customResolver }: RollupAliasOptions): readonly R }); } -function getHookFunction(hook: T | { handler?: T }): T | null { +function getHookFunction any>(hook: T | { handler?: T }): T | null { if (typeof hook === 'function') { return hook; } @@ -104,7 +142,7 @@ export default function alias(options: RollupAliasOptions = {}): Plugin { if (!path.isAbsolute(updatedId)) { this.warn( - `rewrote ${importee} to ${updatedId} but was not an abolute path and was not handled by other plugins. ` + + `rewrote ${importee} to ${updatedId} but was not an absolute path and was not handled by other plugins. ` + `This will lead to duplicated modules for the same path. ` + `To avoid duplicating modules, you should resolve to an absolute path.` ); diff --git a/packages/alias/test/alias.test.ts b/packages/alias/test/alias.test.ts new file mode 100644 index 000000000..46619bad0 --- /dev/null +++ b/packages/alias/test/alias.test.ts @@ -0,0 +1,500 @@ +import path, { posix } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import os from 'node:os'; + +import { describe, it, expect } from 'vitest'; +import { rollup } from 'rollup'; +import nodeResolvePlugin from '@rollup/plugin-node-resolve'; + +import alias from '~package'; + +const DIRNAME = fileURLToPath(new URL('.', import.meta.url)); +const isWindows = os.platform() === 'win32'; + +/** + * Helper function to test configuration with Rollup + * @param plugins is an array of plugins for Rollup, they should include "alias" + * @param externalIds is an array of ids that will be external + * @param tests is an array of pairs [source, importer] + */ +function resolveWithRollup( + plugins: any[], + externalIds: string[], + tests: { source: string; importer?: string; options?: any }[] +) { + if (!plugins.find((p) => p.name === 'alias')) { + throw new Error('`plugins` should include the alias plugin.'); + } + + // Coordinate between the Rollup build lifecycle and our test assertions. + let settle!: (value: (string | null)[]) => void; + let settleErr!: (reason?: unknown) => void; + const resultsPromise = new Promise<(string | null)[]>((res, rej) => { + settle = res; + settleErr = rej; + }); + + return rollup({ + input: 'dummy-input', + plugins: [ + { + name: 'test-plugin', + buildStart() { + // Resolve the requested ids using Rollup's resolver in the proper context. + Promise.all( + tests.map(({ source, importer, options }) => + // @ts-expect-error - this context is provided by Rollup + this.resolve(source, importer, options).then((result: any) => + result ? result.id : null + ) + ) + ) + .then(settle) + .catch(settleErr); + }, + resolveId(id: string) { + if (id === 'dummy-input') return id; + if (externalIds.includes(id)) return { id, external: true } as any; + return null; + }, + load(id: string) { + if (id === 'dummy-input') return 'console.log("test");'; + return null; + } + }, + ...plugins + ] + }).then(async (bundle) => { + try { + const results = await resultsPromise; + return results; + } finally { + await bundle.close(); + } + }); +} + +/** + * Helper function to test configuration with Rollup and injected alias plugin + */ +function resolveAliasWithRollup( + aliasOptions: any, + externalIds: string[], + tests: { source: string; importer?: string; options?: any }[] +) { + return resolveWithRollup([alias(aliasOptions)], externalIds, tests); +} + +describe('plugin-alias', () => { + it('type', () => { + expect(typeof alias).toBe('function'); + }); + + it('instance', () => { + const result = alias(); + expect(typeof result).toBe('object'); + expect(typeof (result as any).resolveId).toBe('function'); + }); + + it('defaults', () => { + const result = alias({}); + expect(typeof result).toBe('object'); + expect(typeof (result as any).resolveId).toBe('function'); + }); + + it('Simple aliasing (array)', async () => { + const result = await resolveAliasWithRollup( + { + entries: [ + { find: 'foo', replacement: 'bar' }, + { find: 'pony', replacement: 'paradise' }, + { find: './local', replacement: 'global' } + ] + }, + ['bar', 'paradise', 'global'], + [ + { source: 'foo', importer: '/src/importer.js' }, + { source: 'pony', importer: '/src/importer.js' }, + { source: './local', importer: '/src/importer.js' } + ] + ); + expect(result).toEqual(['bar', 'paradise', 'global']); + }); + + it('Simple aliasing (object)', async () => { + const result = await resolveAliasWithRollup( + { + entries: { + foo: 'bar', + pony: 'paradise', + './local': 'global' + } + }, + ['bar', 'paradise', 'global'], + [ + { source: 'foo', importer: '/src/importer.js' }, + { source: 'pony', importer: '/src/importer.js' }, + { source: './local', importer: '/src/importer.js' } + ] + ); + expect(result).toEqual(['bar', 'paradise', 'global']); + }); + + it('RegExp aliasing', async () => { + const result = await resolveAliasWithRollup( + { + entries: [ + { find: /f(o+)bar/, replacement: 'f$1bar2019' }, + { find: new RegExp('.*pony.*'), replacement: 'i/am/a/barbie/girl' }, + { find: /^test\/$/, replacement: 'this/is/strict' } + ] + }, + ['fooooooooobar2019', 'i/am/a/barbie/girl', 'this/is/strict'], + [ + { source: 'fooooooooobar', importer: '/src/importer.js' }, + { source: 'im/a/little/pony/yes', importer: '/src/importer.js' }, + { source: './test', importer: '/src/importer.js' }, + { source: 'test', importer: '/src/importer.js' }, + { source: 'test/', importer: '/src/importer.js' } + ] + ); + expect(result).toEqual([ + 'fooooooooobar2019', + 'i/am/a/barbie/girl', + null, + null, + 'this/is/strict' + ]); + }); + + it('Will not confuse modules with similar names', async () => { + const result = await resolveAliasWithRollup( + { + entries: [ + { find: 'foo', replacement: 'bar' }, + { find: './foo', replacement: 'bar' } + ] + }, + [], + [ + { source: 'foo2', importer: '/src/importer.js' }, + { source: './fooze/bar', importer: '/src/importer.js' }, + { source: './someFile.foo', importer: '/src/importer.js' } + ] + ); + expect(result).toEqual([null, null, null]); + }); + + it('Alias entry file', async () => { + const result = await resolveAliasWithRollup( + { entries: [{ find: 'abacaxi', replacement: './abacaxi' }] }, + ['./abacaxi/entry.js'], + [{ source: 'abacaxi/entry.js' }] + ); + expect(result).toEqual(['./abacaxi/entry.js']); + }); + + it('i/am/a/file', async () => { + const result = await resolveAliasWithRollup( + { entries: [{ find: 'resolve', replacement: 'i/am/a/file' }] }, + ['i/am/a/file'], + [{ source: 'resolve', importer: '/src/import.js' }] + ); + expect(result).toEqual(['i/am/a/file']); + }); + + it('Windows absolute path aliasing', async () => { + if (!isWindows) { + expect(1).toBe(1); + return; + } + const result = await resolveAliasWithRollup( + { + entries: [{ find: 'resolve', replacement: 'E:\\react\\node_modules\\fbjs\\lib\\warning' }] + }, + [], + [{ source: 'resolve', importer: posix.resolve(DIRNAME, './fixtures/index.js') }] + ); + expect(result).toEqual(['E:\\react\\node_modules\\fbjs\\lib\\warning']); + }); + + const getModuleIdsFromBundle = (bundle: any) => { + if (bundle.modules) { + return Promise.resolve(bundle.modules.map((module: any) => module.id)); + } + return bundle + .generate({ format: 'es' }) + .then((generated: any) => { + if (generated.output) { + return generated.output.length + ? generated.output + : Object.keys(generated.output).map((chunkName) => generated.output[chunkName]); + } + return [generated]; + }) + .then((chunks: any[]) => + chunks.reduce((moduleIds, chunk) => moduleIds.concat(Object.keys(chunk.modules)), []) + ); + }; + + it('Works in rollup with non fake input', async () => { + const bundle = await rollup({ + input: './test/fixtures/index.js', + plugins: [ + alias({ + entries: [ + { find: 'fancyNumber', replacement: './aliasMe' }, + { find: './anotherFancyNumber', replacement: './localAliasMe' }, + { find: 'numberFolder', replacement: './folder' }, + { find: './numberFolder', replacement: './folder' } + ] + }) + ] + }); + const moduleIds: string[] = await getModuleIdsFromBundle(bundle); + const normalizedIds = moduleIds.map((id) => path.resolve(id)).sort(); + expect(normalizedIds.length).toBe(5); + [ + '/fixtures/aliasMe.js', + '/fixtures/folder/anotherNumber.js', + '/fixtures/index.js', + '/fixtures/localAliasMe.js', + '/fixtures/nonAliased.js' + ] + .map((id) => path.normalize(id)) + .forEach((expectedId, index) => { + expect(normalizedIds[index].endsWith(expectedId)).toBe(true); + }); + }); + + // Global customResolver function is covered by the plugin-like variant below. + + it('Local customResolver function', async () => { + const localCustomResult = 'localCustomResult'; + const result = await resolveAliasWithRollup( + { + entries: [ + { + find: 'test', + replacement: path.resolve('./test/files/folder/hipster.jsx'), + customResolver: () => localCustomResult + } + ] + }, + [], + [{ source: 'test', importer: posix.resolve(DIRNAME, './files/index.js') }] + ); + expect(result).toEqual([localCustomResult]); + }); + + it('Global customResolver plugin-like object', async () => { + const customResult = 'customResult'; + const result = await resolveAliasWithRollup( + { + entries: [{ find: 'test', replacement: path.resolve('./test/files/folder/hipster.jsx') }], + customResolver: { resolveId: () => customResult } + }, + [], + [{ source: 'test', importer: posix.resolve(DIRNAME, './files/index.js') }] + ); + expect(result).toEqual([customResult]); + }); + + it('Local customResolver plugin-like object', async () => { + const localCustomResult = 'localCustomResult'; + const result = await resolveAliasWithRollup( + { + entries: [ + { + find: 'test', + replacement: path.resolve('./test/files/folder/hipster.jsx'), + customResolver: { resolveId: () => localCustomResult } + } + ] + }, + [], + [{ source: 'test', importer: posix.resolve(DIRNAME, './files/index.js') }] + ); + expect(result).toEqual([localCustomResult]); + }); + + it('supports node-resolve as a custom resolver', async () => { + const result = await resolveAliasWithRollup( + { + entries: [ + { + find: 'local-resolver', + replacement: path.resolve(DIRNAME, 'fixtures'), + customResolver: nodeResolvePlugin() + }, + { find: 'global-resolver', replacement: path.resolve(DIRNAME, 'fixtures', 'folder') } + ], + customResolver: nodeResolvePlugin() + }, + [], + [ + { source: 'local-resolver', importer: posix.resolve(DIRNAME, './files/index.js') }, + { source: 'global-resolver', importer: posix.resolve(DIRNAME, './files/index.js') } + ] + ); + expect(result).toEqual([ + path.resolve(DIRNAME, 'fixtures', 'index.js'), + path.resolve(DIRNAME, 'fixtures', 'folder', 'index.js') + ]); + }); + + it('Alias + rollup-plugin-node-resolve', async () => { + const bundle = await rollup({ + input: './test/fixtures/index.js', + plugins: [ + alias({ + entries: [ + { find: 'fancyNumber', replacement: './aliasMe' }, + { find: './anotherFancyNumber', replacement: './localAliasMe' }, + { find: 'numberFolder/anotherNumber', replacement: './folder' }, + { find: './numberFolder', replacement: './folder' }, + { find: 'superdeep', replacement: './deep/deep2' } + ] + }), + nodeResolvePlugin() + ] + }); + const moduleIds: string[] = await getModuleIdsFromBundle(bundle); + const normalizedIds = moduleIds.map((id) => path.resolve(id)).sort(); + expect(normalizedIds.length).toBe(6); + [ + '/fixtures/aliasMe.js', + '/fixtures/folder/anotherNumber.js', + '/fixtures/folder/deep/deep2/index.js', + '/fixtures/index.js', + '/fixtures/localAliasMe.js', + '/fixtures/nonAliased.js' + ] + .map((id) => path.normalize(id)) + .forEach((expectedId, index) => { + expect(normalizedIds[index].endsWith(expectedId)).toBe(true); + }); + }); + + it('Forwards isEntry and custom options to a custom resolver', async () => { + const resolverCalls: any[] = []; + const result = await resolveAliasWithRollup( + { + entries: { entry: 'entry-point', nonEntry: 'non-entry-point' }, + customResolver: (...args: any[]) => { + resolverCalls.push(args); + return args[0]; + } + }, + [], + [ + { source: 'entry', importer: '/src/importer.js', options: { isEntry: true } }, + { + source: 'nonEntry', + importer: '/src/importer.js', + options: { attributes: {}, isEntry: false, custom: { test: 42 } } + } + ] + ); + expect(resolverCalls).toEqual([ + ['entry-point', '/src/importer.js', { attributes: {}, custom: void 0, isEntry: true }], + [ + 'non-entry-point', + '/src/importer.js', + { attributes: {}, custom: { test: 42 }, isEntry: false } + ] + ]); + expect(result).toEqual(['entry-point', 'non-entry-point']); + }); + + it('Forwards isEntry and custom options to other plugins', async () => { + const resolverCalls: any[] = []; + const result = await resolveWithRollup( + [ + alias({ entries: { entry: 'entry-point', nonEntry: 'non-entry-point' } }), + { + name: 'test', + resolveId(...args: any[]) { + resolverCalls.push(args); + if (['entry-point', 'non-entry-point'].includes(args[0])) { + return { id: args[0], external: true } as any; + } + return null; + } + } + ], + [], + [ + { source: 'entry', importer: '/src/importer.js', options: { isEntry: true } }, + { + source: 'nonEntry', + importer: '/src/importer.js', + options: { isEntry: false, custom: { test: 42 } } + } + ] + ); + expect(resolverCalls).toEqual([ + ['entry-point', '/src/importer.js', { attributes: {}, custom: void 0, isEntry: true }], + [ + 'non-entry-point', + '/src/importer.js', + { attributes: {}, custom: { test: 42 }, isEntry: false } + ] + ]); + expect(result).toEqual(['entry-point', 'non-entry-point']); + }); + + it('CustomResolver plugin-like object with buildStart', async () => { + const count = { entry: 0, option: 0 }; + await resolveAliasWithRollup( + { + entries: [ + { + find: 'this', + replacement: path.resolve('./that.jsx'), + customResolver: { + resolveId: () => 'custom Resolver', + buildStart: () => (count.entry += 1) + } + }, + { find: 'that', replacement: '' } + ], + customResolver: { buildStart: () => (count.option += 1) } + }, + [], + [] + ); + expect(count).toEqual({ entry: 1, option: 1 }); + }); + + it('show warning for non-absolute non-plugin resolved id', async () => { + const warnList: any[] = []; + await rollup({ + input: './test/fixtures/warn.js', + plugins: [ + alias({ + entries: [ + { + find: '@', + replacement: path.relative(process.cwd(), path.join(DIRNAME, './fixtures/folder')) + } + ] + }) + ], + onwarn(log) { + const formattedLog = { ...log, message: (log as any).message.replace(/\\/g, '/') } as any; + warnList.push(formattedLog); + } + }); + expect(warnList).toMatchObject([ + { + message: + '[plugin alias] rewrote @/warn-importee.js to test/fixtures/folder/warn-importee.js but was not an absolute path and was not handled by other plugins. ' + + 'This will lead to duplicated modules for the same path. ' + + 'To avoid duplicating modules, you should resolve to an absolute path.', + code: 'PLUGIN_WARNING', + plugin: 'alias' + } + ]); + }); +}); diff --git a/packages/alias/test/node_modules/current-package b/packages/alias/test/node_modules/current-package deleted file mode 120000 index c25bddb6d..000000000 --- a/packages/alias/test/node_modules/current-package +++ /dev/null @@ -1 +0,0 @@ -../.. \ No newline at end of file diff --git a/packages/alias/test/test.mjs b/packages/alias/test/test.mjs deleted file mode 100755 index 2f0be4eab..000000000 --- a/packages/alias/test/test.mjs +++ /dev/null @@ -1,673 +0,0 @@ -import path, { posix } from 'path'; -import { fileURLToPath } from 'url'; -import { createRequire } from 'module'; -import os from 'os'; - -import test from 'ava'; -import { rollup } from 'rollup'; -import nodeResolvePlugin from '@rollup/plugin-node-resolve'; - -import alias from 'current-package'; - -const DIRNAME = fileURLToPath(new URL('.', import.meta.url)); - -const isWindows = os.platform() === 'win32'; - -/** - * Helper function to test configuration with Rollup - * @param plugins is an array of plugins for Rollup, they should include "alias" - * @param externalIds is an array of ids that will be external - * @param tests is an array of pairs [source, importer] - * @returns {Promise} - */ -function resolveWithRollup(plugins, externalIds, tests) { - if (!plugins.find((p) => p.name === 'alias')) { - throw new Error('`plugins` should include the alias plugin.'); - } - return new Promise((resolve, reject) => { - rollup({ - input: 'dummy-input', - plugins: [ - { - name: 'test-plugin', - buildStart() { - resolve( - // The buildStart hook is the first to have access to this.resolve - // We map the tests to an array of resulting ids - Promise.all( - tests.map(({ source, importer, options }) => - this.resolve(source, importer, options).then((result) => - result ? result.id : null - ) - ) - ) - ); - }, - resolveId(id) { - if (id === 'dummy-input') return id; - if (externalIds.includes(id)) return { id, external: true }; - return null; - }, - load(id) { - if (id === 'dummy-input') return 'console.log("test");'; - return null; - } - }, - ...plugins - ] - // if Rollup throws an error, this should reject the test - }).catch(reject); - }); -} - -/** - * Helper function to test configuration with Rollup and injected alias plugin - * @param aliasOptions is a configuration for alias plugin - * @param externalIds is an array of ids that will be external - * @param tests is an array of pairs [source, importer] - * @returns {Promise} - */ -function resolveAliasWithRollup(aliasOptions, externalIds, tests) { - return resolveWithRollup([alias(aliasOptions)], externalIds, tests); -} - -test('type', (t) => { - t.is(typeof alias, 'function'); -}); - -test('instance', (t) => { - const result = alias(); - t.is(typeof result, 'object'); - t.is(typeof result.resolveId, 'function'); -}); - -test('defaults', (t) => { - const result = alias({}); - t.is(typeof result, 'object'); - t.is(typeof result.resolveId, 'function'); -}); - -test('Simple aliasing (array)', (t) => - resolveAliasWithRollup( - { - entries: [ - { find: 'foo', replacement: 'bar' }, - { find: 'pony', replacement: 'paradise' }, - { find: './local', replacement: 'global' } - ] - }, - ['bar', 'paradise', 'global'], - [ - { source: 'foo', importer: '/src/importer.js' }, - { source: 'pony', importer: '/src/importer.js' }, - { source: './local', importer: '/src/importer.js' } - ] - ).then((result) => t.deepEqual(result, ['bar', 'paradise', 'global']))); - -test('Simple aliasing (object)', (t) => - resolveAliasWithRollup( - { - entries: { - foo: 'bar', - pony: 'paradise', - './local': 'global' - } - }, - ['bar', 'paradise', 'global'], - [ - { source: 'foo', importer: '/src/importer.js' }, - { source: 'pony', importer: '/src/importer.js' }, - { source: './local', importer: '/src/importer.js' } - ] - ).then((result) => t.deepEqual(result, ['bar', 'paradise', 'global']))); - -test('RegExp aliasing', (t) => - resolveAliasWithRollup( - { - entries: [ - { find: /f(o+)bar/, replacement: 'f$1bar2019' }, - { - find: new RegExp('.*pony.*'), - replacement: 'i/am/a/barbie/girl' - }, - { find: /^test\/$/, replacement: 'this/is/strict' } - ] - }, - ['fooooooooobar2019', 'i/am/a/barbie/girl', 'this/is/strict'], - [ - { - source: 'fooooooooobar', - importer: '/src/importer.js' - }, - { - source: 'im/a/little/pony/yes', - importer: '/src/importer.js' - }, - { source: './test', importer: '/src/importer.js' }, - { source: 'test', importer: '/src/importer.js' }, - { source: 'test/', importer: '/src/importer.js' } - ] - ).then((result) => - t.deepEqual(result, ['fooooooooobar2019', 'i/am/a/barbie/girl', null, null, 'this/is/strict']) - )); - -test('Will not confuse modules with similar names', (t) => - resolveAliasWithRollup( - { - entries: [ - { find: 'foo', replacement: 'bar' }, - { find: './foo', replacement: 'bar' } - ] - }, - [], - [ - { source: 'foo2', importer: '/src/importer.js' }, - { - source: './fooze/bar', - importer: '/src/importer.js' - }, - { - source: './someFile.foo', - importer: '/src/importer.js' - } - ] - ).then((result) => t.deepEqual(result, [null, null, null]))); - -test('Alias entry file', (t) => - resolveAliasWithRollup( - { - entries: [{ find: 'abacaxi', replacement: './abacaxi' }] - }, - ['./abacaxi/entry.js'], - // eslint-disable-next-line no-undefined - [{ source: 'abacaxi/entry.js' }] - ).then((result) => t.deepEqual(result, ['./abacaxi/entry.js']))); - -test('i/am/a/file', (t) => - resolveAliasWithRollup( - { - entries: [{ find: 'resolve', replacement: 'i/am/a/file' }] - }, - ['i/am/a/file'], - [{ source: 'resolve', importer: '/src/import.js' }] - ).then((result) => t.deepEqual(result, ['i/am/a/file']))); - -test('Windows absolute path aliasing', (t) => { - if (!isWindows) { - t.deepEqual(1, 1); - return null; - } - - return resolveAliasWithRollup( - { - entries: [ - { - find: 'resolve', - replacement: 'E:\\react\\node_modules\\fbjs\\lib\\warning' - } - ] - }, - [], - [ - { - source: 'resolve', - importer: posix.resolve(DIRNAME, './fixtures/index.js') - } - ] - ).then((result) => t.deepEqual(result, ['E:\\react\\node_modules\\fbjs\\lib\\warning'])); -}); - -/** - * Helper function to get moduleIDs from final Rollup bundle - * @param bundle Rollup bundle - * @returns {PromiseLike|Promise} - */ -const getModuleIdsFromBundle = (bundle) => { - if (bundle.modules) { - return Promise.resolve(bundle.modules.map((module) => module.id)); - } - return bundle - .generate({ format: 'es' }) - .then((generated) => { - if (generated.output) { - return generated.output.length - ? generated.output - : Object.keys(generated.output).map((chunkName) => generated.output[chunkName]); - } - return [generated]; - }) - .then((chunks) => - chunks.reduce((moduleIds, chunk) => moduleIds.concat(Object.keys(chunk.modules)), []) - ); -}; - -test('Works in rollup with non fake input', (t) => - rollup({ - input: './test/fixtures/index.js', - plugins: [ - alias({ - entries: [ - { find: 'fancyNumber', replacement: './aliasMe' }, - { - find: './anotherFancyNumber', - replacement: './localAliasMe' - }, - { find: 'numberFolder', replacement: './folder' }, - { - find: './numberFolder', - replacement: './folder' - } - ] - }) - ] - }) - .then(getModuleIdsFromBundle) - .then((moduleIds) => { - const normalizedIds = moduleIds.map((id) => path.resolve(id)).sort(); - t.is(normalizedIds.length, 5); - [ - '/fixtures/aliasMe.js', - '/fixtures/folder/anotherNumber.js', - '/fixtures/index.js', - '/fixtures/localAliasMe.js', - '/fixtures/nonAliased.js' - ] - .map((id) => path.normalize(id)) - .forEach((expectedId, index) => - t.is( - normalizedIds[index].endsWith(expectedId), - true, - `expected ${normalizedIds[index]} to end with ${expectedId}` - ) - ); - })); - -test('Global customResolver function', (t) => { - const customResult = 'customResult'; - - return resolveAliasWithRollup( - { - entries: [ - { - find: 'test', - replacement: path.resolve('./test/files/folder/hipster.jsx') - } - ], - customResolver: () => customResult - }, - [], - [ - { - source: 'test', - importer: posix.resolve(DIRNAME, './files/index.js') - } - ] - ).then((result) => t.deepEqual(result, [customResult])); -}); - -test('Local customResolver function', (t) => { - const customResult = 'customResult'; - const localCustomResult = 'localCustomResult'; - - return resolveAliasWithRollup( - { - entries: [ - { - find: 'test', - replacement: path.resolve('./test/files/folder/hipster.jsx'), - customResolver: () => localCustomResult - } - ], - customResolver: () => customResult - }, - [], - [ - { - source: 'test', - importer: posix.resolve(DIRNAME, './files/index.js') - } - ] - ).then((result) => t.deepEqual(result, [localCustomResult])); -}); - -test('Global customResolver plugin-like object', (t) => { - const customResult = 'customResult'; - - return resolveAliasWithRollup( - { - entries: [ - { - find: 'test', - replacement: path.resolve('./test/files/folder/hipster.jsx') - } - ], - customResolver: { resolveId: () => customResult } - }, - [], - [ - { - source: 'test', - importer: posix.resolve(DIRNAME, './files/index.js') - } - ] - ).then((result) => t.deepEqual(result, [customResult])); -}); - -test('Local customResolver plugin-like object', (t) => { - const customResult = 'customResult'; - const localCustomResult = 'localCustomResult'; - - return resolveAliasWithRollup( - { - entries: [ - { - find: 'test', - replacement: path.resolve('./test/files/folder/hipster.jsx'), - customResolver: { - resolveId: () => localCustomResult - } - } - ], - customResolver: { resolveId: () => customResult } - }, - [], - [ - { - source: 'test', - importer: posix.resolve(DIRNAME, './files/index.js') - } - ] - ).then((result) => t.deepEqual(result, [localCustomResult])); -}); - -test('supports node-resolve as a custom resolver', (t) => - resolveAliasWithRollup( - { - entries: [ - { - find: 'local-resolver', - replacement: path.resolve(DIRNAME, 'fixtures'), - customResolver: nodeResolvePlugin() - }, - { - find: 'global-resolver', - replacement: path.resolve(DIRNAME, 'fixtures', 'folder') - } - ], - customResolver: nodeResolvePlugin() - }, - [], - [ - { - source: 'local-resolver', - importer: posix.resolve(DIRNAME, './files/index.js') - }, - { - source: 'global-resolver', - importer: posix.resolve(DIRNAME, './files/index.js') - } - ] - ).then((result) => - t.deepEqual(result, [ - path.resolve(DIRNAME, 'fixtures', 'index.js'), - path.resolve(DIRNAME, 'fixtures', 'folder', 'index.js') - ]) - )); - -test('Alias + rollup-plugin-node-resolve', (t) => - rollup({ - input: './test/fixtures/index.js', - plugins: [ - alias({ - entries: [ - { find: 'fancyNumber', replacement: './aliasMe' }, - { - find: './anotherFancyNumber', - replacement: './localAliasMe' - }, - { - find: 'numberFolder/anotherNumber', - replacement: './folder' - }, - { - find: './numberFolder', - replacement: './folder' - }, - { find: 'superdeep', replacement: './deep/deep2' } - ] - }), - nodeResolvePlugin() - ] - }) - .then(getModuleIdsFromBundle) - .then((moduleIds) => { - const normalizedIds = moduleIds.map((id) => path.resolve(id)).sort(); - t.is(normalizedIds.length, 6); - [ - '/fixtures/aliasMe.js', - '/fixtures/folder/anotherNumber.js', - '/fixtures/folder/deep/deep2/index.js', - '/fixtures/index.js', - '/fixtures/localAliasMe.js', - '/fixtures/nonAliased.js' - ] - .map((id) => path.normalize(id)) - .forEach((expectedId, index) => - t.is( - normalizedIds[index].endsWith(expectedId), - true, - `expected ${normalizedIds[index]} to end with ${expectedId}` - ) - ); - })); - -test('Forwards isEntry and custom options to a custom resolver', (t) => { - const resolverCalls = []; - return resolveAliasWithRollup( - { - entries: { - entry: 'entry-point', - nonEntry: 'non-entry-point' - }, - customResolver: (...args) => { - resolverCalls.push(args); - return args[0]; - } - }, - [], - [ - { source: 'entry', importer: '/src/importer.js', options: { isEntry: true } }, - { - source: 'nonEntry', - importer: '/src/importer.js', - options: { attributes: {}, isEntry: false, custom: { test: 42 } } - } - ] - ).then((result) => { - t.deepEqual(resolverCalls, [ - [ - 'entry-point', - '/src/importer.js', - { - attributes: {}, - custom: void 0, - isEntry: true - } - ], - [ - 'non-entry-point', - '/src/importer.js', - { - attributes: {}, - custom: { test: 42 }, - isEntry: false - } - ] - ]); - t.deepEqual(result, ['entry-point', 'non-entry-point']); - }); -}); - -test('Forwards isEntry and custom options to other plugins', (t) => { - const resolverCalls = []; - return resolveWithRollup( - [ - alias({ - entries: { - entry: 'entry-point', - nonEntry: 'non-entry-point' - } - }), - { - name: 'test', - resolveId(...args) { - resolverCalls.push(args); - - if (['entry-point', 'non-entry-point'].includes(args[0])) { - return { id: args[0], external: true }; - } - return null; - } - } - ], - [], - [ - { source: 'entry', importer: '/src/importer.js', options: { isEntry: true } }, - { - source: 'nonEntry', - importer: '/src/importer.js', - options: { isEntry: false, custom: { test: 42 } } - } - ] - ).then((result) => { - t.deepEqual(resolverCalls, [ - [ - 'entry-point', - '/src/importer.js', - { - attributes: {}, - custom: void 0, - isEntry: true - } - ], - [ - 'non-entry-point', - '/src/importer.js', - { - attributes: {}, - custom: { test: 42 }, - isEntry: false - } - ] - ]); - t.deepEqual(result, ['entry-point', 'non-entry-point']); - }); -}); - -test('CustomResolver plugin-like object with buildStart', (t) => { - const count = { - entry: 0, - option: 0 - }; - return resolveAliasWithRollup( - { - entries: [ - { - find: 'this', - replacement: path.resolve('./that.jsx'), - customResolver: { - resolveId: () => 'custom Resolver', - buildStart: () => (count.entry += 1) - } - }, - { - find: 'that', - replacement: '' - } - ], - customResolver: { - buildStart: () => (count.option += 1) - } - }, - [], - [] - ).then(() => - t.deepEqual(count, { - entry: 1, - option: 1 - }) - ); -}); - -test('Works as CJS plugin', async (t) => { - const require = createRequire(import.meta.url); - const aliasCjs = require('current-package'); - const bundle = await rollup({ - input: './test/fixtures/index.js', - plugins: [ - aliasCjs({ - entries: [ - { find: 'fancyNumber', replacement: './aliasMe' }, - { - find: './anotherFancyNumber', - replacement: './localAliasMe' - }, - { find: 'numberFolder', replacement: './folder' }, - { - find: './numberFolder', - replacement: './folder' - } - ] - }) - ] - }); - const moduleIds = await getModuleIdsFromBundle(bundle); - const normalizedIds = moduleIds.map((id) => path.resolve(id)).sort(); - t.is(normalizedIds.length, 5); - [ - '/fixtures/aliasMe.js', - '/fixtures/folder/anotherNumber.js', - '/fixtures/index.js', - '/fixtures/localAliasMe.js', - '/fixtures/nonAliased.js' - ] - .map((id) => path.normalize(id)) - .forEach((expectedId, index) => - t.is( - normalizedIds[index].endsWith(expectedId), - true, - `expected ${normalizedIds[index]} to end with ${expectedId}` - ) - ); -}); - -test('show warning for non-absolute non-plugin resolved id', async (t) => { - const warnList = []; - await rollup({ - input: './test/fixtures/warn.js', - plugins: [ - alias({ - entries: [ - { - find: '@', - replacement: path.relative(process.cwd(), path.join(DIRNAME, './fixtures/folder')) - } - ] - }) - ], - onwarn(log) { - const formattedLog = { ...log, message: log.message.replace(/\\/g, '/') }; - warnList.push(formattedLog); - } - }); - t.deepEqual(warnList, [ - { - message: - 'rewrote @/warn-importee.js to test/fixtures/folder/warn-importee.js but was not an abolute path and was not handled by other plugins. ' + - 'This will lead to duplicated modules for the same path. ' + - 'To avoid duplicating modules, you should resolve to an absolute path.', - code: 'PLUGIN_WARNING', - plugin: 'alias' - } - ]); -}); diff --git a/packages/alias/tsconfig.json b/packages/alias/tsconfig.json index 7cd38da8f..1ef31f009 120000 --- a/packages/alias/tsconfig.json +++ b/packages/alias/tsconfig.json @@ -1 +1 @@ -../../shared/tsconfig.json \ No newline at end of file +../../.config/tsconfig.plugin.json \ No newline at end of file diff --git a/packages/alias/types/index.d.ts b/packages/alias/types/index.d.ts deleted file mode 100644 index 52cc2a471..000000000 --- a/packages/alias/types/index.d.ts +++ /dev/null @@ -1,44 +0,0 @@ -import type { Plugin, PluginHooks } from 'rollup'; - -type MapToFunction = T extends Function ? T : never; - -export type ResolverFunction = MapToFunction; - -export interface ResolverObject { - buildStart?: PluginHooks['buildStart']; - resolveId: ResolverFunction; -} - -export interface Alias { - find: string | RegExp; - replacement: string; - customResolver?: ResolverFunction | ResolverObject | null; -} - -export interface ResolvedAlias { - find: string | RegExp; - replacement: string; - resolverFunction: ResolverFunction | null; -} - -export interface RollupAliasOptions { - /** - * Instructs the plugin to use an alternative resolving algorithm, - * rather than the Rollup's resolver. - * @default null - */ - customResolver?: ResolverFunction | ResolverObject | null; - - /** - * Specifies an `Object`, or an `Array` of `Object`, - * which defines aliases used to replace values in `import` or `require` statements. - * With either format, the order of the entries is important, - * in that the first defined rules are applied first. - */ - entries?: readonly Alias[] | { [find: string]: string }; -} - -/** - * 🍣 A Rollup plugin for defining aliases when bundling packages. - */ -export default function alias(options?: RollupAliasOptions): Plugin; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3bda279f9..e5908b66b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,12 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +catalogs: + default: + typescript: + specifier: ^5.9.3 + version: 5.9.3 + importers: .: @@ -13,19 +19,19 @@ importers: version: 0.3.1 '@rollup/plugin-typescript': specifier: ^9.0.1 - version: 9.0.1(rollup@4.0.0-24)(tslib@2.4.0)(typescript@4.8.4) + version: 9.0.1(tslib@2.4.0)(typescript@5.9.3) '@types/node': - specifier: 14.18.30 - version: 14.18.30 + specifier: ^20.19.0 + version: 20.19.23 '@types/source-map-support': specifier: ^0.5.4 version: 0.5.6 '@typescript-eslint/eslint-plugin': specifier: ^5.38.0 - version: 5.39.0(@typescript-eslint/parser@5.39.0(eslint@8.57.1)(typescript@4.8.4))(eslint@8.57.1)(typescript@4.8.4) + version: 5.39.0(@typescript-eslint/parser@5.39.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^5.38.0 - version: 5.39.0(eslint@8.57.1)(typescript@4.8.4) + version: 5.39.0(eslint@8.57.1)(typescript@5.9.3) ava: specifier: ^4.3.3 version: 4.3.3 @@ -43,7 +49,7 @@ importers: version: 8.57.1 eslint-config-rollup: specifier: ^3.0.1 - version: 3.0.1(typescript@4.8.4) + version: 3.0.1(typescript@5.9.3) esm: specifier: ^3.2.25 version: 3.2.25 @@ -73,28 +79,28 @@ importers: version: 0.5.21 ts-node: specifier: 10.9.1 - version: 10.9.1(@swc/core@1.3.78)(@types/node@14.18.30)(typescript@4.8.4) + version: 10.9.1(@swc/core@1.3.78)(@types/node@20.19.23)(typescript@5.9.3) typescript: - specifier: ^4.8.3 - version: 4.8.4 + specifier: 'catalog:' + version: 5.9.3 + vitest: + specifier: ^4.0.2 + version: 4.0.2(@types/node@20.19.23)(terser@5.17.4) packages/alias: devDependencies: '@rollup/plugin-node-resolve': specifier: ^15.0.0 - version: 15.0.0(rollup@4.0.0-24) - '@rollup/plugin-typescript': - specifier: ^9.0.1 - version: 9.0.1(rollup@4.0.0-24)(tslib@2.4.0)(typescript@4.8.4) + version: 15.0.0(rollup@4.52.5) del-cli: specifier: ^5.0.0 version: 5.0.0 rollup: - specifier: ^4.0.0-24 - version: 4.0.0-24 + specifier: ^4.0.0 + version: 4.52.5 typescript: - specifier: ^4.8.3 - version: 4.8.4 + specifier: 'catalog:' + version: 5.9.3 packages/auto-install: devDependencies: @@ -394,7 +400,7 @@ importers: version: 4.0.0-24 rollup-plugin-postcss: specifier: ^4.0.2 - version: 4.0.2(postcss@8.4.17)(ts-node@10.9.1(@swc/core@1.3.78)(@types/node@14.18.30)(typescript@4.8.4)) + version: 4.0.2(postcss@8.4.17)(ts-node@10.9.1(@swc/core@1.3.78)(@types/node@20.19.23)(typescript@4.8.4)) typescript: specifier: ^4.8.3 version: 4.8.4 @@ -1413,6 +1419,162 @@ packages: engines: {node: '>=18'} hasBin: true + '@esbuild/aix-ppc64@0.25.11': + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.11': + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.11': + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.11': + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.11': + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.11': + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.11': + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.11': + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.11': + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.11': + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.11': + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.11': + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.11': + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.11': + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.11': + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.11': + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.11': + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.11': + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.11': + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.11': + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.11': + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.11': + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.11': + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.11': + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.11': + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.11': + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.0': resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1530,6 +1692,9 @@ packages: '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.16': resolution: {integrity: sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA==} @@ -1664,56 +1829,166 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.52.5': + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.0.0-24': resolution: {integrity: sha512-ftTp5ByyyozDsHfmYGeErrQmBi4ZEVZItC4Siilwretkf+cMv9z0s0Ru8ncd28OZpaO0cr9b7Afm+DIRDyE8Kw==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.52.5': + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.0.0-24': resolution: {integrity: sha512-wYXWdPbMLiIRHQeTF/r9ZoDcf3k1ROR0Kyd/caUtbs5VEZOBfnpZ/FHQPzXW0S1fzxTtD5W4tXULxARMHAlNdQ==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.52.5': + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.0.0-24': resolution: {integrity: sha512-8tIz6Uga/5XdeRkid7kfNtxrvru7o4lDBxAPooZezKXbyB2ap2yKAKCqTFEXyTuPhl2yxLMa5zqZ91FBEnSbPg==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.52.5': + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.52.5': + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.52.5': + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.0.0-24': resolution: {integrity: sha512-ZCNBOaw2NV3BnpQ049VCPJSamss3wAoCunFcWYfhWgGyu9C0hiRvZAcKvhd7e/9EhuoIxsNxMLwI46NmZx9WBQ==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.0.0-24': resolution: {integrity: sha512-BGnRktAZq4RI6FSicI+F6ws9paiYmjyaXUNKSukLthzgzPC91V4SXVylbFOCKvrhdWAr0lvZgcTrkgYNAmAcuQ==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.52.5': + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.52.5': + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.52.5': + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.52.5': + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.52.5': + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.0.0-24': resolution: {integrity: sha512-FzhHpp+vRTjIUYXMExj9Ffj2bCQgnRAzlWlsQTdYGYvPQMVadfPMvnlcr4Li8P7Yv1iBFtDzRVfZAgL5glvIAA==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.52.5': + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.0.0-24': resolution: {integrity: sha512-0y+oXnCCT5+U5V58bY7dy65yDrWWfopFJwtC2EbFeA9SHrVjG36/TQo535ML3zdFwO+fma8r5FP1os0psbQBXQ==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.52.5': + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.52.5': + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + cpu: [arm64] + os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.0.0-24': resolution: {integrity: sha512-xT8djNMxVB84cCm1XILpQXkMcu8S+GBKjurXM4sc6eB1FQpFpcTAOsuQSg9xOhfPqm1xa7qqXA6ZpUhoUMboVQ==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.52.5': + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.0.0-24': resolution: {integrity: sha512-3gXFBlG5f18xbhVxKTM+zwciJPk097i3YswLI9cajVd4MAqMw5bGbuZkGOZOMnkzeIX0ELxovYWPbGDyUr+f5g==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.52.5': + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.52.5': + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.0.0-24': resolution: {integrity: sha512-41+QkzRaKEZwmA14Fa2DI0QKN5hkcN/orA2KOg5vJAtvwSfB1uQTUmf6T4SGZLw/8In2TEmViB9tDVlbnXmH1A==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.52.5': + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} + cpu: [x64] + os: [win32] + '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -1730,6 +2005,9 @@ packages: '@sinonjs/text-encoding@0.7.2': resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@swc/core-darwin-arm64@1.3.78': resolution: {integrity: sha512-596KRua/d5Gx1buHKKchSyHuwoIL4S1BRD/wCvYNLNZ3xOzcuBBmXOjrDVigKi1ztNDeS07p30RO5UyYur0XAA==} engines: {node: '>=10'} @@ -1837,9 +2115,15 @@ packages: '@types/cacheable-request@6.0.2': resolution: {integrity: sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/d3-dsv@3.0.0': resolution: {integrity: sha512-o0/7RlMl9p5n6FQDptuJVMxDf/7EDEv2SYEO/CwdG2tr1hTfUVi0Iavkk2ax+VpaQ/1jVhpnj5rq1nj8vwhn2A==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/eslint@8.56.12': resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} @@ -1870,6 +2154,9 @@ packages: '@types/node@14.18.31': resolution: {integrity: sha512-vQAnaReSQkEDa8uwAyQby8bYGKu84R/deEc6mg5T8fX6gzCn8QW6rziSgsti1fNvsrswKUKPnVTi7uoB+u62Mw==} + '@types/node@20.19.23': + resolution: {integrity: sha512-yIdlVVVHXpmqRhtyovZAcSy0MiPcYWGkoO4CGe/+jpP0hmNuihm4XhHbADpK++MsiLHP5MVlv+bcgdF99kSiFQ==} + '@types/normalize-package-data@2.4.1': resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -2019,6 +2306,35 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@vitest/expect@4.0.2': + resolution: {integrity: sha512-izQY+ABWqL2Vyr5+LNo3m16nLLTAzLn8em6i5uxqsrWRhdgzdN5JIHrpFVGBAYRGDAbtwE+yD4Heu8gsBSWTVQ==} + + '@vitest/mocker@4.0.2': + resolution: {integrity: sha512-oiny+oBSGU9vHMA1DPdO+t1GVidCRuA4lKSG6rbo5SrCiTCGl7bTCyTaUkwxDpUkiSxEVneeXW4LJ4fg3H56dw==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.0.2': + resolution: {integrity: sha512-PhrSiljryCz5nUDhHla5ihXYy2iRCBob+rNqlu34dA+KZIllVR39rUGny5R3kLgDgw3r8GW1ptOo64WbieMkeQ==} + + '@vitest/runner@4.0.2': + resolution: {integrity: sha512-mPS5T/ZDuO6J5rsQiA76CFmlHtos7dnCvL14I1Oo8SbcjIhJd6kirFmekovfYLRygdF0gJe6SA5asCKIWKw1tw==} + + '@vitest/snapshot@4.0.2': + resolution: {integrity: sha512-NibujZAh+fTQlpGdP8J2pZcsPg7EPjiLUOUq9In++4p35vc9xIFMkXfQDbBSpijqZPe6i2hEKrUCbKu70/sPzw==} + + '@vitest/spy@4.0.2': + resolution: {integrity: sha512-KrTWRXFPYrbhD0iUXeoA8BMXl81nvemj5D8sc7NbTlRvCeUWo36JheOWtAUCafcNi0G72ycAdsvWQVSOxy/3TA==} + + '@vitest/utils@4.0.2': + resolution: {integrity: sha512-H9jFzZb/5B5Qh7ajPUWMJ8UYGxQ4EQTaNLSm3icXs/oXkzQ1jqfcWDEJ4U3LkFPZOd6QW8M2MYjz32poW+KKqg==} + JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true @@ -2148,6 +2464,10 @@ packages: resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} engines: {node: '>=12'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -2272,6 +2592,10 @@ packages: resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} engines: {node: '>=12.19'} + chai@6.2.0: + resolution: {integrity: sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==} + engines: {node: '>=18'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -2502,6 +2826,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize-keys@1.1.0: resolution: {integrity: sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==} engines: {node: '>=0.10.0'} @@ -2623,6 +2956,9 @@ packages: resolution: {integrity: sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==} engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-shim-unscopables@1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} @@ -2643,6 +2979,11 @@ packages: es6-symbol@3.1.3: resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + esbuild@0.25.11: + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} + engines: {node: '>=18'} + hasBin: true + escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -2831,6 +3172,9 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -2842,6 +3186,10 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + ext@1.7.0: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} @@ -2880,6 +3228,15 @@ packages: picomatch: optional: true + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + figures@4.0.1: resolution: {integrity: sha512-rElJwkA/xS04Vfg+CaZodpso7VqBknOYbzi6I76hI4X80RUjkSxO2oAyPmGbuXUppywjqndOrQDl817hDnI++w==} engines: {node: '>=12'} @@ -3514,6 +3871,9 @@ packages: resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} engines: {node: '>=12'} + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + magic-string@0.30.3: resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==} engines: {node: '>=12'} @@ -3633,6 +3993,11 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + nanoid@3.3.4: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -3842,9 +4207,15 @@ packages: pathe@2.0.2: resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -3853,6 +4224,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -4101,6 +4476,10 @@ packages: resolution: {integrity: sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -4303,6 +4682,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.52.5: + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -4369,6 +4753,9 @@ packages: side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -4410,6 +4797,10 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -4455,6 +4846,12 @@ packages: resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} engines: {node: '>=10'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + string-argv@0.3.1: resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} engines: {node: '>=0.6.19'} @@ -4590,10 +4987,24 @@ packages: resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} engines: {node: '>=4'} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -4700,12 +5111,20 @@ packages: engines: {node: '>=4.2.0'} hasBin: true + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + unicode-canonical-property-names-ecmascript@1.0.4: resolution: {integrity: sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==} engines: {node: '>=4'} @@ -4760,6 +5179,80 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + vite@7.1.12: + resolution: {integrity: sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@4.0.2: + resolution: {integrity: sha512-SXrA2ZzOPulX479d8W13RqKSmvHb9Bfg71eW7Fbs6ZjUFcCCXyt/OzFCkNyiUE8mFlPHa4ZVUGw0ky+5ndKnrg==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.2 + '@vitest/browser-preview': 4.0.2 + '@vitest/browser-webdriverio': 4.0.2 + '@vitest/ui': 4.0.2 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + well-known-symbols@2.0.0: resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} engines: {node: '>=6'} @@ -4775,6 +5268,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + word-wrap@1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} @@ -5640,6 +6138,84 @@ snapshots: write-pkg: 4.0.0 yargs-parser: 21.1.1 + '@esbuild/aix-ppc64@0.25.11': + optional: true + + '@esbuild/android-arm64@0.25.11': + optional: true + + '@esbuild/android-arm@0.25.11': + optional: true + + '@esbuild/android-x64@0.25.11': + optional: true + + '@esbuild/darwin-arm64@0.25.11': + optional: true + + '@esbuild/darwin-x64@0.25.11': + optional: true + + '@esbuild/freebsd-arm64@0.25.11': + optional: true + + '@esbuild/freebsd-x64@0.25.11': + optional: true + + '@esbuild/linux-arm64@0.25.11': + optional: true + + '@esbuild/linux-arm@0.25.11': + optional: true + + '@esbuild/linux-ia32@0.25.11': + optional: true + + '@esbuild/linux-loong64@0.25.11': + optional: true + + '@esbuild/linux-mips64el@0.25.11': + optional: true + + '@esbuild/linux-ppc64@0.25.11': + optional: true + + '@esbuild/linux-riscv64@0.25.11': + optional: true + + '@esbuild/linux-s390x@0.25.11': + optional: true + + '@esbuild/linux-x64@0.25.11': + optional: true + + '@esbuild/netbsd-arm64@0.25.11': + optional: true + + '@esbuild/netbsd-x64@0.25.11': + optional: true + + '@esbuild/openbsd-arm64@0.25.11': + optional: true + + '@esbuild/openbsd-x64@0.25.11': + optional: true + + '@esbuild/openharmony-arm64@0.25.11': + optional: true + + '@esbuild/sunos-x64@0.25.11': + optional: true + + '@esbuild/win32-arm64@0.25.11': + optional: true + + '@esbuild/win32-ia32@0.25.11': + optional: true + + '@esbuild/win32-x64@0.25.11': + optional: true + '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -5781,6 +6357,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.16': dependencies: '@jridgewell/resolve-uri': 3.1.0 @@ -5854,6 +6432,17 @@ snapshots: optionalDependencies: rollup: 4.0.0-24 + '@rollup/plugin-node-resolve@15.0.0(rollup@4.52.5)': + dependencies: + '@rollup/pluginutils': 4.2.1 + '@types/resolve': 1.20.2 + deepmerge: 4.2.2 + is-builtin-module: 3.2.0 + is-module: 1.0.0 + resolve: 1.22.1 + optionalDependencies: + rollup: 4.52.5 + '@rollup/plugin-typescript@9.0.1(rollup@4.0.0-24)(tslib@2.4.0)(typescript@4.8.4)': dependencies: '@rollup/pluginutils': 4.2.1 @@ -5863,6 +6452,14 @@ snapshots: rollup: 4.0.0-24 tslib: 2.4.0 + '@rollup/plugin-typescript@9.0.1(tslib@2.4.0)(typescript@5.9.3)': + dependencies: + '@rollup/pluginutils': 4.2.1 + resolve: 1.22.1 + typescript: 5.9.3 + optionalDependencies: + tslib: 2.4.0 + '@rollup/plugin-virtual@3.0.0(rollup@4.0.0-24)': optionalDependencies: rollup: 4.0.0-24 @@ -5899,36 +6496,102 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.0.0-24': optional: true + '@rollup/rollup-android-arm-eabi@4.52.5': + optional: true + '@rollup/rollup-android-arm64@4.0.0-24': optional: true + '@rollup/rollup-android-arm64@4.52.5': + optional: true + '@rollup/rollup-darwin-arm64@4.0.0-24': optional: true + '@rollup/rollup-darwin-arm64@4.52.5': + optional: true + '@rollup/rollup-darwin-x64@4.0.0-24': optional: true + '@rollup/rollup-darwin-x64@4.52.5': + optional: true + + '@rollup/rollup-freebsd-arm64@4.52.5': + optional: true + + '@rollup/rollup-freebsd-x64@4.52.5': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.0.0-24': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.0.0-24': optional: true + '@rollup/rollup-linux-arm64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.52.5': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.52.5': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-x64-gnu@4.0.0-24': optional: true + '@rollup/rollup-linux-x64-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-x64-musl@4.0.0-24': optional: true + '@rollup/rollup-linux-x64-musl@4.52.5': + optional: true + + '@rollup/rollup-openharmony-arm64@4.52.5': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.0.0-24': optional: true + '@rollup/rollup-win32-arm64-msvc@4.52.5': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.0.0-24': optional: true + '@rollup/rollup-win32-ia32-msvc@4.52.5': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.5': + optional: true + '@rollup/rollup-win32-x64-msvc@4.0.0-24': optional: true + '@rollup/rollup-win32-x64-msvc@4.52.5': + optional: true + '@sindresorhus/is@4.6.0': {} '@sinonjs/commons@1.8.3': @@ -5947,6 +6610,8 @@ snapshots: '@sinonjs/text-encoding@0.7.2': {} + '@standard-schema/spec@1.0.0': {} + '@swc/core-darwin-arm64@1.3.78': optional: true @@ -6033,11 +6698,18 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 14.18.30 + '@types/node': 20.19.23 '@types/responselike': 1.0.0 + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + '@types/d3-dsv@3.0.0': {} + '@types/deep-eql@4.0.2': {} + '@types/eslint@8.56.12': dependencies: '@types/estree': 1.0.8 @@ -6055,7 +6727,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 14.18.30 + '@types/node': 20.19.23 '@types/minimist@1.2.2': {} @@ -6063,6 +6735,10 @@ snapshots: '@types/node@14.18.31': {} + '@types/node@20.19.23': + dependencies: + undici-types: 6.21.0 + '@types/normalize-package-data@2.4.1': {} '@types/parse-json@4.0.0': {} @@ -6073,7 +6749,7 @@ snapshots: '@types/responselike@1.0.0': dependencies: - '@types/node': 14.18.30 + '@types/node': 20.19.23 '@types/semver@7.3.12': {} @@ -6083,70 +6759,70 @@ snapshots: dependencies: source-map: 0.6.1 - '@typescript-eslint/eslint-plugin@5.39.0(@typescript-eslint/parser@5.39.0(eslint@8.57.1)(typescript@4.8.4))(eslint@8.57.1)(typescript@4.8.4)': + '@typescript-eslint/eslint-plugin@5.39.0(@typescript-eslint/parser@5.39.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/parser': 5.39.0(eslint@8.57.1)(typescript@4.8.4) + '@typescript-eslint/parser': 5.39.0(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/scope-manager': 5.39.0 - '@typescript-eslint/type-utils': 5.39.0(eslint@8.57.1)(typescript@4.8.4) - '@typescript-eslint/utils': 5.39.0(eslint@8.57.1)(typescript@4.8.4) + '@typescript-eslint/type-utils': 5.39.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 5.39.0(eslint@8.57.1)(typescript@5.9.3) debug: 4.3.4 eslint: 8.57.1 ignore: 5.2.0 regexpp: 3.2.0 semver: 7.3.8 - tsutils: 3.21.0(typescript@4.8.4) + tsutils: 3.21.0(typescript@5.9.3) optionalDependencies: - typescript: 4.8.4 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@5.44.0(@typescript-eslint/parser@5.44.0(eslint@8.28.0)(typescript@4.8.4))(eslint@8.28.0)(typescript@4.8.4)': + '@typescript-eslint/eslint-plugin@5.44.0(@typescript-eslint/parser@5.44.0(eslint@8.28.0)(typescript@5.9.3))(eslint@8.28.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/parser': 5.44.0(eslint@8.28.0)(typescript@4.8.4) + '@typescript-eslint/parser': 5.44.0(eslint@8.28.0)(typescript@5.9.3) '@typescript-eslint/scope-manager': 5.44.0 - '@typescript-eslint/type-utils': 5.44.0(eslint@8.28.0)(typescript@4.8.4) - '@typescript-eslint/utils': 5.44.0(eslint@8.28.0)(typescript@4.8.4) + '@typescript-eslint/type-utils': 5.44.0(eslint@8.28.0)(typescript@5.9.3) + '@typescript-eslint/utils': 5.44.0(eslint@8.28.0)(typescript@5.9.3) debug: 4.3.4 eslint: 8.28.0 ignore: 5.2.0 natural-compare-lite: 1.4.0 regexpp: 3.2.0 semver: 7.3.8 - tsutils: 3.21.0(typescript@4.8.4) + tsutils: 3.21.0(typescript@5.9.3) optionalDependencies: - typescript: 4.8.4 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/experimental-utils@5.39.0(eslint@8.28.0)(typescript@4.8.4)': + '@typescript-eslint/experimental-utils@5.39.0(eslint@8.28.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/utils': 5.39.0(eslint@8.28.0)(typescript@4.8.4) + '@typescript-eslint/utils': 5.39.0(eslint@8.28.0)(typescript@5.9.3) eslint: 8.28.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/parser@5.39.0(eslint@8.57.1)(typescript@4.8.4)': + '@typescript-eslint/parser@5.39.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 5.39.0 '@typescript-eslint/types': 5.39.0 - '@typescript-eslint/typescript-estree': 5.39.0(typescript@4.8.4) + '@typescript-eslint/typescript-estree': 5.39.0(typescript@5.9.3) debug: 4.3.4 eslint: 8.57.1 optionalDependencies: - typescript: 4.8.4 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.44.0(eslint@8.28.0)(typescript@4.8.4)': + '@typescript-eslint/parser@5.44.0(eslint@8.28.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 5.44.0 '@typescript-eslint/types': 5.44.0 - '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.8.4) + '@typescript-eslint/typescript-estree': 5.44.0(typescript@5.9.3) debug: 4.3.4 eslint: 8.28.0 optionalDependencies: - typescript: 4.8.4 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -6160,27 +6836,27 @@ snapshots: '@typescript-eslint/types': 5.44.0 '@typescript-eslint/visitor-keys': 5.44.0 - '@typescript-eslint/type-utils@5.39.0(eslint@8.57.1)(typescript@4.8.4)': + '@typescript-eslint/type-utils@5.39.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/typescript-estree': 5.39.0(typescript@4.8.4) - '@typescript-eslint/utils': 5.39.0(eslint@8.57.1)(typescript@4.8.4) + '@typescript-eslint/typescript-estree': 5.39.0(typescript@5.9.3) + '@typescript-eslint/utils': 5.39.0(eslint@8.57.1)(typescript@5.9.3) debug: 4.3.4 eslint: 8.57.1 - tsutils: 3.21.0(typescript@4.8.4) + tsutils: 3.21.0(typescript@5.9.3) optionalDependencies: - typescript: 4.8.4 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@5.44.0(eslint@8.28.0)(typescript@4.8.4)': + '@typescript-eslint/type-utils@5.44.0(eslint@8.28.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.8.4) - '@typescript-eslint/utils': 5.44.0(eslint@8.28.0)(typescript@4.8.4) + '@typescript-eslint/typescript-estree': 5.44.0(typescript@5.9.3) + '@typescript-eslint/utils': 5.44.0(eslint@8.28.0)(typescript@5.9.3) debug: 4.3.4 eslint: 8.28.0 - tsutils: 3.21.0(typescript@4.8.4) + tsutils: 3.21.0(typescript@5.9.3) optionalDependencies: - typescript: 4.8.4 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -6188,7 +6864,7 @@ snapshots: '@typescript-eslint/types@5.44.0': {} - '@typescript-eslint/typescript-estree@5.39.0(typescript@4.8.4)': + '@typescript-eslint/typescript-estree@5.39.0(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 5.39.0 '@typescript-eslint/visitor-keys': 5.39.0 @@ -6196,13 +6872,13 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 - tsutils: 3.21.0(typescript@4.8.4) + tsutils: 3.21.0(typescript@5.9.3) optionalDependencies: - typescript: 4.8.4 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@5.44.0(typescript@4.8.4)': + '@typescript-eslint/typescript-estree@5.44.0(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 5.44.0 '@typescript-eslint/visitor-keys': 5.44.0 @@ -6210,18 +6886,18 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 - tsutils: 3.21.0(typescript@4.8.4) + tsutils: 3.21.0(typescript@5.9.3) optionalDependencies: - typescript: 4.8.4 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.39.0(eslint@8.28.0)(typescript@4.8.4)': + '@typescript-eslint/utils@5.39.0(eslint@8.28.0)(typescript@5.9.3)': dependencies: '@types/json-schema': 7.0.15 '@typescript-eslint/scope-manager': 5.39.0 '@typescript-eslint/types': 5.39.0 - '@typescript-eslint/typescript-estree': 5.39.0(typescript@4.8.4) + '@typescript-eslint/typescript-estree': 5.39.0(typescript@5.9.3) eslint: 8.28.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0(eslint@8.28.0) @@ -6229,12 +6905,12 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@5.39.0(eslint@8.57.1)(typescript@4.8.4)': + '@typescript-eslint/utils@5.39.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@types/json-schema': 7.0.15 '@typescript-eslint/scope-manager': 5.39.0 '@typescript-eslint/types': 5.39.0 - '@typescript-eslint/typescript-estree': 5.39.0(typescript@4.8.4) + '@typescript-eslint/typescript-estree': 5.39.0(typescript@5.9.3) eslint: 8.57.1 eslint-scope: 5.1.1 eslint-utils: 3.0.0(eslint@8.57.1) @@ -6242,13 +6918,13 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@5.44.0(eslint@8.28.0)(typescript@4.8.4)': + '@typescript-eslint/utils@5.44.0(eslint@8.28.0)(typescript@5.9.3)': dependencies: '@types/json-schema': 7.0.15 '@types/semver': 7.3.12 '@typescript-eslint/scope-manager': 5.44.0 '@typescript-eslint/types': 5.44.0 - '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.8.4) + '@typescript-eslint/typescript-estree': 5.44.0(typescript@5.9.3) eslint: 8.28.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0(eslint@8.28.0) @@ -6269,6 +6945,45 @@ snapshots: '@ungap/structured-clone@1.3.0': {} + '@vitest/expect@4.0.2': + dependencies: + '@standard-schema/spec': 1.0.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.2 + '@vitest/utils': 4.0.2 + chai: 6.2.0 + tinyrainbow: 3.0.3 + + '@vitest/mocker@4.0.2(vite@7.1.12(@types/node@20.19.23)(terser@5.17.4))': + dependencies: + '@vitest/spy': 4.0.2 + estree-walker: 3.0.3 + magic-string: 0.30.19 + optionalDependencies: + vite: 7.1.12(@types/node@20.19.23)(terser@5.17.4) + + '@vitest/pretty-format@4.0.2': + dependencies: + tinyrainbow: 3.0.3 + + '@vitest/runner@4.0.2': + dependencies: + '@vitest/utils': 4.0.2 + pathe: 2.0.3 + + '@vitest/snapshot@4.0.2': + dependencies: + '@vitest/pretty-format': 4.0.2 + magic-string: 0.30.19 + pathe: 2.0.3 + + '@vitest/spy@4.0.2': {} + + '@vitest/utils@4.0.2': + dependencies: + '@vitest/pretty-format': 4.0.2 + tinyrainbow: 3.0.3 + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 @@ -6383,6 +7098,8 @@ snapshots: arrify@3.0.0: {} + assertion-error@2.0.1: {} + astral-regex@2.0.0: {} astring@1.8.5: {} @@ -6565,6 +7282,8 @@ snapshots: dependencies: nofilter: 3.1.0 + chai@6.2.0: {} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -6829,6 +7548,10 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decamelize-keys@1.1.0: dependencies: decamelize: 1.2.0 @@ -6973,6 +7696,8 @@ snapshots: string.prototype.trimstart: 1.0.5 unbox-primitive: 1.0.2 + es-module-lexer@1.7.0: {} + es-shim-unscopables@1.0.0: dependencies: has: 1.0.3 @@ -7002,6 +7727,35 @@ snapshots: d: 1.0.1 ext: 1.7.0 + esbuild@0.25.11: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.11 + '@esbuild/android-arm': 0.25.11 + '@esbuild/android-arm64': 0.25.11 + '@esbuild/android-x64': 0.25.11 + '@esbuild/darwin-arm64': 0.25.11 + '@esbuild/darwin-x64': 0.25.11 + '@esbuild/freebsd-arm64': 0.25.11 + '@esbuild/freebsd-x64': 0.25.11 + '@esbuild/linux-arm': 0.25.11 + '@esbuild/linux-arm64': 0.25.11 + '@esbuild/linux-ia32': 0.25.11 + '@esbuild/linux-loong64': 0.25.11 + '@esbuild/linux-mips64el': 0.25.11 + '@esbuild/linux-ppc64': 0.25.11 + '@esbuild/linux-riscv64': 0.25.11 + '@esbuild/linux-s390x': 0.25.11 + '@esbuild/linux-x64': 0.25.11 + '@esbuild/netbsd-arm64': 0.25.11 + '@esbuild/netbsd-x64': 0.25.11 + '@esbuild/openbsd-arm64': 0.25.11 + '@esbuild/openbsd-x64': 0.25.11 + '@esbuild/openharmony-arm64': 0.25.11 + '@esbuild/sunos-x64': 0.25.11 + '@esbuild/win32-arm64': 0.25.11 + '@esbuild/win32-ia32': 0.25.11 + '@esbuild/win32-x64': 0.25.11 + escalade@3.1.1: {} escape-string-regexp@1.0.5: {} @@ -7012,14 +7766,14 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-rollup@3.0.1(typescript@4.8.4): + eslint-config-rollup@3.0.1(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 5.44.0(@typescript-eslint/parser@5.44.0(eslint@8.28.0)(typescript@4.8.4))(eslint@8.28.0)(typescript@4.8.4) - '@typescript-eslint/parser': 5.44.0(eslint@8.28.0)(typescript@4.8.4) + '@typescript-eslint/eslint-plugin': 5.44.0(@typescript-eslint/parser@5.44.0(eslint@8.28.0)(typescript@5.9.3))(eslint@8.28.0)(typescript@5.9.3) + '@typescript-eslint/parser': 5.44.0(eslint@8.28.0)(typescript@5.9.3) eslint: 8.28.0 - eslint-plugin-import: 2.26.0(@typescript-eslint/parser@5.44.0(eslint@8.28.0)(typescript@4.8.4))(eslint@8.28.0) + eslint-plugin-import: 2.26.0(@typescript-eslint/parser@5.44.0(eslint@8.28.0)(typescript@5.9.3))(eslint@8.28.0) eslint-plugin-prettier: 4.2.1(eslint@8.28.0)(prettier@2.8.0) - eslint-plugin-typescript-sort-keys: 2.1.0(@typescript-eslint/parser@5.44.0(eslint@8.28.0)(typescript@4.8.4))(eslint@8.28.0)(typescript@4.8.4) + eslint-plugin-typescript-sort-keys: 2.1.0(@typescript-eslint/parser@5.44.0(eslint@8.28.0)(typescript@5.9.3))(eslint@8.28.0)(typescript@5.9.3) prettier: 2.8.0 prettier-plugin-package: 1.3.0(prettier@2.8.0) transitivePeerDependencies: @@ -7036,17 +7790,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.7.4(@typescript-eslint/parser@5.44.0(eslint@8.28.0)(typescript@4.8.4))(eslint-import-resolver-node@0.3.6)(eslint@8.28.0): + eslint-module-utils@2.7.4(@typescript-eslint/parser@5.44.0(eslint@8.28.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.6)(eslint@8.28.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 5.44.0(eslint@8.28.0)(typescript@4.8.4) + '@typescript-eslint/parser': 5.44.0(eslint@8.28.0)(typescript@5.9.3) eslint: 8.28.0 eslint-import-resolver-node: 0.3.6 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.26.0(@typescript-eslint/parser@5.44.0(eslint@8.28.0)(typescript@4.8.4))(eslint@8.28.0): + eslint-plugin-import@2.26.0(@typescript-eslint/parser@5.44.0(eslint@8.28.0)(typescript@5.9.3))(eslint@8.28.0): dependencies: array-includes: 3.1.5 array.prototype.flat: 1.3.0 @@ -7054,7 +7808,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.28.0 eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.44.0(eslint@8.28.0)(typescript@4.8.4))(eslint-import-resolver-node@0.3.6)(eslint@8.28.0) + eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.44.0(eslint@8.28.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.6)(eslint@8.28.0) has: 1.0.3 is-core-module: 2.10.0 is-glob: 4.0.3 @@ -7063,7 +7817,7 @@ snapshots: resolve: 1.22.1 tsconfig-paths: 3.14.1 optionalDependencies: - '@typescript-eslint/parser': 5.44.0(eslint@8.28.0)(typescript@4.8.4) + '@typescript-eslint/parser': 5.44.0(eslint@8.28.0)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -7075,14 +7829,14 @@ snapshots: prettier: 2.8.0 prettier-linter-helpers: 1.0.0 - eslint-plugin-typescript-sort-keys@2.1.0(@typescript-eslint/parser@5.44.0(eslint@8.28.0)(typescript@4.8.4))(eslint@8.28.0)(typescript@4.8.4): + eslint-plugin-typescript-sort-keys@2.1.0(@typescript-eslint/parser@5.44.0(eslint@8.28.0)(typescript@5.9.3))(eslint@8.28.0)(typescript@5.9.3): dependencies: - '@typescript-eslint/experimental-utils': 5.39.0(eslint@8.28.0)(typescript@4.8.4) - '@typescript-eslint/parser': 5.44.0(eslint@8.28.0)(typescript@4.8.4) + '@typescript-eslint/experimental-utils': 5.39.0(eslint@8.28.0)(typescript@5.9.3) + '@typescript-eslint/parser': 5.44.0(eslint@8.28.0)(typescript@5.9.3) eslint: 8.28.0 json-schema: 0.4.0 natural-compare-lite: 1.4.0 - typescript: 4.8.4 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -7295,6 +8049,10 @@ snapshots: estree-walker@2.0.2: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.0 + esutils@2.0.3: {} eventemitter3@4.0.7: {} @@ -7311,6 +8069,8 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + expect-type@1.2.2: {} + ext@1.7.0: dependencies: type: 2.7.2 @@ -7343,6 +8103,10 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + figures@4.0.1: dependencies: escape-string-regexp: 5.0.0 @@ -7939,6 +8703,10 @@ snapshots: dependencies: sourcemap-codec: 1.4.8 + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.3: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -8064,6 +8832,8 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 + nanoid@3.3.11: {} + nanoid@3.3.4: {} natural-compare-lite@1.4.0: {} @@ -8292,12 +9062,18 @@ snapshots: pathe@2.0.2: {} + pathe@2.0.3: {} + picocolors@1.0.0: {} + picocolors@1.1.1: {} + picomatch@2.3.1: {} picomatch@4.0.2: {} + picomatch@4.0.3: {} + pify@4.0.1: {} pify@5.0.0: {} @@ -8365,13 +9141,13 @@ snapshots: dependencies: postcss: 8.4.17 - postcss-load-config@3.1.4(postcss@8.4.17)(ts-node@10.9.1(@swc/core@1.3.78)(@types/node@14.18.30)(typescript@4.8.4)): + postcss-load-config@3.1.4(postcss@8.4.17)(ts-node@10.9.1(@swc/core@1.3.78)(@types/node@20.19.23)(typescript@4.8.4)): dependencies: lilconfig: 2.0.6 yaml: 1.10.2 optionalDependencies: postcss: 8.4.17 - ts-node: 10.9.1(@swc/core@1.3.78)(@types/node@14.18.30)(typescript@4.8.4) + ts-node: 10.9.1(@swc/core@1.3.78)(@types/node@20.19.23)(typescript@4.8.4) postcss-merge-longhand@5.1.6(postcss@8.4.17): dependencies: @@ -8531,6 +9307,12 @@ snapshots: picocolors: 1.0.0 source-map-js: 1.0.2 + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: @@ -8715,7 +9497,7 @@ snapshots: dependencies: glob: 7.2.3 - rollup-plugin-postcss@4.0.2(postcss@8.4.17)(ts-node@10.9.1(@swc/core@1.3.78)(@types/node@14.18.30)(typescript@4.8.4)): + rollup-plugin-postcss@4.0.2(postcss@8.4.17)(ts-node@10.9.1(@swc/core@1.3.78)(@types/node@20.19.23)(typescript@4.8.4)): dependencies: chalk: 4.1.2 concat-with-sourcemaps: 1.1.0 @@ -8724,7 +9506,7 @@ snapshots: p-queue: 6.6.2 pify: 5.0.0 postcss: 8.4.17 - postcss-load-config: 3.1.4(postcss@8.4.17)(ts-node@10.9.1(@swc/core@1.3.78)(@types/node@14.18.30)(typescript@4.8.4)) + postcss-load-config: 3.1.4(postcss@8.4.17)(ts-node@10.9.1(@swc/core@1.3.78)(@types/node@20.19.23)(typescript@4.8.4)) postcss-modules: 4.3.1(postcss@8.4.17) promise.series: 0.2.0 resolve: 1.22.1 @@ -8753,6 +9535,34 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.0.0-24 fsevents: 2.3.3 + rollup@4.52.5: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.5 + '@rollup/rollup-android-arm64': 4.52.5 + '@rollup/rollup-darwin-arm64': 4.52.5 + '@rollup/rollup-darwin-x64': 4.52.5 + '@rollup/rollup-freebsd-arm64': 4.52.5 + '@rollup/rollup-freebsd-x64': 4.52.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 + '@rollup/rollup-linux-arm64-musl': 4.52.5 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 + '@rollup/rollup-linux-x64-gnu': 4.52.5 + '@rollup/rollup-linux-x64-musl': 4.52.5 + '@rollup/rollup-openharmony-arm64': 4.52.5 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 + '@rollup/rollup-win32-x64-gnu': 4.52.5 + '@rollup/rollup-win32-x64-msvc': 4.52.5 + fsevents: 2.3.3 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -8813,6 +9623,8 @@ snapshots: get-intrinsic: 1.1.3 object-inspect: 1.12.2 + siginfo@2.0.0: {} + signal-exit@3.0.7: {} sinon@14.0.1: @@ -8855,6 +9667,8 @@ snapshots: source-map-js@1.0.2: {} + source-map-js@1.2.1: {} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -8901,6 +9715,10 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + stackback@0.0.2: {} + + std-env@3.10.0: {} + string-argv@0.3.1: {} string-capitalize@1.0.1: {} @@ -9044,11 +9862,22 @@ snapshots: time-zone@1.0.0: {} + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + tinyglobby@0.2.14: dependencies: fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinyrainbow@3.0.3: {} + to-fast-properties@2.0.0: {} to-regex-range@5.0.1: @@ -9063,14 +9892,14 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.1(@swc/core@1.3.78)(@types/node@14.18.30)(typescript@4.8.4): + ts-node@10.9.1(@swc/core@1.3.78)(@types/node@20.19.23)(typescript@4.8.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 14.18.30 + '@types/node': 20.19.23 acorn: 8.8.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -9082,6 +9911,27 @@ snapshots: yn: 3.1.1 optionalDependencies: '@swc/core': 1.3.78 + optional: true + + ts-node@10.9.1(@swc/core@1.3.78)(@types/node@20.19.23)(typescript@5.9.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 20.19.23 + acorn: 8.8.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.3.78 tsconfig-paths@3.14.1: dependencies: @@ -9094,10 +9944,10 @@ snapshots: tslib@2.4.0: {} - tsutils@3.21.0(typescript@4.8.4): + tsutils@3.21.0(typescript@5.9.3): dependencies: tslib: 1.14.1 - typescript: 4.8.4 + typescript: 5.9.3 type-check@0.4.0: dependencies: @@ -9131,6 +9981,8 @@ snapshots: typescript@4.8.4: {} + typescript@5.9.3: {} + ufo@1.5.4: {} unbox-primitive@1.0.2: @@ -9140,6 +9992,8 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 + undici-types@6.21.0: {} + unicode-canonical-property-names-ecmascript@1.0.4: {} unicode-canonical-property-names-ecmascript@2.0.0: {} @@ -9183,6 +10037,57 @@ snapshots: spdx-correct: 3.1.1 spdx-expression-parse: 3.0.1 + vite@7.1.12(@types/node@20.19.23)(terser@5.17.4): + dependencies: + esbuild: 0.25.11 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.5 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 20.19.23 + fsevents: 2.3.3 + terser: 5.17.4 + + vitest@4.0.2(@types/node@20.19.23)(terser@5.17.4): + dependencies: + '@vitest/expect': 4.0.2 + '@vitest/mocker': 4.0.2(vite@7.1.12(@types/node@20.19.23)(terser@5.17.4)) + '@vitest/pretty-format': 4.0.2 + '@vitest/runner': 4.0.2 + '@vitest/snapshot': 4.0.2 + '@vitest/spy': 4.0.2 + '@vitest/utils': 4.0.2 + debug: 4.4.3 + es-module-lexer: 1.7.0 + expect-type: 1.2.2 + magic-string: 0.30.19 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.1.12(@types/node@20.19.23)(terser@5.17.4) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.19.23 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + well-known-symbols@2.0.0: {} which-boxed-primitive@1.0.2: @@ -9199,6 +10104,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + word-wrap@1.2.3: {} word-wrap@1.2.5: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 18ec407ef..c1c7cb59f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,2 +1,9 @@ packages: - 'packages/*' + +# Align critical tooling versions across the workspace. +# With the default catalog, packages can declare e.g.: +# "typescript": "catalog:" +# and resolve to the range below. +catalog: + typescript: ^5.9.3