├── .npmrc ├── .gitignore ├── .editorconfig ├── tsconfig.json ├── rollup.config.js ├── src ├── index.ts └── counter.ts ├── .github └── workflows │ └── main.yml ├── package.json ├── benchmarks ├── bundler.mjs └── main.mjs ├── README.md └── pnpm-lock.yaml /.npmrc: -------------------------------------------------------------------------------- 1 | message="Release v%s" 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | .idea 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": [ 3 | "src/**/*.ts" 4 | ], 5 | "compilerOptions": { 6 | "declaration": true, 7 | "declarationDir": "dist", 8 | "moduleResolution": "node", 9 | "resolveJsonModule": true, 10 | "noImplicitAny": true, 11 | "strict": true, 12 | "target": "ESNext", 13 | "lib": [ 14 | "DOM", 15 | "ESNext" 16 | ] 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import typescript from '@rollup/plugin-typescript'; 2 | import pkg from './package.json' with { type: 'json' }; 3 | 4 | export default { 5 | input: 'src/index.ts', 6 | plugins: [ 7 | typescript() 8 | ], 9 | output: [ 10 | { 11 | file: pkg.main, 12 | format: 'cjs' 13 | }, 14 | { 15 | file: pkg.module, 16 | format: 'esm' 17 | } 18 | ] 19 | }; 20 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import {Plugin, UserConfig} from 'vite'; 2 | import {counter} from './counter'; 3 | 4 | export interface OptimizeCssModuleOptions { 5 | dictionary?: string; 6 | apply?: 'build' | 'serve'; 7 | } 8 | 9 | export const optimizeCssModules = (options?: OptimizeCssModuleOptions): Plugin => { 10 | const next = counter(options?.dictionary); 11 | const map: Map = new Map(); 12 | 13 | return { 14 | name: 'optimize-css-modules', 15 | apply: options?.apply ?? 'build', 16 | config: (): UserConfig => ({ 17 | css: { 18 | modules: { 19 | generateScopedName: (name: string, fileName: string) => { 20 | const key = fileName + name; 21 | 22 | let hash = map.get(key); 23 | if (!hash) { 24 | map.set(key, (hash = next())); 25 | } 26 | 27 | return hash!; 28 | } 29 | } 30 | } 31 | }) 32 | }; 33 | }; 34 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Main 2 | 3 | on: push 4 | 5 | jobs: 6 | build: 7 | name: Build 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v4 11 | - uses: pnpm/action-setup@v4 12 | with: 13 | version: 9.11.0 14 | 15 | - uses: actions/setup-node@v4 16 | with: 17 | node-version: 22 18 | cache: 'pnpm' 19 | 20 | - name: Install dependencies 21 | run: pnpm install --frozen-lockfile 22 | 23 | - name: Build 24 | run: pnpm build 25 | 26 | - name: Upload build files 27 | uses: actions/upload-artifact@v4 28 | with: 29 | name: build 30 | path: dist 31 | 32 | publish: 33 | if: startsWith(github.ref, 'refs/tags/v') 34 | name: Publish 35 | needs: build 36 | runs-on: ubuntu-latest 37 | steps: 38 | - uses: actions/checkout@v4 39 | - uses: actions/setup-node@v4 40 | with: 41 | node-version: 22 42 | registry-url: 'https://registry.npmjs.org' 43 | env: 44 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 45 | 46 | - name: Download build files 47 | uses: actions/download-artifact@v4 48 | with: 49 | name: build 50 | path: dist 51 | 52 | - name: Publish 53 | run: npm publish --access public 54 | -------------------------------------------------------------------------------- /src/counter.ts: -------------------------------------------------------------------------------- 1 | const DEFAULT_DICTIONARY = '_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 2 | 3 | export const counter = (dictionary: string = DEFAULT_DICTIONARY) => { 4 | const sequence: string[] = [dictionary[0]]; 5 | 6 | return () => { 7 | const str = sequence.join(''); 8 | let carry = 0; 9 | 10 | for (let i = 0; i < sequence.length; i++) { 11 | const index = dictionary.indexOf(sequence[i]) + carry + 1; 12 | 13 | if (index < dictionary.length) { 14 | sequence[i] = dictionary[index]; 15 | 16 | 17 | /** 18 | * Make sure the following rules are not violated: 19 | * 1. The first character cannot be a number 20 | * 2. The second character cannot be a number if the first is a dash 21 | * 3. The dash cannot be the only character 22 | * 23 | * https://www.w3.org/TR/CSS21/syndata.html#characters 24 | */ 25 | const [c1, c2] = sequence; 26 | if ( 27 | (c1 >= '0' && c1 <= '9') || 28 | (c1 === '-' && (c2 >= '0' && c2 <= '9')) || 29 | (c1 === '-' && sequence.length === 1) 30 | ) { 31 | i--; 32 | continue; 33 | } 34 | 35 | carry = 0; 36 | break; 37 | } else { 38 | sequence[i] = dictionary[0]; 39 | carry = 1; 40 | } 41 | } 42 | 43 | if (carry) { 44 | sequence.push(dictionary[0]); 45 | } 46 | 47 | return str; 48 | }; 49 | }; 50 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-plugin-optimize-css-modules", 3 | "version": "1.2.0", 4 | "description": "Mangles the classnames generated by postcss-modules in vite", 5 | "type": "module", 6 | "packageManager": "pnpm@9.11.0", 7 | "main": "./dist/index.cjs", 8 | "module": "./dist/index.mjs", 9 | "types": "./dist/index.d.ts", 10 | "files": [ 11 | "dist" 12 | ], 13 | "exports": { 14 | ".": { 15 | "import": "./dist/index.mjs", 16 | "require": "./dist/index.cjs", 17 | "types": "./dist/index.d.ts" 18 | } 19 | }, 20 | "keywords": [ 21 | "vite", 22 | "vite-plugin", 23 | "css-modules", 24 | "css", 25 | "minify" 26 | ], 27 | "author": "Simon Reinisch ", 28 | "license": "MIT", 29 | "scripts": { 30 | "dev": "rollup -c rollup.config.js --watch", 31 | "build": "rollup -c rollup.config.js", 32 | "benchmark": "node benchmarks/main.mjs" 33 | }, 34 | "repository": { 35 | "type": "git", 36 | "url": "git+https://github.com/simonwep/vite-plugin-optimize-css-modules.git" 37 | }, 38 | "bugs": { 39 | "url": "https://github.com/simonwep/vite-plugin-optimize-css-modules/issues" 40 | }, 41 | "homepage": "https://github.com/simonwep/vite-plugin-optimize-css-modules", 42 | "peerDependencies": { 43 | "vite": "^6.0.0 || ^5.0.0 || ^4.0.0 || ^3.0.0 || ^2.0.0" 44 | }, 45 | "devDependencies": { 46 | "@rollup/plugin-typescript": "12.1.1", 47 | "@types/node": "22.10.2", 48 | "brotli-size": "4.0.0", 49 | "gzip-size": "7.0.0", 50 | "pretty-bytes": "6.1.1", 51 | "rollup": "4.28.1", 52 | "tslib": "2.8.1", 53 | "typescript": "5.7.2", 54 | "vite": "6.0.6" 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /benchmarks/bundler.mjs: -------------------------------------------------------------------------------- 1 | import {isMainThread, parentPort, workerData} from 'node:worker_threads'; 2 | import {join} from 'node:path'; 3 | import {mkdir, writeFile, stat} from 'node:fs/promises' 4 | import {build} from 'vite' 5 | import {gzipSize} from 'gzip-size'; 6 | import * as brotliSize from 'brotli-size'; 7 | import {randomUUID} from 'node:crypto'; 8 | import {optimizeCssModules} from '../dist/index.mjs'; 9 | 10 | if (isMainThread) { 11 | throw new Error('This module must be run as a worker.'); 12 | } 13 | 14 | const benchmark = join(process.cwd(), 'benchmarks'); 15 | const output = join(benchmark, '.output', randomUUID()); 16 | 17 | // Clean and re-create output directory 18 | await mkdir(output).catch(() => 0); 19 | 20 | const sizeFor = async (string) => ({ 21 | gzip: await gzipSize(string), 22 | brotli: brotliSize.sync(string), 23 | }); 24 | 25 | const {input, optimize = false} = workerData; 26 | const root = join(output, `${input}.html`); 27 | const module = join(output, `${input}.ts`); 28 | const css = join(benchmark, 'fixtures', input); 29 | 30 | await writeFile(root, ``) 31 | await writeFile(module, `import styles from '${css}'; console.log(Object.entries(styles));`) 32 | 33 | const start = process.hrtime.bigint(); 34 | const result = await build({ 35 | plugins: optimize ? [optimizeCssModules()] : [], 36 | build: { 37 | outDir: output, 38 | rollupOptions: { 39 | input: { 40 | app: root 41 | } 42 | } 43 | } 44 | }); 45 | 46 | const builtTime = process.hrtime.bigint() - start; 47 | const minifiedCssFile = result.output.find(v => v.fileName.endsWith('.css')).source; 48 | const sizes = await sizeFor(minifiedCssFile); 49 | 50 | parentPort.postMessage({ 51 | input, 52 | builtTime: Number(builtTime), 53 | optimized: optimize, 54 | sizes: { 55 | ...sizes, 56 | original: (await stat(css)).size 57 | } 58 | }); 59 | 60 | 61 | -------------------------------------------------------------------------------- /benchmarks/main.mjs: -------------------------------------------------------------------------------- 1 | import {join} from 'node:path'; 2 | import {readdir, mkdir, rm} from 'node:fs/promises'; 3 | import {Worker} from 'node:worker_threads'; 4 | import prettyBytes from 'pretty-bytes'; 5 | 6 | const benchmark = join(process.cwd(), 'benchmarks'); 7 | const workerModule = join(benchmark, 'bundler.mjs'); 8 | const output = join(benchmark, '.output'); 9 | 10 | // Clean and re-create output directory 11 | await rm(output, {recursive: true}).catch(() => 0); 12 | await mkdir(output).catch(() => 0); 13 | 14 | const inputs = await readdir(join(benchmark, 'fixtures')); 15 | const workers = await Promise.all( 16 | [true, false].flatMap((optimize) => 17 | inputs.map(input => 18 | new Promise((resolve, reject) => { 19 | const worker = new Worker(workerModule, {workerData: {input, optimize}}); 20 | worker.on('message', resolve); 21 | worker.on('error', reject); 22 | }) 23 | ) 24 | ) 25 | ) 26 | 27 | // Cleanup 28 | await rm(output, {recursive: true}).catch(() => 0); 29 | 30 | // Print results 31 | const markdown = [ 32 | '| Input | Build Time | Gzip Size | Brotli Size |', 33 | '| --- | --- | --- | --- |' 34 | ]; 35 | 36 | for (const result of workers) { 37 | if (!result.optimized) continue; 38 | const unoptimized = workers.find(v => v.input === result.input && !v.optimized); 39 | 40 | const buildTimeDiff = Math.round((result.builtTime - unoptimized.builtTime) / 1_000_000); 41 | const buildTimePercent = ((result.builtTime - unoptimized.builtTime) / unoptimized.builtTime * 100).toFixed(2); 42 | const gzipDiff = result.sizes.gzip - unoptimized.sizes.gzip; 43 | const gzipPercent = ((result.sizes.gzip - unoptimized.sizes.gzip) / unoptimized.sizes.gzip * 100).toFixed(2); 44 | const brotliDiff = result.sizes.brotli - unoptimized.sizes.brotli; 45 | const brotliPercent = ((result.sizes.brotli - unoptimized.sizes.brotli) / unoptimized.sizes.brotli * 100).toFixed(2); 46 | 47 | markdown.push([ 48 | '| ', 49 | `[${result.input}](benchmarks/fixtures/${result.input})`, 50 | ` | ${Math.round(result.builtTime / 1_000_000)}ms (_**${buildTimePercent}%**_ / _**${buildTimeDiff}ms**_)`, 51 | ` | ${prettyBytes(result.sizes.gzip)} (_**${gzipPercent}%**_ / _**${prettyBytes(gzipDiff)}**_)`, 52 | ` | ${prettyBytes(result.sizes.gzip)} (_**${brotliPercent}%**_ / _**${prettyBytes(brotliDiff)}**_)`, 53 | ' |' 54 | ].join('')); 55 | } 56 | 57 | console.log('\n\n'); 58 | console.log(markdown.join('\n')); 59 | console.log('\n\n'); 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |

4 |

Vite Plugin - Optimize CSS Modules

5 |

6 | 7 |
8 |

Mangle classnames in production - save up to 30% on css and 90% of build time for free!

9 |
10 | 11 |

12 | CI Status 15 | Install count 18 | Current version 20 | Support me 23 |

24 | 25 | ### Setup 26 | 27 | This plugin requires [vite](https://vitejs.dev/) of v3 or greater. 28 | It only makes sense to use if you're using [css modules](https://vitejs.dev/config/shared-options.html#css-modules). 29 | 30 | ```sh 31 | $ npm install --save-dev vite-plugin-optimize-css-modules 32 | ``` 33 | 34 | In your [`vite.config.ts`](https://vitejs.dev/config/#configuring-vite) simply add the plugin: 35 | 36 | ```ts 37 | import { optimizeCssModules } from 'vite-plugin-optimize-css-modules'; 38 | import { defineConfig } from 'vite'; 39 | 40 | export default defineConfig({ 41 | plugins: [ 42 | optimizeCssModules() 43 | ] 44 | }) 45 | ``` 46 | 47 | And that's it. When running `vite build` your generated CSS should be significantly smaller. 48 | 49 | ### Benchmarks 50 | 51 | Benchmarks are done against [bootstrap](https://getbootstrap.com/docs/5.0/getting-started/introduction/) and [materialize.css](https://materializecss.com/getting-started.html) assuming all the classes are used as css modules. 52 | The benchmark code is located in the [benchmarks](./benchmarks) directory. 53 | 54 | Run them by building the plugin via `npm run build` and then running `npm run benchmarks`. 55 | The results below are from a MacBook Air M2 with node v22.8.0. 56 | 57 | | Input | Build Time | Gzip Size | Brotli Size | 58 | |----------------------------------------------------------------------------------|---------------------------------------|------------------------------------------|-----------------------------------------| 59 | | [bootstrap-5.0.2.module.css](benchmarks/fixtures/bootstrap-5.0.2.module.css) | 525ms (_**-94.06%**_ / _**-8311ms**_) | 21.3 kB (_**-26.53%**_ / _**-7.69 kB**_) | 21.3 kB (_**-27.54%**_ / _**-6 kB**_) | 60 | | [materialize-1.0.0.module.css](benchmarks/fixtures/materialize-1.0.0.module.css) | 572ms (_**-92.59%**_ / _**-7156ms**_) | 20.1 kB (_**-19.70%**_ / _**-4.93 kB**_) | 20.1 kB (_**-21.33%**_ / _**-4.3 kB**_) | 61 | 62 | 63 | ### How does it work? 64 | 65 | By default, when using css modules, you end up with hashes or other long class-names in your bundled css files: 66 | 67 | ```css 68 | @keyframes _close-card_pzatx_1 { 69 | /* ...css */ 70 | } 71 | 72 | ._card_pzatx_32 { 73 | /* ...css */ 74 | } 75 | 76 | ._back_pzatx_49 ._content_pzatx_70 ._close_pzatx_74 { 77 | /* ...css */ 78 | } 79 | ``` 80 | 81 | By using this module, the smalles possible classname will be used for each "id": 82 | 83 | ```css 84 | @keyframes a { 85 | /* ...css */ 86 | } 87 | 88 | .v { 89 | /* ...css */ 90 | } 91 | 92 | .c .s .w { 93 | /* ...css */ 94 | } 95 | ``` 96 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@rollup/plugin-typescript': 12 | specifier: 12.1.1 13 | version: 12.1.1(rollup@4.28.1)(tslib@2.8.1)(typescript@5.7.2) 14 | '@types/node': 15 | specifier: 22.10.2 16 | version: 22.10.2 17 | brotli-size: 18 | specifier: 4.0.0 19 | version: 4.0.0 20 | gzip-size: 21 | specifier: 7.0.0 22 | version: 7.0.0 23 | pretty-bytes: 24 | specifier: 6.1.1 25 | version: 6.1.1 26 | rollup: 27 | specifier: 4.28.1 28 | version: 4.28.1 29 | tslib: 30 | specifier: 2.8.1 31 | version: 2.8.1 32 | typescript: 33 | specifier: 5.7.2 34 | version: 5.7.2 35 | vite: 36 | specifier: 6.0.6 37 | version: 6.0.6(@types/node@22.10.2) 38 | 39 | packages: 40 | 41 | '@esbuild/aix-ppc64@0.24.2': 42 | resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} 43 | engines: {node: '>=18'} 44 | cpu: [ppc64] 45 | os: [aix] 46 | 47 | '@esbuild/android-arm64@0.24.2': 48 | resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} 49 | engines: {node: '>=18'} 50 | cpu: [arm64] 51 | os: [android] 52 | 53 | '@esbuild/android-arm@0.24.2': 54 | resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} 55 | engines: {node: '>=18'} 56 | cpu: [arm] 57 | os: [android] 58 | 59 | '@esbuild/android-x64@0.24.2': 60 | resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} 61 | engines: {node: '>=18'} 62 | cpu: [x64] 63 | os: [android] 64 | 65 | '@esbuild/darwin-arm64@0.24.2': 66 | resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} 67 | engines: {node: '>=18'} 68 | cpu: [arm64] 69 | os: [darwin] 70 | 71 | '@esbuild/darwin-x64@0.24.2': 72 | resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} 73 | engines: {node: '>=18'} 74 | cpu: [x64] 75 | os: [darwin] 76 | 77 | '@esbuild/freebsd-arm64@0.24.2': 78 | resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} 79 | engines: {node: '>=18'} 80 | cpu: [arm64] 81 | os: [freebsd] 82 | 83 | '@esbuild/freebsd-x64@0.24.2': 84 | resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} 85 | engines: {node: '>=18'} 86 | cpu: [x64] 87 | os: [freebsd] 88 | 89 | '@esbuild/linux-arm64@0.24.2': 90 | resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} 91 | engines: {node: '>=18'} 92 | cpu: [arm64] 93 | os: [linux] 94 | 95 | '@esbuild/linux-arm@0.24.2': 96 | resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} 97 | engines: {node: '>=18'} 98 | cpu: [arm] 99 | os: [linux] 100 | 101 | '@esbuild/linux-ia32@0.24.2': 102 | resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} 103 | engines: {node: '>=18'} 104 | cpu: [ia32] 105 | os: [linux] 106 | 107 | '@esbuild/linux-loong64@0.24.2': 108 | resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} 109 | engines: {node: '>=18'} 110 | cpu: [loong64] 111 | os: [linux] 112 | 113 | '@esbuild/linux-mips64el@0.24.2': 114 | resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} 115 | engines: {node: '>=18'} 116 | cpu: [mips64el] 117 | os: [linux] 118 | 119 | '@esbuild/linux-ppc64@0.24.2': 120 | resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} 121 | engines: {node: '>=18'} 122 | cpu: [ppc64] 123 | os: [linux] 124 | 125 | '@esbuild/linux-riscv64@0.24.2': 126 | resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} 127 | engines: {node: '>=18'} 128 | cpu: [riscv64] 129 | os: [linux] 130 | 131 | '@esbuild/linux-s390x@0.24.2': 132 | resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} 133 | engines: {node: '>=18'} 134 | cpu: [s390x] 135 | os: [linux] 136 | 137 | '@esbuild/linux-x64@0.24.2': 138 | resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} 139 | engines: {node: '>=18'} 140 | cpu: [x64] 141 | os: [linux] 142 | 143 | '@esbuild/netbsd-arm64@0.24.2': 144 | resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} 145 | engines: {node: '>=18'} 146 | cpu: [arm64] 147 | os: [netbsd] 148 | 149 | '@esbuild/netbsd-x64@0.24.2': 150 | resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} 151 | engines: {node: '>=18'} 152 | cpu: [x64] 153 | os: [netbsd] 154 | 155 | '@esbuild/openbsd-arm64@0.24.2': 156 | resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} 157 | engines: {node: '>=18'} 158 | cpu: [arm64] 159 | os: [openbsd] 160 | 161 | '@esbuild/openbsd-x64@0.24.2': 162 | resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} 163 | engines: {node: '>=18'} 164 | cpu: [x64] 165 | os: [openbsd] 166 | 167 | '@esbuild/sunos-x64@0.24.2': 168 | resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} 169 | engines: {node: '>=18'} 170 | cpu: [x64] 171 | os: [sunos] 172 | 173 | '@esbuild/win32-arm64@0.24.2': 174 | resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} 175 | engines: {node: '>=18'} 176 | cpu: [arm64] 177 | os: [win32] 178 | 179 | '@esbuild/win32-ia32@0.24.2': 180 | resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} 181 | engines: {node: '>=18'} 182 | cpu: [ia32] 183 | os: [win32] 184 | 185 | '@esbuild/win32-x64@0.24.2': 186 | resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} 187 | engines: {node: '>=18'} 188 | cpu: [x64] 189 | os: [win32] 190 | 191 | '@rollup/plugin-typescript@12.1.1': 192 | resolution: {integrity: sha512-t7O653DpfB5MbFrqPe/VcKFFkvRuFNp9qId3xq4Eth5xlyymzxNpye2z8Hrl0RIMuXTSr5GGcFpkdlMeacUiFQ==} 193 | engines: {node: '>=14.0.0'} 194 | peerDependencies: 195 | rollup: ^2.14.0||^3.0.0||^4.0.0 196 | tslib: '*' 197 | typescript: '>=3.7.0' 198 | peerDependenciesMeta: 199 | rollup: 200 | optional: true 201 | tslib: 202 | optional: true 203 | 204 | '@rollup/pluginutils@5.1.0': 205 | resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} 206 | engines: {node: '>=14.0.0'} 207 | peerDependencies: 208 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 209 | peerDependenciesMeta: 210 | rollup: 211 | optional: true 212 | 213 | '@rollup/rollup-android-arm-eabi@4.28.1': 214 | resolution: {integrity: sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==} 215 | cpu: [arm] 216 | os: [android] 217 | 218 | '@rollup/rollup-android-arm64@4.28.1': 219 | resolution: {integrity: sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==} 220 | cpu: [arm64] 221 | os: [android] 222 | 223 | '@rollup/rollup-darwin-arm64@4.28.1': 224 | resolution: {integrity: sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==} 225 | cpu: [arm64] 226 | os: [darwin] 227 | 228 | '@rollup/rollup-darwin-x64@4.28.1': 229 | resolution: {integrity: sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==} 230 | cpu: [x64] 231 | os: [darwin] 232 | 233 | '@rollup/rollup-freebsd-arm64@4.28.1': 234 | resolution: {integrity: sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==} 235 | cpu: [arm64] 236 | os: [freebsd] 237 | 238 | '@rollup/rollup-freebsd-x64@4.28.1': 239 | resolution: {integrity: sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==} 240 | cpu: [x64] 241 | os: [freebsd] 242 | 243 | '@rollup/rollup-linux-arm-gnueabihf@4.28.1': 244 | resolution: {integrity: sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==} 245 | cpu: [arm] 246 | os: [linux] 247 | 248 | '@rollup/rollup-linux-arm-musleabihf@4.28.1': 249 | resolution: {integrity: sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==} 250 | cpu: [arm] 251 | os: [linux] 252 | 253 | '@rollup/rollup-linux-arm64-gnu@4.28.1': 254 | resolution: {integrity: sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==} 255 | cpu: [arm64] 256 | os: [linux] 257 | 258 | '@rollup/rollup-linux-arm64-musl@4.28.1': 259 | resolution: {integrity: sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==} 260 | cpu: [arm64] 261 | os: [linux] 262 | 263 | '@rollup/rollup-linux-loongarch64-gnu@4.28.1': 264 | resolution: {integrity: sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==} 265 | cpu: [loong64] 266 | os: [linux] 267 | 268 | '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': 269 | resolution: {integrity: sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==} 270 | cpu: [ppc64] 271 | os: [linux] 272 | 273 | '@rollup/rollup-linux-riscv64-gnu@4.28.1': 274 | resolution: {integrity: sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==} 275 | cpu: [riscv64] 276 | os: [linux] 277 | 278 | '@rollup/rollup-linux-s390x-gnu@4.28.1': 279 | resolution: {integrity: sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==} 280 | cpu: [s390x] 281 | os: [linux] 282 | 283 | '@rollup/rollup-linux-x64-gnu@4.28.1': 284 | resolution: {integrity: sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==} 285 | cpu: [x64] 286 | os: [linux] 287 | 288 | '@rollup/rollup-linux-x64-musl@4.28.1': 289 | resolution: {integrity: sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==} 290 | cpu: [x64] 291 | os: [linux] 292 | 293 | '@rollup/rollup-win32-arm64-msvc@4.28.1': 294 | resolution: {integrity: sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==} 295 | cpu: [arm64] 296 | os: [win32] 297 | 298 | '@rollup/rollup-win32-ia32-msvc@4.28.1': 299 | resolution: {integrity: sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==} 300 | cpu: [ia32] 301 | os: [win32] 302 | 303 | '@rollup/rollup-win32-x64-msvc@4.28.1': 304 | resolution: {integrity: sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==} 305 | cpu: [x64] 306 | os: [win32] 307 | 308 | '@types/estree@1.0.5': 309 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 310 | 311 | '@types/estree@1.0.6': 312 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 313 | 314 | '@types/node@22.10.2': 315 | resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} 316 | 317 | brotli-size@4.0.0: 318 | resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==} 319 | engines: {node: '>= 10.16.0'} 320 | 321 | duplexer@0.1.1: 322 | resolution: {integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==} 323 | 324 | duplexer@0.1.2: 325 | resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} 326 | 327 | esbuild@0.24.2: 328 | resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} 329 | engines: {node: '>=18'} 330 | hasBin: true 331 | 332 | estree-walker@2.0.2: 333 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 334 | 335 | fsevents@2.3.3: 336 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 337 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 338 | os: [darwin] 339 | 340 | function-bind@1.1.2: 341 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 342 | 343 | gzip-size@7.0.0: 344 | resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} 345 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 346 | 347 | hasown@2.0.0: 348 | resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} 349 | engines: {node: '>= 0.4'} 350 | 351 | is-core-module@2.13.1: 352 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 353 | 354 | nanoid@3.3.7: 355 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 356 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 357 | hasBin: true 358 | 359 | path-parse@1.0.7: 360 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 361 | 362 | picocolors@1.1.1: 363 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 364 | 365 | picomatch@2.3.1: 366 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 367 | engines: {node: '>=8.6'} 368 | 369 | postcss@8.4.49: 370 | resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} 371 | engines: {node: ^10 || ^12 || >=14} 372 | 373 | pretty-bytes@6.1.1: 374 | resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} 375 | engines: {node: ^14.13.1 || >=16.0.0} 376 | 377 | resolve@1.22.8: 378 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 379 | hasBin: true 380 | 381 | rollup@4.28.1: 382 | resolution: {integrity: sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==} 383 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 384 | hasBin: true 385 | 386 | source-map-js@1.2.1: 387 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 388 | engines: {node: '>=0.10.0'} 389 | 390 | supports-preserve-symlinks-flag@1.0.0: 391 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 392 | engines: {node: '>= 0.4'} 393 | 394 | tslib@2.8.1: 395 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 396 | 397 | typescript@5.7.2: 398 | resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} 399 | engines: {node: '>=14.17'} 400 | hasBin: true 401 | 402 | undici-types@6.20.0: 403 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 404 | 405 | vite@6.0.6: 406 | resolution: {integrity: sha512-NSjmUuckPmDU18bHz7QZ+bTYhRR0iA72cs2QAxCqDpafJ0S6qetco0LB3WW2OxlMHS0JmAv+yZ/R3uPmMyGTjQ==} 407 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 408 | hasBin: true 409 | peerDependencies: 410 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 411 | jiti: '>=1.21.0' 412 | less: '*' 413 | lightningcss: ^1.21.0 414 | sass: '*' 415 | sass-embedded: '*' 416 | stylus: '*' 417 | sugarss: '*' 418 | terser: ^5.16.0 419 | tsx: ^4.8.1 420 | yaml: ^2.4.2 421 | peerDependenciesMeta: 422 | '@types/node': 423 | optional: true 424 | jiti: 425 | optional: true 426 | less: 427 | optional: true 428 | lightningcss: 429 | optional: true 430 | sass: 431 | optional: true 432 | sass-embedded: 433 | optional: true 434 | stylus: 435 | optional: true 436 | sugarss: 437 | optional: true 438 | terser: 439 | optional: true 440 | tsx: 441 | optional: true 442 | yaml: 443 | optional: true 444 | 445 | snapshots: 446 | 447 | '@esbuild/aix-ppc64@0.24.2': 448 | optional: true 449 | 450 | '@esbuild/android-arm64@0.24.2': 451 | optional: true 452 | 453 | '@esbuild/android-arm@0.24.2': 454 | optional: true 455 | 456 | '@esbuild/android-x64@0.24.2': 457 | optional: true 458 | 459 | '@esbuild/darwin-arm64@0.24.2': 460 | optional: true 461 | 462 | '@esbuild/darwin-x64@0.24.2': 463 | optional: true 464 | 465 | '@esbuild/freebsd-arm64@0.24.2': 466 | optional: true 467 | 468 | '@esbuild/freebsd-x64@0.24.2': 469 | optional: true 470 | 471 | '@esbuild/linux-arm64@0.24.2': 472 | optional: true 473 | 474 | '@esbuild/linux-arm@0.24.2': 475 | optional: true 476 | 477 | '@esbuild/linux-ia32@0.24.2': 478 | optional: true 479 | 480 | '@esbuild/linux-loong64@0.24.2': 481 | optional: true 482 | 483 | '@esbuild/linux-mips64el@0.24.2': 484 | optional: true 485 | 486 | '@esbuild/linux-ppc64@0.24.2': 487 | optional: true 488 | 489 | '@esbuild/linux-riscv64@0.24.2': 490 | optional: true 491 | 492 | '@esbuild/linux-s390x@0.24.2': 493 | optional: true 494 | 495 | '@esbuild/linux-x64@0.24.2': 496 | optional: true 497 | 498 | '@esbuild/netbsd-arm64@0.24.2': 499 | optional: true 500 | 501 | '@esbuild/netbsd-x64@0.24.2': 502 | optional: true 503 | 504 | '@esbuild/openbsd-arm64@0.24.2': 505 | optional: true 506 | 507 | '@esbuild/openbsd-x64@0.24.2': 508 | optional: true 509 | 510 | '@esbuild/sunos-x64@0.24.2': 511 | optional: true 512 | 513 | '@esbuild/win32-arm64@0.24.2': 514 | optional: true 515 | 516 | '@esbuild/win32-ia32@0.24.2': 517 | optional: true 518 | 519 | '@esbuild/win32-x64@0.24.2': 520 | optional: true 521 | 522 | '@rollup/plugin-typescript@12.1.1(rollup@4.28.1)(tslib@2.8.1)(typescript@5.7.2)': 523 | dependencies: 524 | '@rollup/pluginutils': 5.1.0(rollup@4.28.1) 525 | resolve: 1.22.8 526 | typescript: 5.7.2 527 | optionalDependencies: 528 | rollup: 4.28.1 529 | tslib: 2.8.1 530 | 531 | '@rollup/pluginutils@5.1.0(rollup@4.28.1)': 532 | dependencies: 533 | '@types/estree': 1.0.5 534 | estree-walker: 2.0.2 535 | picomatch: 2.3.1 536 | optionalDependencies: 537 | rollup: 4.28.1 538 | 539 | '@rollup/rollup-android-arm-eabi@4.28.1': 540 | optional: true 541 | 542 | '@rollup/rollup-android-arm64@4.28.1': 543 | optional: true 544 | 545 | '@rollup/rollup-darwin-arm64@4.28.1': 546 | optional: true 547 | 548 | '@rollup/rollup-darwin-x64@4.28.1': 549 | optional: true 550 | 551 | '@rollup/rollup-freebsd-arm64@4.28.1': 552 | optional: true 553 | 554 | '@rollup/rollup-freebsd-x64@4.28.1': 555 | optional: true 556 | 557 | '@rollup/rollup-linux-arm-gnueabihf@4.28.1': 558 | optional: true 559 | 560 | '@rollup/rollup-linux-arm-musleabihf@4.28.1': 561 | optional: true 562 | 563 | '@rollup/rollup-linux-arm64-gnu@4.28.1': 564 | optional: true 565 | 566 | '@rollup/rollup-linux-arm64-musl@4.28.1': 567 | optional: true 568 | 569 | '@rollup/rollup-linux-loongarch64-gnu@4.28.1': 570 | optional: true 571 | 572 | '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': 573 | optional: true 574 | 575 | '@rollup/rollup-linux-riscv64-gnu@4.28.1': 576 | optional: true 577 | 578 | '@rollup/rollup-linux-s390x-gnu@4.28.1': 579 | optional: true 580 | 581 | '@rollup/rollup-linux-x64-gnu@4.28.1': 582 | optional: true 583 | 584 | '@rollup/rollup-linux-x64-musl@4.28.1': 585 | optional: true 586 | 587 | '@rollup/rollup-win32-arm64-msvc@4.28.1': 588 | optional: true 589 | 590 | '@rollup/rollup-win32-ia32-msvc@4.28.1': 591 | optional: true 592 | 593 | '@rollup/rollup-win32-x64-msvc@4.28.1': 594 | optional: true 595 | 596 | '@types/estree@1.0.5': {} 597 | 598 | '@types/estree@1.0.6': {} 599 | 600 | '@types/node@22.10.2': 601 | dependencies: 602 | undici-types: 6.20.0 603 | 604 | brotli-size@4.0.0: 605 | dependencies: 606 | duplexer: 0.1.1 607 | 608 | duplexer@0.1.1: {} 609 | 610 | duplexer@0.1.2: {} 611 | 612 | esbuild@0.24.2: 613 | optionalDependencies: 614 | '@esbuild/aix-ppc64': 0.24.2 615 | '@esbuild/android-arm': 0.24.2 616 | '@esbuild/android-arm64': 0.24.2 617 | '@esbuild/android-x64': 0.24.2 618 | '@esbuild/darwin-arm64': 0.24.2 619 | '@esbuild/darwin-x64': 0.24.2 620 | '@esbuild/freebsd-arm64': 0.24.2 621 | '@esbuild/freebsd-x64': 0.24.2 622 | '@esbuild/linux-arm': 0.24.2 623 | '@esbuild/linux-arm64': 0.24.2 624 | '@esbuild/linux-ia32': 0.24.2 625 | '@esbuild/linux-loong64': 0.24.2 626 | '@esbuild/linux-mips64el': 0.24.2 627 | '@esbuild/linux-ppc64': 0.24.2 628 | '@esbuild/linux-riscv64': 0.24.2 629 | '@esbuild/linux-s390x': 0.24.2 630 | '@esbuild/linux-x64': 0.24.2 631 | '@esbuild/netbsd-arm64': 0.24.2 632 | '@esbuild/netbsd-x64': 0.24.2 633 | '@esbuild/openbsd-arm64': 0.24.2 634 | '@esbuild/openbsd-x64': 0.24.2 635 | '@esbuild/sunos-x64': 0.24.2 636 | '@esbuild/win32-arm64': 0.24.2 637 | '@esbuild/win32-ia32': 0.24.2 638 | '@esbuild/win32-x64': 0.24.2 639 | 640 | estree-walker@2.0.2: {} 641 | 642 | fsevents@2.3.3: 643 | optional: true 644 | 645 | function-bind@1.1.2: {} 646 | 647 | gzip-size@7.0.0: 648 | dependencies: 649 | duplexer: 0.1.2 650 | 651 | hasown@2.0.0: 652 | dependencies: 653 | function-bind: 1.1.2 654 | 655 | is-core-module@2.13.1: 656 | dependencies: 657 | hasown: 2.0.0 658 | 659 | nanoid@3.3.7: {} 660 | 661 | path-parse@1.0.7: {} 662 | 663 | picocolors@1.1.1: {} 664 | 665 | picomatch@2.3.1: {} 666 | 667 | postcss@8.4.49: 668 | dependencies: 669 | nanoid: 3.3.7 670 | picocolors: 1.1.1 671 | source-map-js: 1.2.1 672 | 673 | pretty-bytes@6.1.1: {} 674 | 675 | resolve@1.22.8: 676 | dependencies: 677 | is-core-module: 2.13.1 678 | path-parse: 1.0.7 679 | supports-preserve-symlinks-flag: 1.0.0 680 | 681 | rollup@4.28.1: 682 | dependencies: 683 | '@types/estree': 1.0.6 684 | optionalDependencies: 685 | '@rollup/rollup-android-arm-eabi': 4.28.1 686 | '@rollup/rollup-android-arm64': 4.28.1 687 | '@rollup/rollup-darwin-arm64': 4.28.1 688 | '@rollup/rollup-darwin-x64': 4.28.1 689 | '@rollup/rollup-freebsd-arm64': 4.28.1 690 | '@rollup/rollup-freebsd-x64': 4.28.1 691 | '@rollup/rollup-linux-arm-gnueabihf': 4.28.1 692 | '@rollup/rollup-linux-arm-musleabihf': 4.28.1 693 | '@rollup/rollup-linux-arm64-gnu': 4.28.1 694 | '@rollup/rollup-linux-arm64-musl': 4.28.1 695 | '@rollup/rollup-linux-loongarch64-gnu': 4.28.1 696 | '@rollup/rollup-linux-powerpc64le-gnu': 4.28.1 697 | '@rollup/rollup-linux-riscv64-gnu': 4.28.1 698 | '@rollup/rollup-linux-s390x-gnu': 4.28.1 699 | '@rollup/rollup-linux-x64-gnu': 4.28.1 700 | '@rollup/rollup-linux-x64-musl': 4.28.1 701 | '@rollup/rollup-win32-arm64-msvc': 4.28.1 702 | '@rollup/rollup-win32-ia32-msvc': 4.28.1 703 | '@rollup/rollup-win32-x64-msvc': 4.28.1 704 | fsevents: 2.3.3 705 | 706 | source-map-js@1.2.1: {} 707 | 708 | supports-preserve-symlinks-flag@1.0.0: {} 709 | 710 | tslib@2.8.1: {} 711 | 712 | typescript@5.7.2: {} 713 | 714 | undici-types@6.20.0: {} 715 | 716 | vite@6.0.6(@types/node@22.10.2): 717 | dependencies: 718 | esbuild: 0.24.2 719 | postcss: 8.4.49 720 | rollup: 4.28.1 721 | optionalDependencies: 722 | '@types/node': 22.10.2 723 | fsevents: 2.3.3 724 | --------------------------------------------------------------------------------