From b270525ec09feacc17872105fc9c7fc9fd257c75 Mon Sep 17 00:00:00 2001 From: eryue0220 Date: Thu, 27 Aug 2026 18:55:32 +0800 Subject: [PATCH] add vite exmaple --- .github/workflows/pages.yml | 3 + env.d.ts | 16 + package.json | 6 +- pnpm-lock.yaml | 673 +++++++++++++++++++++++++++++-- src/env.d.ts | 13 - src/lib/examples.ts | 5 +- src/lib/playground-app.ts | 2 +- src/lib/playgrounds.ts | 67 ++- src/pages/examples/default.astro | 2 +- src/pages/examples/vite.astro | 67 +++ src/pages/guide/get-started.md | 4 +- src/pages/index.astro | 2 +- test/examples.test.ts | 17 + test/playgrounds.test.ts | 41 ++ tsconfig.json | 4 +- vitest.config.ts | 7 + 16 files changed, 871 insertions(+), 58 deletions(-) create mode 100644 env.d.ts delete mode 100644 src/env.d.ts create mode 100644 src/pages/examples/vite.astro create mode 100644 test/examples.test.ts create mode 100644 test/playgrounds.test.ts create mode 100644 vitest.config.ts diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 97f89ba..70f5b42 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -42,6 +42,9 @@ jobs: - name: Lint and format run: pnpm lint && pnpm format:check + - name: Test + run: pnpm test + - name: Build website run: pnpm build diff --git a/env.d.ts b/env.d.ts new file mode 100644 index 0000000..9c646ca --- /dev/null +++ b/env.d.ts @@ -0,0 +1,16 @@ +/// + +interface ImportMetaEnv { + BASE_URL: string; + MODE: string; + DEV: boolean; + PROD: boolean; + SSR: boolean; + readonly SITE: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} + +declare module '*.css' {} diff --git a/package.json b/package.json index a6b6f88..29c4376 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "lint:fix": "eslint . --fix", "format": "prettier . --write", "format:check": "prettier . --check", + "test": "vitest run", "prepare": "husky" }, "lint-staged": { @@ -25,7 +26,7 @@ "*.{json,md,yml,yaml,css}": "prettier --write" }, "dependencies": { - "@postcss-go/core": "^0.0.3", + "@postcss-go/core": "^0.0.5", "@tailwindcss/vite": "^4.3.3", "astro": "^7.2.4", "autoprefixer": "^10.5.4", @@ -46,6 +47,7 @@ "prettier-plugin-astro": "^0.14.1", "tailwindcss": "^4.3.3", "typescript": "^6.0.3", - "typescript-eslint": "^8.61.0" + "typescript-eslint": "^8.61.0", + "vitest": "^3.2.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0bda979..1becdad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@postcss-go/core': - specifier: ^0.0.3 - version: 0.0.3 + specifier: ^0.0.5 + version: 0.0.5 '@tailwindcss/vite': specifier: ^4.3.3 version: 4.3.3(vite@8.2.2(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) @@ -69,6 +69,9 @@ importers: typescript-eslint: specifier: ^8.61.0 version: 8.67.0(eslint@10.9.0(jiti@2.7.0))(typescript@6.0.3) + vitest: + specifier: ^3.2.4 + version: 3.2.7(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0) packages: @@ -674,6 +677,12 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + '@napi-rs/wasm-runtime@1.2.3': resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} @@ -687,38 +696,38 @@ packages: '@oxc-project/types@0.147.0': resolution: {integrity: sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==} - '@postcss-go/core@0.0.3': - resolution: {integrity: sha512-7WqKAPdi5j7JYAPoPhySmlEZkyHNskKweOVnS2GDq+I3qpd0294QN54p2tBrZUu5c6kr9LopCED8LWiNYEGbhQ==} + '@postcss-go/core@0.0.5': + resolution: {integrity: sha512-Vs34NCpx+TZXr/rbjJ2C3p0NiZhCiL2LkbQLYguS2ml59ll+2zGDxfY71GiKrBuatWFLw2o42lhMdBIAIjU1lg==} engines: {node: '>=18'} hasBin: true - '@postcss-go/native-darwin-arm64@0.0.3': - resolution: {integrity: sha512-k+BFg5qd+zQOqNiix2gn47L0WNwlnBVMmaeLbTd0W+uDn2bAyQZ2iXDChBP0hWTxE2BRcwrjE/rmKXaVNPzRmA==} + '@postcss-go/native-darwin-arm64@0.0.5': + resolution: {integrity: sha512-7GQw+nWVsoBYUDEYYNmdj5iE8fIq5ObxQBX+u/wizlpHCviq72cHtjiy05aawKNB4Vshm+Dk7JoQ8bjgpATHqQ==} cpu: [arm64] os: [darwin] - '@postcss-go/native-darwin-x64@0.0.3': - resolution: {integrity: sha512-PmMOebiU9/n0Uxv5xEedDpggR6yI6DX7vmxl9gbL4/xCSwOoU1EWeSom/x5DoAskw8PCrvtv+siSOB6LBhA5ow==} + '@postcss-go/native-darwin-x64@0.0.5': + resolution: {integrity: sha512-bViVXwITdJ9m2XHDN3BPQPvERN9I7BjGHR40C+jGjTiw/dU6Q/e4Fy7JVBpkjvSY5HXpQk6lN2w4toHMYleE4A==} cpu: [x64] os: [darwin] - '@postcss-go/native-linux-arm64-gnu@0.0.3': - resolution: {integrity: sha512-AodLmgdyOBgOpuYIJRT0L5VafWdEHzBt0NylxDmNXSuNZ40IX1jG62Ut65DHLzSQpWnnVtpZ/YaIf70reyLchg==} + '@postcss-go/native-linux-arm64-gnu@0.0.5': + resolution: {integrity: sha512-EktI2dxWR1F1AcB/Vqv1a1mHCbWBWx3Cmoini7nUyxOm/exl1/I3rhuizM1RGB21CZoVsqtU/fMWp89/cp44Dg==} cpu: [arm64] os: [linux] - '@postcss-go/native-linux-x64-gnu@0.0.3': - resolution: {integrity: sha512-3o/lZtWKofM8mMifgOdAlIDHjaelSNsO7MxVpNWDIkpNdvbzx14ylCaJUynD5+gsPLiqqjjIn9ug6+XtEnWCzw==} + '@postcss-go/native-linux-x64-gnu@0.0.5': + resolution: {integrity: sha512-VEiJvyR2euHolkDJXgNqbre4/GXzN9ZiruDEL2lxEuAw830OZuTvUl4gd65m91YmBO71Cbe3ZOu9lEUH6LfM8g==} cpu: [x64] os: [linux] - '@postcss-go/native-win32-arm64-msvc@0.0.3': - resolution: {integrity: sha512-A2fgzcW+5y9va3bW0bGLBLvs+/dccs1X3TfIv+/qr+JXTmc4FpRwcPSvIiOMtdm+TpzhOjHhjxUdSQZPvkepaw==} + '@postcss-go/native-win32-arm64-msvc@0.0.5': + resolution: {integrity: sha512-5AAk+q8oecS3NWK2c4v6bAVoIvnmVOtSO2Qe7s8oBxfN07D9mK0agDfWt+7vb0FasEzv9b28X5UVRjDiiTnoDg==} cpu: [arm64] os: [win32] - '@postcss-go/native-win32-x64-msvc@0.0.3': - resolution: {integrity: sha512-2BFlKTtQVqPqs5lQiwzbVpJ+AKapCnTxkofQ06tnwseOCS17e/j/JSjUJ9AU8UKQMyNY6rhfblTMvsLufROBGw==} + '@postcss-go/native-win32-x64-msvc@0.0.5': + resolution: {integrity: sha512-IBvqJeYkPxAvh9APj/H+X/zj/FnvIy9ZHluiaQrD4xh9lpUGpoAZvk3Mux1+fuCDaz+e5rwvzbZLC66tURkodA==} cpu: [x64] os: [win32] @@ -815,6 +824,131 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + '@rollup/rollup-android-arm-eabi@4.63.0': + resolution: {integrity: sha512-70TeIFezKKy65LgAVyQh+w94/gjWhvPWaLaGGeMEgVrPkQhuj/M5bAYYZzIFUj9Y69oHyTm5Um/R6gcLh4A8JA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.63.0': + resolution: {integrity: sha512-YC86tYIHK6M1IV+wbzO+Bxk8RCBr6ZyWYgWxUCzaZD8mc8rrFoIJDNzDrkHBYRc/wKdrsIXmm6/F7NzrAO+OrA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.63.0': + resolution: {integrity: sha512-oI+ECtUcli0y0fi4xpW82GdPIXdTkI8G8DSjG2LRuw09fPAGykaWYH/hXxiKuTxiAjiPSTIIuYUqof5Z2hShWw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.63.0': + resolution: {integrity: sha512-NwV+1s7TiKrMe4owHyKB/dTLD7ZJD0YEBEhIz+hvav1Cu1GReJjF+rsdNwjzENQeIAbE/CoNiaAc5Vz2h5DPAA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.63.0': + resolution: {integrity: sha512-tWtHBTu5gOPK4u4Urtk4qAHW3zZ9rQAmbssO8gp7ELvGTGI3aCiq6NqyTQ0PCIg7KbHJF2UkGDDs77YZGxfjCA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.63.0': + resolution: {integrity: sha512-2qPoJiwTvtHQ27NnYvTnsgk8laXWYuVmNESG8WFZBcEPKLfZ3I27qBJarjVRQtwGeYyRfq5ZowHXih9lm2BItw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.63.0': + resolution: {integrity: sha512-FQwsTRvLNuHoTdICABJQfbPUSEueISGmnpT06tXTMpfprf5NiKLSXKA0A+w45wJnCmZAnzgqBwbt6ARFuyOi5w==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.63.0': + resolution: {integrity: sha512-BBVTXziw8mY1a4ZbWME9tZyfzqXCDPqaC7Z3heQ29p5dkvXzwL0NwelO8zLa8c3RBKvl3YTuSnBgsBhYBtwjIw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.63.0': + resolution: {integrity: sha512-w2Iyy9+RqKwx3d9qWMKsJg0FfRBsY0/pXNv0mCQ3ueRvJI6+QAScfD4nrMlzFLs2HNVW6Ew+mtZfDl9b7Ew5/Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.63.0': + resolution: {integrity: sha512-YK++KtrFRHYE0P6/RtYEAy9t8F37znP+K03RrIuLPYOL6SVlObRumf/0OE4V/h63xL9DwkWbNssZfmA9hawuDA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.63.0': + resolution: {integrity: sha512-aBfOG6fP7YkkPmTqPwufRJeFyz7WPpECv9XNbnsk9+vg7rxdih0lbtEel7jcRng4LZrrmU3FfitCFyEj4BWDWg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.63.0': + resolution: {integrity: sha512-LGaHEOeHNAag9VuS1Crs5DFg4RrU9MPi2nVnNJk9DTePx/B6RRYKVmrIXt2h7YOJlwjaFJ6lwtFDliZxScTLrQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.63.0': + resolution: {integrity: sha512-jClvk+J0FC3b7Udvegiw5/4hErbHtmsNsQgENnKXDWtNCJXsJYZH5WURvu7imDOO38xYml24eeh5x3A04ppwCw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.63.0': + resolution: {integrity: sha512-0OJlaGK+8+B777Ql5okIpD7ua5Ro9+VB9Ve0OKa28OQJZ1RbuUBVNHK/e3pr4BROqsyPl1JrPO1ZxJseCNffcA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.63.0': + resolution: {integrity: sha512-Ygsx+HoNH7afwi1bTIXbnTvVnsO+zurPLSYxybV1hHFVU72OWOCl6v05ql/z0hkpAPx+DK7Kn9Bi7MayCcjLTA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.63.0': + resolution: {integrity: sha512-pDQxtMGb+OvG3fLwR2OkZlSd47hW+kWg4BYMG/++sR6RqorQccwPTDsxda5hPwiIeIErAnCF9ma3SAU06bdQtQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.63.0': + resolution: {integrity: sha512-0BnUG9mS8I4SSHr3XsxVhuCMEiu+rX61xxZF5vujso4LaiAGFZFxvDjg6Xn6tLPNTUAfuCvQYas4LMQMVsKRSQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.63.0': + resolution: {integrity: sha512-Adu/VttB1dpPNW+FEacrZ+xVm9tFty84+RrFzsqlFaPxoJB+9XXyDGtp5dCOoBwGBIEVH0To7lExFXEx0BIF4A==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.63.0': + resolution: {integrity: sha512-NQ3bDvjUbFKmP23671xUlXtKmqVsUBd6M4PQCvbmNtOy06hnQIdKHy8oG/6S3R/S6He1JgPk6A5VT+prAJMYEw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.63.0': + resolution: {integrity: sha512-u2eDAl4+0aFvA13GxlGBtTI3SS3sdgwgtV0HyjZ0QaQVCgNE+jqNGey+GtxWiq+wxr/UycAx/OnfJzApCFamvA==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.63.0': + resolution: {integrity: sha512-XvRb5vfW3wAZQ+ZUG21AnHHDKtNcw99eigzEhjr//NZ3u7SoBaPP0seSc7FgP7p1epAEdAoZckMW9WY/+4w70w==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.63.0': + resolution: {integrity: sha512-iZPmniy4kNBf5yo2RezbkYNNK5HPbXE9+g+twnbqSng7dtLEJy1SKoxiE/ni4FDacjyuZpEeb9U054N4EoKHYw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.63.0': + resolution: {integrity: sha512-mFBBd+LF37fnE8JnYUOH+imj0aPFPK30vpar4ehJkgnLj9sZn8ZxiRENmLtgIwxK7TC8klF6N57fxdNBwQoqOA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.63.0': + resolution: {integrity: sha512-ujeqEY3B+zbGn3Z4Q03cUBG/LGWnBJncVT36WER31LcOsQk9+1dmINKKtvmmfChUvRbK1G0R8OhMWFgHgaZtAw==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.63.0': + resolution: {integrity: sha512-hncn90N4sOky0L2LKE5oESKLbxCPeVo4eLA2LSMoDzM+879ml4WSr+Rr4DWknNIVVvS1Hirkc9hx02W6YxS8rQ==} + cpu: [x64] + os: [win32] + '@shikijs/core@4.4.3': resolution: {integrity: sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==} engines: {node: '>=20'} @@ -939,6 +1073,12 @@ packages: '@tybys/wasm-util@0.10.3': resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} @@ -1028,6 +1168,35 @@ packages: '@ungap/structured-clone@1.3.4': resolution: {integrity: sha512-JL+CF0GeLHyPWI0rXu7UnxgiuOm9UQWzadi0OYOJNhNO2q6EZElpwlgXkNkfU1PzANDHq3YcwKVZprdvS+BrbQ==} + '@vitest/expect@3.2.7': + resolution: {integrity: sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==} + + '@vitest/mocker@3.2.7': + resolution: {integrity: sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.7': + resolution: {integrity: sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==} + + '@vitest/runner@3.2.7': + resolution: {integrity: sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==} + + '@vitest/snapshot@3.2.7': + resolution: {integrity: sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==} + + '@vitest/spy@3.2.7': + resolution: {integrity: sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==} + + '@vitest/utils@3.2.7': + resolution: {integrity: sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1060,6 +1229,10 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + astro-eslint-parser@3.1.0: resolution: {integrity: sha512-lS5qlx401Q1ZUhQ44XQnM4uT2qI6hA0H+vstrd841xGVxunFOs0ut3DWJGYHK1l7mxRxQdDi1j53pfE7/AyGlA==} engines: {node: ^22.22.3 || ^24.16.0 || >=26.3.0} @@ -1117,12 +1290,20 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + caniuse-lite@1.0.30001809: resolution: {integrity: sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -1133,6 +1314,10 @@ packages: character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1218,6 +1403,10 @@ packages: supports-color: optional: true + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1280,6 +1469,9 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.3.2: resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} @@ -1356,6 +1548,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -1363,6 +1558,10 @@ packages: eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -1531,6 +1730,9 @@ packages: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@4.3.1: resolution: {integrity: sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==} hasBin: true @@ -1707,6 +1909,9 @@ packages: resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lru-cache@11.5.2: resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} engines: {node: 20 || >=22} @@ -1846,6 +2051,13 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + piccolore@0.1.3: resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} @@ -1947,6 +2159,11 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rollup@4.63.0: + resolution: {integrity: sha512-T5vnZ2y4QqC3/4P+w2+JO+Q/OVdnPsv4XcSYJYMEn0R9/jjl5AgLwO9LAZMzP2lN71O6pypn91rB7lDstUkfrQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + s.color@0.0.15: resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} @@ -1986,6 +2203,9 @@ packages: resolution: {integrity: sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==} engines: {node: '>=20'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -2004,6 +2224,12 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -2011,6 +2237,9 @@ packages: stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + suf-log@2.5.3: resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} @@ -2033,10 +2262,16 @@ packages: tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyclip@0.1.15: resolution: {integrity: sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==} engines: {node: ^16.14.0 || >= 17.3.0} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.3.0: resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} engines: {node: '>=18'} @@ -2045,6 +2280,18 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2194,6 +2441,51 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@7.3.6: + resolution: {integrity: sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vite@8.2.2: resolution: {integrity: sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2245,11 +2537,44 @@ packages: vite: optional: true + vitest@3.2.7: + resolution: {integrity: sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.7 + '@vitest/ui': 3.2.7 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -2756,6 +3081,9 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true + '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: '@emnapi/core': 1.11.1 @@ -2767,7 +3095,7 @@ snapshots: '@oxc-project/types@0.147.0': {} - '@postcss-go/core@0.0.3': + '@postcss-go/core@0.0.5': dependencies: chokidar: 3.6.0 dependency-graph: 1.0.0 @@ -2778,29 +3106,29 @@ snapshots: source-map-js: 1.2.1 tinyglobby: 0.2.17 optionalDependencies: - '@postcss-go/native-darwin-arm64': 0.0.3 - '@postcss-go/native-darwin-x64': 0.0.3 - '@postcss-go/native-linux-arm64-gnu': 0.0.3 - '@postcss-go/native-linux-x64-gnu': 0.0.3 - '@postcss-go/native-win32-arm64-msvc': 0.0.3 - '@postcss-go/native-win32-x64-msvc': 0.0.3 + '@postcss-go/native-darwin-arm64': 0.0.5 + '@postcss-go/native-darwin-x64': 0.0.5 + '@postcss-go/native-linux-arm64-gnu': 0.0.5 + '@postcss-go/native-linux-x64-gnu': 0.0.5 + '@postcss-go/native-win32-arm64-msvc': 0.0.5 + '@postcss-go/native-win32-x64-msvc': 0.0.5 - '@postcss-go/native-darwin-arm64@0.0.3': + '@postcss-go/native-darwin-arm64@0.0.5': optional: true - '@postcss-go/native-darwin-x64@0.0.3': + '@postcss-go/native-darwin-x64@0.0.5': optional: true - '@postcss-go/native-linux-arm64-gnu@0.0.3': + '@postcss-go/native-linux-arm64-gnu@0.0.5': optional: true - '@postcss-go/native-linux-x64-gnu@0.0.3': + '@postcss-go/native-linux-x64-gnu@0.0.5': optional: true - '@postcss-go/native-win32-arm64-msvc@0.0.3': + '@postcss-go/native-win32-arm64-msvc@0.0.5': optional: true - '@postcss-go/native-win32-x64-msvc@0.0.3': + '@postcss-go/native-win32-x64-msvc@0.0.5': optional: true '@rolldown/binding-android-arm-eabi@1.2.6': @@ -2850,6 +3178,81 @@ snapshots: '@rolldown/pluginutils@1.0.1': {} + '@rollup/rollup-android-arm-eabi@4.63.0': + optional: true + + '@rollup/rollup-android-arm64@4.63.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.63.0': + optional: true + + '@rollup/rollup-darwin-x64@4.63.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.63.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.63.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.63.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.63.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.63.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.63.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.63.0': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.63.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.63.0': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.63.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.63.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.63.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.63.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.63.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.63.0': + optional: true + + '@rollup/rollup-openbsd-x64@4.63.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.63.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.63.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.63.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.63.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.63.0': + optional: true + '@shikijs/core@4.4.3': dependencies: '@shikijs/primitive': 4.4.3 @@ -2963,6 +3366,13 @@ snapshots: tslib: 2.8.1 optional: true + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + '@types/esrecurse@4.3.1': {} '@types/estree-jsx@1.0.5': @@ -3083,6 +3493,48 @@ snapshots: '@ungap/structured-clone@1.3.4': {} + '@vitest/expect@3.2.7': + dependencies: + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.7 + '@vitest/utils': 3.2.7 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.7(vite@7.3.6(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0))': + dependencies: + '@vitest/spy': 3.2.7 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.6(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0) + + '@vitest/pretty-format@3.2.7': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.7': + dependencies: + '@vitest/utils': 3.2.7 + pathe: 2.0.3 + strip-literal: 3.1.0 + + '@vitest/snapshot@3.2.7': + dependencies: + '@vitest/pretty-format': 3.2.7 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@3.2.7': + dependencies: + tinyspy: 4.0.4 + + '@vitest/utils@3.2.7': + dependencies: + '@vitest/pretty-format': 3.2.7 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + acorn-jsx@5.3.2(acorn@8.18.0): dependencies: acorn: 8.18.0 @@ -3113,6 +3565,8 @@ snapshots: aria-query@5.3.2: {} + assertion-error@2.0.1: {} + astro-eslint-parser@3.1.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1): dependencies: '@astrojs/compiler-rs': 0.4.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) @@ -3257,10 +3711,20 @@ snapshots: node-releases: 2.0.53 update-browserslist-db: 1.3.1(browserslist@4.28.8) + cac@6.7.14: {} + caniuse-lite@1.0.30001809: {} ccount@2.0.1: {} + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -3270,6 +3734,8 @@ snapshots: character-entities-legacy@3.0.0: {} + check-error@2.1.3: {} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -3348,6 +3814,8 @@ snapshots: dependencies: ms: 2.1.3 + deep-eql@5.0.2: {} + deep-is@0.1.4: {} defu@6.1.7: {} @@ -3401,6 +3869,8 @@ snapshots: entities@4.5.0: {} + es-module-lexer@1.7.0: {} + es-module-lexer@2.3.2: {} esbuild@0.28.2: @@ -3523,10 +3993,16 @@ snapshots: estraverse@5.3.0: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + esutils@2.0.3: {} eventemitter3@5.0.4: {} + expect-type@1.4.0: {} + extend@3.0.2: {} fast-deep-equal@3.1.3: {} @@ -3676,6 +4152,8 @@ snapshots: jiti@2.7.0: {} + js-tokens@9.0.1: {} + js-yaml@4.3.1: dependencies: argparse: 2.0.1 @@ -3809,6 +4287,8 @@ snapshots: loglevel@1.9.2: {} + loupe@3.2.1: {} + lru-cache@11.5.2: {} magic-string@0.30.21: @@ -3947,6 +4427,10 @@ snapshots: path-key@3.1.1: {} + pathe@2.0.3: {} + + pathval@2.0.1: {} + piccolore@0.1.3: {} picocolors@1.1.1: {} @@ -4044,6 +4528,38 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.2.6 '@rolldown/binding-win32-x64-msvc': 1.2.6 + rollup@4.63.0: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.63.0 + '@rollup/rollup-android-arm64': 4.63.0 + '@rollup/rollup-darwin-arm64': 4.63.0 + '@rollup/rollup-darwin-x64': 4.63.0 + '@rollup/rollup-freebsd-arm64': 4.63.0 + '@rollup/rollup-freebsd-x64': 4.63.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.63.0 + '@rollup/rollup-linux-arm-musleabihf': 4.63.0 + '@rollup/rollup-linux-arm64-gnu': 4.63.0 + '@rollup/rollup-linux-arm64-musl': 4.63.0 + '@rollup/rollup-linux-loong64-gnu': 4.63.0 + '@rollup/rollup-linux-loong64-musl': 4.63.0 + '@rollup/rollup-linux-ppc64-gnu': 4.63.0 + '@rollup/rollup-linux-ppc64-musl': 4.63.0 + '@rollup/rollup-linux-riscv64-gnu': 4.63.0 + '@rollup/rollup-linux-riscv64-musl': 4.63.0 + '@rollup/rollup-linux-s390x-gnu': 4.63.0 + '@rollup/rollup-linux-x64-gnu': 4.63.0 + '@rollup/rollup-linux-x64-musl': 4.63.0 + '@rollup/rollup-openbsd-x64': 4.63.0 + '@rollup/rollup-openharmony-arm64': 4.63.0 + '@rollup/rollup-win32-arm64-msvc': 4.63.0 + '@rollup/rollup-win32-ia32-msvc': 4.63.0 + '@rollup/rollup-win32-x64-gnu': 4.63.0 + '@rollup/rollup-win32-x64-msvc': 4.63.0 + fsevents: 2.3.3 + s.color@0.0.15: {} sass-formatter@0.7.9: @@ -4121,6 +4637,8 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.5 + siginfo@2.0.0: {} + sisteransi@1.0.5: {} slash@5.1.0: {} @@ -4131,6 +4649,10 @@ snapshots: space-separated-tokens@2.0.2: {} + stackback@0.0.2: {} + + std-env@3.10.0: {} + string-argv@0.3.2: {} stringify-entities@4.0.4: @@ -4138,6 +4660,10 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + suf-log@2.5.3: dependencies: s.color: 0.0.15 @@ -4162,8 +4688,12 @@ snapshots: tiny-inflate@1.0.3: {} + tinybench@2.9.0: {} + tinyclip@0.1.15: {} + tinyexec@0.3.2: {} + tinyexec@1.3.0: {} tinyglobby@0.2.17: @@ -4171,6 +4701,12 @@ snapshots: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.4: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -4283,6 +4819,41 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 + vite-node@3.2.4(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.3.6(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@7.3.6(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0): + dependencies: + esbuild: 0.28.2 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + postcss: 8.5.26 + rollup: 4.63.0 + tinyglobby: 0.2.17 + optionalDependencies: + fsevents: 2.3.3 + jiti: 2.7.0 + lightningcss: 1.33.0 + yaml: 2.9.0 + vite@8.2.2(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 @@ -4300,10 +4871,54 @@ snapshots: optionalDependencies: vite: 8.2.2(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) + vitest@3.2.7(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0): + dependencies: + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.7 + '@vitest/mocker': 3.2.7(vite@7.3.6(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0)) + '@vitest/pretty-format': 3.2.7 + '@vitest/runner': 3.2.7 + '@vitest/snapshot': 3.2.7 + '@vitest/spy': 3.2.7 + '@vitest/utils': 3.2.7 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.4.0 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.7 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.17 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.3.6(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0) + vite-node: 3.2.4(jiti@2.7.0)(lightningcss@1.33.0)(yaml@2.9.0) + why-is-node-running: 2.3.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + which@2.0.2: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + word-wrap@1.2.5: {} xxhash-wasm@1.1.0: {} diff --git a/src/env.d.ts b/src/env.d.ts deleted file mode 100644 index 0a51d3b..0000000 --- a/src/env.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -/// - -declare module '*?url' { - const value: string; - export default value; -} - -declare module '*?worker' { - const WorkerFactory: { - new (): Worker; - }; - export default WorkerFactory; -} diff --git a/src/lib/examples.ts b/src/lib/examples.ts index 7db1043..4dc6f62 100644 --- a/src/lib/examples.ts +++ b/src/lib/examples.ts @@ -17,7 +17,10 @@ export function exampleGroups(base: string): ExampleGroup[] { }, { label: 'Frameworks', - items: [{ label: 'webpack', href: `${base}examples/webpack/`, key: 'webpack' }], + items: [ + { label: 'Vite', href: `${base}examples/vite/`, key: 'vite' }, + { label: 'webpack', href: `${base}examples/webpack/`, key: 'webpack' }, + ], }, ]; } diff --git a/src/lib/playground-app.ts b/src/lib/playground-app.ts index 00082ae..96e6200 100644 --- a/src/lib/playground-app.ts +++ b/src/lib/playground-app.ts @@ -79,7 +79,7 @@ ${css} } export function bootPlayground(root: HTMLElement) { - const id = root.dataset.presetId ?? 'webpack'; + const id = root.dataset.presetId ?? 'default'; const preset = playgroundPreset(id); const inputFile = playgroundInputFile(preset); const inputHost = root.querySelector('[data-editor="input"]'); diff --git a/src/lib/playgrounds.ts b/src/lib/playgrounds.ts index ad822a0..da0c9e1 100644 --- a/src/lib/playgrounds.ts +++ b/src/lib/playgrounds.ts @@ -36,18 +36,25 @@ export function playgroundInputFile(preset: PlaygroundPreset): PlaygroundFile { export const PLAYGROUND_LINKS: PlaygroundLink[] = [ { id: 'default', label: 'Default' }, + { id: 'vite', label: 'Vite' }, { id: 'webpack', label: 'webpack' }, ]; export function playgroundGroups(base: string) { + const link = (id: string, label: string) => ({ + label, + href: `${base}playground/${id}/`, + key: id, + }); + return [ + { + label: 'Usage', + items: [link('default', 'Default')], + }, { label: 'Frameworks', - items: PLAYGROUND_LINKS.map((item) => ({ - label: item.label, - href: `${base}playground/${item.id}/`, - key: item.id, - })), + items: [link('vite', 'Vite'), link('webpack', 'webpack')], }, ]; } @@ -66,6 +73,12 @@ const postcssConfig = `export default { }, };`; +const viteConfig = `import postcssGo from '@postcss-go/vite-loader'; + +export default { + plugins: [postcssGo()], +};`; + const webpackConfig = `export default { module: { rules: [ @@ -100,6 +113,19 @@ const demoInput = `.hero { } `; +const viteInput = `.hero { + display: flex; + gap: 0.5rem; + min-height: 100vh; + align-items: center; + justify-content: center; + + & h1 span { + color: #c8ff3d; + } +} +`; + const webpackInput = `.hero { display: flex; gap: 0.5rem; @@ -137,12 +163,41 @@ export const PLAYGROUND_PRESETS: Record = { ], previewHtml: `

PostCSS, rebuilt.

`, }, + vite: { + id: 'vite', + title: 'Vite', + description: 'CSS as @postcss-go/vite-loader would hand to the engine.', + exampleId: 'vite', + plugins: { nested: true, autoprefixer: true }, + files: [ + { + id: 'postcss', + filename: 'postcss.config.js', + language: 'javascript', + content: postcssConfig, + }, + { + id: 'vite', + filename: 'vite.config.js', + language: 'javascript', + content: viteConfig, + }, + { + id: 'css', + filename: 'src/styles.css', + language: 'css', + content: viteInput, + input: true, + }, + ], + previewHtml: `

Vite + PostCSS

`, + }, webpack: { id: 'webpack', title: 'webpack', description: 'CSS as @postcss-go/webpack-loader would hand to the engine.', exampleId: 'webpack', - plugins: { nested: true, autoprefixer: false }, + plugins: { nested: true, autoprefixer: true }, files: [ { id: 'postcss', diff --git a/src/pages/examples/default.astro b/src/pages/examples/default.astro index 0721ce7..0e85d3b 100644 --- a/src/pages/examples/default.astro +++ b/src/pages/examples/default.astro @@ -48,7 +48,7 @@ await writeFile('dist/index.css', result.css);`; The default setup is a postcss.config.js plus the postcss-go CLI. No bundler is required. The same config file is what Vite, Next.js, and other tools already look for.

- +

Install

diff --git a/src/pages/examples/vite.astro b/src/pages/examples/vite.astro new file mode 100644 index 0000000..ec956b5 --- /dev/null +++ b/src/pages/examples/vite.astro @@ -0,0 +1,67 @@ +--- +import ExamplesLayout from '../../layouts/ExamplesLayout.astro'; +import CodeSample from '../../components/CodeSample.astro'; +import PlaygroundCta from '../../components/PlaygroundCta.astro'; + +const install = 'pnpm add -D @postcss-go/core @postcss-go/vite-loader autoprefixer vite'; +const config = `export default { + plugins: { + autoprefixer: {}, + }, +};`; +const viteConfig = `import postcssGo from '@postcss-go/vite-loader'; + +export default { + plugins: [postcssGo()], +};`; +const viteConfigInline = `import postcssGo from '@postcss-go/vite-loader'; +import autoprefixer from 'autoprefixer'; + +export default { + plugins: [ + postcssGo({ + postcssOptions: { + config: false, + plugins: [autoprefixer()], + }, + }), + ], +};`; +const css = `.button { + display: flex; + gap: 0.5rem; +}`; +const scripts = `{ + "scripts": { + "dev": "vite", + "build": "vite build", + "build:css": "postcss-go src/**/*.css --base src --dir dist/css --no-map" + } +}`; +--- + + +

Vite

+

+ Add @postcss-go/vite-loader to your Vite plugins. It runs before Vite's built-in CSS + pipeline, calls the Go engine directly, and does not depend on postcss. By default + it discovers postcss.config.js from each input file, same as the CLI. +

+ + + + +

+ Pass postcssOptions inline when you want to disable config lookup or set plugins in the + Vite config. postcssOptions can also be a function that receives mode, + env, file, and the Vite config. +

+ + +

+ Unless css.postcss is already set, the plugin clears Vite's PostCSS plugin list so the + same postcss.config.* is not run twice. You can still run the CLI for a bundler-free + CSS pass: +

+ +
diff --git a/src/pages/guide/get-started.md b/src/pages/guide/get-started.md index f16b00d..820af4a 100644 --- a/src/pages/guide/get-started.md +++ b/src/pages/guide/get-started.md @@ -50,8 +50,8 @@ file or environment:
terminal
pnpm postcss-go src/index.css -o dist/index.css
-For the default config, see [Examples](../../examples/default/). For webpack, -see the [webpack example](../../examples/webpack/). +For the default config, see [Examples](../../examples/default/). For Vite and webpack, +see the [Vite example](../../examples/vite/) and [webpack example](../../examples/webpack/). For a gradual migration, see the [migration and compatibility guide](../migration/). For browsers, import `@postcss-go/core/wasm` and follow the [Browser and WASM](../browser-wasm/) guide. diff --git a/src/pages/index.astro b/src/pages/index.astro index 128875c..c538d0a 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -70,7 +70,7 @@ import BenchmarkChart from '../components/BenchmarkChart.astro'; Examples - Playground MIT licensed diff --git a/test/examples.test.ts b/test/examples.test.ts new file mode 100644 index 0000000..1a33c74 --- /dev/null +++ b/test/examples.test.ts @@ -0,0 +1,17 @@ +import { describe, expect, it } from 'vitest'; + +import { exampleGroups } from '../src/lib/examples'; + +describe('exampleGroups', () => { + it('includes Vite in Frameworks', () => { + const groups = exampleGroups('/'); + const frameworks = groups.find((group) => group.label === 'Frameworks'); + expect(frameworks?.items.map((item) => item.key)).toEqual(['vite', 'webpack']); + }); + + it('builds framework hrefs from the site base', () => { + const groups = exampleGroups('/postcss-go/'); + const vite = groups.flatMap((group) => group.items).find((item) => item.key === 'vite'); + expect(vite?.href).toBe('/postcss-go/examples/vite/'); + }); +}); diff --git a/test/playgrounds.test.ts b/test/playgrounds.test.ts new file mode 100644 index 0000000..4a27c37 --- /dev/null +++ b/test/playgrounds.test.ts @@ -0,0 +1,41 @@ +import { describe, expect, it } from 'vitest'; + +import { + PLAYGROUND_LINKS, + PLAYGROUND_PRESETS, + playgroundGroups, + playgroundInputFile, + playgroundPreset, +} from '../src/lib/playgrounds'; + +describe('playgrounds', () => { + it('lists the Vite preset', () => { + expect(PLAYGROUND_LINKS.map((item) => item.id)).toEqual(['default', 'vite', 'webpack']); + }); + + it('builds playground nav links from the site base', () => { + const groups = playgroundGroups('/postcss-go/'); + const defaultLink = groups[0]?.items.find((item) => item.key === 'default'); + const vite = groups[1]?.items.find((item) => item.key === 'vite'); + expect(defaultLink?.href).toBe('/postcss-go/playground/default/'); + expect(vite?.href).toBe('/postcss-go/playground/vite/'); + }); + + it('links the Vite preset to the Vite example', () => { + expect(PLAYGROUND_PRESETS.vite.exampleId).toBe('vite'); + }); + + it('includes Vite config and CSS input files', () => { + const preset = playgroundPreset('vite'); + expect(preset.files.map((file) => file.filename)).toEqual([ + 'postcss.config.js', + 'vite.config.js', + 'src/styles.css', + ]); + expect(playgroundInputFile(preset).filename).toBe('src/styles.css'); + }); + + it('falls back to the default preset for unknown ids', () => { + expect(playgroundPreset('missing').id).toBe('default'); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index 8bf91d3..384cc2d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "astro/tsconfigs/strict", - "include": [".astro/types.d.ts", "**/*"], + "extends": "./node_modules/astro/tsconfigs/strict.json", + "include": [".astro/types.d.ts", "env.d.ts", "**/*"], "exclude": ["dist"] } diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..43e56f4 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + include: ['test/**/*.test.ts'], + }, +});