diff --git a/packages/repack/src/loaders/assetsLoader/__tests__/assetsLoader.test.ts b/packages/repack/src/loaders/assetsLoader/__tests__/assetsLoader.test.ts deleted file mode 100644 index 07a27624a..000000000 --- a/packages/repack/src/loaders/assetsLoader/__tests__/assetsLoader.test.ts +++ /dev/null @@ -1,356 +0,0 @@ -import fs from 'node:fs'; -import path from 'node:path'; -import vm from 'node:vm'; -import { rspack } from '@rspack/core'; -import memfs from 'memfs'; -import { RspackVirtualModulePlugin } from 'rspack-plugin-virtual-module'; -import { - getAssetExtensionsRegExp, - getResolveOptions, -} from '../../../utils/index.js'; - -function loadFixtures(...filenames: string[]) { - return filenames - .map((filename: string) => { - const localPath = path.join(__dirname, '__fixtures__', filename); - const assetPath = `./__fixtures__/${filename}`; - const assetData = fs.readFileSync(localPath); - return [assetPath, assetData] as const; - }) - .reduce( - (acc, [assetPath, assetData]) => { - acc[assetPath] = assetData; - return acc; - }, - {} as Record - ); -} - -async function compileBundle( - platform: string, - virtualModules: Record, - inline?: boolean, - remote?: { - enabled: boolean; - assetPath?: (args: { - resourcePath: string; - resourceFilename: string; - resourceDirname: string; - resourceExtensionType: string; - }) => string; - publicPath: string; - } -) { - const compiler = rspack({ - context: __dirname, - mode: 'development', - devtool: false, - entry: './index.js', - resolve: getResolveOptions(platform), - output: { - path: '/out', - library: 'Export', - }, - module: { - rules: [ - { - test: getAssetExtensionsRegExp(), - use: { - loader: require.resolve('../assetsLoader'), - options: { - platform, - inline, - remote, - }, - }, - }, - ], - }, - plugins: [ - new RspackVirtualModulePlugin({ - 'package.json': '{ "type": "module" }', - 'node_modules/react-native/package.json': - '{ "name": "react-native", "main": "./index.js" }', - 'node_modules/react-native/index.js': - 'module.exports = { PixelRatio: { get: () => 1 } };', - 'node_modules/react-native/Libraries/Image/AssetRegistry.js': - 'module.exports = { registerAsset: (spec) => spec };', - 'node_modules/react-native/Libraries/Image/AssetSourceResolver.js': ` - module.exports = class AssetSourceResolver { - constructor(a, b, c) { - this.asset = c; - } - scaledAssetPath() { - var scale = require('react-native').PixelRatio.get(); - var scaleSuffix = scale === 1 ? '' : '@x' + scale; - return { - __packager_asset: true, - width: this.asset.width, - height: this.asset.height, - uri: this.asset.httpServerLocation + '/' + this.asset.name + scaleSuffix + '.' + this.asset.type, - scale: scale, - }; - } - static pickScale(scales, pixelRatio) { - return scales[pixelRatio - 1]; - } - };`, - ...virtualModules, - }), - ], - }); - - const volume = new memfs.Volume(); - const fileSystem = memfs.createFsFromVolume(volume); - // @ts-expect-error memfs is compatible enough - compiler.outputFileSystem = fileSystem; - - return await new Promise<{ - code: string; - fileSystem: typeof memfs.fs; - volume: typeof memfs.vol; - }>((resolve, reject) => - compiler.run((error) => { - if (error) { - reject(error); - } else { - resolve({ - code: fileSystem.readFileSync('/out/main.js', 'utf-8') as string, - fileSystem, - volume, - }); - } - }) - ); -} - -describe('assetLoader', () => { - const fixtures = loadFixtures( - 'logo.png', - 'star@1x.png', - 'star@2x.png', - 'star@3x.png' - ); - - describe.each(['ios', 'android'])('on %s', (platform) => { - it('should load and extract asset without scales', async () => { - const { code, volume } = await compileBundle(platform, { - ...fixtures, - './index.js': "export { default } from './__fixtures__/logo.png';", - }); - - const context: { Export?: { default: Record } } = {}; - vm.runInNewContext(code, context); - - expect(context.Export?.default).toMatchSnapshot(); - expect(volume.toTree()).toMatchSnapshot(); - }); - - it('should load and extract asset with scales', async () => { - const { code, volume } = await compileBundle(platform, { - ...fixtures, - './index.js': "export { default } from './__fixtures__/star.png';", - }); - - const context: { Export?: { default: Record } } = {}; - vm.runInNewContext(code, context); - - expect(context.Export?.default).toMatchSnapshot(); - expect(volume.toTree()).toMatchSnapshot(); - }); - - it('should prefer platform specific asset', async () => { - const platformFixtures = loadFixtures('logo.png', `logo.${platform}.png`); - const { code, volume } = await compileBundle(platform, { - ...platformFixtures, - './index.js': "export { default } from './__fixtures__/logo.png';", - }); - - const context: { Export?: { default: Record } } = {}; - vm.runInNewContext(code, context); - - expect(context.Export?.default).toMatchSnapshot(); - expect(volume.toTree()).toMatchSnapshot(); - }); - }); - - describe('should inline asset', () => { - it('without scales', async () => { - const { code, volume } = await compileBundle( - 'android', - { - ...fixtures, - './index.js': "export { default } from './__fixtures__/logo.png';", - }, - true - ); - - const context: { Export?: { default: Record } } = {}; - vm.runInNewContext(code, context); - - expect(context.Export?.default).toMatchSnapshot(); - expect(volume.toTree()).toMatchSnapshot(); - }); - - it.each([ - { - prefferedScale: 1, - }, - { - prefferedScale: 2, - }, - { - prefferedScale: 3, - }, - ])('with scales ($prefferedScale)', async ({ prefferedScale }) => { - const { code, volume } = await compileBundle( - 'android', - { - ...fixtures, - 'node_modules/react-native/index.js': `module.exports = { PixelRatio: { get: () => ${prefferedScale} } };`, - './index.js': "export { default } from './__fixtures__/star.png';", - }, - true - ); - - const context: { Export?: { default: Record } } = {}; - vm.runInNewContext(code, context); - - expect(context.Export?.default).toMatchSnapshot(); - expect(volume.toTree()).toMatchSnapshot(); - }); - }); - - describe('should convert to remote-asset', () => { - it('without scales', async () => { - const { code, volume } = await compileBundle( - 'ios', // platform doesn't matter for remote-assets - { - ...fixtures, - './index.js': "export { default } from './__fixtures__/logo.png';", - }, - false, - { - enabled: true, - publicPath: 'http://localhost:9999', - } - ); - - const context: { Export?: { default: Record } } = {}; - vm.runInNewContext(code, context); - - expect(context.Export?.default).toMatchSnapshot(); - expect(volume.toTree()).toMatchSnapshot(); - }); - - it.each([ - { prefferedScale: 1 }, - { prefferedScale: 2 }, - { prefferedScale: 3 }, - ])('with scales $prefferedScale', async ({ prefferedScale }) => { - const { code, volume } = await compileBundle( - 'ios', // platform doesn't matter for remote-assets - { - ...fixtures, - 'node_modules/react-native/index.js': `module.exports = { PixelRatio: { get: () => ${prefferedScale} } };`, - './index.js': "export { default } from './__fixtures__/star.png';", - }, - false, - { - enabled: true, - publicPath: 'http://localhost:9999', - } - ); - - const context: { Export?: { default: Record } } = {}; - vm.runInNewContext(code, context); - - expect(context.Export?.default).toMatchSnapshot(); - expect(volume.toTree()).toMatchSnapshot(); - }); - - it('with URL containing a path after basename', async () => { - const { code, volume } = await compileBundle( - 'ios', // platform doesn't matter for remote-assets - { - ...fixtures, - './index.js': "export { default } from './__fixtures__/logo.png';", - }, - false, - { - enabled: true, - publicPath: 'http://localhost:9999/remote-assets', - } - ); - - const context: { Export?: { default: Record } } = {}; - vm.runInNewContext(code, context); - - expect(context.Export?.default).toMatchSnapshot(); - expect(volume.toTree()).toMatchSnapshot(); - }); - - describe('with specified assetPath', () => { - it('without scales', async () => { - const { code, volume } = await compileBundle( - 'ios', // platform doesn't matter for remote-assets - { - ...fixtures, - './index.js': "export { default } from './__fixtures__/logo.png';", - }, - false, - { - enabled: true, - assetPath: ({ - resourceFilename, - resourceDirname, - resourceExtensionType, - }) => { - return `${resourceDirname}/nested-folder/${resourceFilename}-fake-hash.${resourceExtensionType}`; - }, - publicPath: 'http://localhost:9999/remote-assets', - } - ); - - const context: { Export?: { default: Record } } = {}; - vm.runInNewContext(code, context); - - expect(context.Export?.default).toMatchSnapshot(); - expect(volume.toTree()).toMatchSnapshot(); - }); - - it.each([ - { prefferedScale: 1 }, - { prefferedScale: 2 }, - { prefferedScale: 3 }, - ])('with scales $prefferedScale', async ({ prefferedScale }) => { - const { code, volume } = await compileBundle( - 'ios', // platform doesn't matter for remote-assets - { - ...fixtures, - 'node_modules/react-native/index.js': `module.exports = { PixelRatio: { get: () => ${prefferedScale} } };`, - './index.js': "export { default } from './__fixtures__/star.png';", - }, - false, - { - enabled: true, - assetPath: ({ - resourceFilename, - resourceDirname, - resourceExtensionType, - }) => { - return `${resourceDirname}/nested-folder/${resourceFilename}-fake-hash.${resourceExtensionType}`; - }, - publicPath: 'http://localhost:9999', - } - ); - - const context: { Export?: { default: Record } } = {}; - vm.runInNewContext(code, context); - - expect(context.Export?.default).toMatchSnapshot(); - expect(volume.toTree()).toMatchSnapshot(); - }); - }); - }); -}); diff --git a/packages/repack/src/types/runtime-globals.d.ts b/packages/repack/src/types/runtime-globals.d.ts index 611945be2..8b6c03c55 100644 --- a/packages/repack/src/types/runtime-globals.d.ts +++ b/packages/repack/src/types/runtime-globals.d.ts @@ -104,6 +104,8 @@ declare var __webpack_hash__: string; declare var __repack__: RepackRuntimeGlobals.RepackRuntimeObject; declare var __webpack_require__: RepackRuntimeGlobals.WebpackRequire; -declare interface NodeModule { - hot?: RepackRuntimeGlobals.HotApi; +declare namespace NodeJS { + interface Module { + hot?: RepackRuntimeGlobals.HotApi; + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5fdb19b9b..8ac14166e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,8 +16,8 @@ catalogs: specifier: ~0.5.17 version: 0.5.17 '@types/node': - specifier: ^20 - version: 20.14.11 + specifier: ^20.19.31 + version: 20.19.31 react: specifier: 19.1.0 version: 19.1.0 @@ -31,8 +31,8 @@ catalogs: specifier: ^5.8.3 version: 5.8.3 vitest: - specifier: ^2.0.5 - version: 2.0.5 + specifier: ^4.0.18 + version: 4.0.18 webpack: specifier: ^5.99.9 version: 5.100.2 @@ -234,7 +234,7 @@ importers: version: 5.8.3 vitest: specifier: 'catalog:' - version: 2.0.5(@types/node@20.14.11)(lightningcss@1.28.2)(terser@5.31.3) + version: 4.0.18(@types/node@20.19.31)(jiti@2.6.1)(lightningcss@1.28.2)(terser@5.31.3)(yaml@2.8.2) webpack: specifier: 'catalog:' version: 5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17)) @@ -438,7 +438,7 @@ importers: version: 7.0.6 '@types/node': specifier: 'catalog:' - version: 20.14.11 + version: 20.19.31 '@types/ws': specifier: ^8.18.0 version: 8.18.0 @@ -466,7 +466,7 @@ importers: version: 0.6.3(typescript@5.8.3) '@types/node': specifier: 'catalog:' - version: 20.14.11 + version: 20.19.31 '@types/semver': specifier: ^7.5.8 version: 7.5.8 @@ -511,7 +511,7 @@ importers: version: 1.6.0(@swc/helpers@0.5.18) '@types/node': specifier: 'catalog:' - version: 20.14.11 + version: 20.19.31 webpack: specifier: 'catalog:' version: 5.100.2(@swc/core@1.13.3) @@ -533,7 +533,7 @@ importers: version: 0.7.2 '@types/node': specifier: 'catalog:' - version: 20.14.11 + version: 20.19.31 nativewind: specifier: ^4.1.23 version: 4.1.23(react-native-reanimated@4.0.0(@babel/core@7.25.2)(react-native-worklets@0.4.0(@babel/core@7.25.2)(react-native@0.81.0(@babel/core@7.25.2)(@react-native-community/cli@20.0.0(typescript@5.8.3))(@types/react@19.1.8)(react@19.2.4))(react@19.2.4))(react-native@0.81.0(@babel/core@7.25.2)(@react-native-community/cli@20.0.0(typescript@5.8.3))(@types/react@19.1.8)(react@19.2.4))(react@19.2.4))(react-native@0.81.0(@babel/core@7.25.2)(@react-native-community/cli@20.0.0(typescript@5.8.3))(@types/react@19.1.8)(react@19.2.4))(react@19.2.4)(tailwindcss@3.4.17) @@ -561,7 +561,7 @@ importers: version: 7.20.5 '@types/node': specifier: 'catalog:' - version: 20.14.11 + version: 20.19.31 '@types/semver': specifier: ^7.7.0 version: 7.7.0 @@ -691,7 +691,7 @@ importers: version: 2.1.4 '@types/node': specifier: 'catalog:' - version: 20.14.11 + version: 20.19.31 '@types/react-dom': specifier: ^17.0.7 version: 17.0.25 @@ -709,7 +709,7 @@ importers: version: 1.8.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.14.11) + version: 29.7.0(@types/node@20.19.31) react: specifier: 'catalog:' version: 19.1.0 @@ -726,6 +726,33 @@ importers: specifier: 'catalog:' version: 5.100.2(@swc/core@1.13.3) + tests/integration: + devDependencies: + '@callstack/repack': + specifier: workspace:* + version: link:../../packages/repack + '@rspack/core': + specifier: 'catalog:' + version: 1.6.0(@swc/helpers@0.5.18) + '@types/node': + specifier: 'catalog:' + version: 20.19.31 + memfs: + specifier: ^4.11.1 + version: 4.17.0 + typescript: + specifier: 'catalog:' + version: 5.8.3 + vitest: + specifier: 'catalog:' + version: 4.0.18(@types/node@20.19.31)(jiti@2.6.1)(lightningcss@1.28.2)(terser@5.31.3)(yaml@2.8.2) + webpack: + specifier: 'catalog:' + version: 5.100.2(@swc/core@1.13.3) + webpack-virtual-modules: + specifier: ^0.6.2 + version: 0.6.2 + tests/metro-compat: devDependencies: '@callstack/repack': @@ -736,7 +763,7 @@ importers: version: 29.5.14 '@types/node': specifier: 'catalog:' - version: 20.14.11 + version: 20.19.31 babel-jest: specifier: ^29.7.0 version: 29.7.0(@babel/core@7.25.2) @@ -751,7 +778,7 @@ importers: version: 5.18.1 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.14.11) + version: 29.7.0(@types/node@20.19.31) memfs: specifier: ^4.11.1 version: 4.17.0 @@ -766,7 +793,7 @@ importers: version: link:../../packages/repack '@types/node': specifier: 'catalog:' - version: 20.14.11 + version: 20.19.31 enhanced-resolve: specifier: ^5.18.1 version: 5.18.1 @@ -778,7 +805,7 @@ importers: version: 5.8.3 vitest: specifier: 'catalog:' - version: 2.0.5(@types/node@20.14.11)(lightningcss@1.28.2)(terser@5.31.3) + version: 4.0.18(@types/node@20.19.31)(jiti@2.6.1)(lightningcss@1.28.2)(terser@5.31.3)(yaml@2.8.2) website: dependencies: @@ -794,7 +821,7 @@ importers: devDependencies: '@types/node': specifier: 'catalog:' - version: 20.14.11 + version: 20.19.31 '@types/react': specifier: ^18.2.64 version: 18.3.3 @@ -1711,9 +1738,9 @@ packages: '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -1723,9 +1750,9 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -1735,9 +1762,9 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} cpu: [arm] os: [android] @@ -1747,9 +1774,9 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} cpu: [x64] os: [android] @@ -1759,9 +1786,9 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -1771,9 +1798,9 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -1783,9 +1810,9 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -1795,9 +1822,9 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -1807,9 +1834,9 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -1819,9 +1846,9 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -1831,9 +1858,9 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -1843,9 +1870,9 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -1855,9 +1882,9 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -1867,9 +1894,9 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -1879,9 +1906,9 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -1891,9 +1918,9 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -1903,45 +1930,63 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.17.19': resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.17.19': resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.17.19': resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -1951,9 +1996,9 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -1963,9 +2008,9 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -1975,9 +2020,9 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -2137,6 +2182,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -2641,83 +2689,128 @@ packages: resolution: {integrity: sha512-F18Pn28Ligw3RyNKzXtSRZudWQ5R3JFywyWwqcUY+UFmjBjhekdIceHM/SXNZOJgkj21RRgXaIJy1gpaJtT0Jw==} engines: {node: '>=16.17'} - '@rollup/rollup-android-arm-eabi@4.21.2': - resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.21.2': - resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==} + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.21.2': - resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==} + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.21.2': - resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==} + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.21.2': - resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==} + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.21.2': - resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==} + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.21.2': - resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==} + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.21.2': - resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==} + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': - resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==} + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.21.2': - resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==} + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.21.2': - resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==} + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.21.2': - resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==} + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.21.2': - resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==} + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.21.2': - resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==} + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.21.2': - resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==} + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.21.2': - resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==} + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} cpu: [x64] os: [win32] @@ -3064,6 +3157,9 @@ packages: '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} engines: {node: '>=14'} @@ -3251,6 +3347,9 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -3266,6 +3365,9 @@ packages: '@types/dedent@0.7.2': resolution: {integrity: sha512-kRiitIeUg1mPV9yH4VUJ/1uk2XjyANfeL8/7rH1tsjvHeO9PJLBHJIYsFWmAvmGj5u8rj+1TZx7PZzW2qLw3Lw==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -3338,6 +3440,9 @@ packages: '@types/node@20.14.11': resolution: {integrity: sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==} + '@types/node@20.19.31': + resolution: {integrity: sha512-5jsi0wpncvTD33Sh1UCgacK37FFwDn+EG7wCmEvs62fCvBL+n8/76cAYDok21NF6+jaVWIqKwCZyX7Vbu8eB3A==} + '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} @@ -3429,23 +3534,34 @@ packages: vue-router: optional: true - '@vitest/expect@2.0.5': - resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} + '@vitest/expect@4.0.18': + resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} - '@vitest/pretty-format@2.0.5': - resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + '@vitest/mocker@4.0.18': + resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true - '@vitest/runner@2.0.5': - resolution: {integrity: sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==} + '@vitest/pretty-format@4.0.18': + resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} - '@vitest/snapshot@2.0.5': - resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==} + '@vitest/runner@4.0.18': + resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} - '@vitest/spy@2.0.5': - resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + '@vitest/snapshot@4.0.18': + resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} - '@vitest/utils@2.0.5': - resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} + '@vitest/spy@4.0.18': + resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + + '@vitest/utils@4.0.18': + resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} '@vscode/sudo-prompt@9.3.1': resolution: {integrity: sha512-9ORTwwS74VaTn38tNbQhsA5U44zkJfcb0BdTSyyG6frP4e8KMtHuTXYmwefe5dpL8XB1aGSIVTaLjD3BbWb5iA==} @@ -3899,9 +4015,9 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@5.1.1: - resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} - engines: {node: '>=12'} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -3938,10 +4054,6 @@ 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'} @@ -4283,10 +4395,6 @@ packages: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - deep-equal@1.0.1: resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} @@ -4504,6 +4612,9 @@ packages: es-module-lexer@1.5.4: resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -4523,9 +4634,9 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: @@ -4619,10 +4730,6 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - execa@9.5.2: resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} engines: {node: ^18.19.0 || >=20.5.0} @@ -4639,6 +4746,10 @@ packages: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4893,9 +5004,6 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} @@ -4924,10 +5032,6 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - get-stream@9.0.1: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'} @@ -5151,10 +5255,6 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - human-signals@8.0.0: resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} engines: {node: '>=18.18.0'} @@ -5336,10 +5436,6 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-stream@4.0.1: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} @@ -5840,9 +5936,6 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@3.1.1: - resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} - lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -5859,6 +5952,9 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -6159,10 +6255,6 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - minimatch@10.1.1: resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} @@ -6218,6 +6310,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.8: resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -6288,10 +6385,6 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - npm-run-path@6.0.0: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} @@ -6333,6 +6426,9 @@ packages: resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} engines: {node: '>= 0.4'} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} @@ -6356,10 +6452,6 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - oniguruma-parser@0.12.1: resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} @@ -6521,12 +6613,8 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} - engines: {node: '>= 14.16'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -6643,6 +6731,10 @@ packages: resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + preferred-pm@4.1.1: resolution: {integrity: sha512-rU+ZAv1Ur9jAUZtGPebQVQPzdGhNzaEiQ7VL9+cjsAWPHFYOccNXPNiev1CCDSOg/2j7UujM7ojNhpkuILEVNQ==} engines: {node: '>=18.12'} @@ -7059,8 +7151,8 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rollup@4.21.2: - resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==} + rollup@4.57.1: + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -7330,8 +7422,8 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} stream-buffers@2.2.0: resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} @@ -7391,10 +7483,6 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - strip-final-newline@4.0.0: resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} engines: {node: '>=18'} @@ -7521,6 +7609,10 @@ packages: tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + tinyglobby@0.2.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} @@ -7532,20 +7624,12 @@ packages: tinygradient@1.1.5: resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} - tinypool@1.0.1: - resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} - engines: {node: ^18.0.0 || >=20.0.0} - tinypool@1.1.1: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} 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.0: - resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} tmp@0.0.33: @@ -7643,6 +7727,9 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + unhead@2.1.2: resolution: {integrity: sha512-vSihrxyb+zsEUfEbraZBCjdE0p/WSoc2NGDrpwwSNAwuPxhYK1nH3eegf02IENLpn1sUhL8IoO84JWmRQ6tILA==} @@ -7765,27 +7852,27 @@ packages: vfile@6.0.2: resolution: {integrity: sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==} - vite-node@2.0.5: - resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - - vite@5.4.3: - resolution: {integrity: sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.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: @@ -7800,24 +7887,37 @@ packages: optional: true terser: optional: true + tsx: + optional: true + yaml: + optional: true - vitest@2.0.5: - resolution: {integrity: sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==} - engines: {node: ^18.0.0 || >=20.0.0} + vitest@4.0.18: + resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.0.5 - '@vitest/ui': 2.0.5 + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.18 + '@vitest/browser-preview': 4.0.18 + '@vitest/browser-webdriverio': 4.0.18 + '@vitest/ui': 4.0.18 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@opentelemetry/api': + optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': optional: true '@vitest/ui': optional: true @@ -7864,6 +7964,9 @@ packages: resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} engines: {node: '>=10.13.0'} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + webpack@5.100.2: resolution: {integrity: sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw==} engines: {node: '>=10.13.0'} @@ -9259,139 +9362,148 @@ snapshots: dependencies: tslib: 2.8.1 - '@esbuild/aix-ppc64@0.21.5': + '@esbuild/aix-ppc64@0.27.2': optional: true '@esbuild/android-arm64@0.17.19': optional: true - '@esbuild/android-arm64@0.21.5': + '@esbuild/android-arm64@0.27.2': optional: true '@esbuild/android-arm@0.17.19': optional: true - '@esbuild/android-arm@0.21.5': + '@esbuild/android-arm@0.27.2': optional: true '@esbuild/android-x64@0.17.19': optional: true - '@esbuild/android-x64@0.21.5': + '@esbuild/android-x64@0.27.2': optional: true '@esbuild/darwin-arm64@0.17.19': optional: true - '@esbuild/darwin-arm64@0.21.5': + '@esbuild/darwin-arm64@0.27.2': optional: true '@esbuild/darwin-x64@0.17.19': optional: true - '@esbuild/darwin-x64@0.21.5': + '@esbuild/darwin-x64@0.27.2': optional: true '@esbuild/freebsd-arm64@0.17.19': optional: true - '@esbuild/freebsd-arm64@0.21.5': + '@esbuild/freebsd-arm64@0.27.2': optional: true '@esbuild/freebsd-x64@0.17.19': optional: true - '@esbuild/freebsd-x64@0.21.5': + '@esbuild/freebsd-x64@0.27.2': optional: true '@esbuild/linux-arm64@0.17.19': optional: true - '@esbuild/linux-arm64@0.21.5': + '@esbuild/linux-arm64@0.27.2': optional: true '@esbuild/linux-arm@0.17.19': optional: true - '@esbuild/linux-arm@0.21.5': + '@esbuild/linux-arm@0.27.2': optional: true '@esbuild/linux-ia32@0.17.19': optional: true - '@esbuild/linux-ia32@0.21.5': + '@esbuild/linux-ia32@0.27.2': optional: true '@esbuild/linux-loong64@0.17.19': optional: true - '@esbuild/linux-loong64@0.21.5': + '@esbuild/linux-loong64@0.27.2': optional: true '@esbuild/linux-mips64el@0.17.19': optional: true - '@esbuild/linux-mips64el@0.21.5': + '@esbuild/linux-mips64el@0.27.2': optional: true '@esbuild/linux-ppc64@0.17.19': optional: true - '@esbuild/linux-ppc64@0.21.5': + '@esbuild/linux-ppc64@0.27.2': optional: true '@esbuild/linux-riscv64@0.17.19': optional: true - '@esbuild/linux-riscv64@0.21.5': + '@esbuild/linux-riscv64@0.27.2': optional: true '@esbuild/linux-s390x@0.17.19': optional: true - '@esbuild/linux-s390x@0.21.5': + '@esbuild/linux-s390x@0.27.2': optional: true '@esbuild/linux-x64@0.17.19': optional: true - '@esbuild/linux-x64@0.21.5': + '@esbuild/linux-x64@0.27.2': + optional: true + + '@esbuild/netbsd-arm64@0.27.2': optional: true '@esbuild/netbsd-x64@0.17.19': optional: true - '@esbuild/netbsd-x64@0.21.5': + '@esbuild/netbsd-x64@0.27.2': + optional: true + + '@esbuild/openbsd-arm64@0.27.2': optional: true '@esbuild/openbsd-x64@0.17.19': optional: true - '@esbuild/openbsd-x64@0.21.5': + '@esbuild/openbsd-x64@0.27.2': + optional: true + + '@esbuild/openharmony-arm64@0.27.2': optional: true '@esbuild/sunos-x64@0.17.19': optional: true - '@esbuild/sunos-x64@0.21.5': + '@esbuild/sunos-x64@0.27.2': optional: true '@esbuild/win32-arm64@0.17.19': optional: true - '@esbuild/win32-arm64@0.21.5': + '@esbuild/win32-arm64@0.27.2': optional: true '@esbuild/win32-ia32@0.17.19': optional: true - '@esbuild/win32-ia32@0.21.5': + '@esbuild/win32-ia32@0.27.2': optional: true '@esbuild/win32-x64@0.17.19': optional: true - '@esbuild/win32-x64@0.21.5': + '@esbuild/win32-x64@0.27.2': optional: true '@fastify/ajv-compiler@3.6.0': @@ -9463,7 +9575,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 20.14.11 + '@types/node': 20.19.31 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -9476,14 +9588,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.11 + '@types/node': 20.19.31 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.14.11) + jest-config: 29.7.0(@types/node@20.19.31) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -9556,7 +9668,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.14.11 + '@types/node': 20.19.31 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -9633,7 +9745,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.14.11 + '@types/node': 20.19.31 '@types/yargs': 15.0.19 chalk: 4.1.2 @@ -9642,7 +9754,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.14.11 + '@types/node': 20.19.31 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -9663,6 +9775,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -10501,52 +10615,79 @@ snapshots: dependencies: '@rnx-kit/tools-node': 3.0.0 - '@rollup/rollup-android-arm-eabi@4.21.2': + '@rollup/rollup-android-arm-eabi@4.57.1': + optional: true + + '@rollup/rollup-android-arm64@4.57.1': optional: true - '@rollup/rollup-android-arm64@4.21.2': + '@rollup/rollup-darwin-arm64@4.57.1': optional: true - '@rollup/rollup-darwin-arm64@4.21.2': + '@rollup/rollup-darwin-x64@4.57.1': optional: true - '@rollup/rollup-darwin-x64@4.21.2': + '@rollup/rollup-freebsd-arm64@4.57.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.21.2': + '@rollup/rollup-freebsd-x64@4.57.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.21.2': + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.21.2': + '@rollup/rollup-linux-arm-musleabihf@4.57.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.21.2': + '@rollup/rollup-linux-arm64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': + '@rollup/rollup-linux-arm64-musl@4.57.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.21.2': + '@rollup/rollup-linux-loong64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.21.2': + '@rollup/rollup-linux-loong64-musl@4.57.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.21.2': + '@rollup/rollup-linux-ppc64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-x64-musl@4.21.2': + '@rollup/rollup-linux-ppc64-musl@4.57.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.21.2': + '@rollup/rollup-linux-riscv64-gnu@4.57.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.21.2': + '@rollup/rollup-linux-riscv64-musl@4.57.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.21.2': + '@rollup/rollup-linux-s390x-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.57.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.57.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.57.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true '@rsbuild/core@1.3.5': @@ -11130,6 +11271,8 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} + '@standard-schema/spec@1.1.0': {} + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11322,6 +11465,11 @@ snapshots: dependencies: '@babel/types': 7.25.6 + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + '@types/connect@3.4.38': dependencies: '@types/node': 20.14.11 @@ -11338,6 +11486,8 @@ snapshots: '@types/dedent@0.7.2': {} + '@types/deep-eql@4.0.2': {} + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 @@ -11365,7 +11515,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.14.11 + '@types/node': 20.19.31 '@types/gradient-string@1.1.6': dependencies: @@ -11377,7 +11527,7 @@ snapshots: '@types/http-proxy@1.17.16': dependencies: - '@types/node': 20.14.11 + '@types/node': 20.19.31 '@types/istanbul-lib-coverage@2.0.6': {} @@ -11402,7 +11552,7 @@ snapshots: '@types/jsonwebtoken@9.0.6': dependencies: - '@types/node': 20.14.11 + '@types/node': 20.19.31 '@types/mdast@4.0.4': dependencies: @@ -11420,6 +11570,10 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@20.19.31': + dependencies: + undici-types: 6.21.0 + '@types/prop-types@15.7.12': {} '@types/react-dom@17.0.25': @@ -11465,7 +11619,7 @@ snapshots: '@types/ws@8.18.0': dependencies: - '@types/node': 20.14.11 + '@types/node': 20.19.31 '@types/yargs-parser@21.0.3': {} @@ -11488,38 +11642,44 @@ snapshots: optionalDependencies: react: 19.2.4 - '@vitest/expect@2.0.5': + '@vitest/expect@4.0.18': dependencies: - '@vitest/spy': 2.0.5 - '@vitest/utils': 2.0.5 - chai: 5.1.1 - tinyrainbow: 1.2.0 + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + chai: 6.2.2 + tinyrainbow: 3.0.3 - '@vitest/pretty-format@2.0.5': + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@20.19.31)(jiti@2.6.1)(lightningcss@1.28.2)(terser@5.31.3)(yaml@2.8.2))': dependencies: - tinyrainbow: 1.2.0 + '@vitest/spy': 4.0.18 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.1(@types/node@20.19.31)(jiti@2.6.1)(lightningcss@1.28.2)(terser@5.31.3)(yaml@2.8.2) - '@vitest/runner@2.0.5': + '@vitest/pretty-format@4.0.18': dependencies: - '@vitest/utils': 2.0.5 - pathe: 1.1.2 + tinyrainbow: 3.0.3 - '@vitest/snapshot@2.0.5': + '@vitest/runner@4.0.18': dependencies: - '@vitest/pretty-format': 2.0.5 - magic-string: 0.30.17 - pathe: 1.1.2 + '@vitest/utils': 4.0.18 + pathe: 2.0.3 - '@vitest/spy@2.0.5': + '@vitest/snapshot@4.0.18': dependencies: - tinyspy: 3.0.0 + '@vitest/pretty-format': 4.0.18 + magic-string: 0.30.21 + pathe: 2.0.3 - '@vitest/utils@2.0.5': + '@vitest/spy@4.0.18': {} + + '@vitest/utils@4.0.18': dependencies: - '@vitest/pretty-format': 2.0.5 - estree-walker: 3.0.3 - loupe: 3.1.1 - tinyrainbow: 1.2.0 + '@vitest/pretty-format': 4.0.18 + tinyrainbow: 3.0.3 '@vscode/sudo-prompt@9.3.1': {} @@ -12025,13 +12185,7 @@ snapshots: ccount@2.0.1: {} - chai@5.1.1: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.1.1 - pathval: 2.0.0 + chai@6.2.2: {} chalk@2.4.2: dependencies: @@ -12063,8 +12217,6 @@ snapshots: chardet@0.7.0: {} - check-error@2.1.1: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -12079,7 +12231,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 20.14.11 + '@types/node': 20.19.31 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -12090,7 +12242,7 @@ snapshots: chromium-edge-launcher@0.2.0: dependencies: - '@types/node': 20.14.11 + '@types/node': 20.19.31 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -12291,13 +12443,13 @@ snapshots: optionalDependencies: typescript: 5.8.3 - create-jest@29.7.0(@types/node@20.14.11): + create-jest@29.7.0(@types/node@20.19.31): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.14.11) + jest-config: 29.7.0(@types/node@20.19.31) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -12389,8 +12541,6 @@ snapshots: dependencies: type-detect: 4.0.8 - deep-eql@5.0.2: {} - deep-equal@1.0.1: {} deepmerge@4.3.1: {} @@ -12583,6 +12733,8 @@ snapshots: es-module-lexer@1.5.4: {} + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -12633,31 +12785,34 @@ snapshots: '@esbuild/win32-ia32': 0.17.19 '@esbuild/win32-x64': 0.17.19 - esbuild@0.21.5: + esbuild@0.27.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 escalade@3.2.0: {} @@ -12743,18 +12898,6 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - execa@8.0.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - execa@9.5.2: dependencies: '@sindresorhus/merge-streams': 4.0.0 @@ -12778,6 +12921,8 @@ snapshots: dependencies: homedir-polyfill: 1.0.3 + expect-type@1.3.0: {} + expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 @@ -13054,8 +13199,6 @@ snapshots: get-caller-file@2.0.5: {} - get-func-name@2.0.2: {} - get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 @@ -13090,8 +13233,6 @@ snapshots: get-stream@6.0.1: {} - get-stream@8.0.1: {} - get-stream@9.0.1: dependencies: '@sec-ant/readable-stream': 0.4.1 @@ -13442,8 +13583,6 @@ snapshots: human-signals@2.1.0: {} - human-signals@5.0.0: {} - human-signals@8.0.0: {} husky@9.1.6: {} @@ -13571,8 +13710,6 @@ snapshots: is-stream@2.0.1: {} - is-stream@3.0.0: {} - is-stream@4.0.1: {} is-subdir@1.2.0: @@ -13664,7 +13801,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.11 + '@types/node': 20.19.31 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3 @@ -13684,16 +13821,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.14.11): + jest-cli@29.7.0(@types/node@20.19.31): dependencies: '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.14.11) + create-jest: 29.7.0(@types/node@20.19.31) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.14.11) + jest-config: 29.7.0(@types/node@20.19.31) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -13703,7 +13840,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.14.11): + jest-config@29.7.0(@types/node@20.19.31): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 @@ -13728,7 +13865,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.14.11 + '@types/node': 20.19.31 transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -13774,7 +13911,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.14.11 + '@types/node': 20.19.31 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -13848,7 +13985,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.11 + '@types/node': 20.19.31 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -13876,7 +14013,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.11 + '@types/node': 20.19.31 chalk: 4.1.2 cjs-module-lexer: 1.3.1 collect-v8-coverage: 1.0.2 @@ -13941,7 +14078,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.11 + '@types/node': 20.19.31 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -13961,12 +14098,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.14.11): + jest@29.7.0(@types/node@20.19.31): dependencies: '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.14.11) + jest-cli: 29.7.0(@types/node@20.19.31) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -14283,10 +14420,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@3.1.1: - dependencies: - get-func-name: 2.0.2 - lower-case@2.0.2: dependencies: tslib: 2.8.1 @@ -14303,6 +14436,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + make-dir@2.1.0: dependencies: pify: 4.0.1 @@ -14972,8 +15109,6 @@ snapshots: mimic-fn@2.1.0: {} - mimic-fn@4.0.0: {} - minimatch@10.1.1: dependencies: '@isaacs/brace-expansion': 5.0.0 @@ -15018,6 +15153,8 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 + nanoid@3.3.11: {} + nanoid@3.3.8: {} nativewind@4.1.23(react-native-reanimated@4.0.0(@babel/core@7.25.2)(react-native-worklets@0.4.0(@babel/core@7.25.2)(react-native@0.81.0(@babel/core@7.25.2)(@react-native-community/cli@20.0.0(typescript@5.8.3))(@types/react@19.1.8)(react@19.1.0))(react@19.1.0))(react-native@0.81.0(@babel/core@7.25.2)(@react-native-community/cli@20.0.0(typescript@5.8.3))(@types/react@19.1.8)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.5.0(react-native@0.81.0(@babel/core@7.25.2)(@react-native-community/cli@20.0.0(typescript@5.8.3))(@types/react@19.1.8)(react@19.1.0))(react@19.1.0))(react-native-svg@15.12.0(react-native@0.81.0(@babel/core@7.25.2)(@react-native-community/cli@20.0.0(typescript@5.8.3))(@types/react@19.1.8)(react@19.1.0))(react@19.1.0))(react-native@0.81.0(@babel/core@7.25.2)(@react-native-community/cli@20.0.0(typescript@5.8.3))(@types/react@19.1.8)(react@19.1.0))(react@19.1.0)(tailwindcss@3.4.17): @@ -15089,10 +15226,6 @@ snapshots: dependencies: path-key: 3.1.1 - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - npm-run-path@6.0.0: dependencies: path-key: 4.0.0 @@ -15168,6 +15301,8 @@ snapshots: object-inspect@1.13.2: {} + obug@2.1.1: {} + on-exit-leak-free@2.1.2: {} on-finished@2.3.0: @@ -15188,10 +15323,6 @@ snapshots: dependencies: mimic-fn: 2.1.0 - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - oniguruma-parser@0.12.1: {} oniguruma-to-es@4.3.4: @@ -15357,9 +15488,7 @@ snapshots: path-type@4.0.0: {} - pathe@1.1.2: {} - - pathval@2.0.0: {} + pathe@2.0.3: {} picocolors@1.1.1: {} @@ -15475,6 +15604,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + preferred-pm@4.1.1: dependencies: find-up-simple: 1.0.0 @@ -16076,26 +16211,35 @@ snapshots: dependencies: glob: 7.2.3 - rollup@4.21.2: + rollup@4.57.1: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.21.2 - '@rollup/rollup-android-arm64': 4.21.2 - '@rollup/rollup-darwin-arm64': 4.21.2 - '@rollup/rollup-darwin-x64': 4.21.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.21.2 - '@rollup/rollup-linux-arm-musleabihf': 4.21.2 - '@rollup/rollup-linux-arm64-gnu': 4.21.2 - '@rollup/rollup-linux-arm64-musl': 4.21.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2 - '@rollup/rollup-linux-riscv64-gnu': 4.21.2 - '@rollup/rollup-linux-s390x-gnu': 4.21.2 - '@rollup/rollup-linux-x64-gnu': 4.21.2 - '@rollup/rollup-linux-x64-musl': 4.21.2 - '@rollup/rollup-win32-arm64-msvc': 4.21.2 - '@rollup/rollup-win32-ia32-msvc': 4.21.2 - '@rollup/rollup-win32-x64-msvc': 4.21.2 + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 fsevents: 2.3.3 rsbuild-plugin-dts@0.6.3(@rsbuild/core@1.3.5)(typescript@5.8.3): @@ -16376,7 +16520,7 @@ snapshots: statuses@2.0.1: {} - std-env@3.7.0: {} + std-env@3.10.0: {} stream-buffers@2.2.0: {} @@ -16436,8 +16580,6 @@ snapshots: strip-final-newline@2.0.0: {} - strip-final-newline@3.0.0: {} - strip-final-newline@4.0.0: {} strip-json-comments@3.1.1: {} @@ -16596,6 +16738,8 @@ snapshots: tinycolor2@1.6.0: {} + tinyexec@1.0.2: {} + tinyglobby@0.2.14: dependencies: fdir: 6.4.4(picomatch@4.0.2) @@ -16611,13 +16755,9 @@ snapshots: '@types/tinycolor2': 1.4.6 tinycolor2: 1.6.0 - tinypool@1.0.1: {} - tinypool@1.1.1: {} - tinyrainbow@1.2.0: {} - - tinyspy@3.0.0: {} + tinyrainbow@3.0.3: {} tmp@0.0.33: dependencies: @@ -16682,6 +16822,8 @@ snapshots: undici-types@5.26.5: {} + undici-types@6.21.0: {} + unhead@2.1.2: dependencies: hookable: 6.0.1 @@ -16813,67 +16955,58 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - vite-node@2.0.5(@types/node@20.14.11)(lightningcss@1.28.2)(terser@5.31.3): - dependencies: - cac: 6.7.14 - debug: 4.4.0 - pathe: 1.1.2 - tinyrainbow: 1.2.0 - vite: 5.4.3(@types/node@20.14.11)(lightningcss@1.28.2)(terser@5.31.3) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - vite@5.4.3(@types/node@20.14.11)(lightningcss@1.28.2)(terser@5.31.3): + vite@7.3.1(@types/node@20.19.31)(jiti@2.6.1)(lightningcss@1.28.2)(terser@5.31.3)(yaml@2.8.2): dependencies: - esbuild: 0.21.5 - postcss: 8.5.1 - rollup: 4.21.2 + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 20.14.11 + '@types/node': 20.19.31 fsevents: 2.3.3 + jiti: 2.6.1 lightningcss: 1.28.2 terser: 5.31.3 + yaml: 2.8.2 - vitest@2.0.5(@types/node@20.14.11)(lightningcss@1.28.2)(terser@5.31.3): - dependencies: - '@ampproject/remapping': 2.3.0 - '@vitest/expect': 2.0.5 - '@vitest/pretty-format': 2.0.5 - '@vitest/runner': 2.0.5 - '@vitest/snapshot': 2.0.5 - '@vitest/spy': 2.0.5 - '@vitest/utils': 2.0.5 - chai: 5.1.1 - debug: 4.4.0 - execa: 8.0.1 - magic-string: 0.30.17 - pathe: 1.1.2 - std-env: 3.7.0 + vitest@4.0.18(@types/node@20.19.31)(jiti@2.6.1)(lightningcss@1.28.2)(terser@5.31.3)(yaml@2.8.2): + dependencies: + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@20.19.31)(jiti@2.6.1)(lightningcss@1.28.2)(terser@5.31.3)(yaml@2.8.2)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + es-module-lexer: 1.7.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 tinybench: 2.9.0 - tinypool: 1.0.1 - tinyrainbow: 1.2.0 - vite: 5.4.3(@types/node@20.14.11)(lightningcss@1.28.2)(terser@5.31.3) - vite-node: 2.0.5(@types/node@20.14.11)(lightningcss@1.28.2)(terser@5.31.3) + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.3.1(@types/node@20.19.31)(jiti@2.6.1)(lightningcss@1.28.2)(terser@5.31.3)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.14.11 + '@types/node': 20.19.31 transitivePeerDependencies: + - jiti - less - lightningcss + - msw - sass - sass-embedded - stylus - sugarss - - supports-color - terser + - tsx + - yaml vlq@0.2.3: {} @@ -16924,6 +17057,8 @@ snapshots: webpack-sources@3.3.3: {} + webpack-virtual-modules@0.6.2: {} + webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17)): dependencies: '@types/eslint-scope': 3.7.7 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 2ee44fd3d..9bdc932a0 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -8,13 +8,13 @@ catalog: "@rspack/core": ^1.6.0 "@rslib/core": ^0.6.3 "@swc/helpers": ~0.5.17 - "@types/node": ^20 + "@types/node": ^20.19.31 "terser-webpack-plugin": ^5.3.14 "typescript": ^5.8.3 "webpack": ^5.99.9 "react": "19.1.0" "react-native": "0.81.0" - "vitest": ^2.0.5 + "vitest": ^4.0.18 catalogs: testers: diff --git a/tests/integration/package.json b/tests/integration/package.json new file mode 100644 index 000000000..1821ba903 --- /dev/null +++ b/tests/integration/package.json @@ -0,0 +1,24 @@ +{ + "name": "integration-test", + "version": "0.0.1", + "description": "Integration tests for @callstack/repack", + "private": true, + "type": "module", + "engines": { + "node": ">=22" + }, + "scripts": { + "test": "vitest run", + "test:watch": "vitest" + }, + "devDependencies": { + "@callstack/repack": "workspace:*", + "@rspack/core": "catalog:", + "@types/node": "catalog:", + "memfs": "^4.11.1", + "typescript": "catalog:", + "vitest": "catalog:", + "webpack": "catalog:", + "webpack-virtual-modules": "^0.6.2" + } +} diff --git a/tests/integration/src/helpers.ts b/tests/integration/src/helpers.ts new file mode 100644 index 000000000..4ceea48f7 --- /dev/null +++ b/tests/integration/src/helpers.ts @@ -0,0 +1,114 @@ +import type { + Compiler as RspackCompiler, + Configuration as RspackConfiguration, +} from '@rspack/core'; +import { Volume, createFsFromVolume } from 'memfs'; +import { inject } from 'vitest'; +import type { + Compiler as WebpackCompiler, + Configuration as WebpackConfiguration, +} from 'webpack'; + +export type BundlerType = 'rspack' | 'webpack'; + +type Compiler = RspackCompiler | WebpackCompiler; +type Configuration = RspackConfiguration | WebpackConfiguration; + +function getBundlerType(): BundlerType { + return inject('bundlerType'); +} + +/** + * Create a compiler instance for the current bundler + */ +export async function createCompiler(config: Configuration): Promise { + const type = getBundlerType(); + if (type === 'rspack') { + const { rspack } = await import('@rspack/core'); + return rspack(config as RspackConfiguration); + } + const { webpack } = await import('webpack'); + return webpack(config as WebpackConfiguration); +} + +/** + * Create a virtual module plugin for the current bundler + */ +export async function createVirtualModulePlugin( + modules: Record +): Promise<{ apply(compiler: Compiler): void }> { + const type = getBundlerType(); + if (type === 'rspack') { + const { rspack } = await import('@rspack/core'); + return new rspack.experiments.VirtualModulesPlugin(modules); + } + const VirtualModulesPlugin = (await import('webpack-virtual-modules')) + .default; + return new VirtualModulesPlugin(modules); +} + +/** + * Run compilation and return the result + */ +export function compile(compiler: Compiler) { + const volume = new Volume(); + const fileSystem = createFsFromVolume(volume); + + // @ts-expect-error memfs is compatible enough with webpack's output filesystem + compiler.outputFileSystem = fileSystem; + + return new Promise<{ code: string; volume: InstanceType }>( + (resolve, reject) => { + compiler.run((error, stats) => { + if (error) { + reject(error); + return; + } + + if (stats?.hasErrors()) { + reject(new Error(stats.toString({ errors: true }))); + return; + } + + const code = fileSystem.readFileSync('/out/main.js', 'utf-8') as string; + resolve({ code, volume }); + }); + } + ); +} + +/** + * Virtual modules for mocking React Native in tests + */ +export function getReactNativeVirtualModules( + pixelRatio = 1 +): Record { + return { + 'package.json': '{ "type": "module" }', + 'node_modules/react-native/package.json': + '{ "name": "react-native", "main": "./index.js" }', + 'node_modules/react-native/index.js': `module.exports = { PixelRatio: { get: () => ${pixelRatio} } };`, + 'node_modules/react-native/Libraries/Image/AssetRegistry.js': + 'module.exports = { registerAsset: (spec) => spec };', + 'node_modules/react-native/Libraries/Image/AssetSourceResolver.js': ` + module.exports = class AssetSourceResolver { + constructor(a, b, c) { + this.asset = c; + } + scaledAssetPath() { + var scale = require('react-native').PixelRatio.get(); + var scaleSuffix = scale === 1 ? '' : '@x' + scale; + return { + __packager_asset: true, + width: this.asset.width, + height: this.asset.height, + uri: this.asset.httpServerLocation + '/' + this.asset.name + scaleSuffix + '.' + this.asset.type, + scale: scale, + }; + } + static pickScale(scales, pixelRatio) { + return scales[pixelRatio - 1]; + } + };`, + }; +} diff --git a/packages/repack/src/loaders/assetsLoader/__tests__/__fixtures__/logo.android.png b/tests/integration/src/loaders/__fixtures__/assets/logo.android.png similarity index 100% rename from packages/repack/src/loaders/assetsLoader/__tests__/__fixtures__/logo.android.png rename to tests/integration/src/loaders/__fixtures__/assets/logo.android.png diff --git a/packages/repack/src/loaders/assetsLoader/__tests__/__fixtures__/logo.ios.png b/tests/integration/src/loaders/__fixtures__/assets/logo.ios.png similarity index 100% rename from packages/repack/src/loaders/assetsLoader/__tests__/__fixtures__/logo.ios.png rename to tests/integration/src/loaders/__fixtures__/assets/logo.ios.png diff --git a/packages/repack/src/loaders/assetsLoader/__tests__/__fixtures__/logo.png b/tests/integration/src/loaders/__fixtures__/assets/logo.png similarity index 100% rename from packages/repack/src/loaders/assetsLoader/__tests__/__fixtures__/logo.png rename to tests/integration/src/loaders/__fixtures__/assets/logo.png diff --git a/packages/repack/src/loaders/assetsLoader/__tests__/__fixtures__/star@1x.png b/tests/integration/src/loaders/__fixtures__/assets/star@1x.png similarity index 100% rename from packages/repack/src/loaders/assetsLoader/__tests__/__fixtures__/star@1x.png rename to tests/integration/src/loaders/__fixtures__/assets/star@1x.png diff --git a/packages/repack/src/loaders/assetsLoader/__tests__/__fixtures__/star@2x.png b/tests/integration/src/loaders/__fixtures__/assets/star@2x.png similarity index 100% rename from packages/repack/src/loaders/assetsLoader/__tests__/__fixtures__/star@2x.png rename to tests/integration/src/loaders/__fixtures__/assets/star@2x.png diff --git a/packages/repack/src/loaders/assetsLoader/__tests__/__fixtures__/star@3x.png b/tests/integration/src/loaders/__fixtures__/assets/star@3x.png similarity index 100% rename from packages/repack/src/loaders/assetsLoader/__tests__/__fixtures__/star@3x.png rename to tests/integration/src/loaders/__fixtures__/assets/star@3x.png diff --git a/packages/repack/src/loaders/assetsLoader/__tests__/__snapshots__/assetsLoader.test.ts.snap b/tests/integration/src/loaders/__snapshots__/rspack/assets-loader.test.ts.snap similarity index 85% rename from packages/repack/src/loaders/assetsLoader/__tests__/__snapshots__/assetsLoader.test.ts.snap rename to tests/integration/src/loaders/__snapshots__/rspack/assets-loader.test.ts.snap index 9e8c3068f..7a4a7b268 100644 --- a/packages/repack/src/loaders/assetsLoader/__tests__/__snapshots__/assetsLoader.test.ts.snap +++ b/tests/integration/src/loaders/__snapshots__/rspack/assets-loader.test.ts.snap @@ -1,11 +1,11 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`assetLoader on android should load and extract asset with scales 1`] = ` +exports[`assetLoader > on android > should load and extract asset with scales 1`] = ` { "__packager_asset": true, "hash": "86abef08a42e972a96c958d6fa9d43da,02ad731a8881911e488b51c48a4cc6c1,d9f7c31eebb3a41cc180431867b04f38", "height": 272, - "httpServerLocation": "assets/node_modules/rspack-virtual-module-2f60a7fc/__fixtures__", + "httpServerLocation": "assets/__fixtures__/assets", "name": "star", "scales": [ 1, @@ -17,24 +17,24 @@ exports[`assetLoader on android should load and extract asset with scales 1`] = } `; -exports[`assetLoader on android should load and extract asset with scales 2`] = ` +exports[`assetLoader > on android > should load and extract asset with scales 2`] = ` "/ └─ out/ ├─ drawable-mdpi/ - │ └─ node_modules_rspackvirtualmodule2f60a7fc___fixtures___star.png + │ └─ __fixtures___assets_star.png ├─ drawable-xhdpi/ - │ └─ node_modules_rspackvirtualmodule2f60a7fc___fixtures___star.png + │ └─ __fixtures___assets_star.png ├─ drawable-xxhdpi/ - │ └─ node_modules_rspackvirtualmodule2f60a7fc___fixtures___star.png + │ └─ __fixtures___assets_star.png └─ main.js" `; -exports[`assetLoader on android should load and extract asset without scales 1`] = ` +exports[`assetLoader > on android > should load and extract asset without scales 1`] = ` { "__packager_asset": true, - "hash": "30be0ddcd5932e77845666e7b6f6a863", + "hash": "373411381c08b2c5034c814c24c26b19", "height": 51, - "httpServerLocation": "assets/node_modules/rspack-virtual-module-dede2d21/__fixtures__", + "httpServerLocation": "assets/__fixtures__/assets", "name": "logo", "scales": [ 1, @@ -44,20 +44,20 @@ exports[`assetLoader on android should load and extract asset without scales 1`] } `; -exports[`assetLoader on android should load and extract asset without scales 2`] = ` +exports[`assetLoader > on android > should load and extract asset without scales 2`] = ` "/ └─ out/ ├─ drawable-mdpi/ - │ └─ node_modules_rspackvirtualmoduledede2d21___fixtures___logo.png + │ └─ __fixtures___assets_logo.png └─ main.js" `; -exports[`assetLoader on android should prefer platform specific asset 1`] = ` +exports[`assetLoader > on android > should prefer platform specific asset 1`] = ` { "__packager_asset": true, "hash": "373411381c08b2c5034c814c24c26b19", "height": 51, - "httpServerLocation": "assets/node_modules/rspack-virtual-module-acc39058/__fixtures__", + "httpServerLocation": "assets/__fixtures__/assets", "name": "logo", "scales": [ 1, @@ -67,20 +67,20 @@ exports[`assetLoader on android should prefer platform specific asset 1`] = ` } `; -exports[`assetLoader on android should prefer platform specific asset 2`] = ` +exports[`assetLoader > on android > should prefer platform specific asset 2`] = ` "/ └─ out/ ├─ drawable-mdpi/ - │ └─ node_modules_rspackvirtualmoduleacc39058___fixtures___logo.png + │ └─ __fixtures___assets_logo.png └─ main.js" `; -exports[`assetLoader on ios should load and extract asset with scales 1`] = ` +exports[`assetLoader > on ios > should load and extract asset with scales 1`] = ` { "__packager_asset": true, "hash": "86abef08a42e972a96c958d6fa9d43da,02ad731a8881911e488b51c48a4cc6c1,d9f7c31eebb3a41cc180431867b04f38", "height": 272, - "httpServerLocation": "assets/node_modules/rspack-virtual-module-2f60a7fc/__fixtures__", + "httpServerLocation": "assets/__fixtures__/assets", "name": "star", "scales": [ 1, @@ -92,25 +92,24 @@ exports[`assetLoader on ios should load and extract asset with scales 1`] = ` } `; -exports[`assetLoader on ios should load and extract asset with scales 2`] = ` +exports[`assetLoader > on ios > should load and extract asset with scales 2`] = ` "/ └─ out/ ├─ assets/ - │ └─ node_modules/ - │ └─ rspack-virtual-module-2f60a7fc/ - │ └─ __fixtures__/ - │ ├─ star.png - │ ├─ star@2x.png - │ └─ star@3x.png + │ └─ __fixtures__/ + │ └─ assets/ + │ ├─ star.png + │ ├─ star@2x.png + │ └─ star@3x.png └─ main.js" `; -exports[`assetLoader on ios should load and extract asset without scales 1`] = ` +exports[`assetLoader > on ios > should load and extract asset without scales 1`] = ` { "__packager_asset": true, - "hash": "30be0ddcd5932e77845666e7b6f6a863", + "hash": "6839dbc2a8dafd50c1d82b7db5fe274a", "height": 51, - "httpServerLocation": "assets/node_modules/rspack-virtual-module-dede2d21/__fixtures__", + "httpServerLocation": "assets/__fixtures__/assets", "name": "logo", "scales": [ 1, @@ -120,23 +119,22 @@ exports[`assetLoader on ios should load and extract asset without scales 1`] = ` } `; -exports[`assetLoader on ios should load and extract asset without scales 2`] = ` +exports[`assetLoader > on ios > should load and extract asset without scales 2`] = ` "/ └─ out/ ├─ assets/ - │ └─ node_modules/ - │ └─ rspack-virtual-module-dede2d21/ - │ └─ __fixtures__/ - │ └─ logo.png + │ └─ __fixtures__/ + │ └─ assets/ + │ └─ logo.png └─ main.js" `; -exports[`assetLoader on ios should prefer platform specific asset 1`] = ` +exports[`assetLoader > on ios > should prefer platform specific asset 1`] = ` { "__packager_asset": true, "hash": "6839dbc2a8dafd50c1d82b7db5fe274a", "height": 51, - "httpServerLocation": "assets/node_modules/rspack-virtual-module-1d9593d4/__fixtures__", + "httpServerLocation": "assets/__fixtures__/assets", "name": "logo", "scales": [ 1, @@ -146,232 +144,222 @@ exports[`assetLoader on ios should prefer platform specific asset 1`] = ` } `; -exports[`assetLoader on ios should prefer platform specific asset 2`] = ` +exports[`assetLoader > on ios > should prefer platform specific asset 2`] = ` "/ └─ out/ ├─ assets/ - │ └─ node_modules/ - │ └─ rspack-virtual-module-1d9593d4/ - │ └─ __fixtures__/ - │ └─ logo.png + │ └─ __fixtures__/ + │ └─ assets/ + │ └─ logo.png └─ main.js" `; -exports[`assetLoader should convert to remote-asset with URL containing a path after basename 1`] = ` +exports[`assetLoader > should convert to remote-asset > with URL containing a path after basename 1`] = ` { "__packager_asset": true, "height": 51, "scale": 1, - "uri": "http://localhost:9999/remote-assets/assets/node_modules/rspack-virtual-module-dede2d21/__fixtures__/logo.png", + "uri": "http://localhost:9999/remote-assets/assets/__fixtures__/assets/logo.png", "width": 297, } `; -exports[`assetLoader should convert to remote-asset with URL containing a path after basename 2`] = ` +exports[`assetLoader > should convert to remote-asset > with URL containing a path after basename 2`] = ` "/ └─ out/ ├─ main.js └─ remote-assets/ └─ assets/ - └─ node_modules/ - └─ rspack-virtual-module-dede2d21/ - └─ __fixtures__/ - └─ logo.png" + └─ __fixtures__/ + └─ assets/ + └─ logo.png" `; -exports[`assetLoader should convert to remote-asset with scales 1 1`] = ` +exports[`assetLoader > should convert to remote-asset > with scales 1 1`] = ` { "__packager_asset": true, "height": 272, "scale": 1, - "uri": "http://localhost:9999/assets/node_modules/rspack-virtual-module-2f60a7fc/__fixtures__/star.png", + "uri": "http://localhost:9999/assets/__fixtures__/assets/star.png", "width": 286, } `; -exports[`assetLoader should convert to remote-asset with scales 1 2`] = ` +exports[`assetLoader > should convert to remote-asset > with scales 1 2`] = ` "/ └─ out/ ├─ main.js └─ remote-assets/ └─ assets/ - └─ node_modules/ - └─ rspack-virtual-module-2f60a7fc/ - └─ __fixtures__/ - ├─ star.png - ├─ star@2x.png - └─ star@3x.png" + └─ __fixtures__/ + └─ assets/ + ├─ star.png + ├─ star@2x.png + └─ star@3x.png" `; -exports[`assetLoader should convert to remote-asset with scales 2 1`] = ` +exports[`assetLoader > should convert to remote-asset > with scales 2 1`] = ` { "__packager_asset": true, "height": 272, "scale": 2, - "uri": "http://localhost:9999/assets/node_modules/rspack-virtual-module-4e63ce4e/__fixtures__/star@x2.png", + "uri": "http://localhost:9999/assets/__fixtures__/assets/star@x2.png", "width": 286, } `; -exports[`assetLoader should convert to remote-asset with scales 2 2`] = ` +exports[`assetLoader > should convert to remote-asset > with scales 2 2`] = ` "/ └─ out/ ├─ main.js └─ remote-assets/ └─ assets/ - └─ node_modules/ - └─ rspack-virtual-module-4e63ce4e/ - └─ __fixtures__/ - ├─ star.png - ├─ star@2x.png - └─ star@3x.png" + └─ __fixtures__/ + └─ assets/ + ├─ star.png + ├─ star@2x.png + └─ star@3x.png" `; -exports[`assetLoader should convert to remote-asset with scales 3 1`] = ` +exports[`assetLoader > should convert to remote-asset > with scales 3 1`] = ` { "__packager_asset": true, "height": 272, "scale": 3, - "uri": "http://localhost:9999/assets/node_modules/rspack-virtual-module-1f80d675/__fixtures__/star@x3.png", + "uri": "http://localhost:9999/assets/__fixtures__/assets/star@x3.png", "width": 286, } `; -exports[`assetLoader should convert to remote-asset with scales 3 2`] = ` +exports[`assetLoader > should convert to remote-asset > with scales 3 2`] = ` "/ └─ out/ ├─ main.js └─ remote-assets/ └─ assets/ - └─ node_modules/ - └─ rspack-virtual-module-1f80d675/ - └─ __fixtures__/ - ├─ star.png - ├─ star@2x.png - └─ star@3x.png" + └─ __fixtures__/ + └─ assets/ + ├─ star.png + ├─ star@2x.png + └─ star@3x.png" `; -exports[`assetLoader should convert to remote-asset with specified assetPath with scales 1 1`] = ` +exports[`assetLoader > should convert to remote-asset > with specified assetPath > with scales 1 1`] = ` { "__packager_asset": true, "height": 272, "scale": 1, - "uri": "http://localhost:9999/assets/node_modules/rspack-virtual-module-2f60a7fc/__fixtures__/nested-folder/star-fake-hash.png", + "uri": "http://localhost:9999/assets/__fixtures__/assets/nested-folder/star-fake-hash.png", "width": 286, } `; -exports[`assetLoader should convert to remote-asset with specified assetPath with scales 1 2`] = ` +exports[`assetLoader > should convert to remote-asset > with specified assetPath > with scales 1 2`] = ` "/ └─ out/ ├─ main.js └─ remote-assets/ └─ assets/ - └─ node_modules/ - └─ rspack-virtual-module-2f60a7fc/ - └─ __fixtures__/ - └─ nested-folder/ - ├─ star-fake-hash.png - ├─ star-fake-hash@2x.png - └─ star-fake-hash@3x.png" + └─ __fixtures__/ + └─ assets/ + └─ nested-folder/ + ├─ star-fake-hash.png + ├─ star-fake-hash@2x.png + └─ star-fake-hash@3x.png" `; -exports[`assetLoader should convert to remote-asset with specified assetPath with scales 2 1`] = ` +exports[`assetLoader > should convert to remote-asset > with specified assetPath > with scales 2 1`] = ` { "__packager_asset": true, "height": 272, "scale": 2, - "uri": "http://localhost:9999/assets/node_modules/rspack-virtual-module-4e63ce4e/__fixtures__/nested-folder/star-fake-hash@x2.png", + "uri": "http://localhost:9999/assets/__fixtures__/assets/nested-folder/star-fake-hash@x2.png", "width": 286, } `; -exports[`assetLoader should convert to remote-asset with specified assetPath with scales 2 2`] = ` +exports[`assetLoader > should convert to remote-asset > with specified assetPath > with scales 2 2`] = ` "/ └─ out/ ├─ main.js └─ remote-assets/ └─ assets/ - └─ node_modules/ - └─ rspack-virtual-module-4e63ce4e/ - └─ __fixtures__/ - └─ nested-folder/ - ├─ star-fake-hash.png - ├─ star-fake-hash@2x.png - └─ star-fake-hash@3x.png" + └─ __fixtures__/ + └─ assets/ + └─ nested-folder/ + ├─ star-fake-hash.png + ├─ star-fake-hash@2x.png + └─ star-fake-hash@3x.png" `; -exports[`assetLoader should convert to remote-asset with specified assetPath with scales 3 1`] = ` +exports[`assetLoader > should convert to remote-asset > with specified assetPath > with scales 3 1`] = ` { "__packager_asset": true, "height": 272, "scale": 3, - "uri": "http://localhost:9999/assets/node_modules/rspack-virtual-module-1f80d675/__fixtures__/nested-folder/star-fake-hash@x3.png", + "uri": "http://localhost:9999/assets/__fixtures__/assets/nested-folder/star-fake-hash@x3.png", "width": 286, } `; -exports[`assetLoader should convert to remote-asset with specified assetPath with scales 3 2`] = ` +exports[`assetLoader > should convert to remote-asset > with specified assetPath > with scales 3 2`] = ` "/ └─ out/ ├─ main.js └─ remote-assets/ └─ assets/ - └─ node_modules/ - └─ rspack-virtual-module-1f80d675/ - └─ __fixtures__/ - └─ nested-folder/ - ├─ star-fake-hash.png - ├─ star-fake-hash@2x.png - └─ star-fake-hash@3x.png" + └─ __fixtures__/ + └─ assets/ + └─ nested-folder/ + ├─ star-fake-hash.png + ├─ star-fake-hash@2x.png + └─ star-fake-hash@3x.png" `; -exports[`assetLoader should convert to remote-asset with specified assetPath without scales 1`] = ` +exports[`assetLoader > should convert to remote-asset > with specified assetPath > without scales 1`] = ` { "__packager_asset": true, "height": 51, "scale": 1, - "uri": "http://localhost:9999/remote-assets/assets/node_modules/rspack-virtual-module-dede2d21/__fixtures__/nested-folder/logo-fake-hash.png", + "uri": "http://localhost:9999/remote-assets/assets/__fixtures__/assets/nested-folder/logo-fake-hash.png", "width": 297, } `; -exports[`assetLoader should convert to remote-asset with specified assetPath without scales 2`] = ` +exports[`assetLoader > should convert to remote-asset > with specified assetPath > without scales 2`] = ` "/ └─ out/ ├─ main.js └─ remote-assets/ └─ assets/ - └─ node_modules/ - └─ rspack-virtual-module-dede2d21/ - └─ __fixtures__/ - └─ nested-folder/ - └─ logo-fake-hash.png" + └─ __fixtures__/ + └─ assets/ + └─ nested-folder/ + └─ logo-fake-hash.png" `; -exports[`assetLoader should convert to remote-asset without scales 1`] = ` +exports[`assetLoader > should convert to remote-asset > without scales 1`] = ` { "__packager_asset": true, "height": 51, "scale": 1, - "uri": "http://localhost:9999/assets/node_modules/rspack-virtual-module-dede2d21/__fixtures__/logo.png", + "uri": "http://localhost:9999/assets/__fixtures__/assets/logo.png", "width": 297, } `; -exports[`assetLoader should convert to remote-asset without scales 2`] = ` +exports[`assetLoader > should convert to remote-asset > without scales 2`] = ` "/ └─ out/ ├─ main.js └─ remote-assets/ └─ assets/ - └─ node_modules/ - └─ rspack-virtual-module-dede2d21/ - └─ __fixtures__/ - └─ logo.png" + └─ __fixtures__/ + └─ assets/ + └─ logo.png" `; -exports[`assetLoader should inline asset with scales (1) 1`] = ` +exports[`assetLoader > should inline asset > with scales (1) 1`] = ` { "height": 272, "scale": 1, @@ -380,13 +368,13 @@ exports[`assetLoader should inline asset with scales (1) 1`] = ` } `; -exports[`assetLoader should inline asset with scales (1) 2`] = ` +exports[`assetLoader > should inline asset > with scales (1) 2`] = ` "/ └─ out/ └─ main.js" `; -exports[`assetLoader should inline asset with scales (2) 1`] = ` +exports[`assetLoader > should inline asset > with scales (2) 1`] = ` { "height": 407.5, "scale": 2, @@ -395,13 +383,13 @@ exports[`assetLoader should inline asset with scales (2) 1`] = ` } `; -exports[`assetLoader should inline asset with scales (2) 2`] = ` +exports[`assetLoader > should inline asset > with scales (2) 2`] = ` "/ └─ out/ └─ main.js" `; -exports[`assetLoader should inline asset with scales (3) 1`] = ` +exports[`assetLoader > should inline asset > with scales (3) 1`] = ` { "height": 362, "scale": 3, @@ -410,22 +398,22 @@ exports[`assetLoader should inline asset with scales (3) 1`] = ` } `; -exports[`assetLoader should inline asset with scales (3) 2`] = ` +exports[`assetLoader > should inline asset > with scales (3) 2`] = ` "/ └─ out/ └─ main.js" `; -exports[`assetLoader should inline asset without scales 1`] = ` +exports[`assetLoader > should inline asset > without scales 1`] = ` { "height": 51, "scale": 1, - "uri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASkAAAAzCAMAAAD8fQ75AAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAYxQTFRF////REF2BQFInZu3cnCYgoCjg4GkQ0B1oZ+6IyBeDwxO8/T7dn/MwMTog4KkEA1PYGnEBxajHCqrv8PnmJ7YlpzYeYHNER+nGiiqwsXoGymr/f3+YWvFy83rfIPOCRikNkK04+X1+vv9Chmk4eP04eDpwL/RxMPUhIOlbmuUycjXq6rCtrXJhoSma2mTeHace3mea2iSoaC6RUJ3bGqT7+/0qKe/f32hlJvXGSeqaWeRFRFT0M/djYur4N/ooqG6lZzYDBulGSap3+HzeoLOxsrq4OLzm6DZ5eTs5+fuiYenqafAenidDQpNamiS09Lf9vb5iYepDQlOysnYiIanuLfLoqC6ZmSPCwdMUlCBp6W+s7HHu7rNYmCM+fr9y87s8/P6d3/Ma3TIaXLHsa/GanPHpaO9dnSbkJfWDRulVV/A/Pz+Kjew0NLt2tzxKDWvJjOvys7s2dzx0NPu2NvxxcjpSlW8T0x+zcza0tHe9/f55uXs6Ofu8vL22tnk8/P21dTg9fX4zs3b397nc16LtQAAA1RJREFUeJztm0tIVFEYx+/nnRkfl1QI3LiIBq+bCjQqetcqQhIke1jQuG3VImpVQRJFLaJFtAgKBskWlZULUYra9KBaSEFFlOAiIqIUsofVONrVud953Hs8c2ZsfND3X/3ne8z57s+LnMucCxbJTDDbA8wbESlTaUiBMgdpdJEx/VfbKX0+NqrPR3+jK/ljWsml7ikeYbbsl2/kOR2Ab8pFciYVwwWmTar8uz5fYFIVCESa04kCwKCqlUhJc3qgvAsv+qJoJVLinJOgPEU+h1uJlDCn40Cmqxg+hlqJFJ8T7yhPpeMhVESKzVkNP3hhqf0+0EqkOCkbhnkWBgKtRIrPGR+NDmEy0h9sDdFwMQJT7Dxfo1uSjdRLfX7ZK3RLUzG2FrxAx69/+XN09T95v9MXrlz5FV2lcv9Y/pRZxX/0eBW8yeTCoMKk1j7xzRp4qFrr32nDI3Qi8o1sVX79mx6g43e0p6JwZS27wmx3tHKXUO3CxB+lHu6F64mUVBmPDwxZFe5dRT2Rkis9VOnaO6p6IhWojLvjSlBEyqAyIyJFpOYQqa1Zdo4LevT5hl50NULUZV0qUg1vhdL+cGUOpBq7fbNtiAcXwu2p6qdBqs7R56tu6fOF2KPnQIrdkU2feLBvS9dU9dMgNRefZvIhJUpz0URKEpFSiEgZrk6kTFcnUqarEynT1YmU6eozSaq5W59fkaV/x010MWW+8Tq6XTfQ7RQ3hoxfXqRarvlmt7BD3g6dON2VQP2ce+5TaQaf+/Z1+Gb140A9kSJS85dUAiApBYiUWgm7q2ksKUaIlFIJ+/5w3WIJFZFSaQKUZdXF00ke+39I7bX1+eJLzGZAeahqUkkWLAQp/hvy5hFLobKLzM4gKfM9OoKSURWCFFeepxdnmdT+HnaIpAXggm+JFIpNkCjv4NGWyHnfESkUn+AAtKNthXNoiRRKmOBg2kfVap9lQSKFEifwUYmgiBSTNMEkKgkUkWKS936HUu0yKCLFFNglH4bL8lsW5qRWRdEtuiqE16FZfybck+d7MzmQcpsxA6dUa3EdSevzne/kz07lB+nzUfaG0Wn9F1nH+CnQNiHs7vHNs14rJPV0JcfRtQEeGbVPCgUn8KR1cHp6a81YRMpUfwHvTJdSiEnodgAAAABJRU5ErkJggg==", + "uri": "data:image/png;base64,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", "width": 297, } `; -exports[`assetLoader should inline asset without scales 2`] = ` +exports[`assetLoader > should inline asset > without scales 2`] = ` "/ └─ out/ └─ main.js" diff --git a/tests/integration/src/loaders/__snapshots__/webpack/assets-loader.test.ts.snap b/tests/integration/src/loaders/__snapshots__/webpack/assets-loader.test.ts.snap new file mode 100644 index 000000000..7a4a7b268 --- /dev/null +++ b/tests/integration/src/loaders/__snapshots__/webpack/assets-loader.test.ts.snap @@ -0,0 +1,420 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`assetLoader > on android > should load and extract asset with scales 1`] = ` +{ + "__packager_asset": true, + "hash": "86abef08a42e972a96c958d6fa9d43da,02ad731a8881911e488b51c48a4cc6c1,d9f7c31eebb3a41cc180431867b04f38", + "height": 272, + "httpServerLocation": "assets/__fixtures__/assets", + "name": "star", + "scales": [ + 1, + 2, + 3, + ], + "type": "png", + "width": 286, +} +`; + +exports[`assetLoader > on android > should load and extract asset with scales 2`] = ` +"/ +└─ out/ + ├─ drawable-mdpi/ + │ └─ __fixtures___assets_star.png + ├─ drawable-xhdpi/ + │ └─ __fixtures___assets_star.png + ├─ drawable-xxhdpi/ + │ └─ __fixtures___assets_star.png + └─ main.js" +`; + +exports[`assetLoader > on android > should load and extract asset without scales 1`] = ` +{ + "__packager_asset": true, + "hash": "373411381c08b2c5034c814c24c26b19", + "height": 51, + "httpServerLocation": "assets/__fixtures__/assets", + "name": "logo", + "scales": [ + 1, + ], + "type": "png", + "width": 297, +} +`; + +exports[`assetLoader > on android > should load and extract asset without scales 2`] = ` +"/ +└─ out/ + ├─ drawable-mdpi/ + │ └─ __fixtures___assets_logo.png + └─ main.js" +`; + +exports[`assetLoader > on android > should prefer platform specific asset 1`] = ` +{ + "__packager_asset": true, + "hash": "373411381c08b2c5034c814c24c26b19", + "height": 51, + "httpServerLocation": "assets/__fixtures__/assets", + "name": "logo", + "scales": [ + 1, + ], + "type": "png", + "width": 297, +} +`; + +exports[`assetLoader > on android > should prefer platform specific asset 2`] = ` +"/ +└─ out/ + ├─ drawable-mdpi/ + │ └─ __fixtures___assets_logo.png + └─ main.js" +`; + +exports[`assetLoader > on ios > should load and extract asset with scales 1`] = ` +{ + "__packager_asset": true, + "hash": "86abef08a42e972a96c958d6fa9d43da,02ad731a8881911e488b51c48a4cc6c1,d9f7c31eebb3a41cc180431867b04f38", + "height": 272, + "httpServerLocation": "assets/__fixtures__/assets", + "name": "star", + "scales": [ + 1, + 2, + 3, + ], + "type": "png", + "width": 286, +} +`; + +exports[`assetLoader > on ios > should load and extract asset with scales 2`] = ` +"/ +└─ out/ + ├─ assets/ + │ └─ __fixtures__/ + │ └─ assets/ + │ ├─ star.png + │ ├─ star@2x.png + │ └─ star@3x.png + └─ main.js" +`; + +exports[`assetLoader > on ios > should load and extract asset without scales 1`] = ` +{ + "__packager_asset": true, + "hash": "6839dbc2a8dafd50c1d82b7db5fe274a", + "height": 51, + "httpServerLocation": "assets/__fixtures__/assets", + "name": "logo", + "scales": [ + 1, + ], + "type": "png", + "width": 297, +} +`; + +exports[`assetLoader > on ios > should load and extract asset without scales 2`] = ` +"/ +└─ out/ + ├─ assets/ + │ └─ __fixtures__/ + │ └─ assets/ + │ └─ logo.png + └─ main.js" +`; + +exports[`assetLoader > on ios > should prefer platform specific asset 1`] = ` +{ + "__packager_asset": true, + "hash": "6839dbc2a8dafd50c1d82b7db5fe274a", + "height": 51, + "httpServerLocation": "assets/__fixtures__/assets", + "name": "logo", + "scales": [ + 1, + ], + "type": "png", + "width": 297, +} +`; + +exports[`assetLoader > on ios > should prefer platform specific asset 2`] = ` +"/ +└─ out/ + ├─ assets/ + │ └─ __fixtures__/ + │ └─ assets/ + │ └─ logo.png + └─ main.js" +`; + +exports[`assetLoader > should convert to remote-asset > with URL containing a path after basename 1`] = ` +{ + "__packager_asset": true, + "height": 51, + "scale": 1, + "uri": "http://localhost:9999/remote-assets/assets/__fixtures__/assets/logo.png", + "width": 297, +} +`; + +exports[`assetLoader > should convert to remote-asset > with URL containing a path after basename 2`] = ` +"/ +└─ out/ + ├─ main.js + └─ remote-assets/ + └─ assets/ + └─ __fixtures__/ + └─ assets/ + └─ logo.png" +`; + +exports[`assetLoader > should convert to remote-asset > with scales 1 1`] = ` +{ + "__packager_asset": true, + "height": 272, + "scale": 1, + "uri": "http://localhost:9999/assets/__fixtures__/assets/star.png", + "width": 286, +} +`; + +exports[`assetLoader > should convert to remote-asset > with scales 1 2`] = ` +"/ +└─ out/ + ├─ main.js + └─ remote-assets/ + └─ assets/ + └─ __fixtures__/ + └─ assets/ + ├─ star.png + ├─ star@2x.png + └─ star@3x.png" +`; + +exports[`assetLoader > should convert to remote-asset > with scales 2 1`] = ` +{ + "__packager_asset": true, + "height": 272, + "scale": 2, + "uri": "http://localhost:9999/assets/__fixtures__/assets/star@x2.png", + "width": 286, +} +`; + +exports[`assetLoader > should convert to remote-asset > with scales 2 2`] = ` +"/ +└─ out/ + ├─ main.js + └─ remote-assets/ + └─ assets/ + └─ __fixtures__/ + └─ assets/ + ├─ star.png + ├─ star@2x.png + └─ star@3x.png" +`; + +exports[`assetLoader > should convert to remote-asset > with scales 3 1`] = ` +{ + "__packager_asset": true, + "height": 272, + "scale": 3, + "uri": "http://localhost:9999/assets/__fixtures__/assets/star@x3.png", + "width": 286, +} +`; + +exports[`assetLoader > should convert to remote-asset > with scales 3 2`] = ` +"/ +└─ out/ + ├─ main.js + └─ remote-assets/ + └─ assets/ + └─ __fixtures__/ + └─ assets/ + ├─ star.png + ├─ star@2x.png + └─ star@3x.png" +`; + +exports[`assetLoader > should convert to remote-asset > with specified assetPath > with scales 1 1`] = ` +{ + "__packager_asset": true, + "height": 272, + "scale": 1, + "uri": "http://localhost:9999/assets/__fixtures__/assets/nested-folder/star-fake-hash.png", + "width": 286, +} +`; + +exports[`assetLoader > should convert to remote-asset > with specified assetPath > with scales 1 2`] = ` +"/ +└─ out/ + ├─ main.js + └─ remote-assets/ + └─ assets/ + └─ __fixtures__/ + └─ assets/ + └─ nested-folder/ + ├─ star-fake-hash.png + ├─ star-fake-hash@2x.png + └─ star-fake-hash@3x.png" +`; + +exports[`assetLoader > should convert to remote-asset > with specified assetPath > with scales 2 1`] = ` +{ + "__packager_asset": true, + "height": 272, + "scale": 2, + "uri": "http://localhost:9999/assets/__fixtures__/assets/nested-folder/star-fake-hash@x2.png", + "width": 286, +} +`; + +exports[`assetLoader > should convert to remote-asset > with specified assetPath > with scales 2 2`] = ` +"/ +└─ out/ + ├─ main.js + └─ remote-assets/ + └─ assets/ + └─ __fixtures__/ + └─ assets/ + └─ nested-folder/ + ├─ star-fake-hash.png + ├─ star-fake-hash@2x.png + └─ star-fake-hash@3x.png" +`; + +exports[`assetLoader > should convert to remote-asset > with specified assetPath > with scales 3 1`] = ` +{ + "__packager_asset": true, + "height": 272, + "scale": 3, + "uri": "http://localhost:9999/assets/__fixtures__/assets/nested-folder/star-fake-hash@x3.png", + "width": 286, +} +`; + +exports[`assetLoader > should convert to remote-asset > with specified assetPath > with scales 3 2`] = ` +"/ +└─ out/ + ├─ main.js + └─ remote-assets/ + └─ assets/ + └─ __fixtures__/ + └─ assets/ + └─ nested-folder/ + ├─ star-fake-hash.png + ├─ star-fake-hash@2x.png + └─ star-fake-hash@3x.png" +`; + +exports[`assetLoader > should convert to remote-asset > with specified assetPath > without scales 1`] = ` +{ + "__packager_asset": true, + "height": 51, + "scale": 1, + "uri": "http://localhost:9999/remote-assets/assets/__fixtures__/assets/nested-folder/logo-fake-hash.png", + "width": 297, +} +`; + +exports[`assetLoader > should convert to remote-asset > with specified assetPath > without scales 2`] = ` +"/ +└─ out/ + ├─ main.js + └─ remote-assets/ + └─ assets/ + └─ __fixtures__/ + └─ assets/ + └─ nested-folder/ + └─ logo-fake-hash.png" +`; + +exports[`assetLoader > should convert to remote-asset > without scales 1`] = ` +{ + "__packager_asset": true, + "height": 51, + "scale": 1, + "uri": "http://localhost:9999/assets/__fixtures__/assets/logo.png", + "width": 297, +} +`; + +exports[`assetLoader > should convert to remote-asset > without scales 2`] = ` +"/ +└─ out/ + ├─ main.js + └─ remote-assets/ + └─ assets/ + └─ __fixtures__/ + └─ assets/ + └─ logo.png" +`; + +exports[`assetLoader > should inline asset > with scales (1) 1`] = ` +{ + "height": 272, + "scale": 1, + "uri": "data:image/png;base64,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", + "width": 286, +} +`; + +exports[`assetLoader > should inline asset > with scales (1) 2`] = ` +"/ +└─ out/ + └─ main.js" +`; + +exports[`assetLoader > should inline asset > with scales (2) 1`] = ` +{ + "height": 407.5, + "scale": 2, + "uri": "data:image/png;base64,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", + "width": 428, +} +`; + +exports[`assetLoader > should inline asset > with scales (2) 2`] = ` +"/ +└─ out/ + └─ main.js" +`; + +exports[`assetLoader > should inline asset > with scales (3) 1`] = ` +{ + "height": 362, + "scale": 3, + "uri": "data:image/png;base64,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", + "width": 380.6666666666667, +} +`; + +exports[`assetLoader > should inline asset > with scales (3) 2`] = ` +"/ +└─ out/ + └─ main.js" +`; + +exports[`assetLoader > should inline asset > without scales 1`] = ` +{ + "height": 51, + "scale": 1, + "uri": "data:image/png;base64,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", + "width": 297, +} +`; + +exports[`assetLoader > should inline asset > without scales 2`] = ` +"/ +└─ out/ + └─ main.js" +`; diff --git a/tests/integration/src/loaders/assets-loader.test.ts b/tests/integration/src/loaders/assets-loader.test.ts new file mode 100644 index 000000000..e6995732a --- /dev/null +++ b/tests/integration/src/loaders/assets-loader.test.ts @@ -0,0 +1,285 @@ +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import vm from 'node:vm'; +import { getAssetExtensionsRegExp, getResolveOptions } from '@callstack/repack'; +import { describe, expect, it } from 'vitest'; +import { + compile, + createCompiler, + createVirtualModulePlugin, + getReactNativeVirtualModules, +} from '../helpers.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +async function compileBundle( + platform: string, + virtualModules: Record, + inline?: boolean, + remote?: { + enabled: boolean; + assetPath?: (args: { + resourcePath: string; + resourceFilename: string; + resourceDirname: string; + resourceExtensionType: string; + }) => string; + publicPath: string; + } +) { + const virtualPlugin = await createVirtualModulePlugin(virtualModules); + + const compiler = await createCompiler({ + context: __dirname, + mode: 'development', + devtool: false, + entry: './index.js', + resolve: getResolveOptions(platform), + output: { + path: '/out', + library: 'Export', + }, + module: { + rules: [ + { + test: getAssetExtensionsRegExp(), + use: { + loader: require.resolve('@callstack/repack/assets-loader'), + options: { + platform, + inline, + remote, + }, + }, + }, + ], + }, + plugins: [virtualPlugin], + }); + + return compile(compiler); +} + +describe('assetLoader', () => { + describe.each(['ios', 'android'])('on %s', (platform) => { + it('should load and extract asset without scales', async () => { + const { code, volume } = await compileBundle(platform, { + ...getReactNativeVirtualModules(), + './index.js': + "export { default } from './__fixtures__/assets/logo.png';", + }); + + const context: { Export?: { default: Record } } = {}; + vm.runInNewContext(code, context); + + expect(context.Export?.default).toMatchSnapshot(); + expect(volume.toTree()).toMatchSnapshot(); + }); + + it('should load and extract asset with scales', async () => { + const { code, volume } = await compileBundle(platform, { + ...getReactNativeVirtualModules(), + './index.js': + "export { default } from './__fixtures__/assets/star.png';", + }); + + const context: { Export?: { default: Record } } = {}; + vm.runInNewContext(code, context); + + expect(context.Export?.default).toMatchSnapshot(); + expect(volume.toTree()).toMatchSnapshot(); + }); + + it('should prefer platform specific asset', async () => { + const { code, volume } = await compileBundle(platform, { + ...getReactNativeVirtualModules(), + './index.js': + "export { default } from './__fixtures__/assets/logo.png';", + }); + + const context: { Export?: { default: Record } } = {}; + vm.runInNewContext(code, context); + + expect(context.Export?.default).toMatchSnapshot(); + expect(volume.toTree()).toMatchSnapshot(); + }); + }); + + describe('should inline asset', () => { + it('without scales', async () => { + const { code, volume } = await compileBundle( + 'android', + { + ...getReactNativeVirtualModules(), + './index.js': + "export { default } from './__fixtures__/assets/logo.png';", + }, + true + ); + + const context: { Export?: { default: Record } } = {}; + vm.runInNewContext(code, context); + + expect(context.Export?.default).toMatchSnapshot(); + expect(volume.toTree()).toMatchSnapshot(); + }); + + it.each([ + { preferredScale: 1 }, + { preferredScale: 2 }, + { preferredScale: 3 }, + ])('with scales ($preferredScale)', async ({ preferredScale }) => { + const { code, volume } = await compileBundle( + 'android', + { + ...getReactNativeVirtualModules(preferredScale), + './index.js': + "export { default } from './__fixtures__/assets/star.png';", + }, + true + ); + + const context: { Export?: { default: Record } } = {}; + vm.runInNewContext(code, context); + + expect(context.Export?.default).toMatchSnapshot(); + expect(volume.toTree()).toMatchSnapshot(); + }); + }); + + describe('should convert to remote-asset', () => { + it('without scales', async () => { + const { code, volume } = await compileBundle( + 'ios', // platform doesn't matter for remote-assets + { + ...getReactNativeVirtualModules(), + './index.js': + "export { default } from './__fixtures__/assets/logo.png';", + }, + false, + { + enabled: true, + publicPath: 'http://localhost:9999', + } + ); + + const context: { Export?: { default: Record } } = {}; + vm.runInNewContext(code, context); + + expect(context.Export?.default).toMatchSnapshot(); + expect(volume.toTree()).toMatchSnapshot(); + }); + + it.each([ + { preferredScale: 1 }, + { preferredScale: 2 }, + { preferredScale: 3 }, + ])('with scales $preferredScale', async ({ preferredScale }) => { + const { code, volume } = await compileBundle( + 'ios', // platform doesn't matter for remote-assets + { + ...getReactNativeVirtualModules(preferredScale), + './index.js': + "export { default } from './__fixtures__/assets/star.png';", + }, + false, + { + enabled: true, + publicPath: 'http://localhost:9999', + } + ); + + const context: { Export?: { default: Record } } = {}; + vm.runInNewContext(code, context); + + expect(context.Export?.default).toMatchSnapshot(); + expect(volume.toTree()).toMatchSnapshot(); + }); + + it('with URL containing a path after basename', async () => { + const { code, volume } = await compileBundle( + 'ios', // platform doesn't matter for remote-assets + { + ...getReactNativeVirtualModules(), + './index.js': + "export { default } from './__fixtures__/assets/logo.png';", + }, + false, + { + enabled: true, + publicPath: 'http://localhost:9999/remote-assets', + } + ); + + const context: { Export?: { default: Record } } = {}; + vm.runInNewContext(code, context); + + expect(context.Export?.default).toMatchSnapshot(); + expect(volume.toTree()).toMatchSnapshot(); + }); + + describe('with specified assetPath', () => { + it('without scales', async () => { + const { code, volume } = await compileBundle( + 'ios', // platform doesn't matter for remote-assets + { + ...getReactNativeVirtualModules(), + './index.js': + "export { default } from './__fixtures__/assets/logo.png';", + }, + false, + { + enabled: true, + assetPath: ({ + resourceFilename, + resourceDirname, + resourceExtensionType, + }) => { + return `${resourceDirname}/nested-folder/${resourceFilename}-fake-hash.${resourceExtensionType}`; + }, + publicPath: 'http://localhost:9999/remote-assets', + } + ); + + const context: { Export?: { default: Record } } = {}; + vm.runInNewContext(code, context); + + expect(context.Export?.default).toMatchSnapshot(); + expect(volume.toTree()).toMatchSnapshot(); + }); + + it.each([ + { preferredScale: 1 }, + { preferredScale: 2 }, + { preferredScale: 3 }, + ])('with scales $preferredScale', async ({ preferredScale }) => { + const { code, volume } = await compileBundle( + 'ios', // platform doesn't matter for remote-assets + { + ...getReactNativeVirtualModules(preferredScale), + './index.js': + "export { default } from './__fixtures__/assets/star.png';", + }, + false, + { + enabled: true, + assetPath: ({ + resourceFilename, + resourceDirname, + resourceExtensionType, + }) => { + return `${resourceDirname}/nested-folder/${resourceFilename}-fake-hash.${resourceExtensionType}`; + }, + publicPath: 'http://localhost:9999', + } + ); + + const context: { Export?: { default: Record } } = {}; + vm.runInNewContext(code, context); + + expect(context.Export?.default).toMatchSnapshot(); + expect(volume.toTree()).toMatchSnapshot(); + }); + }); + }); +}); diff --git a/tests/integration/src/vitest.d.ts b/tests/integration/src/vitest.d.ts new file mode 100644 index 000000000..f74518776 --- /dev/null +++ b/tests/integration/src/vitest.d.ts @@ -0,0 +1,7 @@ +import 'vitest'; + +declare module 'vitest' { + export interface ProvidedContext { + bundlerType: 'rspack' | 'webpack'; + } +} diff --git a/tests/integration/tsconfig.json b/tests/integration/tsconfig.json new file mode 100644 index 000000000..bec28a273 --- /dev/null +++ b/tests/integration/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "noEmit": true, + "types": ["node", "vitest/globals"] + }, + "include": ["src", "vitest.config.ts"] +} diff --git a/tests/integration/vitest.config.ts b/tests/integration/vitest.config.ts new file mode 100644 index 000000000..6e2d2b80f --- /dev/null +++ b/tests/integration/vitest.config.ts @@ -0,0 +1,43 @@ +import { basename, dirname, join } from 'node:path'; +import { defineConfig } from 'vitest/config'; +import type { BundlerType } from './src/helpers.js'; + +export default defineConfig({ + test: { + // Store snapshots in separate directories per bundler for easier review + // e.g. __snapshots__/rspack/test.ts.snap, __snapshots__/webpack/test.ts.snap + resolveSnapshotPath(testPath, snapExtension, context) { + const projectName = context.config.name ?? 'default'; + return join( + dirname(testPath), + '__snapshots__', + projectName, + basename(testPath) + snapExtension + ); + }, + projects: [ + { + test: { + name: 'rspack', + include: ['src/**/*.test.ts'], + environment: 'node', + testTimeout: 30_000, + provide: { + bundlerType: 'rspack' satisfies BundlerType, + }, + }, + }, + { + test: { + name: 'webpack', + include: ['src/**/*.test.ts'], + environment: 'node', + testTimeout: 30_000, + provide: { + bundlerType: 'webpack' satisfies BundlerType, + }, + }, + }, + ], + }, +});