From b13e35473ea6ae8acfef5f9b262c9770de4336a1 Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Sun, 13 Oct 2024 13:15:46 +0200 Subject: [PATCH] Add tets for index, report, and utils files --- .gitignore | 1 + packages/sonda/package.json | 4 + packages/sonda/src/utils.ts | 12 +- .../sonda/tests/fixtures/detailed/index.js | 2 + .../tests/fixtures/detailed/index.js.map | 1 + .../tests/fixtures/detailed/src/maths.js | 2 + .../tests/fixtures/detailed/src/maths.js.map | 1 + .../sonda/tests/fixtures/hasMapping/index.css | 5 + .../tests/fixtures/hasMapping/index.css.map | 1 + .../sonda/tests/fixtures/hasMapping/index.js | 2 + .../tests/fixtures/hasMapping/index.js.map | 1 + .../sonda/tests/fixtures/noMapping/index.js | 3 + packages/sonda/tests/index.test.ts | 20 + packages/sonda/tests/report.test.ts | 328 +++++++++++++ packages/sonda/tests/utils.test.ts | 68 +++ pnpm-lock.yaml | 460 +++++++++++++++++- 16 files changed, 877 insertions(+), 34 deletions(-) create mode 100644 packages/sonda/tests/fixtures/detailed/index.js create mode 100644 packages/sonda/tests/fixtures/detailed/index.js.map create mode 100644 packages/sonda/tests/fixtures/detailed/src/maths.js create mode 100644 packages/sonda/tests/fixtures/detailed/src/maths.js.map create mode 100644 packages/sonda/tests/fixtures/hasMapping/index.css create mode 100644 packages/sonda/tests/fixtures/hasMapping/index.css.map create mode 100644 packages/sonda/tests/fixtures/hasMapping/index.js create mode 100644 packages/sonda/tests/fixtures/hasMapping/index.js.map create mode 100644 packages/sonda/tests/fixtures/noMapping/index.js create mode 100644 packages/sonda/tests/index.test.ts create mode 100644 packages/sonda/tests/report.test.ts create mode 100644 packages/sonda/tests/utils.test.ts diff --git a/.gitignore b/.gitignore index e1b08a3..15a66bb 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ node_modules dist +coverage package-lock.json sonda-report.* diff --git a/packages/sonda/package.json b/packages/sonda/package.json index 9956fdd..15f3144 100644 --- a/packages/sonda/package.json +++ b/packages/sonda/package.json @@ -34,6 +34,8 @@ "CHANGELOG.md" ], "scripts": { + "test": "vitest", + "test:coverage": "vitest run --coverage", "prepack": "pnpm run build && clean-package -rm devDependencies scripts", "build:load-source-map": "cd ../load-source-map && pnpm run build", "build:html": "cd ../html-report && pnpm run build", @@ -46,9 +48,11 @@ "open": "^10.1.0" }, "devDependencies": { + "@vitest/coverage-v8": "2.1.2", "esbuild": "^0.23.1", "load-source-map": "workspace:^*", "rollup": "^4.24.0", + "vitest": "^2.1.2", "webpack": "^5.89.0" } } diff --git a/packages/sonda/src/utils.ts b/packages/sonda/src/utils.ts index cfb25ba..344d2a5 100644 --- a/packages/sonda/src/utils.ts +++ b/packages/sonda/src/utils.ts @@ -1,8 +1,6 @@ -import { relative, posix, sep } from 'path'; +import path from 'path'; import type { Options } from './types'; -const cwd = /* #__PURE__ */ process.cwd(); - export function normalizeOptions( options?: Partial ) { const defaultOptions: Options = { open: true, @@ -15,13 +13,13 @@ export function normalizeOptions( options?: Partial ) { return Object.assign( {}, defaultOptions, options ) as Options; } -export function normalizePath( path: string ): string { +export function normalizePath( pathToNormalize: string ): string { // Unicode escape sequences used by Rollup and Vite to identify virtual modules - const normalized = path.replace( /^\0/, '' ) + const normalized = pathToNormalize.replace( /^\0/, '' ) // Transform absolute paths to relative paths - const relativized = relative( cwd, normalized ); + const relativized = path.relative( process.cwd(), normalized ); // Ensure paths are POSIX-compliant - https://stackoverflow.com/a/63251716/4617687 - return relativized.replaceAll( sep, posix.sep ); + return relativized.replaceAll( path.win32.sep, path.posix.sep ); } diff --git a/packages/sonda/tests/fixtures/detailed/index.js b/packages/sonda/tests/fixtures/detailed/index.js new file mode 100644 index 0000000..d70989b --- /dev/null +++ b/packages/sonda/tests/fixtures/detailed/index.js @@ -0,0 +1,2 @@ +function n(n,t){return n**t}function t(n,t){return n+t}function r(n,t){return n-t}function u(n,t){return n/t}function i(n,t){return n*t}export{t as add,u as divide,i as multiply,n as pow,r as substract}; +//# sourceMappingURL=index.js.map diff --git a/packages/sonda/tests/fixtures/detailed/index.js.map b/packages/sonda/tests/fixtures/detailed/index.js.map new file mode 100644 index 0000000..4e1c719 --- /dev/null +++ b/packages/sonda/tests/fixtures/detailed/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sources":["src/pow.js","src/maths.js"],"sourcesContent":["export function pow(base, exponent) {\n\t\treturn base ** exponent;\n}\n","function n(n,r){return n+r}function r(n,r){return n-r}function t(n,r){return n/r}function u(n,r){return n*r}export{n as add,t as divide,u as multiply,r as substract};\n//# sourceMappingURL=maths.js.map\n"],"names":["pow","base","exponent","n","r","t","u"],"mappings":"AAAO,SAASA,EAAIC,EAAMC,GACxB,OAAOD,GAAQC,CACjB,CCFA,SAASC,EAAEA,EAAEC,GAAG,OAAOD,EAAEC,CAAC,CAAC,SAASA,EAAED,EAAEC,GAAG,OAAOD,EAAEC,CAAC,CAAC,SAASC,EAAEF,EAAEC,GAAG,OAAOD,EAAEC,CAAC,CAAC,SAASE,EAAEH,EAAEC,GAAG,OAAOD,EAAEC,CAAC"} diff --git a/packages/sonda/tests/fixtures/detailed/src/maths.js b/packages/sonda/tests/fixtures/detailed/src/maths.js new file mode 100644 index 0000000..168b400 --- /dev/null +++ b/packages/sonda/tests/fixtures/detailed/src/maths.js @@ -0,0 +1,2 @@ +function n(n,r){return n+r}function r(n,r){return n-r}function t(n,r){return n/r}function u(n,r){return n*r}export{n as add,t as divide,u as multiply,r as substract}; +//# sourceMappingURL=maths.js.map diff --git a/packages/sonda/tests/fixtures/detailed/src/maths.js.map b/packages/sonda/tests/fixtures/detailed/src/maths.js.map new file mode 100644 index 0000000..103401e --- /dev/null +++ b/packages/sonda/tests/fixtures/detailed/src/maths.js.map @@ -0,0 +1 @@ +{"version":3,"file":"maths.js","sources":["../src/add.js","../src/substract.js","../src/divide.js","../src/multiply.js"],"sourcesContent":["export function add( a, b ) {\n\treturn a + b;\n}\n","export function substract( a, b ) {\n\treturn a - b;\n}\n","export function divide( a, b ) {\n\treturn a / b;\n}\n","export function multiply( a, b ) {\n\treturn a * b;\n}\n"],"names":["add","a","b","substract","divide","multiply"],"mappings":"AAAO,SAASA,EAAKC,EAAGC,GACvB,OAAOD,EAAIC,CACZ,CCFO,SAASC,EAAWF,EAAGC,GAC7B,OAAOD,EAAIC,CACZ,CCFO,SAASE,EAAQH,EAAGC,GAC1B,OAAOD,EAAIC,CACZ,CCFO,SAASG,EAAUJ,EAAGC,GAC5B,OAAOD,EAAIC,CACZ"} \ No newline at end of file diff --git a/packages/sonda/tests/fixtures/hasMapping/index.css b/packages/sonda/tests/fixtures/hasMapping/index.css new file mode 100644 index 0000000..13ff2e4 --- /dev/null +++ b/packages/sonda/tests/fixtures/hasMapping/index.css @@ -0,0 +1,5 @@ +div { + color: red; +} + +/*# sourceMappingURL=index.css.map */ diff --git a/packages/sonda/tests/fixtures/hasMapping/index.css.map b/packages/sonda/tests/fixtures/hasMapping/index.css.map new file mode 100644 index 0000000..71420f4 --- /dev/null +++ b/packages/sonda/tests/fixtures/hasMapping/index.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["src/styles.css"],"names":[],"mappings":"AAAA;CACC,UAAU;AACX","file":"index.css","sourcesContent":["div {\n\tcolor: red;\n}\n"]} diff --git a/packages/sonda/tests/fixtures/hasMapping/index.js b/packages/sonda/tests/fixtures/hasMapping/index.js new file mode 100644 index 0000000..21d3faf --- /dev/null +++ b/packages/sonda/tests/fixtures/hasMapping/index.js @@ -0,0 +1,2 @@ +function n(n,r){return n+r}export{n as sum}; +//# sourceMappingURL=index.js.map diff --git a/packages/sonda/tests/fixtures/hasMapping/index.js.map b/packages/sonda/tests/fixtures/hasMapping/index.js.map new file mode 100644 index 0000000..17c46cf --- /dev/null +++ b/packages/sonda/tests/fixtures/hasMapping/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sources":["src/index.js"],"sourcesContent":["import './styles.css';\n\nexport function sum( a, b ) {\n\t\treturn a + b;\n}\n"],"names":["sum","a","b"],"mappings":"AAEO,SAASA,EAAKC,EAAGC,GACtB,OAAOD,EAAIC,CACb"} diff --git a/packages/sonda/tests/fixtures/noMapping/index.js b/packages/sonda/tests/fixtures/noMapping/index.js new file mode 100644 index 0000000..241efe6 --- /dev/null +++ b/packages/sonda/tests/fixtures/noMapping/index.js @@ -0,0 +1,3 @@ +export function sum( a, b ) { + return a + b; +} diff --git a/packages/sonda/tests/index.test.ts b/packages/sonda/tests/index.test.ts new file mode 100644 index 0000000..399fc90 --- /dev/null +++ b/packages/sonda/tests/index.test.ts @@ -0,0 +1,20 @@ +import { describe, it, expect } from 'vitest'; +import { + SondaEsbuildPlugin, + SondaRollupPlugin, + SondaWebpackPlugin, +} from '../src/index'; + +describe('index.ts', () => { + it( 'exports SondaEsbuildPlugin', () => { + expect( SondaEsbuildPlugin ).toBeDefined(); + } ); + + it( 'exports SondaRollupPlugin', () => { + expect( SondaRollupPlugin ).toBeDefined(); + } ); + + it( 'exports SondaWebpackPlugin', () => { + expect( SondaWebpackPlugin ).toBeDefined(); + } ); +} ); diff --git a/packages/sonda/tests/report.test.ts b/packages/sonda/tests/report.test.ts new file mode 100644 index 0000000..0fec31c --- /dev/null +++ b/packages/sonda/tests/report.test.ts @@ -0,0 +1,328 @@ +import { vi, describe, it, expect } from 'vitest'; +import { generateJsonReport, generateHtmlReport } from '../src/report'; +import { normalizeOptions } from '../src/utils'; +import { join } from 'path'; +import type { ReportInput } from '../src'; + +vi.spyOn( process, 'cwd' ).mockImplementation( () => import.meta.dirname ); + +const defaultOptions = normalizeOptions(); + +describe( 'report.ts', () => { + describe( 'generateJsonReport', () => { + it( 'should return report in JSON format', () => { + expect( generateJsonReport( [], {}, defaultOptions ) ).toEqual( { + inputs: {}, + outputs: {}, + } ); + } ); + + it( 'passes provided #inputs', () => { + const inputs = { + test: { + bytes: 42, + format: 'esm', + imports: [], + belongsTo: null, + } satisfies ReportInput + }; + + expect( generateJsonReport( [], inputs, defaultOptions ) ).toEqual( { + inputs, + outputs: {}, + } ); + } ); + + it( 'ignores source maps in #assets', () => { + const assets = [ 'file.js.map' ]; + + expect( generateJsonReport( assets, {}, defaultOptions ) ).toEqual( { + inputs: {}, + outputs: {}, + } ); + } ); + + it( 'ignores files without sourceMappingURL', () => { + const assets = [ join( import.meta.dirname, 'fixtures/noMapping/index.js' ) ]; + + expect( generateJsonReport( assets, {}, defaultOptions ) ).toEqual( { + inputs: {}, + outputs: {}, + } ); + } ); + + it( 'processes JavaScript files with sourceMappingURL', () => { + const assets = [ join( import.meta.dirname, 'fixtures/hasMapping/index.js' ) ]; + + expect( generateJsonReport( assets, {}, defaultOptions ) ).toEqual( { + inputs: {}, + outputs: { + 'fixtures/hasMapping/index.js': { + brotli: 0, + gzip: 0, + uncompressed: 79, + inputs: { + '[unassigned]': { + brotli: 0, + gzip: 0, + uncompressed: 34 // Length of the sourceMappingURL comment + }, + 'fixtures/hasMapping/src/index.js': { + brotli: 0, + gzip: 0, + uncompressed: 45 + } + } + } + }, + } ); + } ); + + it( 'processes CSS files with sourceMappingURL', () => { + const assets = [ join( import.meta.dirname, 'fixtures/hasMapping/index.css' ) ]; + + expect( generateJsonReport( assets, {}, defaultOptions ) ).toEqual( { + inputs: {}, + outputs: { + 'fixtures/hasMapping/index.css': { + brotli: 0, + gzip: 0, + uncompressed: 60, + inputs: { + '[unassigned]': { + brotli: 0, + gzip: 0, + uncompressed: 40 // Length of the sourceMappingURL comment + }, + 'fixtures/hasMapping/src/styles.css': { + brotli: 0, + gzip: 0, + uncompressed: 20 + } + } + } + } + } ); + } ); + + it( 'calculates Brotli and GZIP when their options are enabled', () => { + const assets = [ join( import.meta.dirname, 'fixtures/hasMapping/index.js' ) ]; + const options = normalizeOptions( { brotli: true, gzip: true } ); + + expect( generateJsonReport( assets, {}, options ) ).toEqual( { + inputs: {}, + outputs: { + 'fixtures/hasMapping/index.js': { + brotli: 71, + gzip: 99, + uncompressed: 79, + inputs: { + '[unassigned]': { + brotli: 31, + gzip: 45, + uncompressed: 34 // Length of the sourceMappingURL comment + }, + 'fixtures/hasMapping/src/index.js': { + brotli: 40, + gzip: 54, + uncompressed: 45 + } + } + } + }, + } ); + } ); + + it( 'doesnt read existing source maps by default', () => { + const assets = [ join( import.meta.dirname, 'fixtures/detailed/index.js' ) ]; + + expect( generateJsonReport( assets, {}, normalizeOptions() ) ).toEqual( { + inputs: {}, + outputs: { + 'fixtures/detailed/index.js': { + brotli: 0, + gzip: 0, + uncompressed: 238, + inputs: { + '[unassigned]': { + brotli: 0, + gzip: 0, + uncompressed: 34 // Length of the sourceMappingURL comment + }, + 'fixtures/detailed/src/maths.js': { + brotli: 0, + gzip: 0, + uncompressed: 176 + }, + 'fixtures/detailed/src/pow.js': { + brotli: 0, + gzip: 0, + uncompressed: 28 + } + } + } + } + } ); + } ); + + it( 'populates #inputs and #outputs with files from sources when `detailed` option is enabled', () => { + const assets = [ join( import.meta.dirname, 'fixtures/detailed/index.js' ) ]; + const options = normalizeOptions( { detailed: true } ); + + expect( generateJsonReport( assets, {}, options ) ).toEqual( { + inputs: { + 'fixtures/detailed/src/add.js': { + belongsTo: 'fixtures/detailed/src/maths.js', + bytes: 47, + format: 'unknown', + imports: [], + }, + 'fixtures/detailed/src/divide.js': { + belongsTo: 'fixtures/detailed/src/maths.js', + bytes: 50, + format: 'unknown', + imports: [], + }, + 'fixtures/detailed/src/multiply.js': { + belongsTo: 'fixtures/detailed/src/maths.js', + bytes: 52, + format: 'unknown', + imports: [], + }, + 'fixtures/detailed/src/substract.js': { + belongsTo: 'fixtures/detailed/src/maths.js', + bytes: 53, + format: 'unknown', + imports: [], + }, + }, + outputs: { + 'fixtures/detailed/index.js': { + brotli: 0, + gzip: 0, + uncompressed: 238, + inputs: { + '[unassigned]': { + brotli: 0, + gzip: 0, + uncompressed: 34 // Length of the sourceMappingURL comment + }, + 'fixtures/detailed/src/add.js': { + brotli: 0, + gzip: 0, + uncompressed: 27 + }, + 'fixtures/detailed/src/divide.js': { + brotli: 0, + gzip: 0, + uncompressed: 27 + }, + 'fixtures/detailed/src/multiply.js': { + brotli: 0, + gzip: 0, + uncompressed: 95 + }, + 'fixtures/detailed/src/pow.js': { + brotli: 0, + gzip: 0, + uncompressed: 28 + }, + 'fixtures/detailed/src/substract.js': { + brotli: 0, + gzip: 0, + uncompressed: 27 + } + } + } + } + } ); + } ); + + it( 'uses parent bundle format as formats for #inputs', () => { + const assets = [ join( import.meta.dirname, 'fixtures/detailed/index.js' ) ]; + const inputs = { + 'fixtures/detailed/src/maths.js': { + bytes: 176, + format: 'esm', + imports: [], + belongsTo: null, + } + } satisfies Record; + const options = normalizeOptions( { detailed: true } ); + + expect( generateJsonReport( assets, inputs, options ) ).toEqual( { + inputs: { + 'fixtures/detailed/src/add.js': { + belongsTo: 'fixtures/detailed/src/maths.js', + bytes: 47, + format: 'esm', + imports: [], + }, + 'fixtures/detailed/src/divide.js': { + belongsTo: 'fixtures/detailed/src/maths.js', + bytes: 50, + format: 'esm', + imports: [], + }, + 'fixtures/detailed/src/maths.js': { + bytes: 176, + format: 'esm', + imports: [], + belongsTo: null, + }, + 'fixtures/detailed/src/multiply.js': { + belongsTo: 'fixtures/detailed/src/maths.js', + bytes: 52, + format: 'esm', + imports: [], + }, + 'fixtures/detailed/src/substract.js': { + belongsTo: 'fixtures/detailed/src/maths.js', + bytes: 53, + format: 'esm', + imports: [], + }, + }, + outputs: { + 'fixtures/detailed/index.js': { + brotli: 0, + gzip: 0, + uncompressed: 238, + inputs: { + '[unassigned]': { + brotli: 0, + gzip: 0, + uncompressed: 34 // Length of the sourceMappingURL comment + }, + 'fixtures/detailed/src/add.js': { + brotli: 0, + gzip: 0, + uncompressed: 27 + }, + 'fixtures/detailed/src/divide.js': { + brotli: 0, + gzip: 0, + uncompressed: 27 + }, + 'fixtures/detailed/src/multiply.js': { + brotli: 0, + gzip: 0, + uncompressed: 95 + }, + 'fixtures/detailed/src/pow.js': { + brotli: 0, + gzip: 0, + uncompressed: 28 + }, + 'fixtures/detailed/src/substract.js': { + brotli: 0, + gzip: 0, + uncompressed: 27 + } + } + } + } + } ); + } ); + } ); +} ); diff --git a/packages/sonda/tests/utils.test.ts b/packages/sonda/tests/utils.test.ts new file mode 100644 index 0000000..c69f887 --- /dev/null +++ b/packages/sonda/tests/utils.test.ts @@ -0,0 +1,68 @@ +import { vi, describe, it, expect } from 'vitest'; +import { normalizeOptions, normalizePath } from '../src/utils'; +import path from 'path'; + +describe('utils.ts', () => { + describe( 'normalizeOptions', () => { + it( 'should return default options when no options are provided', () => { + expect( normalizeOptions() ).toEqual( { + open: true, + format: 'html', + detailed: false, + gzip: false, + brotli: false, + } ); + }); + + it( 'merges defaults with provided values', () => { + expect( normalizeOptions( { format: 'json' } ) ).toEqual( { + open: true, + format: 'json', + detailed: false, + gzip: false, + brotli: false, + } ); + } ); + + it( 'allows overriding all options', () => { + expect( normalizeOptions( { + open: false, + format: 'json', + detailed: true, + gzip: true, + brotli: true, + } ) ).toEqual( { + open: false, + format: 'json', + detailed: true, + gzip: true, + brotli: true, + } ); + } ) + } ); + + describe( 'normalizePath', () => { + it( 'should transform absolute paths to relative paths in POSIX format', () => { + const relativePath = 'src/subfolder/file.ts'; + const absolutePath = path.join( process.cwd(), relativePath ); + + expect( normalizePath( absolutePath ) ).toBe( relativePath ); + } ); + + it( 'removes unicode escape sequence used by virtual modules in Rollup and Vite', () => { + const relativePath = 'src/subfolder/file.ts'; + const absolutePath = path.join( process.cwd(), relativePath ); + + expect( normalizePath( '\0' + absolutePath ) ).toBe( 'src/subfolder/file.ts' ); + } ); + + it( 'should transform Windows paths to POSIX format', () => { + const absolutePath = 'C:\\Users\\Test\\Project\\src\\subfolder\\file.ts'; + + vi.spyOn( path, 'relative').mockImplementationOnce( path.win32.relative ); + vi.spyOn( process, 'cwd' ).mockImplementationOnce( () => 'C:\\Users\\Test\\Project' ); + + expect( normalizePath( absolutePath ) ).toBe( 'src/subfolder/file.ts' ); + } ); + } ); +} ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 46b3a93..6823177 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -95,6 +95,9 @@ importers: specifier: ^10.1.0 version: 10.1.0 devDependencies: + '@vitest/coverage-v8': + specifier: 2.1.2 + version: 2.1.2(vitest@2.1.2(@types/node@22.7.4)(lightningcss@1.27.0)(terser@5.33.0)) esbuild: specifier: ^0.23.1 version: 0.23.1 @@ -104,9 +107,12 @@ importers: rollup: specifier: ^4.24.0 version: 4.24.0 + vitest: + specifier: ^2.1.2 + version: 2.1.2(@types/node@22.7.4)(lightningcss@1.27.0)(terser@5.33.0) webpack: specifier: ^5.89.0 - version: 5.94.0(esbuild@0.23.1) + version: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1) packages/unplugin-sourcemaps: dependencies: @@ -182,7 +188,7 @@ importers: devDependencies: '@rspack/cli': specifier: ^1.0.10 - version: 1.0.10(@rspack/core@1.0.8(@swc/helpers@0.5.13))(@types/express@4.17.21)(webpack@5.94.0) + version: 1.0.10(@rspack/core@1.0.8(@swc/helpers@0.5.13))(@types/express@4.17.21)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))) sonda: specifier: workspace:^* version: link:../../packages/sonda @@ -263,18 +269,38 @@ packages: resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.25.7': + resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.24.7': resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.7': + resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} + engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.7': resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} + '@babel/parser@7.25.8': + resolution: {integrity: sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/runtime@7.25.7': resolution: {integrity: sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==} engines: {node: '>=6.9.0'} + '@babel/types@7.25.8': + resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@changesets/apply-release-plan@7.0.5': resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} @@ -797,6 +823,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -1347,6 +1377,45 @@ packages: '@types/ws@8.5.12': resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} + '@vitest/coverage-v8@2.1.2': + resolution: {integrity: sha512-b7kHrFrs2urS0cOk5N10lttI8UdJ/yP3nB4JYTREvR5o18cR99yPpK4gK8oQgI42BVv0ILWYUSYB7AXkAUDc0g==} + peerDependencies: + '@vitest/browser': 2.1.2 + vitest: 2.1.2 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@2.1.2': + resolution: {integrity: sha512-FEgtlN8mIUSEAAnlvn7mP8vzaWhEaAEvhSXCqrsijM7K6QqjB11qoRZYEd4AKSCDz8p0/+yH5LzhZ47qt+EyPg==} + + '@vitest/mocker@2.1.2': + resolution: {integrity: sha512-ExElkCGMS13JAJy+812fw1aCv2QO/LBK6CyO4WOPAzLTmve50gydOlWhgdBJPx2ztbADUq3JVI0C5U+bShaeEA==} + peerDependencies: + '@vitest/spy': 2.1.2 + msw: ^2.3.5 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.2': + resolution: {integrity: sha512-FIoglbHrSUlOJPDGIrh2bjX1sNars5HbxlcsFKCtKzu4+5lpsRhOCVcuzp0fEhAGHkPZRIXVNzPcpSlkoZ3LuA==} + + '@vitest/runner@2.1.2': + resolution: {integrity: sha512-UCsPtvluHO3u7jdoONGjOSil+uON5SSvU9buQh3lP7GgUXHp78guN1wRmZDX4wGK6J10f9NUtP6pO+SFquoMlw==} + + '@vitest/snapshot@2.1.2': + resolution: {integrity: sha512-xtAeNsZ++aRIYIUsek7VHzry/9AcxeULlegBvsdLncLmNCR6tR8SRjn8BbDP4naxtccvzTqZ+L1ltZlRCfBZFA==} + + '@vitest/spy@2.1.2': + resolution: {integrity: sha512-GSUi5zoy+abNRJwmFhBDC0yRuVUn8WMlQscvnbbXdKLXX9dE59YbfwXxuJ/mth6eeqIzofU8BB5XDo/Ns/qK2A==} + + '@vitest/utils@2.1.2': + resolution: {integrity: sha512-zMO2KdYy6mx56btx9JvAqAZ6EyS3g49krMPPrgOp1yxGZiA93HumGk+bZ5jIZtOg5/VBYl5eBmGRQHqq4FG6uQ==} + '@webassemblyjs/ast@1.12.1': resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} @@ -1523,6 +1592,10 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} @@ -1605,6 +1678,10 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -1629,6 +1706,10 @@ packages: caniuse-lite@1.0.30001660: resolution: {integrity: sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==} + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -1640,6 +1721,10 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1856,6 +1941,10 @@ packages: resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} engines: {node: '>=14.16'} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -2072,6 +2161,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==} + etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -2485,6 +2577,22 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -2635,6 +2743,9 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + loupe@3.1.2: + resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -2647,6 +2758,13 @@ packages: magic-string@0.30.11: resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + marked@4.0.12: resolution: {integrity: sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==} engines: {node: '>= 12'} @@ -2953,6 +3071,10 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + picocolors@1.1.0: resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} @@ -3455,6 +3577,9 @@ packages: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -3524,6 +3649,9 @@ packages: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -3532,6 +3660,9 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} @@ -3687,6 +3818,10 @@ packages: engines: {node: '>=10'} hasBin: true + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -3703,14 +3838,36 @@ packages: thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.0: + resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + tinyglobby@0.2.6: resolution: {integrity: sha512-NbBoFBpqfcgd1tCiO8Lkfdk+xrA7mlLR9zgvZcZWQQwU63XAfUePyd6wZBaU93Hqw347lHnwFzttAkemHzzz4g==} engines: {node: '>=12.0.0'} + tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -3827,6 +3984,11 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vite-node@2.1.2: + resolution: {integrity: sha512-HPcGNN5g/7I2OtPjLqgOtCRu/qhVvBxTUD3qzitmL0SrG1cWFzxzhMDWussxSbrRYWqnKf8P2jiNhPMSN+ymsQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + vite-plugin-html@3.2.2: resolution: {integrity: sha512-vb9C9kcdzcIo/Oc3CLZVS03dL5pDlOFuhGlZYDCJ840BhWl/0nGeZWf3Qy7NlOayscY4Cm/QRgULCQkEZige5Q==} peerDependencies: @@ -3888,6 +4050,31 @@ packages: vite: optional: true + vitest@2.1.2: + resolution: {integrity: sha512-veNjLizOMkRrJ6xxb+pvxN6/QAWg95mzcRjtmkepXdN87FNfxAss9RKe2far/G9cQpipfgP2taqg0KiWsquj8A==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.2 + '@vitest/ui': 2.1.2 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + watchpack@2.4.2: resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} engines: {node: '>=10.13.0'} @@ -3982,6 +4169,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + wildcard@2.0.1: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} @@ -4072,8 +4264,12 @@ snapshots: '@babel/highlight': 7.24.7 picocolors: 1.1.0 + '@babel/helper-string-parser@7.25.7': {} + '@babel/helper-validator-identifier@7.24.7': {} + '@babel/helper-validator-identifier@7.25.7': {} + '@babel/highlight@7.24.7': dependencies: '@babel/helper-validator-identifier': 7.24.7 @@ -4081,10 +4277,22 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.0 + '@babel/parser@7.25.8': + dependencies: + '@babel/types': 7.25.8 + '@babel/runtime@7.25.7': dependencies: regenerator-runtime: 0.14.1 + '@babel/types@7.25.8': + dependencies: + '@babel/helper-string-parser': 7.25.7 + '@babel/helper-validator-identifier': 7.25.7 + to-fast-properties: 2.0.0 + + '@bcoe/v8-coverage@0.2.3': {} + '@changesets/apply-release-plan@7.0.5': dependencies: '@changesets/config': 3.0.3 @@ -4844,6 +5052,8 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@istanbuljs/schema@0.1.3': {} + '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 @@ -5170,11 +5380,11 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 1.0.8 '@rspack/binding-win32-x64-msvc': 1.0.8 - '@rspack/cli@1.0.10(@rspack/core@1.0.8(@swc/helpers@0.5.13))(@types/express@4.17.21)(webpack@5.94.0)': + '@rspack/cli@1.0.10(@rspack/core@1.0.8(@swc/helpers@0.5.13))(@types/express@4.17.21)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13)))': dependencies: '@discoveryjs/json-ext': 0.5.7 '@rspack/core': 1.0.8(@swc/helpers@0.5.13) - '@rspack/dev-server': 1.0.5(@rspack/core@1.0.8(@swc/helpers@0.5.13))(@types/express@4.17.21)(webpack@5.94.0) + '@rspack/dev-server': 1.0.5(@rspack/core@1.0.8(@swc/helpers@0.5.13))(@types/express@4.17.21)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))) colorette: 2.0.19 exit-hook: 3.2.0 interpret: 3.1.1 @@ -5200,7 +5410,7 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.13 - '@rspack/dev-server@1.0.5(@rspack/core@1.0.8(@swc/helpers@0.5.13))(@types/express@4.17.21)(webpack@5.94.0)': + '@rspack/dev-server@1.0.5(@rspack/core@1.0.8(@swc/helpers@0.5.13))(@types/express@4.17.21)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13)))': dependencies: '@rspack/core': 1.0.8(@swc/helpers@0.5.13) chokidar: 3.6.0 @@ -5209,8 +5419,8 @@ snapshots: http-proxy-middleware: 2.0.7(@types/express@4.17.21) mime-types: 2.1.35 p-retry: 4.6.2 - webpack-dev-middleware: 7.4.2(webpack@5.94.0) - webpack-dev-server: 5.0.4(webpack@5.94.0) + webpack-dev-middleware: 7.4.2(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))) + webpack-dev-server: 5.0.4(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))) ws: 8.18.0 transitivePeerDependencies: - '@types/express' @@ -5422,6 +5632,64 @@ snapshots: dependencies: '@types/node': 22.7.4 + '@vitest/coverage-v8@2.1.2(vitest@2.1.2(@types/node@22.7.4)(lightningcss@1.27.0)(terser@5.33.0))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.7 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.11 + magicast: 0.3.5 + std-env: 3.7.0 + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.1.2(@types/node@22.7.4)(lightningcss@1.27.0)(terser@5.33.0) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@2.1.2': + dependencies: + '@vitest/spy': 2.1.2 + '@vitest/utils': 2.1.2 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.2(@vitest/spy@2.1.2)(vite@5.4.6(@types/node@22.7.4)(lightningcss@1.27.0)(terser@5.33.0))': + dependencies: + '@vitest/spy': 2.1.2 + estree-walker: 3.0.3 + magic-string: 0.30.11 + optionalDependencies: + vite: 5.4.6(@types/node@22.7.4)(lightningcss@1.27.0)(terser@5.33.0) + + '@vitest/pretty-format@2.1.2': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.2': + dependencies: + '@vitest/utils': 2.1.2 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.2': + dependencies: + '@vitest/pretty-format': 2.1.2 + magic-string: 0.30.11 + pathe: 1.1.2 + + '@vitest/spy@2.1.2': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@2.1.2': + dependencies: + '@vitest/pretty-format': 2.1.2 + loupe: 3.1.2 + tinyrainbow: 1.2.0 + '@webassemblyjs/ast@1.12.1': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 @@ -5600,6 +5868,8 @@ snapshots: array-union@2.1.0: {} + assertion-error@2.0.1: {} + async@3.2.6: {} autoprefixer@10.4.20(postcss@8.4.47): @@ -5686,6 +5956,8 @@ snapshots: bytes@3.1.2: {} + cac@6.7.14: {} + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -5714,6 +5986,14 @@ snapshots: caniuse-lite@1.0.30001660: {} + chai@5.1.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.2 + pathval: 2.0.0 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -5727,6 +6007,8 @@ snapshots: chardet@0.7.0: {} + check-error@2.1.1: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -6012,6 +6294,8 @@ snapshots: decode-uri-component@0.4.1: {} + deep-eql@5.0.2: {} + deepmerge@4.3.1: {} default-browser-id@5.0.0: {} @@ -6226,6 +6510,10 @@ snapshots: estree-walker@2.0.2: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + etag@1.8.1: {} eventemitter3@4.0.7: {} @@ -6643,6 +6931,27 @@ snapshots: isobject@3.0.1: {} + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.3.7 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -6766,6 +7075,8 @@ snapshots: lodash@4.17.21: {} + loupe@3.1.2: {} + lower-case@2.0.2: dependencies: tslib: 2.7.0 @@ -6781,6 +7092,16 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magicast@0.3.5: + dependencies: + '@babel/parser': 7.25.8 + '@babel/types': 7.25.8 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.6.3 + marked@4.0.12: {} mdn-data@2.0.14: {} @@ -7038,6 +7359,8 @@ snapshots: pathe@1.1.2: {} + pathval@2.0.0: {} + picocolors@1.1.0: {} picomatch@2.3.1: {} @@ -7583,6 +7906,8 @@ snapshots: get-intrinsic: 1.2.4 object-inspect: 1.13.2 + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -7661,10 +7986,14 @@ snapshots: stable@0.1.8: {} + stackback@0.0.2: {} + statuses@1.5.0: {} statuses@2.0.1: {} + std-env@3.7.0: {} + strict-uri-encode@2.0.0: {} string-argv@0.3.2: {} @@ -7825,36 +8154,39 @@ snapshots: term-size@2.2.1: {} - terser-webpack-plugin@5.3.10(@swc/core@1.7.26(@swc/helpers@0.5.13))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(webpack-cli@5.1.4)): + terser-webpack-plugin@5.3.10(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.33.0 - webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1) optionalDependencies: '@swc/core': 1.7.26(@swc/helpers@0.5.13) + esbuild: 0.23.1 - terser-webpack-plugin@5.3.10(esbuild@0.23.1)(webpack@5.94.0(esbuild@0.23.1)): + terser-webpack-plugin@5.3.10(@swc/core@1.7.26(@swc/helpers@0.5.13))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(webpack-cli@5.1.4)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.33.0 - webpack: 5.94.0(esbuild@0.23.1) + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(webpack-cli@5.1.4) optionalDependencies: - esbuild: 0.23.1 + '@swc/core': 1.7.26(@swc/helpers@0.5.13) - terser-webpack-plugin@5.3.10(webpack@5.94.0): + terser-webpack-plugin@5.3.10(@swc/core@1.7.26(@swc/helpers@0.5.13))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.33.0 - webpack: 5.94.0 + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13)) + optionalDependencies: + '@swc/core': 1.7.26(@swc/helpers@0.5.13) optional: true terser@5.33.0: @@ -7864,6 +8196,12 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -7878,15 +8216,27 @@ snapshots: thunky@1.1.0: {} + tinybench@2.9.0: {} + + tinyexec@0.3.0: {} + tinyglobby@0.2.6: dependencies: fdir: 6.4.0(picomatch@4.0.2) picomatch: 4.0.2 + tinypool@1.0.1: {} + + tinyrainbow@1.2.0: {} + + tinyspy@3.0.2: {} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 + to-fast-properties@2.0.0: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -7965,6 +8315,23 @@ snapshots: vary@1.1.2: {} + vite-node@2.1.2(@types/node@22.7.4)(lightningcss@1.27.0)(terser@5.33.0): + dependencies: + cac: 6.7.14 + debug: 4.3.7 + pathe: 1.1.2 + vite: 5.4.6(@types/node@22.7.4)(lightningcss@1.27.0)(terser@5.33.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vite-plugin-html@3.2.2(vite@5.4.6(@types/node@22.7.4)(lightningcss@1.27.0)(terser@5.33.0)): dependencies: '@rollup/pluginutils': 4.2.1 @@ -8011,6 +8378,40 @@ snapshots: optionalDependencies: vite: 5.4.6(@types/node@22.7.4)(lightningcss@1.27.0)(terser@5.33.0) + vitest@2.1.2(@types/node@22.7.4)(lightningcss@1.27.0)(terser@5.33.0): + dependencies: + '@vitest/expect': 2.1.2 + '@vitest/mocker': 2.1.2(@vitest/spy@2.1.2)(vite@5.4.6(@types/node@22.7.4)(lightningcss@1.27.0)(terser@5.33.0)) + '@vitest/pretty-format': 2.1.2 + '@vitest/runner': 2.1.2 + '@vitest/snapshot': 2.1.2 + '@vitest/spy': 2.1.2 + '@vitest/utils': 2.1.2 + chai: 5.1.1 + debug: 4.3.7 + magic-string: 0.30.11 + pathe: 1.1.2 + std-env: 3.7.0 + tinybench: 2.9.0 + tinyexec: 0.3.0 + tinypool: 1.0.1 + tinyrainbow: 1.2.0 + vite: 5.4.6(@types/node@22.7.4)(lightningcss@1.27.0)(terser@5.33.0) + vite-node: 2.1.2(@types/node@22.7.4)(lightningcss@1.27.0)(terser@5.33.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.7.4 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + watchpack@2.4.2: dependencies: glob-to-regexp: 0.4.1 @@ -8072,7 +8473,7 @@ snapshots: optionalDependencies: webpack-bundle-analyzer: 4.10.2 - webpack-dev-middleware@7.4.2(webpack@5.94.0): + webpack-dev-middleware@7.4.2(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))): dependencies: colorette: 2.0.20 memfs: 4.13.0 @@ -8081,9 +8482,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.2.0 optionalDependencies: - webpack: 5.94.0 + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13)) - webpack-dev-server@5.0.4(webpack@5.94.0): + webpack-dev-server@5.0.4(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -8113,10 +8514,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.94.0) + webpack-dev-middleware: 7.4.2(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))) ws: 8.18.0 optionalDependencies: - webpack: 5.94.0 + webpack: 5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13)) transitivePeerDependencies: - bufferutil - debug @@ -8133,7 +8534,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.94.0: + webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13)): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -8155,7 +8556,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.94.0) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.26(@swc/helpers@0.5.13))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -8164,7 +8565,7 @@ snapshots: - uglify-js optional: true - webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(webpack-cli@5.1.4): + webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -8186,17 +8587,15 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.26(@swc/helpers@0.5.13))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(webpack-cli@5.1.4)) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(esbuild@0.23.1)) watchpack: 2.4.2 webpack-sources: 3.2.3 - optionalDependencies: - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.94.0) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.94.0(esbuild@0.23.1): + webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(webpack-cli@5.1.4): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -8218,9 +8617,11 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(esbuild@0.23.1)(webpack@5.94.0(esbuild@0.23.1)) + terser-webpack-plugin: 5.3.10(@swc/core@1.7.26(@swc/helpers@0.5.13))(webpack@5.94.0(@swc/core@1.7.26(@swc/helpers@0.5.13))(webpack-cli@5.1.4)) watchpack: 2.4.2 webpack-sources: 3.2.3 + optionalDependencies: + webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.94.0) transitivePeerDependencies: - '@swc/core' - esbuild @@ -8242,6 +8643,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + wildcard@2.0.1: {} wrap-ansi@7.0.0: