diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..49c3329 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,46 @@ +name: CI + +on: + pull_request: + push: + branches: + - main + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + with: + version: 8.15.9 + + - uses: actions/setup-node@v4 + with: + cache: pnpm + node-version: 20 + + - run: pnpm install --frozen-lockfile + - run: pnpm test + - run: pnpm build + + compatibility: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + with: + version: 8.15.9 + + - uses: actions/setup-node@v4 + with: + cache: pnpm + node-version: 20 + + - run: pnpm install --frozen-lockfile + - run: pnpm build + - run: pnpm test:matrix diff --git a/README.md b/README.md index 99f23df..8626394 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,10 @@ export default defineConfig({ }) ``` +The plugin externalizes matching imports during build resolution, so it can be used alongside your own `build.rollupOptions.external` entries. + +This repo verifies compatibility across Vite 2 through 8 with the `pnpm test:matrix` suite. + ### Configuration Pass an object to `externalizeDeps` to override the default configuration. @@ -41,6 +45,7 @@ externalizeDeps({ deps: true, devDeps: false, except: [], + include: [], nodeBuiltins: true, optionalDeps: true, peerDeps: true, diff --git a/package.json b/package.json index e325bee..2467127 100644 --- a/package.json +++ b/package.json @@ -30,19 +30,18 @@ }, "scripts": { "build": "vite build && tsc", - "test": "vite build -c test/vite.config.ts" + "test": "vitest run", + "test:matrix": "node ./test/compatibility-matrix.mjs" }, "packageManager": "pnpm@8.15.9+sha512.499434c9d8fdd1a2794ebf4552b3b25c0a633abcee5bb15e7b5de90f32f47b513aca98cd5cfd001c31f0db454bc3804edccd578501e4ca293a6816166bbd9f81", "devDependencies": { - "@rollup/plugin-node-resolve": "^16.0.1", "@types/node": "^22.16.0", "typescript": "^5.8.3", - "vite": "^7.0.3", - "vite-plugin-externalize-deps": "^0.9.0", - "vite-plugin-inspect": "^11.3.0" + "vite": "^8.0.2", + "vitest": "^4.1.0" }, "peerDependencies": { - "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "publishConfig": { "access": "public" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0cd4634..06f6400 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,9 +1,10 @@ lockfileVersion: '6.0' +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + devDependencies: - '@rollup/plugin-node-resolve': - specifier: ^16.0.1 - version: 16.0.1 '@types/node': specifier: ^22.16.0 version: 22.16.0 @@ -11,621 +12,468 @@ devDependencies: specifier: ^5.8.3 version: 5.8.3 vite: - specifier: ^7.0.3 - version: 7.0.3(@types/node@22.16.0) - vite-plugin-externalize-deps: - specifier: ^0.9.0 - version: 0.9.0(vite@7.0.3) - vite-plugin-inspect: - specifier: ^11.3.0 - version: 11.3.0(vite@7.0.3) + specifier: ^8.0.2 + version: 8.0.2(@types/node@22.16.0) + vitest: + specifier: ^4.1.0 + version: 4.1.0(@types/node@22.16.0)(vite@8.0.2) packages: - /@esbuild/aix-ppc64@0.25.6: - resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] + /@emnapi/core@1.9.1: + resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} requiresBuild: true + dependencies: + '@emnapi/wasi-threads': 1.2.0 + tslib: 2.8.1 dev: true optional: true - /@esbuild/android-arm64@0.25.6: - resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] + /@emnapi/runtime@1.9.1: + resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} requiresBuild: true + dependencies: + tslib: 2.8.1 dev: true optional: true - /@esbuild/android-arm@0.25.6: - resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] + /@emnapi/wasi-threads@1.2.0: + resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} requiresBuild: true + dependencies: + tslib: 2.8.1 dev: true optional: true - /@esbuild/android-x64@0.25.6: - resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - requiresBuild: true + /@jridgewell/sourcemap-codec@1.5.5: + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} dev: true - optional: true - /@esbuild/darwin-arm64@0.25.6: - resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] + /@napi-rs/wasm-runtime@1.1.1: + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} requiresBuild: true + dependencies: + '@emnapi/core': 1.9.1 + '@emnapi/runtime': 1.9.1 + '@tybys/wasm-util': 0.10.1 dev: true optional: true - /@esbuild/darwin-x64@0.25.6: - resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - requiresBuild: true + /@oxc-project/types@0.122.0: + resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} dev: true - optional: true - /@esbuild/freebsd-arm64@0.25.6: - resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} - engines: {node: '>=18'} + /@rolldown/binding-android-arm64@1.0.0-rc.11: + resolution: {integrity: sha512-SJ+/g+xNnOh6NqYxD0V3uVN4W3VfnrGsC9/hoglicgTNfABFG9JjISvkkU0dNY84MNHLWyOgxP9v9Y9pX4S7+A==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] - os: [freebsd] + os: [android] requiresBuild: true dev: true optional: true - /@esbuild/freebsd-x64@0.25.6: - resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] + /@rolldown/binding-darwin-arm64@1.0.0-rc.11: + resolution: {integrity: sha512-7WQgR8SfOPwmDZGFkThUvsmd/nwAWv91oCO4I5LS7RKrssPZmOt7jONN0cW17ydGC1n/+puol1IpoieKqQidmg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm64@0.25.6: - resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] + /@rolldown/binding-darwin-x64@1.0.0-rc.11: + resolution: {integrity: sha512-39Ks6UvIHq4rEogIfQBoBRusj0Q0nPVWIvqmwBLaT6aqQGIakHdESBVOPRRLacy4WwUPIx4ZKzfZ9PMW+IeyUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm@0.25.6: - resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] + /@rolldown/binding-freebsd-x64@1.0.0-rc.11: + resolution: {integrity: sha512-jfsm0ZHfhiqrvWjJAmzsqiIFPz5e7mAoCOPBNTcNgkiid/LaFKiq92+0ojH+nmJmKYkre4t71BWXUZDNp7vsag==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] requiresBuild: true dev: true optional: true - /@esbuild/linux-ia32@0.25.6: - resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} - engines: {node: '>=18'} - cpu: [ia32] + /@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.11: + resolution: {integrity: sha512-zjQaUtSyq1nVe3nxmlSCuR96T1LPlpvmJ0SZy0WJFEsV4kFbXcq2u68L4E6O0XeFj4aex9bEauqjW8UQBeAvfQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-loong64@0.25.6: - resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} - engines: {node: '>=18'} - cpu: [loong64] + /@rolldown/binding-linux-arm64-gnu@1.0.0-rc.11: + resolution: {integrity: sha512-WMW1yE6IOnehTcFE9eipFkm3XN63zypWlrJQ2iF7NrQ9b2LDRjumFoOGJE8RJJTJCTBAdmLMnJ8uVitACUUo1Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-mips64el@0.25.6: - resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} - engines: {node: '>=18'} - cpu: [mips64el] + /@rolldown/binding-linux-arm64-musl@1.0.0-rc.11: + resolution: {integrity: sha512-jfndI9tsfm4APzjNt6QdBkYwre5lRPUgHeDHoI7ydKUuJvz3lZeCfMsI56BZj+7BYqiKsJm7cfd/6KYV7ubrBg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-ppc64@0.25.6: - resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} - engines: {node: '>=18'} + /@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.11: + resolution: {integrity: sha512-ZlFgw46NOAGMgcdvdYwAGu2Q+SLFA9LzbJLW+iyMOJyhj5wk6P3KEE9Gct4xWwSzFoPI7JCdYmYMzVtlgQ+zfw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-riscv64@0.25.6: - resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} - engines: {node: '>=18'} - cpu: [riscv64] + /@rolldown/binding-linux-s390x-gnu@1.0.0-rc.11: + resolution: {integrity: sha512-hIOYmuT6ofM4K04XAZd3OzMySEO4K0/nc9+jmNcxNAxRi6c5UWpqfw3KMFV4MVFWL+jQsSh+bGw2VqmaPMTLyw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-s390x@0.25.6: - resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} - engines: {node: '>=18'} - cpu: [s390x] + /@rolldown/binding-linux-x64-gnu@1.0.0-rc.11: + resolution: {integrity: sha512-qXBQQO9OvkjjQPLdUVr7Nr2t3QTZI7s4KZtfw7HzBgjbmAPSFwSv4rmET9lLSgq3rH/ndA3ngv3Qb8l2njoPNA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-x64@0.25.6: - resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} - engines: {node: '>=18'} + /@rolldown/binding-linux-x64-musl@1.0.0-rc.11: + resolution: {integrity: sha512-/tpFfoSTzUkH9LPY+cYbqZBDyyX62w5fICq9qzsHLL8uTI6BHip3Q9Uzft0wylk/i8OOwKik8OxW+QAhDmzwmg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/netbsd-arm64@0.25.6: - resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} - engines: {node: '>=18'} + /@rolldown/binding-openharmony-arm64@1.0.0-rc.11: + resolution: {integrity: sha512-mcp3Rio2w72IvdZG0oQ4bM2c2oumtwHfUfKncUM6zGgz0KgPz4YmDPQfnXEiY5t3+KD/i8HG2rOB/LxdmieK2g==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] - os: [netbsd] + os: [openharmony] requiresBuild: true dev: true optional: true - /@esbuild/netbsd-x64@0.25.6: - resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] + /@rolldown/binding-wasm32-wasi@1.0.0-rc.11: + resolution: {integrity: sha512-LXk5Hii1Ph9asuGRjBuz8TUxdc1lWzB7nyfdoRgI0WGPZKmCxvlKk8KfYysqtr4MfGElu/f/pEQRh8fcEgkrWw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] requiresBuild: true + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 dev: true optional: true - /@esbuild/openbsd-arm64@0.25.6: - resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} - engines: {node: '>=18'} + /@rolldown/binding-win32-arm64-msvc@1.0.0-rc.11: + resolution: {integrity: sha512-dDwf5otnx0XgRY1yqxOC4ITizcdzS/8cQ3goOWv3jFAo4F+xQYni+hnMuO6+LssHHdJW7+OCVL3CoU4ycnh35Q==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] - os: [openbsd] + os: [win32] requiresBuild: true dev: true optional: true - /@esbuild/openbsd-x64@0.25.6: - resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} - engines: {node: '>=18'} + /@rolldown/binding-win32-x64-msvc@1.0.0-rc.11: + resolution: {integrity: sha512-LN4/skhSggybX71ews7dAj6r2geaMJfm3kMbK2KhFMg9B10AZXnKoLCVVgzhMHL0S+aKtr4p8QbAW8k+w95bAA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] - os: [openbsd] + os: [win32] requiresBuild: true dev: true optional: true - /@esbuild/openharmony-arm64@0.25.6: - resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - requiresBuild: true + /@rolldown/pluginutils@1.0.0-rc.11: + resolution: {integrity: sha512-xQO9vbwBecJRv9EUcQ/y0dzSTJgA7Q6UVN7xp6B81+tBGSLVAK03yJ9NkJaUA7JFD91kbjxRSC/mDnmvXzbHoQ==} dev: true - optional: true - /@esbuild/sunos-x64@0.25.6: - resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - requiresBuild: true + /@standard-schema/spec@1.1.0: + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} dev: true - optional: true - /@esbuild/win32-arm64@0.25.6: - resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] + /@tybys/wasm-util@0.10.1: + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} requiresBuild: true + dependencies: + tslib: 2.8.1 dev: true optional: true - /@esbuild/win32-ia32@0.25.6: - resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - requiresBuild: true + /@types/chai@5.2.3: + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 dev: true - optional: true - /@esbuild/win32-x64@0.25.6: - resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - requiresBuild: true + /@types/deep-eql@4.0.2: + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} dev: true - optional: true - /@polka/url@1.0.0-next.29: - resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + /@types/estree@1.0.8: + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} dev: true - /@rollup/plugin-node-resolve@16.0.1: - resolution: {integrity: sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true + /@types/node@22.16.0: + resolution: {integrity: sha512-B2egV9wALML1JCpv3VQoQ+yesQKAmNMBIAY7OteVrikcOcAkWm+dGL6qpeCktPjAv6N1JLnhbNiqS35UpFyBsQ==} dependencies: - '@rollup/pluginutils': 5.2.0 - '@types/resolve': 1.20.2 - deepmerge: 4.3.1 - is-module: 1.0.0 - resolve: 1.22.10 + undici-types: 6.21.0 dev: true - /@rollup/pluginutils@5.2.0: - resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} - engines: {node: '>=14.0.0'} + /@vitest/expect@4.1.0: + resolution: {integrity: sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==} + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.0 + '@vitest/utils': 4.1.0 + chai: 6.2.2 + tinyrainbow: 3.1.0 + dev: true + + /@vitest/mocker@4.1.0(vite@8.0.2): + resolution: {integrity: sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 peerDependenciesMeta: - rollup: + msw: + optional: true + vite: optional: true dependencies: - '@types/estree': 1.0.8 - estree-walker: 2.0.2 - picomatch: 4.0.2 + '@vitest/spy': 4.1.0 + estree-walker: 3.0.3 + magic-string: 0.30.21 + vite: 8.0.2(@types/node@22.16.0) dev: true - /@rollup/rollup-android-arm-eabi@4.44.2: - resolution: {integrity: sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==} - cpu: [arm] - os: [android] - requiresBuild: true + /@vitest/pretty-format@4.1.0: + resolution: {integrity: sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==} + dependencies: + tinyrainbow: 3.1.0 dev: true - optional: true - /@rollup/rollup-android-arm64@4.44.2: - resolution: {integrity: sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==} - cpu: [arm64] - os: [android] - requiresBuild: true + /@vitest/runner@4.1.0: + resolution: {integrity: sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==} + dependencies: + '@vitest/utils': 4.1.0 + pathe: 2.0.3 dev: true - optional: true - /@rollup/rollup-darwin-arm64@4.44.2: - resolution: {integrity: sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==} - cpu: [arm64] - os: [darwin] - requiresBuild: true + /@vitest/snapshot@4.1.0: + resolution: {integrity: sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==} + dependencies: + '@vitest/pretty-format': 4.1.0 + '@vitest/utils': 4.1.0 + magic-string: 0.30.21 + pathe: 2.0.3 dev: true - optional: true - /@rollup/rollup-darwin-x64@4.44.2: - resolution: {integrity: sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==} - cpu: [x64] - os: [darwin] - requiresBuild: true + /@vitest/spy@4.1.0: + resolution: {integrity: sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==} dev: true - optional: true - /@rollup/rollup-freebsd-arm64@4.44.2: - resolution: {integrity: sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==} - cpu: [arm64] - os: [freebsd] - requiresBuild: true + /@vitest/utils@4.1.0: + resolution: {integrity: sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==} + dependencies: + '@vitest/pretty-format': 4.1.0 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 dev: true - optional: true - /@rollup/rollup-freebsd-x64@4.44.2: - resolution: {integrity: sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==} - cpu: [x64] - os: [freebsd] - requiresBuild: true + /assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} dev: true - optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.44.2: - resolution: {integrity: sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==} - cpu: [arm] - os: [linux] - requiresBuild: true + /chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} dev: true - optional: true - /@rollup/rollup-linux-arm-musleabihf@4.44.2: - resolution: {integrity: sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==} - cpu: [arm] - os: [linux] + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + dev: true + + /es-module-lexer@2.0.0: + resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + dev: true + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.8 + dev: true + + /expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + dev: true + + /fdir@6.5.0(picomatch@4.0.3): + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + dependencies: + picomatch: 4.0.3 + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.44.2: - resolution: {integrity: sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==} + /lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} cpu: [arm64] - os: [linux] + os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.44.2: - resolution: {integrity: sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==} + /lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} cpu: [arm64] - os: [linux] + os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-loongarch64-gnu@4.44.2: - resolution: {integrity: sha512-Yl5Rdpf9pIc4GW1PmkUGHdMtbx0fBLE1//SxDmuf3X0dUC57+zMepow2LK0V21661cjXdTn8hO2tXDdAWAqE5g==} - cpu: [loong64] - os: [linux] + /lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.44.2: - resolution: {integrity: sha512-03vUDH+w55s680YYryyr78jsO1RWU9ocRMaeV2vMniJJW/6HhoTBwyyiiTPVHNWLnhsnwcQ0oH3S9JSBEKuyqw==} - cpu: [ppc64] - os: [linux] + /lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.44.2: - resolution: {integrity: sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==} - cpu: [riscv64] + /lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-musl@4.44.2: - resolution: {integrity: sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==} - cpu: [riscv64] + /lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-s390x-gnu@4.44.2: - resolution: {integrity: sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==} - cpu: [s390x] + /lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.44.2: - resolution: {integrity: sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==} + /lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.44.2: - resolution: {integrity: sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==} + /lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.44.2: - resolution: {integrity: sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==} + /lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.44.2: - resolution: {integrity: sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-x64-msvc@4.44.2: - resolution: {integrity: sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==} + /lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /@types/estree@1.0.8: - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - dev: true - - /@types/node@22.16.0: - resolution: {integrity: sha512-B2egV9wALML1JCpv3VQoQ+yesQKAmNMBIAY7OteVrikcOcAkWm+dGL6qpeCktPjAv6N1JLnhbNiqS35UpFyBsQ==} + /lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} dependencies: - undici-types: 6.21.0 - dev: true - - /@types/resolve@1.20.2: - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - dev: true - - /ansis@4.1.0: - resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} - engines: {node: '>=14'} - dev: true - - /birpc@2.4.0: - resolution: {integrity: sha512-5IdNxTyhXHv2UlgnPHQ0h+5ypVmkrYHzL8QT+DwFZ//2N/oNV8Ch+BCRmTJ3x6/z9Axo/cXYBc9eprsUVK/Jsg==} - dev: true - - /bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} - engines: {node: '>=18'} - dependencies: - run-applescript: 7.0.0 - dev: true - - /debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true - - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: true - - /default-browser-id@5.0.0: - resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} - engines: {node: '>=18'} - dev: true - - /default-browser@5.2.1: - resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} - engines: {node: '>=18'} - dependencies: - bundle-name: 4.1.0 - default-browser-id: 5.0.0 - dev: true - - /define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - dev: true - - /error-stack-parser-es@1.0.5: - resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} - dev: true - - /esbuild@0.25.6: - resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} - engines: {node: '>=18'} - hasBin: true - requiresBuild: true + detect-libc: 2.1.2 optionalDependencies: - '@esbuild/aix-ppc64': 0.25.6 - '@esbuild/android-arm': 0.25.6 - '@esbuild/android-arm64': 0.25.6 - '@esbuild/android-x64': 0.25.6 - '@esbuild/darwin-arm64': 0.25.6 - '@esbuild/darwin-x64': 0.25.6 - '@esbuild/freebsd-arm64': 0.25.6 - '@esbuild/freebsd-x64': 0.25.6 - '@esbuild/linux-arm': 0.25.6 - '@esbuild/linux-arm64': 0.25.6 - '@esbuild/linux-ia32': 0.25.6 - '@esbuild/linux-loong64': 0.25.6 - '@esbuild/linux-mips64el': 0.25.6 - '@esbuild/linux-ppc64': 0.25.6 - '@esbuild/linux-riscv64': 0.25.6 - '@esbuild/linux-s390x': 0.25.6 - '@esbuild/linux-x64': 0.25.6 - '@esbuild/netbsd-arm64': 0.25.6 - '@esbuild/netbsd-x64': 0.25.6 - '@esbuild/openbsd-arm64': 0.25.6 - '@esbuild/openbsd-x64': 0.25.6 - '@esbuild/openharmony-arm64': 0.25.6 - '@esbuild/sunos-x64': 0.25.6 - '@esbuild/win32-arm64': 0.25.6 - '@esbuild/win32-ia32': 0.25.6 - '@esbuild/win32-x64': 0.25.6 - dev: true - - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: true - - /fdir@6.4.6(picomatch@4.0.2): - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - dependencies: - picomatch: 4.0.2 - dev: true - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true - - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: true - - /is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + dev: true + + /magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} dependencies: - hasown: 2.0.2 - dev: true - - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - dev: true - - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - dependencies: - is-docker: 3.0.0 - dev: true - - /is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - dev: true - - /is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} - dependencies: - is-inside-container: 1.0.0 - dev: true - - /mrmime@2.0.1: - resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} - engines: {node: '>=10'} - dev: true - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + '@jridgewell/sourcemap-codec': 1.5.5 dev: true /nanoid@3.3.11: @@ -634,43 +482,25 @@ packages: hasBin: true dev: true - /ohash@2.0.11: - resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} - dev: true - - /open@10.1.2: - resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==} - engines: {node: '>=18'} - dependencies: - default-browser: 5.2.1 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - is-wsl: 3.1.0 - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + /obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} dev: true /pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} dev: true - /perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - dev: true - /picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} dev: true - /picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + /picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} dev: true - /postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + /postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.11 @@ -678,83 +508,76 @@ packages: source-map-js: 1.2.1 dev: true - /resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} + /rolldown@1.0.0-rc.11: + resolution: {integrity: sha512-NRjoKMusSjfRbSYiH3VSumlkgFe7kYAa3pzVOsVYVFY3zb5d7nS+a3KGQ7hJKXuYWbzJKPVQ9Wxq2UvyK+ENpw==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 + '@oxc-project/types': 0.122.0 + '@rolldown/pluginutils': 1.0.0-rc.11 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.11 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.11 + '@rolldown/binding-darwin-x64': 1.0.0-rc.11 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.11 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.11 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.11 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.11 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.11 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.11 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.11 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.11 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.11 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.11 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.11 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.11 + dev: true + + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} dev: true - /rollup@4.44.2: - resolution: {integrity: sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.44.2 - '@rollup/rollup-android-arm64': 4.44.2 - '@rollup/rollup-darwin-arm64': 4.44.2 - '@rollup/rollup-darwin-x64': 4.44.2 - '@rollup/rollup-freebsd-arm64': 4.44.2 - '@rollup/rollup-freebsd-x64': 4.44.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.44.2 - '@rollup/rollup-linux-arm-musleabihf': 4.44.2 - '@rollup/rollup-linux-arm64-gnu': 4.44.2 - '@rollup/rollup-linux-arm64-musl': 4.44.2 - '@rollup/rollup-linux-loongarch64-gnu': 4.44.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.44.2 - '@rollup/rollup-linux-riscv64-gnu': 4.44.2 - '@rollup/rollup-linux-riscv64-musl': 4.44.2 - '@rollup/rollup-linux-s390x-gnu': 4.44.2 - '@rollup/rollup-linux-x64-gnu': 4.44.2 - '@rollup/rollup-linux-x64-musl': 4.44.2 - '@rollup/rollup-win32-arm64-msvc': 4.44.2 - '@rollup/rollup-win32-ia32-msvc': 4.44.2 - '@rollup/rollup-win32-x64-msvc': 4.44.2 - fsevents: 2.3.3 + /source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} dev: true - /run-applescript@7.0.0: - resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} - engines: {node: '>=18'} + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true - /sirv@3.0.1: - resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} - engines: {node: '>=18'} - dependencies: - '@polka/url': 1.0.0-next.29 - mrmime: 2.0.1 - totalist: 3.0.1 + /std-env@4.0.0: + resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} dev: true - /source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + /tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + /tinyexec@1.0.4: + resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} + engines: {node: '>=18'} dev: true - /tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + /tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} dependencies: - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 dev: true - /totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} + /tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} + engines: {node: '>=14.0.0'} dev: true + /tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + requiresBuild: true + dev: true + optional: true + /typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} @@ -765,73 +588,16 @@ packages: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} dev: true - /unplugin-utils@0.2.4: - resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==} - engines: {node: '>=18.12.0'} - dependencies: - pathe: 2.0.3 - picomatch: 4.0.2 - dev: true - - /vite-dev-rpc@1.1.0(vite@7.0.3): - resolution: {integrity: sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==} - peerDependencies: - vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 - dependencies: - birpc: 2.4.0 - vite: 7.0.3(@types/node@22.16.0) - vite-hot-client: 2.1.0(vite@7.0.3) - dev: true - - /vite-hot-client@2.1.0(vite@7.0.3): - resolution: {integrity: sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==} - peerDependencies: - vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 - dependencies: - vite: 7.0.3(@types/node@22.16.0) - dev: true - - /vite-plugin-externalize-deps@0.9.0(vite@7.0.3): - resolution: {integrity: sha512-wg3qb5gCy2d1KpPKyD9wkXMcYJ84yjgziHrStq9/8R7chhUC73mhQz+tVtvhFiICQHsBn1pnkY4IBbPqF9JHNw==} - peerDependencies: - vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 - dependencies: - vite: 7.0.3(@types/node@22.16.0) - dev: true - - /vite-plugin-inspect@11.3.0(vite@7.0.3): - resolution: {integrity: sha512-vmt7K1WVKQkuiwvsM6e5h3HDJ2pSWTnzoj+JP9Kvu3Sh2G+nFap1F1V7tqpyA4qFxM1GQ84ryffWFGQrwShERQ==} - engines: {node: '>=14'} - peerDependencies: - '@nuxt/kit': '*' - vite: ^6.0.0 || ^7.0.0-0 - peerDependenciesMeta: - '@nuxt/kit': - optional: true - dependencies: - ansis: 4.1.0 - debug: 4.4.1 - error-stack-parser-es: 1.0.5 - ohash: 2.0.11 - open: 10.1.2 - perfect-debounce: 1.0.0 - sirv: 3.0.1 - unplugin-utils: 0.2.4 - vite: 7.0.3(@types/node@22.16.0) - vite-dev-rpc: 1.1.0(vite@7.0.3) - transitivePeerDependencies: - - supports-color - dev: true - - /vite@7.0.3(@types/node@22.16.0): - resolution: {integrity: sha512-y2L5oJZF7bj4c0jgGYgBNSdIu+5HF+m68rn2cQXFbGoShdhV1phX9rbnxy9YXj82aS8MMsCLAAFkRxZeWdldrQ==} + /vite@8.0.2(@types/node@22.16.0): + resolution: {integrity: sha512-1gFhNi+bHhRE/qKZOJXACm6tX4bA3Isy9KuKF15AgSRuRazNBOJfdDemPBU16/mpMxApDPrWvZ08DcLPEoRnuA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.0 + esbuild: ^0.27.0 jiti: '>=1.21.0' less: ^4.0.0 - lightningcss: ^1.21.0 sass: ^1.70.0 sass-embedded: ^1.70.0 stylus: '>=0.54.8' @@ -842,12 +608,14 @@ packages: peerDependenciesMeta: '@types/node': optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true jiti: optional: true less: optional: true - lightningcss: - optional: true sass: optional: true sass-embedded: @@ -864,12 +632,80 @@ packages: optional: true dependencies: '@types/node': 22.16.0 - esbuild: 0.25.6 - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 - postcss: 8.5.6 - rollup: 4.44.2 - tinyglobby: 0.2.14 + lightningcss: 1.32.0 + picomatch: 4.0.3 + postcss: 8.5.8 + rolldown: 1.0.0-rc.11 + tinyglobby: 0.2.15 optionalDependencies: fsevents: 2.3.3 dev: true + + /vitest@4.1.0(@types/node@22.16.0)(vite@8.0.2): + resolution: {integrity: sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.0 + '@vitest/browser-preview': 4.1.0 + '@vitest/browser-webdriverio': 4.1.0 + '@vitest/ui': 4.1.0 + happy-dom: '*' + jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/node': 22.16.0 + '@vitest/expect': 4.1.0 + '@vitest/mocker': 4.1.0(vite@8.0.2) + '@vitest/pretty-format': 4.1.0 + '@vitest/runner': 4.1.0 + '@vitest/snapshot': 4.1.0 + '@vitest/spy': 4.1.0 + '@vitest/utils': 4.1.0 + es-module-lexer: 2.0.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: 4.0.0 + tinybench: 2.9.0 + tinyexec: 1.0.4 + tinyglobby: 0.2.15 + tinyrainbow: 3.1.0 + vite: 8.0.2(@types/node@22.16.0) + why-is-node-running: 2.3.0 + transitivePeerDependencies: + - msw + dev: true + + /why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true diff --git a/src/index.ts b/src/index.ts index e423dbf..80541b9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -29,8 +29,33 @@ interface UserOptions { useFile: string, } -const parseFile = (file: string) => { - return JSON.parse(readFileSync(file).toString()) +interface PackageJson { + dependencies?: Record, + devDependencies?: Record, + optionalDependencies?: Record, + peerDependencies?: Record, +} + +const parseFile = (file: string): PackageJson => { + return JSON.parse(readFileSync(file, 'utf8')) +} + +const matchesDependency = (id: string, dependency: string) => { + return id === dependency || id.startsWith(`${dependency}/`) +} + +const createBuiltinIdSet = () => { + const builtinIds = new Set() + + builtinModules.forEach((builtinModule) => { + builtinIds.add(builtinModule) + + if (!builtinModule.startsWith('node:')) { + builtinIds.add(`node:${builtinModule}`) + } + }) + + return builtinIds } /** @@ -83,100 +108,106 @@ export const externalizeDeps = (options: Partial = {}): Plugin => { ...options, } - return { - name: 'vite-plugin-externalize-deps', - config: (_config, _env) => { - if (!existsSync(optionsResolved.useFile)) { - throw new Error(`[vite-plugin-externalize-deps] The file specified for useFile (${optionsResolved.useFile}) does not exist.`) - } + const builtinIds = optionsResolved.nodeBuiltins + ? createBuiltinIdSet() + : new Set() + const dependencyIds = new Set() + let isInitialized = false - const externalDeps = new Set() - const { - dependencies = {}, - devDependencies = {}, - optionalDependencies = {}, - peerDependencies = {}, - } = parseFile(optionsResolved.useFile) - - if (optionsResolved.deps) { - Object.keys(dependencies).forEach((dep) => { - const depMatcher = new RegExp(`^${dep}(?:/.+)?$`) - - externalDeps.add(depMatcher) - }) + const isException = (id: string) => { + return optionsResolved.except.some((exception) => { + if (typeof exception === 'string') { + return exception === id } - if (optionsResolved.devDeps) { - Object.keys(devDependencies).forEach((dep) => { - const depMatcher = new RegExp(`^${dep}(?:/.+)?$`) - - externalDeps.add(depMatcher) - }) - } - - if (optionsResolved.nodeBuiltins) { - builtinModules.forEach((builtinModule) => { - const builtinMatcher = new RegExp(`^(?:node:)?${builtinModule}$`) + return exception.test(id) + }) + } - externalDeps.add(builtinMatcher) - }) + const isIncluded = (id: string) => { + return optionsResolved.include.some((included) => { + if (typeof included === 'string') { + return included === id } - if (optionsResolved.optionalDeps) { - Object.keys(optionalDependencies).forEach((dep) => { - const depMatcher = new RegExp(`^${dep}(?:/.+)?$`) + return included.test(id) + }) + } - externalDeps.add(depMatcher) - }) - } + const initialize = () => { + if (isInitialized) { + return + } + + if (!existsSync(optionsResolved.useFile)) { + throw new Error(`[vite-plugin-externalize-deps] The file specified for useFile (${optionsResolved.useFile}) does not exist.`) + } + + const { + dependencies = {}, + devDependencies = {}, + optionalDependencies = {}, + peerDependencies = {}, + } = parseFile(optionsResolved.useFile) + + if (optionsResolved.deps) { + Object.keys(dependencies).forEach((dependency) => { + dependencyIds.add(dependency) + }) + } + + if (optionsResolved.devDeps) { + Object.keys(devDependencies).forEach((dependency) => { + dependencyIds.add(dependency) + }) + } + + if (optionsResolved.optionalDeps) { + Object.keys(optionalDependencies).forEach((dependency) => { + dependencyIds.add(dependency) + }) + } + + if (optionsResolved.peerDeps) { + Object.keys(peerDependencies).forEach((dependency) => { + dependencyIds.add(dependency) + }) + } + + isInitialized = true + } - if (optionsResolved.peerDeps) { - Object.keys(peerDependencies).forEach((dep) => { - const depMatcher = new RegExp(`^${dep}(?:/.+)?$`) + return { + name: 'vite-plugin-externalize-deps', + apply: 'build', + enforce: 'pre', + configResolved: () => { + initialize() + }, + resolveId: (id: string) => { + initialize() - externalDeps.add(depMatcher) - }) + if (isException(id)) { + return null } - const depMatchers = Array.from(externalDeps) - - const isException = (id: string) => { - return optionsResolved.except.some((exception) => { - if (typeof exception === 'string') { - return exception === id - } - - return exception.test(id) - }) + if (isIncluded(id) || builtinIds.has(id)) { + return { + external: true, + id, + } } - const isIncluded = (id: string) => { - return optionsResolved.include.some((included) => { - if (typeof included === 'string') { - return included === id + for (const dependency of dependencyIds) { + if (matchesDependency(id, dependency)) { + return { + external: true, + id, } - - return included.test(id) - }) + } } - return { - build: { - rollupOptions: { - external: (id) => { - if (isException(id)) { - return false - } - - if (isIncluded(id)) { - return true - } - - return depMatchers.some((depMatcher) => depMatcher.test(id)) - }, - }, - }, - } + return null }, } } diff --git a/test/compatibility-matrix.mjs b/test/compatibility-matrix.mjs new file mode 100644 index 0000000..f9beec3 --- /dev/null +++ b/test/compatibility-matrix.mjs @@ -0,0 +1,140 @@ +import { mkdtemp, mkdir, readFile, rm, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { dirname, join, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' +import { spawn } from 'node:child_process' + +const __dirname = dirname(fileURLToPath(import.meta.url)) +const projectRoot = resolve(__dirname, '..') +const pluginEntry = resolve(projectRoot, 'dist', 'index.js') +const pnpmCommand = process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm' + +const viteVersions = [ + '2.9.18', + '3.2.11', + '4.5.14', + '5.4.19', + '6.4.1', + '7.0.3', + '8.0.2', +] + +const run = (command, args, cwd) => { + return new Promise((resolvePromise, rejectPromise) => { + const child = spawn(command, args, { + cwd, + env: process.env, + stdio: 'pipe', + }) + + let stdout = '' + let stderr = '' + + child.stdout.on('data', (chunk) => { + stdout += chunk.toString() + }) + + child.stderr.on('data', (chunk) => { + stderr += chunk.toString() + }) + + child.on('error', (error) => { + rejectPromise(error) + }) + + child.on('close', (code) => { + if (code === 0) { + resolvePromise({ stderr, stdout }) + return + } + + rejectPromise(new Error([ + `Command failed: ${command} ${args.join(' ')}`, + stdout, + stderr, + ].filter(Boolean).join('\n'))) + }) + }) +} + +const createFixture = async (root) => { + await mkdir(join(root, 'src'), { recursive: true }) + await writeFile( + join(root, 'package.json'), + JSON.stringify({ + name: 'compatibility-fixture', + private: true, + type: 'module', + dependencies: { + chalk: '^5.6.2', + }, + }, null, 2), + ) + await writeFile( + join(root, 'src', 'entry.ts'), + [ + 'import chalk from "chalk"', + 'import path from "node:path"', + 'console.log(chalk.green("ok"), path.sep)', + ].join('\n'), + ) + await writeFile( + join(root, 'vite.config.mjs'), + [ + 'import { defineConfig } from "vite"', + `import { externalizeDeps } from ${JSON.stringify(pluginEntry)}`, + '', + 'export default defineConfig({', + ' plugins: [externalizeDeps({ useFile: "./package.json" })],', + ' ssr: {', + ' noExternal: true,', + ' },', + ' build: {', + ' ssr: true,', + ' lib: {', + ' entry: "./src/entry.ts",', + ' formats: ["es"],', + ' fileName: "bundle",', + ' },', + ' outDir: "./dist",', + ' },', + '})', + '', + ].join('\n'), + ) +} + +const assertOutput = async (root, viteVersion) => { + const output = await readFile(join(root, 'dist', 'entry.js'), 'utf8') + + if (!output.includes('import chalk from "chalk";')) { + throw new Error(`Vite ${viteVersion} bundled chalk unexpectedly.\n\n${output}`) + } + + if (!output.includes('import path from "node:path";')) { + throw new Error(`Vite ${viteVersion} bundled node:path unexpectedly.\n\n${output}`) + } +} + +const main = async () => { + const tempRoot = await mkdtemp(join(tmpdir(), 'vite-plugin-externalize-deps-compat-')) + + try { + for (const viteVersion of viteVersions) { + const fixtureRoot = join(tempRoot, viteVersion.replaceAll('.', '-')) + + await createFixture(fixtureRoot) + process.stdout.write(`Testing Vite ${viteVersion}\n`) + await run(pnpmCommand, ['add', '-D', `vite@${viteVersion}`], fixtureRoot) + await run(pnpmCommand, ['vite', 'build'], fixtureRoot) + await assertOutput(fixtureRoot, viteVersion) + } + } finally { + await rm(tempRoot, { force: true, recursive: true }) + } +} + +main().catch((error) => { + process.stderr.write(`${error instanceof Error ? error.stack ?? error.message : String(error)}\n`) + process.exitCode = 1 +}) diff --git a/test/entry.ts b/test/entry.ts deleted file mode 100644 index 79d6051..0000000 --- a/test/entry.ts +++ /dev/null @@ -1,13 +0,0 @@ -import path from 'path' -import path2 from 'node:path' -import { resolve } from 'path' -import chalk from 'chalk' -import { defineConfig } from 'vite' -// @ts-ignore -import esbuild from 'esbuild' -// @ts-ignore -import rollup from 'rollup' -// @ts-ignore -import hello from 'unlisted-dep' - -console.log(path, path2, resolve, chalk, esbuild, defineConfig, rollup, hello) diff --git a/test/externalize-deps.test.ts b/test/externalize-deps.test.ts new file mode 100644 index 0000000..1f9d3e6 --- /dev/null +++ b/test/externalize-deps.test.ts @@ -0,0 +1,241 @@ +import { mkdtemp, mkdir, readFile, rm, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { basename, dirname, extname, join } from 'node:path' +import { afterEach, describe, expect, it } from 'vitest' +import { build } from 'vite' +import { externalizeDeps } from '../src/index' + +interface PackageDefinition { + code?: string, + subpathFiles?: Record, +} + +interface ProjectDefinition { + entry: string, + manifest: Record, + packages?: Record, +} + +const temporaryDirectories: string[] = [] + +const createProject = async ({ entry, manifest, packages = {} }: ProjectDefinition) => { + const root = await mkdtemp(join(tmpdir(), 'vite-plugin-externalize-deps-')) + + temporaryDirectories.push(root) + + await mkdir(join(root, 'src'), { recursive: true }) + await writeFile( + join(root, 'package.json'), + JSON.stringify({ + name: 'fixture', + private: true, + type: 'module', + ...manifest, + }, null, 2), + ) + await writeFile(join(root, 'src', 'entry.ts'), entry) + + await Promise.all(Object.entries(packages).map(async ([packageName, definition]) => { + const packageDirectory = join(root, 'node_modules', ...packageName.split('/')) + + await mkdir(packageDirectory, { recursive: true }) + await writeFile( + join(packageDirectory, 'package.json'), + JSON.stringify({ + name: packageName, + type: 'module', + version: '1.0.0', + exports: './index.js', + }, null, 2), + ) + await writeFile( + join(packageDirectory, 'index.js'), + definition.code ?? `export default ${JSON.stringify(`${packageName} bundled`)}`, + ) + + if (definition.subpathFiles) { + await Promise.all(Object.entries(definition.subpathFiles).map(async ([subpath, code]) => { + const filePath = join(packageDirectory, subpath) + + await mkdir(dirname(filePath), { recursive: true }) + await writeFile(filePath, code) + })) + } + })) + + return root +} + +const buildServerBundle = async ( + root: string, + { + pluginOptions = {}, + rollupExternal, + }: { + pluginOptions?: Parameters[0], + rollupExternal?: string[], + } = {}, +) => { + const entry = join(root, 'src', 'entry.ts') + + await build({ + configFile: false, + logLevel: 'silent', + plugins: [ + externalizeDeps({ + useFile: join(root, 'package.json'), + ...pluginOptions, + }), + ], + root, + ssr: { + noExternal: true, + }, + build: { + emptyOutDir: true, + minify: false, + outDir: join(root, 'dist'), + rollupOptions: rollupExternal + ? { + external: rollupExternal, + } + : undefined, + ssr: true, + lib: { + entry, + formats: ['es'], + }, + }, + }) + + const outputFile = join(root, 'dist', `${basename(entry, extname(entry))}.js`) + + return readFile(outputFile, 'utf8') +} + +afterEach(async () => { + await Promise.all(temporaryDirectories.splice(0).map(async (directory) => { + await rm(directory, { force: true, recursive: true }) + })) +}) + +describe('externalizeDeps', () => { + it('matches declared dependencies, include rules, and Node builtins without regex false positives', async () => { + const root = await createProject({ + entry: 'export {}', + manifest: { + dependencies: { + 'foo.bar': '1.0.0', + }, + devDependencies: { + 'dev-only': '1.0.0', + }, + optionalDependencies: { + 'optional-only': '1.0.0', + }, + peerDependencies: { + 'peer-only': '1.0.0', + }, + }, + }) + + const plugin = externalizeDeps({ + devDeps: true, + include: ['manual-only'], + useFile: join(root, 'package.json'), + }) + const resolveId = plugin.resolveId as (id: string) => Promise | unknown + const resolve = (id: string) => Promise.resolve(resolveId(id)) + + await expect(resolve('foo.bar')).resolves.toEqual({ external: true, id: 'foo.bar' }) + await expect(resolve('foo.bar/subpath')).resolves.toEqual({ external: true, id: 'foo.bar/subpath' }) + await expect(resolve('fooXbar')).resolves.toBeNull() + await expect(resolve('dev-only')).resolves.toEqual({ external: true, id: 'dev-only' }) + await expect(resolve('optional-only')).resolves.toEqual({ external: true, id: 'optional-only' }) + await expect(resolve('peer-only')).resolves.toEqual({ external: true, id: 'peer-only' }) + await expect(resolve('manual-only')).resolves.toEqual({ external: true, id: 'manual-only' }) + await expect(resolve('node:path')).resolves.toEqual({ external: true, id: 'node:path' }) + await expect(resolve('path/posix')).resolves.toEqual({ external: true, id: 'path/posix' }) + await expect(resolve('node:test')).resolves.toEqual({ external: true, id: 'node:test' }) + await expect(resolve('test')).resolves.toBeNull() + }) + + it('honors exceptions before externalizing and still allows manual includes', async () => { + const root = await createProject({ + entry: 'export {}', + manifest: { + dependencies: { + 'dep-a': '1.0.0', + }, + }, + }) + + const plugin = externalizeDeps({ + except: [/^dep-a(?:\/.*)?$/], + include: [/^manual-dep(?:\/.*)?$/], + useFile: join(root, 'package.json'), + }) + const resolveId = plugin.resolveId as (id: string) => Promise | unknown + const resolve = (id: string) => Promise.resolve(resolveId(id)) + + await expect(resolve('dep-a')).resolves.toBeNull() + await expect(resolve('dep-a/subpath')).resolves.toBeNull() + await expect(resolve('manual-dep/subpath')).resolves.toEqual({ + external: true, + id: 'manual-dep/subpath', + }) + }) + + it('builds a server bundle on Vite 8 while bundling exceptions and externalizing the rest', async () => { + const root = await createProject({ + entry: [ + 'import bundled from "dep-a"', + 'import externalized from "dep-b"', + 'console.log(bundled, externalized)', + ].join('\n'), + manifest: { + dependencies: { + 'dep-a': '1.0.0', + 'dep-b': '1.0.0', + }, + }, + packages: { + 'dep-a': { + code: 'export default "dep-a bundled"\n', + }, + }, + }) + + const output = await buildServerBundle(root, { + pluginOptions: { + except: [/^dep-a(?:\/.*)?$/], + }, + }) + + expect(output).toContain('dep-a bundled') + expect(output).toContain('from "dep-b"') + expect(output).not.toContain('from "dep-a"') + }) + + it('coexists with user-supplied static rollup externals in server builds', async () => { + const root = await createProject({ + entry: [ + 'import dependency from "dep-a"', + 'import custom from "custom-external"', + 'console.log(dependency, custom)', + ].join('\n'), + manifest: { + dependencies: { + 'dep-a': '1.0.0', + }, + }, + }) + + const output = await buildServerBundle(root, { + rollupExternal: ['custom-external'], + }) + + expect(output).toContain('from "dep-a"') + expect(output).toContain('from "custom-external"') + }) +}) diff --git a/test/test.json b/test/test.json deleted file mode 100644 index 7b8d579..0000000 --- a/test/test.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "test", - "packageManager": "pnpm@8.3.1", - "dependencies": { - "chalk": "^5.0.1" - }, - "devDependencies": { - "vite": "^3.0.0" - }, - "optionalDependencies": { - "esbuild": "^0.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } -} diff --git a/test/vite.config.ts b/test/vite.config.ts deleted file mode 100644 index d88e99e..0000000 --- a/test/vite.config.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { nodeResolve } from '@rollup/plugin-node-resolve' -import { defineConfig } from 'vite' -import { externalizeDeps } from '../dist' - -export default defineConfig({ - build: { - lib: { - entry: './test/entry.ts', - fileName: 'test', - formats: ['es'], - }, - outDir: './test/dist', - }, - plugins: [ - // We need nodeResolve to resolve dependencies of chalk. - nodeResolve(), - externalizeDeps({ - devDeps: true, - include: [ - /^unlisted-dep(?:\/.*)?$/, - ], - useFile: './test/test.json', - }), - ], -}) diff --git a/tsconfig.json b/tsconfig.json index 71fe981..b1e06fb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,7 @@ "emitDeclarationOnly": true, "esModuleInterop": true, "module": "ESNext", - "moduleResolution": "Node", + "moduleResolution": "Bundler", "noImplicitReturns": true, "noUnusedLocals": true, "noUnusedParameters": true, diff --git a/vite.config.ts b/vite.config.ts index c45b4cd..cbeba74 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import { externalizeDeps } from 'vite-plugin-externalize-deps' +import { externalizeDeps } from './src/index' // https://vitejs.dev/config/ export default defineConfig({ @@ -19,8 +19,7 @@ export default defineConfig({ { exports: 'named', format: 'cjs', - inlineDynamicImports: true, - interop: 'auto', + codeSplitting: false, }, ], },