diff --git a/apps/ui-site/package.json b/apps/ui-site/package.json
index 26806c8..87fe009 100644
--- a/apps/ui-site/package.json
+++ b/apps/ui-site/package.json
@@ -40,7 +40,7 @@
"vite-plugin-dts": "^4.5.4"
},
"dependencies": {
- "@defgov/ui-web": "workspace:*",
+ "@defgov/ui-web-tw": "workspace:*",
"react": "^19.2.5",
"react-dom": "^19.2.5"
}
diff --git a/apps/ui-site/src/App.tsx b/apps/ui-site/src/App.tsx
index 1e21c79..0ce0eac 100644
--- a/apps/ui-site/src/App.tsx
+++ b/apps/ui-site/src/App.tsx
@@ -1,4 +1,4 @@
-import { clsm } from "@defgov/ui-web";
+import { clsm } from "@defgov/ui-web-tw";
import { ButtonGallery } from "./gallery/ButtonGallery";
import { cn } from "tailwind-variants";
diff --git a/apps/ui-site/src/gallery/ButtonGallery.tsx b/apps/ui-site/src/gallery/ButtonGallery.tsx
index d47117f..c71d01e 100644
--- a/apps/ui-site/src/gallery/ButtonGallery.tsx
+++ b/apps/ui-site/src/gallery/ButtonGallery.tsx
@@ -1,4 +1,4 @@
-import { Button, DownloadSvg } from "@defgov/ui-web";
+import { Button, DownloadSvg } from "@defgov/ui-web-tw";
import { InnerWrapper } from "../common/InnerWrapper";
import { OuterWrapper } from "../common/OuterWrapper";
diff --git a/apps/vite-project/.gitignore b/apps/vite-project/.gitignore
new file mode 100644
index 0000000..a547bf3
--- /dev/null
+++ b/apps/vite-project/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/apps/vite-project/README.md b/apps/vite-project/README.md
new file mode 100644
index 0000000..7dbf7eb
--- /dev/null
+++ b/apps/vite-project/README.md
@@ -0,0 +1,73 @@
+# React + TypeScript + Vite
+
+This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
+
+Currently, two official plugins are available:
+
+- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs)
+- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/)
+
+## React Compiler
+
+The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
+
+## Expanding the ESLint configuration
+
+If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
+
+```js
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ // Other configs...
+
+ // Remove tseslint.configs.recommended and replace with this
+ tseslint.configs.recommendedTypeChecked,
+ // Alternatively, use this for stricter rules
+ tseslint.configs.strictTypeChecked,
+ // Optionally, add this for stylistic rules
+ tseslint.configs.stylisticTypeChecked,
+
+ // Other configs...
+ ],
+ languageOptions: {
+ parserOptions: {
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
+ tsconfigRootDir: import.meta.dirname,
+ },
+ // other options...
+ },
+ },
+])
+```
+
+You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
+
+```js
+// eslint.config.js
+import reactX from 'eslint-plugin-react-x'
+import reactDom from 'eslint-plugin-react-dom'
+
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ // Other configs...
+ // Enable lint rules for React
+ reactX.configs['recommended-typescript'],
+ // Enable lint rules for React DOM
+ reactDom.configs.recommended,
+ ],
+ languageOptions: {
+ parserOptions: {
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
+ tsconfigRootDir: import.meta.dirname,
+ },
+ // other options...
+ },
+ },
+])
+```
diff --git a/apps/vite-project/eslint.config.js b/apps/vite-project/eslint.config.js
new file mode 100644
index 0000000..ef614d2
--- /dev/null
+++ b/apps/vite-project/eslint.config.js
@@ -0,0 +1,22 @@
+import js from '@eslint/js'
+import globals from 'globals'
+import reactHooks from 'eslint-plugin-react-hooks'
+import reactRefresh from 'eslint-plugin-react-refresh'
+import tseslint from 'typescript-eslint'
+import { defineConfig, globalIgnores } from 'eslint/config'
+
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{ts,tsx}'],
+ extends: [
+ js.configs.recommended,
+ tseslint.configs.recommended,
+ reactHooks.configs.flat.recommended,
+ reactRefresh.configs.vite,
+ ],
+ languageOptions: {
+ globals: globals.browser,
+ },
+ },
+])
diff --git a/apps/vite-project/index.html b/apps/vite-project/index.html
new file mode 100644
index 0000000..1a2df5a
--- /dev/null
+++ b/apps/vite-project/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ vite-project
+
+
+
+
+
+
diff --git a/apps/vite-project/package.json b/apps/vite-project/package.json
new file mode 100644
index 0000000..d525600
--- /dev/null
+++ b/apps/vite-project/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "vite-project",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "lint": "eslint .",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "react": "^19.2.5",
+ "react-dom": "^19.2.5"
+ },
+ "devDependencies": {
+ "@eslint/js": "^10.0.1",
+ "@types/node": "^24.12.2",
+ "@types/react": "^19.2.14",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^6.0.1",
+ "eslint": "^10.2.1",
+ "eslint-plugin-react-hooks": "^7.1.1",
+ "eslint-plugin-react-refresh": "^0.5.2",
+ "globals": "^17.5.0",
+ "typescript": "~6.0.2",
+ "typescript-eslint": "^8.58.2",
+ "vite": "^8.0.10"
+ }
+}
diff --git a/apps/vite-project/public/favicon.svg b/apps/vite-project/public/favicon.svg
new file mode 100644
index 0000000..6893eb1
--- /dev/null
+++ b/apps/vite-project/public/favicon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/vite-project/public/icons.svg b/apps/vite-project/public/icons.svg
new file mode 100644
index 0000000..e952219
--- /dev/null
+++ b/apps/vite-project/public/icons.svg
@@ -0,0 +1,24 @@
+
diff --git a/apps/vite-project/src/App.css b/apps/vite-project/src/App.css
new file mode 100644
index 0000000..f90339d
--- /dev/null
+++ b/apps/vite-project/src/App.css
@@ -0,0 +1,184 @@
+.counter {
+ font-size: 16px;
+ padding: 5px 10px;
+ border-radius: 5px;
+ color: var(--accent);
+ background: var(--accent-bg);
+ border: 2px solid transparent;
+ transition: border-color 0.3s;
+ margin-bottom: 24px;
+
+ &:hover {
+ border-color: var(--accent-border);
+ }
+ &:focus-visible {
+ outline: 2px solid var(--accent);
+ outline-offset: 2px;
+ }
+}
+
+.hero {
+ position: relative;
+
+ .base,
+ .framework,
+ .vite {
+ inset-inline: 0;
+ margin: 0 auto;
+ }
+
+ .base {
+ width: 170px;
+ position: relative;
+ z-index: 0;
+ }
+
+ .framework,
+ .vite {
+ position: absolute;
+ }
+
+ .framework {
+ z-index: 1;
+ top: 34px;
+ height: 28px;
+ transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg)
+ scale(1.4);
+ }
+
+ .vite {
+ z-index: 0;
+ top: 107px;
+ height: 26px;
+ width: auto;
+ transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg)
+ scale(0.8);
+ }
+}
+
+#center {
+ display: flex;
+ flex-direction: column;
+ gap: 25px;
+ place-content: center;
+ place-items: center;
+ flex-grow: 1;
+
+ @media (max-width: 1024px) {
+ padding: 32px 20px 24px;
+ gap: 18px;
+ }
+}
+
+#next-steps {
+ display: flex;
+ border-top: 1px solid var(--border);
+ text-align: left;
+
+ & > div {
+ flex: 1 1 0;
+ padding: 32px;
+ @media (max-width: 1024px) {
+ padding: 24px 20px;
+ }
+ }
+
+ .icon {
+ margin-bottom: 16px;
+ width: 22px;
+ height: 22px;
+ }
+
+ @media (max-width: 1024px) {
+ flex-direction: column;
+ text-align: center;
+ }
+}
+
+#docs {
+ border-right: 1px solid var(--border);
+
+ @media (max-width: 1024px) {
+ border-right: none;
+ border-bottom: 1px solid var(--border);
+ }
+}
+
+#next-steps ul {
+ list-style: none;
+ padding: 0;
+ display: flex;
+ gap: 8px;
+ margin: 32px 0 0;
+
+ .logo {
+ height: 18px;
+ }
+
+ a {
+ color: var(--text-h);
+ font-size: 16px;
+ border-radius: 6px;
+ background: var(--social-bg);
+ display: flex;
+ padding: 6px 12px;
+ align-items: center;
+ gap: 8px;
+ text-decoration: none;
+ transition: box-shadow 0.3s;
+
+ &:hover {
+ box-shadow: var(--shadow);
+ }
+ .button-icon {
+ height: 18px;
+ width: 18px;
+ }
+ }
+
+ @media (max-width: 1024px) {
+ margin-top: 20px;
+ flex-wrap: wrap;
+ justify-content: center;
+
+ li {
+ flex: 1 1 calc(50% - 8px);
+ }
+
+ a {
+ width: 100%;
+ justify-content: center;
+ box-sizing: border-box;
+ }
+ }
+}
+
+#spacer {
+ height: 88px;
+ border-top: 1px solid var(--border);
+ @media (max-width: 1024px) {
+ height: 48px;
+ }
+}
+
+.ticks {
+ position: relative;
+ width: 100%;
+
+ &::before,
+ &::after {
+ content: '';
+ position: absolute;
+ top: -4.5px;
+ border: 5px solid transparent;
+ }
+
+ &::before {
+ left: 0;
+ border-left-color: var(--border);
+ }
+ &::after {
+ right: 0;
+ border-right-color: var(--border);
+ }
+}
diff --git a/apps/vite-project/src/App.tsx b/apps/vite-project/src/App.tsx
new file mode 100644
index 0000000..a66b5ef
--- /dev/null
+++ b/apps/vite-project/src/App.tsx
@@ -0,0 +1,122 @@
+import { useState } from 'react'
+import reactLogo from './assets/react.svg'
+import viteLogo from './assets/vite.svg'
+import heroImg from './assets/hero.png'
+import './App.css'
+
+function App() {
+ const [count, setCount] = useState(0)
+
+ return (
+ <>
+
+
+
+
Get started
+
+ Edit src/App.tsx and save to test HMR
+
+
+
+
+
+
+
+
+
+
+
Documentation
+
Your questions, answered
+
+
+
+
+
Connect with us
+
Join the Vite community
+
+
+
+
+
+
+ >
+ )
+}
+
+export default App
diff --git a/apps/vite-project/src/assets/hero.png b/apps/vite-project/src/assets/hero.png
new file mode 100644
index 0000000..02251f4
Binary files /dev/null and b/apps/vite-project/src/assets/hero.png differ
diff --git a/apps/vite-project/src/assets/react.svg b/apps/vite-project/src/assets/react.svg
new file mode 100644
index 0000000..6c87de9
--- /dev/null
+++ b/apps/vite-project/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/vite-project/src/assets/vite.svg b/apps/vite-project/src/assets/vite.svg
new file mode 100644
index 0000000..5101b67
--- /dev/null
+++ b/apps/vite-project/src/assets/vite.svg
@@ -0,0 +1 @@
+
diff --git a/apps/vite-project/src/index.css b/apps/vite-project/src/index.css
new file mode 100644
index 0000000..5fb3313
--- /dev/null
+++ b/apps/vite-project/src/index.css
@@ -0,0 +1,111 @@
+:root {
+ --text: #6b6375;
+ --text-h: #08060d;
+ --bg: #fff;
+ --border: #e5e4e7;
+ --code-bg: #f4f3ec;
+ --accent: #aa3bff;
+ --accent-bg: rgba(170, 59, 255, 0.1);
+ --accent-border: rgba(170, 59, 255, 0.5);
+ --social-bg: rgba(244, 243, 236, 0.5);
+ --shadow:
+ rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px;
+
+ --sans: system-ui, 'Segoe UI', Roboto, sans-serif;
+ --heading: system-ui, 'Segoe UI', Roboto, sans-serif;
+ --mono: ui-monospace, Consolas, monospace;
+
+ font: 18px/145% var(--sans);
+ letter-spacing: 0.18px;
+ color-scheme: light dark;
+ color: var(--text);
+ background: var(--bg);
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+
+ @media (max-width: 1024px) {
+ font-size: 16px;
+ }
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --text: #9ca3af;
+ --text-h: #f3f4f6;
+ --bg: #16171d;
+ --border: #2e303a;
+ --code-bg: #1f2028;
+ --accent: #c084fc;
+ --accent-bg: rgba(192, 132, 252, 0.15);
+ --accent-border: rgba(192, 132, 252, 0.5);
+ --social-bg: rgba(47, 48, 58, 0.5);
+ --shadow:
+ rgba(0, 0, 0, 0.4) 0 10px 15px -3px, rgba(0, 0, 0, 0.25) 0 4px 6px -2px;
+ }
+
+ #social .button-icon {
+ filter: invert(1) brightness(2);
+ }
+}
+
+#root {
+ width: 1126px;
+ max-width: 100%;
+ margin: 0 auto;
+ text-align: center;
+ border-inline: 1px solid var(--border);
+ min-height: 100svh;
+ display: flex;
+ flex-direction: column;
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+}
+
+h1,
+h2 {
+ font-family: var(--heading);
+ font-weight: 500;
+ color: var(--text-h);
+}
+
+h1 {
+ font-size: 56px;
+ letter-spacing: -1.68px;
+ margin: 32px 0;
+ @media (max-width: 1024px) {
+ font-size: 36px;
+ margin: 20px 0;
+ }
+}
+h2 {
+ font-size: 24px;
+ line-height: 118%;
+ letter-spacing: -0.24px;
+ margin: 0 0 8px;
+ @media (max-width: 1024px) {
+ font-size: 20px;
+ }
+}
+p {
+ margin: 0;
+}
+
+code,
+.counter {
+ font-family: var(--mono);
+ display: inline-flex;
+ border-radius: 4px;
+ color: var(--text-h);
+}
+
+code {
+ font-size: 15px;
+ line-height: 135%;
+ padding: 4px 8px;
+ background: var(--code-bg);
+}
diff --git a/apps/vite-project/src/main.tsx b/apps/vite-project/src/main.tsx
new file mode 100644
index 0000000..bef5202
--- /dev/null
+++ b/apps/vite-project/src/main.tsx
@@ -0,0 +1,10 @@
+import { StrictMode } from 'react'
+import { createRoot } from 'react-dom/client'
+import './index.css'
+import App from './App.tsx'
+
+createRoot(document.getElementById('root')!).render(
+
+
+ ,
+)
diff --git a/apps/vite-project/tsconfig.app.json b/apps/vite-project/tsconfig.app.json
new file mode 100644
index 0000000..7f42e5f
--- /dev/null
+++ b/apps/vite-project/tsconfig.app.json
@@ -0,0 +1,25 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+ "target": "es2023",
+ "lib": ["ES2023", "DOM"],
+ "module": "esnext",
+ "types": ["vite/client"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Linting */
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src"]
+}
diff --git a/apps/vite-project/tsconfig.json b/apps/vite-project/tsconfig.json
new file mode 100644
index 0000000..1ffef60
--- /dev/null
+++ b/apps/vite-project/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "files": [],
+ "references": [
+ { "path": "./tsconfig.app.json" },
+ { "path": "./tsconfig.node.json" }
+ ]
+}
diff --git a/apps/vite-project/tsconfig.node.json b/apps/vite-project/tsconfig.node.json
new file mode 100644
index 0000000..d3c52ea
--- /dev/null
+++ b/apps/vite-project/tsconfig.node.json
@@ -0,0 +1,24 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+ "target": "es2023",
+ "lib": ["ES2023"],
+ "module": "esnext",
+ "types": ["node"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+
+ /* Linting */
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/apps/vite-project/vite.config.ts b/apps/vite-project/vite.config.ts
new file mode 100644
index 0000000..174c135
--- /dev/null
+++ b/apps/vite-project/vite.config.ts
@@ -0,0 +1,11 @@
+import { defineConfig } from "vite";
+import react from "@vitejs/plugin-react";
+
+// https://vite.dev/config/
+export default defineConfig({
+ plugins: [react()],
+
+ build: {
+ rolldownOptions: { },
+ },
+});
diff --git a/packages/css/package.json b/packages/css/package.json
new file mode 100644
index 0000000..30134c3
--- /dev/null
+++ b/packages/css/package.json
@@ -0,0 +1,42 @@
+{
+ "name": "@defgov/css",
+ "version": "0.0.0",
+ "private": true,
+ "type": "module",
+ "sideEffects": [
+ "*.css"
+ ],
+ "module": "./dist/index.es.js",
+ "main": "./dist/index.cjs.js",
+ "types": "./dist/index.d.ts",
+ "style": "./dist/index.css",
+ "exports": {
+ ".": {
+ "import": "./dist/index.es.js",
+ "require": "./dist/index.cjs.js",
+ "types": "./dist/index.d.ts"
+ },
+ "./index.css": "./dist/index.css"
+ },
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "gen-index": "ts-node scripts/gen-index.ts",
+ "gen-dts": "tsc -p tsconfig.build.json",
+ "dev": "pnpm gen-index && vite build --watch",
+ "build": "pnpm gen-index && vite build && pnpm gen-dts"
+ },
+ "devDependencies": {
+ "@types/node": "^25.6.0",
+ "@vitejs/plugin-react": "^6.0.1",
+ "glob": "^13.0.6",
+ "ts-node": "^10.9.2",
+ "typescript": "^6.0.3",
+ "vite": "^8.0.10"
+ },
+ "peerDependencies": {
+ "react": "^19",
+ "react-dom": "^19"
+ }
+}
diff --git a/packages/css/scripts/gen-index.ts b/packages/css/scripts/gen-index.ts
new file mode 100644
index 0000000..e03849c
--- /dev/null
+++ b/packages/css/scripts/gen-index.ts
@@ -0,0 +1,147 @@
+import fs from "fs";
+import path from "path";
+import { globSync } from "glob";
+
+interface Config {
+ outputDir: string;
+ outputFilenameWithExt: string;
+ scanDirs: string[];
+ importPrefix: string;
+ predefineStatements: string[];
+ includeExtensions: string[];
+ excludeDirs: string[];
+ excludeFileExtensions: string[];
+ excludePatterns: RegExp[];
+}
+
+const cssConfig: Config = {
+ outputDir: "src",
+ outputFilenameWithExt: "index.css",
+ scanDirs: ["src"],
+ importPrefix: "@import",
+ predefineStatements: [],
+ includeExtensions: [".css"],
+ excludeDirs: ["__tests__", "tests", "story", "stories", "types"],
+ excludeFileExtensions: [],
+ excludePatterns: [/^index\.(css)$/, /\.(test|spec)\./, /\.(story|stories)\./],
+};
+
+const tsConfig: Config = {
+ outputDir: "src",
+ outputFilenameWithExt: "index.ts",
+ scanDirs: ["src"],
+ importPrefix: "export * from",
+ predefineStatements: ["import './index.css'"],
+ includeExtensions: [".ts", "tsx", "js", "jsx"],
+ excludeDirs: ["__tests__", "tests", "story", "stories", "types"],
+ excludeFileExtensions: [".d.ts"],
+ excludePatterns: [
+ /^index\.(ts|tsx|js|jsx)$/,
+ /\.(test|spec)\./,
+ /\.(story|stories)\./,
+ ],
+};
+
+const normalizePath = (p: string) => p.replace(/\\/g, "/");
+
+const isExcludeDir = (filePath: string, excludeDirs: string[]) => {
+ const normalized = normalizePath(filePath);
+ return excludeDirs.some((dir) => normalized.includes(`/${dir}/`));
+};
+
+const isExcludeFileExtensions = (
+ filePath: string,
+ excludeFileExtensions: string[],
+) => excludeFileExtensions.some((ext) => filePath.endsWith(ext));
+
+const isExcludePattern = (fileName: string, excludePatterns: RegExp[]) =>
+ excludePatterns.some((pattern) => pattern.test(fileName));
+
+// ----------------------------------------
+function isValidFile(filePath: string, config: Config): boolean {
+ const fileName = filePath.split(/[\\/]/).pop()!;
+
+ if (isExcludeDir(filePath, config.excludeDirs)) return false;
+ if (isExcludeFileExtensions(filePath, config.excludeFileExtensions))
+ return false;
+ if (isExcludePattern(fileName, config.excludePatterns)) return false;
+
+ const ext = path.extname(filePath);
+ return config.includeExtensions.includes(ext);
+}
+// -----------------------------------------
+function generateIndexFile(config: Config) {
+ const currentPath = process.cwd();
+ const outputPath = path.resolve(currentPath, config.outputDir);
+ let exportStatements: string[] = [];
+
+ // ------ scanDirs forEach start ------------------------
+ config.scanDirs.forEach((dir) => {
+ const scanPattern = path.resolve(currentPath, dir, "**", "*.*");
+
+ const allFilePath = globSync(scanPattern, {
+ absolute: true,
+ windowsPathsNoEscape: true,
+ dot: false,
+ follow: true,
+ });
+
+ const validFiles = allFilePath.filter((filePath) => {
+ return isValidFile(filePath, config);
+ });
+
+ if (validFiles.length === 0) {
+ console.log(
+ `⚠️ 未找到符合条件的文件,跳过生成 ${config.outputFilenameWithExt}`,
+ );
+ return;
+ }
+
+ validFiles.sort();
+
+ validFiles.forEach((file) => {
+ const relativePath = path.relative(outputPath, file);
+ const importPath = `./${relativePath.replace(/\\/g, "/")}`;
+ exportStatements.push(`${config.importPrefix} '${importPath}';`);
+ });
+ });
+
+ // --------- scanDirs forEach end ----------------
+
+ const indexFileContent = `
+${config.predefineStatements.join("\n")}
+${exportStatements.join("\n")}
+`.trim();
+
+ const indexFilePath = path.resolve(
+ currentPath,
+ config.outputDir,
+ config.outputFilenameWithExt,
+ );
+
+ // ✅ 内容比对,避免重复写入
+ if (fs.existsSync(indexFilePath)) {
+ const old = fs.readFileSync(indexFilePath, "utf8");
+ if (old === indexFileContent) {
+ console.log(
+ `✅ ${config.outputFilenameWithExt} 内容无变化,无需重新生成`,
+ );
+ return;
+ }
+ }
+
+ fs.writeFileSync(indexFilePath, indexFileContent, "utf8");
+ console.log(`✅ 成功生成 ${config.outputFilenameWithExt}: ${indexFilePath}`);
+}
+
+// --------------------------------------------------
+
+try {
+ console.log(`🚀 [gen-index] 开始扫描`);
+ generateIndexFile(cssConfig);
+ generateIndexFile(tsConfig);
+} catch (err) {
+ const msg = err instanceof Error ? err.message : String(err);
+ console.error(`❌ [gen-index] 执行失败: ${msg}`);
+ process.exit(1);
+}
diff --git a/packages/css/base/root.css b/packages/css/src/base/root.css
similarity index 98%
rename from packages/css/base/root.css
rename to packages/css/src/base/root.css
index 46b596e..36feec1 100644
--- a/packages/css/base/root.css
+++ b/packages/css/src/base/root.css
@@ -365,6 +365,7 @@
--radius-md: 0.375rem;
--radius-lg: 0.5rem;
--radius-xl: 0.75rem;
+ --radius-2xl: 1rem;
--font-sans:
ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
@@ -379,16 +380,22 @@
--margin-md: calc(var(--spacing) * 2);
--margin-lg: calc(var(--spacing) * 2);
--margin-xl: calc(var(--spacing) * 2);
+ --margin-2xl: calc(var(--spacing) * 2);
--padding-long-xs: calc(var(--spacing) * 3);
--padding-long-sm: calc(var(--spacing) * 4);
--padding-long-md: calc(var(--spacing) * 5);
--padding-long-lg: calc(var(--spacing) * 8);
--padding-long-xl: calc(var(--spacing) * 2);
+ --padding-long-2xl: calc(var(--spacing) * 2);
--padding-xs: calc(var(--spacing) * 2);
--padding-sm: calc(var(--spacing) * 4);
--padding-md: calc(var(--spacing) * 2);
--padding-lg: calc(var(--spacing) * 2);
--padding-xl: calc(var(--spacing) * 2);
+ --padding-2xl: calc(var(--spacing) * 2);
+
+ --drop-shadow: drop-shadow(0 0 4px rgba(0, 0, 0, 0.12))
+ drop-shadow(0 8px 16px rgba(0, 0, 0, 0.14));
}
diff --git a/packages/css/src/index.css b/packages/css/src/index.css
new file mode 100644
index 0000000..b3733dd
--- /dev/null
+++ b/packages/css/src/index.css
@@ -0,0 +1,37 @@
+@import './base/root.css';
+@import './utility/size-insensitive/align-content.css';
+@import './utility/size-insensitive/align-items.css';
+@import './utility/size-insensitive/align-self.css';
+@import './utility/size-insensitive/animation.css';
+@import './utility/size-insensitive/box-decoration.css';
+@import './utility/size-insensitive/box-inside.css';
+@import './utility/size-insensitive/box-sizing.css';
+@import './utility/size-insensitive/brand.css';
+@import './utility/size-insensitive/break-after.css';
+@import './utility/size-insensitive/break-before.css';
+@import './utility/size-insensitive/cursor.css';
+@import './utility/size-insensitive/display.css';
+@import './utility/size-insensitive/drop-shadow.css';
+@import './utility/size-insensitive/flex-direction.css';
+@import './utility/size-insensitive/flex-wrap.css';
+@import './utility/size-insensitive/font-family.css';
+@import './utility/size-insensitive/justify-content.css';
+@import './utility/size-insensitive/justify-items.css';
+@import './utility/size-insensitive/justify-self.css';
+@import './utility/size-insensitive/overflow.css';
+@import './utility/size-insensitive/overscroll-behavior.css';
+@import './utility/size-insensitive/position.css';
+@import './utility/size-insensitive/screen-reader.css';
+@import './utility/size-insensitive/theme.css';
+@import './utility/size-insensitive/user-select.css';
+@import './utility/size-insensitive/z-index.css';
+@import './utility/size-sensitive/border-radius.css';
+@import './utility/size-sensitive/font-size.css';
+@import './utility/size-sensitive/font-weight.css';
+@import './utility/size-sensitive/gap.css';
+@import './utility/size-sensitive/height.css';
+@import './utility/size-sensitive/margin-block.css';
+@import './utility/size-sensitive/margin-inline.css';
+@import './utility/size-sensitive/padding-long.css';
+@import './utility/size-sensitive/padding-short.css';
+@import './utility/size-sensitive/width.css';
\ No newline at end of file
diff --git a/packages/css/src/index.ts b/packages/css/src/index.ts
new file mode 100644
index 0000000..1bdf840
--- /dev/null
+++ b/packages/css/src/index.ts
@@ -0,0 +1,4 @@
+import './index.css'
+export * from './utils/cpm.ts';
+export * from './utils/cvr.ts';
+export * from './utils/prefix-list.ts';
\ No newline at end of file
diff --git a/packages/css/src/types/env.d.ts b/packages/css/src/types/env.d.ts
new file mode 100644
index 0000000..31058d4
--- /dev/null
+++ b/packages/css/src/types/env.d.ts
@@ -0,0 +1,4 @@
+declare module "*.css" {
+ const content: string;
+ export default content;
+}
diff --git a/packages/css/utility/align-content.css b/packages/css/src/utility/size-insensitive/align-content.css
similarity index 100%
rename from packages/css/utility/align-content.css
rename to packages/css/src/utility/size-insensitive/align-content.css
diff --git a/packages/css/utility/align-items.css b/packages/css/src/utility/size-insensitive/align-items.css
similarity index 100%
rename from packages/css/utility/align-items.css
rename to packages/css/src/utility/size-insensitive/align-items.css
diff --git a/packages/css/utility/align-self.css b/packages/css/src/utility/size-insensitive/align-self.css
similarity index 100%
rename from packages/css/utility/align-self.css
rename to packages/css/src/utility/size-insensitive/align-self.css
diff --git a/packages/css/utility/animate.css b/packages/css/src/utility/size-insensitive/animation.css
similarity index 100%
rename from packages/css/utility/animate.css
rename to packages/css/src/utility/size-insensitive/animation.css
diff --git a/packages/css/utility/box-decoration.css b/packages/css/src/utility/size-insensitive/box-decoration.css
similarity index 100%
rename from packages/css/utility/box-decoration.css
rename to packages/css/src/utility/size-insensitive/box-decoration.css
diff --git a/packages/css/utility/box-inside.css b/packages/css/src/utility/size-insensitive/box-inside.css
similarity index 100%
rename from packages/css/utility/box-inside.css
rename to packages/css/src/utility/size-insensitive/box-inside.css
diff --git a/packages/css/utility/box-sizing.css b/packages/css/src/utility/size-insensitive/box-sizing.css
similarity index 100%
rename from packages/css/utility/box-sizing.css
rename to packages/css/src/utility/size-insensitive/box-sizing.css
diff --git a/packages/css/utility/brand.css b/packages/css/src/utility/size-insensitive/brand.css
similarity index 100%
rename from packages/css/utility/brand.css
rename to packages/css/src/utility/size-insensitive/brand.css
diff --git a/packages/css/utility/break-after.css b/packages/css/src/utility/size-insensitive/break-after.css
similarity index 100%
rename from packages/css/utility/break-after.css
rename to packages/css/src/utility/size-insensitive/break-after.css
diff --git a/packages/css/utility/break-before.css b/packages/css/src/utility/size-insensitive/break-before.css
similarity index 100%
rename from packages/css/utility/break-before.css
rename to packages/css/src/utility/size-insensitive/break-before.css
diff --git a/packages/css/utility/cursor.css b/packages/css/src/utility/size-insensitive/cursor.css
similarity index 100%
rename from packages/css/utility/cursor.css
rename to packages/css/src/utility/size-insensitive/cursor.css
diff --git a/packages/css/utility/display.css b/packages/css/src/utility/size-insensitive/display.css
similarity index 100%
rename from packages/css/utility/display.css
rename to packages/css/src/utility/size-insensitive/display.css
diff --git a/packages/css/src/utility/size-insensitive/drop-shadow.css b/packages/css/src/utility/size-insensitive/drop-shadow.css
new file mode 100644
index 0000000..d100e0f
--- /dev/null
+++ b/packages/css/src/utility/size-insensitive/drop-shadow.css
@@ -0,0 +1,5 @@
+@layer utility {
+ .drop-shadow {
+ filter: var(--drop-shadow);
+ }
+}
diff --git a/packages/css/utility/flex-direction.css b/packages/css/src/utility/size-insensitive/flex-direction.css
similarity index 100%
rename from packages/css/utility/flex-direction.css
rename to packages/css/src/utility/size-insensitive/flex-direction.css
diff --git a/packages/css/utility/flex-wrap.css b/packages/css/src/utility/size-insensitive/flex-wrap.css
similarity index 100%
rename from packages/css/utility/flex-wrap.css
rename to packages/css/src/utility/size-insensitive/flex-wrap.css
diff --git a/packages/css/utility/font-family.css b/packages/css/src/utility/size-insensitive/font-family.css
similarity index 100%
rename from packages/css/utility/font-family.css
rename to packages/css/src/utility/size-insensitive/font-family.css
diff --git a/packages/css/utility/justify-content.css b/packages/css/src/utility/size-insensitive/justify-content.css
similarity index 100%
rename from packages/css/utility/justify-content.css
rename to packages/css/src/utility/size-insensitive/justify-content.css
diff --git a/packages/css/utility/justify-items.css b/packages/css/src/utility/size-insensitive/justify-items.css
similarity index 100%
rename from packages/css/utility/justify-items.css
rename to packages/css/src/utility/size-insensitive/justify-items.css
diff --git a/packages/css/utility/justify-self.css b/packages/css/src/utility/size-insensitive/justify-self.css
similarity index 100%
rename from packages/css/utility/justify-self.css
rename to packages/css/src/utility/size-insensitive/justify-self.css
diff --git a/packages/css/utility/overflow.css b/packages/css/src/utility/size-insensitive/overflow.css
similarity index 100%
rename from packages/css/utility/overflow.css
rename to packages/css/src/utility/size-insensitive/overflow.css
diff --git a/packages/css/utility/overscroll-behavior.css b/packages/css/src/utility/size-insensitive/overscroll-behavior.css
similarity index 100%
rename from packages/css/utility/overscroll-behavior.css
rename to packages/css/src/utility/size-insensitive/overscroll-behavior.css
diff --git a/packages/css/utility/position.css b/packages/css/src/utility/size-insensitive/position.css
similarity index 100%
rename from packages/css/utility/position.css
rename to packages/css/src/utility/size-insensitive/position.css
diff --git a/packages/css/utility/screen-reader.css b/packages/css/src/utility/size-insensitive/screen-reader.css
similarity index 100%
rename from packages/css/utility/screen-reader.css
rename to packages/css/src/utility/size-insensitive/screen-reader.css
diff --git a/packages/css/utility/theme.css b/packages/css/src/utility/size-insensitive/theme.css
similarity index 100%
rename from packages/css/utility/theme.css
rename to packages/css/src/utility/size-insensitive/theme.css
diff --git a/packages/css/src/utility/size-insensitive/user-select.css b/packages/css/src/utility/size-insensitive/user-select.css
new file mode 100644
index 0000000..a2deadf
--- /dev/null
+++ b/packages/css/src/utility/size-insensitive/user-select.css
@@ -0,0 +1,14 @@
+@layer utility {
+ .select-none {
+ user-select: none;
+ }
+ .select-text {
+ user-select: text;
+ }
+ .select-all {
+ user-select: all;
+ }
+ .select-auto {
+ user-select: auto;
+ }
+}
diff --git a/packages/css/utility/z-index.css b/packages/css/src/utility/size-insensitive/z-index.css
similarity index 100%
rename from packages/css/utility/z-index.css
rename to packages/css/src/utility/size-insensitive/z-index.css
diff --git a/packages/css/utility/border-radius.css b/packages/css/src/utility/size-sensitive/border-radius.css
similarity index 87%
rename from packages/css/utility/border-radius.css
rename to packages/css/src/utility/size-sensitive/border-radius.css
index 51ff578..47a04ce 100644
--- a/packages/css/utility/border-radius.css
+++ b/packages/css/src/utility/size-sensitive/border-radius.css
@@ -20,4 +20,7 @@
.rounded-xl {
border-radius: var(--radius-xl);
}
+ .rounded-2xl {
+ border-radius: var(--radius-2xl);
+ }
}
diff --git a/packages/css/utility/font-size.css b/packages/css/src/utility/size-sensitive/font-size.css
similarity index 100%
rename from packages/css/utility/font-size.css
rename to packages/css/src/utility/size-sensitive/font-size.css
diff --git a/packages/css/utility/font-weight.css b/packages/css/src/utility/size-sensitive/font-weight.css
similarity index 100%
rename from packages/css/utility/font-weight.css
rename to packages/css/src/utility/size-sensitive/font-weight.css
diff --git a/packages/css/utility/gap.css b/packages/css/src/utility/size-sensitive/gap.css
similarity index 85%
rename from packages/css/utility/gap.css
rename to packages/css/src/utility/size-sensitive/gap.css
index 9af7a48..618b984 100644
--- a/packages/css/utility/gap.css
+++ b/packages/css/src/utility/size-sensitive/gap.css
@@ -17,4 +17,7 @@
.gap-xl {
gap: calc(var(--spacing) * 2.5);
}
+ .gap-2xl {
+ gap: calc(var(--spacing) * 2.5);
+ }
}
diff --git a/packages/css/utility/height.css b/packages/css/src/utility/size-sensitive/height.css
similarity index 96%
rename from packages/css/utility/height.css
rename to packages/css/src/utility/size-sensitive/height.css
index 52c87ba..406a828 100644
--- a/packages/css/utility/height.css
+++ b/packages/css/src/utility/size-sensitive/height.css
@@ -16,7 +16,7 @@
height: var(--height-item-lg);
}
.h-item-xl {
- /* 64px navigation bar */
+ /* 56px section-header bar */
height: var(--height-item-xl);
}
.h-item-2xl {
diff --git a/packages/css/utility/margin-block.css b/packages/css/src/utility/size-sensitive/margin-block.css
similarity index 85%
rename from packages/css/utility/margin-block.css
rename to packages/css/src/utility/size-sensitive/margin-block.css
index 865122e..1221094 100644
--- a/packages/css/utility/margin-block.css
+++ b/packages/css/src/utility/size-sensitive/margin-block.css
@@ -17,6 +17,9 @@
.my-e-xl {
margin-block-end: var(--margin-xl);
}
+ .my-e-2xl {
+ margin-block-end: var(--margin-2xl);
+ }
/* ------------------ */
.my-s-none {
margin-block-start: 0;
@@ -36,6 +39,9 @@
.my-s-xl {
margin-block-start: var(--margin-xl);
}
+ .my-s-2xl {
+ margin-block-start: var(--margin-2xl);
+ }
/* --------------------- */
.my-none {
margin-block: 0;
@@ -55,4 +61,7 @@
.my-xl {
margin-block: var(--margin-xl);
}
+ .my-2xl {
+ margin-block: var(--margin-2xl);
+ }
}
diff --git a/packages/css/utility/margin-inline.css b/packages/css/src/utility/size-sensitive/margin-inline.css
similarity index 85%
rename from packages/css/utility/margin-inline.css
rename to packages/css/src/utility/size-sensitive/margin-inline.css
index 0fea3b7..40e1e9c 100644
--- a/packages/css/utility/margin-inline.css
+++ b/packages/css/src/utility/size-sensitive/margin-inline.css
@@ -17,6 +17,9 @@
.mx-e-xl {
margin-inline-end: var(--margin-xl);
}
+ .mx-e-2xl {
+ margin-inline-end: var(--margin-2xl);
+ }
/* ------------------ */
.mx-s-none {
margin-inline-start: 0;
@@ -36,6 +39,9 @@
.mx-s-xl {
margin-inline-start: var(--margin-xl);
}
+ .mx-s-2xl {
+ margin-inline-start: var(--margin-2xl);
+ }
/* --------------------- */
.mx-none {
margin-inline: 0;
@@ -55,4 +61,7 @@
.mx-xl {
margin-inline: var(--margin-xl);
}
+ .mx-2xl {
+ margin-inline: var(--margin-2xl);
+ }
}
diff --git a/packages/css/utility/padding-long.css b/packages/css/src/utility/size-sensitive/padding-long.css
similarity index 85%
rename from packages/css/utility/padding-long.css
rename to packages/css/src/utility/size-sensitive/padding-long.css
index fd28735..235fff5 100644
--- a/packages/css/utility/padding-long.css
+++ b/packages/css/src/utility/size-sensitive/padding-long.css
@@ -18,4 +18,7 @@
.px-long-xl {
padding-inline: var(--padding-long-xl);
}
+ .px-long-2xl {
+ padding-inline: var(--padding-long-2xl);
+ }
}
diff --git a/packages/css/utility/padding-short.css b/packages/css/src/utility/size-sensitive/padding-short.css
similarity index 86%
rename from packages/css/utility/padding-short.css
rename to packages/css/src/utility/size-sensitive/padding-short.css
index a2b0a6e..5d3ba50 100644
--- a/packages/css/utility/padding-short.css
+++ b/packages/css/src/utility/size-sensitive/padding-short.css
@@ -21,6 +21,9 @@
.px-xl {
padding-inline: var(--padding-xl);
}
+ .px-2xl {
+ padding-inline: var(--padding-2xl);
+ }
/* ------------------------ */
.py-none {
padding-block: 0px;
@@ -40,4 +43,7 @@
.py-xl {
padding-block: var(--padding-xl);
}
+ .py-2xl {
+ padding-block: var(--padding-2xl);
+ }
}
diff --git a/packages/css/utility/width.css b/packages/css/src/utility/size-sensitive/width.css
similarity index 84%
rename from packages/css/utility/width.css
rename to packages/css/src/utility/size-sensitive/width.css
index 13ecf5b..7384f89 100644
--- a/packages/css/utility/width.css
+++ b/packages/css/src/utility/size-sensitive/width.css
@@ -16,6 +16,10 @@
width: var(--height-item-lg);
}
.w-item-xl {
+ /* 56px section-header bar */
+ width: var(--height-item-xl);
+ }
+ .w-item-2xl {
/* 64px navigation bar */
width: var(--height-item-xl);
}
@@ -35,4 +39,7 @@
.w-inline-xl {
width: calc(var(--font-size-xl) * var(--line-height-xl));
}
+ .w-inline-xl {
+ width: calc(var(--font-size-2xl) * var(--line-height-2xl));
+ }
}
diff --git a/packages/css/utils/cpm.ts b/packages/css/src/utils/cpm.ts
similarity index 100%
rename from packages/css/utils/cpm.ts
rename to packages/css/src/utils/cpm.ts
diff --git a/packages/css/utils/cvr.ts b/packages/css/src/utils/cvr.ts
similarity index 100%
rename from packages/css/utils/cvr.ts
rename to packages/css/src/utils/cvr.ts
diff --git a/packages/css/utils/prefix-list.ts b/packages/css/src/utils/prefix-list.ts
similarity index 97%
rename from packages/css/utils/prefix-list.ts
rename to packages/css/src/utils/prefix-list.ts
index c1d237f..8efb393 100644
--- a/packages/css/utils/prefix-list.ts
+++ b/packages/css/src/utils/prefix-list.ts
@@ -33,6 +33,8 @@ export const defaultPrefixList = [
"theme",
"w",
"z",
+ "drop-shadow",
+ "select",
];
// map 里面 key 是 prefix,value 是完整 class。
diff --git a/templates/vite-react-app/tsconfig.build.json b/packages/css/tsconfig.build.json
similarity index 61%
rename from templates/vite-react-app/tsconfig.build.json
rename to packages/css/tsconfig.build.json
index 60d26ca..a5bcc27 100644
--- a/templates/vite-react-app/tsconfig.build.json
+++ b/packages/css/tsconfig.build.json
@@ -1,28 +1,24 @@
{
- "extends": "./tsconfig.base.json",
+ "extends": "./tsconfig.json",
"compilerOptions": {
- "outDir": "./dist",
+ "noEmit": false,
+ "emitDeclarationOnly": true,
+ "declaration": true,
"rootDir": "./src",
- "jsx": "react-jsx",
- "declaration": true
+ "outDir": "./dist",
+ "declarationDir": "./dist"
},
"include": ["src"],
"exclude": [
"node_modules",
"dist",
-
- // ---------- build / cache ----------
".turbo/**/*",
".cache/**/*",
".vite/**/*",
-
- // ---------- 配置文件 ----------
"vite.config.ts",
"*.config.ts",
"*.config.js",
"tsconfig.*.json",
-
- // ---------- 测试相关 ----------
"__tests__/**/*",
"test/**/*",
"tests/**/*",
@@ -30,22 +26,14 @@
"**/*.test.tsx",
"**/*.spec.ts",
"**/*.spec.tsx",
-
- // ---------- Storybook ----------
".storybook/**/*",
"stories/**/*",
-
- // ---------- 示例 / 脚本 ----------
"example/**/*",
"examples/**/*",
"scripts/**/*",
-
- // ---------- 环境与静态资源 ----------
".env",
".env.*",
"public/**/*",
-
- // ---------- 文档 ----------
"docs/**/*",
"README.md",
"LICENSE"
diff --git a/packages/css/tsconfig.json b/packages/css/tsconfig.json
new file mode 100644
index 0000000..eb90b48
--- /dev/null
+++ b/packages/css/tsconfig.json
@@ -0,0 +1,26 @@
+{
+ "compilerOptions": {
+ "target": "es2025",
+ "lib": ["ES2025", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "types": ["node", "vite/client"],
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Linting */
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src", "scripts", "vite.config.ts"]
+}
diff --git a/packages/css/vite.config.ts b/packages/css/vite.config.ts
new file mode 100644
index 0000000..c632b6e
--- /dev/null
+++ b/packages/css/vite.config.ts
@@ -0,0 +1,39 @@
+import { defineConfig } from "vite";
+import react from "@vitejs/plugin-react";
+import path from "path";
+
+export default defineConfig({
+ // d.ts 由 tsc 完成,使用专门配置 tsconfig.build.json
+ // 转换由 oxc 完成
+ // 打包由 rolldown 完成
+ plugins: [react()],
+
+ build: {
+ cssMinify: false,
+ lib: {
+ entry: path.resolve(import.meta.dirname, "src/index.ts"),
+ // 不写 vite 默认是 index.mjs 和 index.js,不方便识别
+ formats: ["es", "cjs"],
+ // package.json 管别人怎么使用,
+ // build.lib 管怎么打包,生成什么
+ // 如果不一致,就会报错,指向文件不存在
+ fileName: (format) => `index.${format}.js`,
+ },
+ rolldownOptions: {
+ // 避免这些被打包,peerDependencies 对 rolldown 是无效的,不会自动 external
+ external: ["react", "react-dom", "react/jsx-runtime"],
+ // 专门给 UMD / IIFE 的映射表
+ output: {
+ globals: {
+ react: "React",
+ "react-dom": "ReactDOM",
+ },
+ },
+ },
+
+ emptyOutDir: true, // 防止旧产物残留
+ sourcemap: true, // 方便调试
+ cssCodeSplit: false, // 合并成一个css文件
+ outDir: "dist", // 专管打包输出目录,tsconfig.build.json 中的 outDir 管的是 d.ts 输出目录
+ },
+});
diff --git a/packages/ui-web-tw/tsconfig.base.json b/packages/ui-web-tw/tsconfig.base.json
deleted file mode 100644
index a7f1b39..0000000
--- a/packages/ui-web-tw/tsconfig.base.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "compilerOptions": {
- "module": "es2022",
- "moduleResolution": "bundler",
- "lib": ["ES2025", "DOM", "DOM.Iterable"],
- "strict": true,
- "esModuleInterop": true,
- "skipLibCheck": true,
- "isolatedModules": true,
- "verbatimModuleSyntax": true
- }
-}
diff --git a/packages/ui-web-tw/tsconfig.build.json b/packages/ui-web-tw/tsconfig.build.json
index 30b6e0a..76f11c4 100644
--- a/packages/ui-web-tw/tsconfig.build.json
+++ b/packages/ui-web-tw/tsconfig.build.json
@@ -1,10 +1,11 @@
{
- "extends": "./tsconfig.base.json",
+ "extends": "./tsconfig.json",
"compilerOptions": {
- "outDir": "./dist",
- "rootDir": "./src",
- "jsx": "react-jsx",
- "declaration": true
+ "noEmit": false,
+ "emitDeclarationOnly": true,
+ "declaration": true,
+ "outDir": "dist",
+ "declarationDir": "dist/types"
},
"include": ["src"],
"exclude": [
diff --git a/packages/ui-web-tw/tsconfig.json b/packages/ui-web-tw/tsconfig.json
index b77a367..9869c7d 100644
--- a/packages/ui-web-tw/tsconfig.json
+++ b/packages/ui-web-tw/tsconfig.json
@@ -1,8 +1,26 @@
{
- "extends": "./tsconfig.base.json",
"compilerOptions": {
+ "target": "es2025",
+ "lib": ["ES2025", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "types": ["node", "vite/client"],
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
"jsx": "react-jsx",
- "noEmit": true
+
+ /* Linting */
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true
},
- "include": [".", "../css/utils/clspm.ts"]
+ "include": ["."]
}
diff --git a/packages/ui-web-tw/vite.config.ts b/packages/ui-web-tw/vite.config.ts
index 0132902..b89f0bb 100644
--- a/packages/ui-web-tw/vite.config.ts
+++ b/packages/ui-web-tw/vite.config.ts
@@ -3,7 +3,6 @@ import react from "@vitejs/plugin-react";
import dts from "vite-plugin-dts";
import path from "path";
import tailwindcss from "@tailwindcss/vite";
-import typescript from "@rollup/plugin-typescript";
export default defineConfig({
plugins: [
@@ -24,17 +23,6 @@ export default defineConfig({
fileName: (format) => `index.${format}.js`,
},
- rollupOptions: {
- plugins: [typescript({ tsconfig: "./tsconfig.build.json" })],
- external: ["react", "react-dom", "react/jsx-runtime"],
- output: {
- globals: {
- react: "React",
- "react-dom": "ReactDOM",
- },
- },
- },
-
sourcemap: true,
cssCodeSplit: true,
},
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 1713038..4e92330 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -14,9 +14,9 @@ importers:
apps/ui-site:
dependencies:
- '@defgov/ui-web':
+ '@defgov/ui-web-tw':
specifier: workspace:*
- version: link:../../packages/ui-web
+ version: link:../../packages/ui-web-tw
react:
specifier: ^19.2.5
version: 19.2.5
@@ -26,7 +26,7 @@ importers:
devDependencies:
'@rollup/plugin-typescript':
specifier: ^12.3.0
- version: 12.3.0(rollup@4.60.2)(typescript@6.0.3)
+ version: 12.3.0(rollup@4.60.2)(tslib@2.8.1)(typescript@6.0.3)
'@types/node':
specifier: ^25.6.0
version: 25.6.0
@@ -61,6 +61,52 @@ importers:
specifier: ^4.5.4
version: 4.5.4(@types/node@25.6.0)(rollup@4.60.2)(typescript@6.0.3)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0))
+ apps/vite-project:
+ dependencies:
+ react:
+ specifier: ^19.2.5
+ version: 19.2.5
+ react-dom:
+ specifier: ^19.2.5
+ version: 19.2.5(react@19.2.5)
+ devDependencies:
+ '@eslint/js':
+ specifier: ^10.0.1
+ version: 10.0.1(eslint@10.3.0(jiti@2.6.1))
+ '@types/node':
+ specifier: ^24.12.2
+ version: 24.12.2
+ '@types/react':
+ specifier: ^19.2.14
+ version: 19.2.14
+ '@types/react-dom':
+ specifier: ^19.2.3
+ version: 19.2.3(@types/react@19.2.14)
+ '@vitejs/plugin-react':
+ specifier: ^6.0.1
+ version: 6.0.1(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1))
+ eslint:
+ specifier: ^10.2.1
+ version: 10.3.0(jiti@2.6.1)
+ eslint-plugin-react-hooks:
+ specifier: ^7.1.1
+ version: 7.1.1(eslint@10.3.0(jiti@2.6.1))
+ eslint-plugin-react-refresh:
+ specifier: ^0.5.2
+ version: 0.5.2(eslint@10.3.0(jiti@2.6.1))
+ globals:
+ specifier: ^17.5.0
+ version: 17.6.0
+ typescript:
+ specifier: ~6.0.2
+ version: 6.0.3
+ typescript-eslint:
+ specifier: ^8.58.2
+ version: 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)
+ vite:
+ specifier: ^8.0.10
+ version: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)
+
packages/bookmark-sync:
dependencies:
typescript:
@@ -83,7 +129,35 @@ importers:
specifier: ^0.12.0
version: 0.12.0
- packages/ui-web:
+ packages/css:
+ dependencies:
+ react:
+ specifier: ^19
+ version: 19.2.5
+ react-dom:
+ specifier: ^19
+ version: 19.2.5(react@19.2.5)
+ devDependencies:
+ '@types/node':
+ specifier: ^25.6.0
+ version: 25.6.0
+ '@vitejs/plugin-react':
+ specifier: ^6.0.1
+ version: 6.0.1(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1))
+ glob:
+ specifier: ^13.0.6
+ version: 13.0.6
+ ts-node:
+ specifier: ^10.9.2
+ version: 10.9.2(@types/node@25.6.0)(typescript@6.0.3)
+ typescript:
+ specifier: ^6.0.3
+ version: 6.0.3
+ vite:
+ specifier: ^8.0.10
+ version: 8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)
+
+ packages/ui-web-tw:
dependencies:
'@base-ui/react':
specifier: ^1.4.1
@@ -106,7 +180,7 @@ importers:
devDependencies:
'@rollup/plugin-typescript':
specifier: ^12.3.0
- version: 12.3.0(rollup@4.60.2)(typescript@6.0.3)
+ version: 12.3.0(rollup@4.60.2)(tslib@2.8.1)(typescript@6.0.3)
'@tailwindcss/vite':
specifier: ^4.2.4
version: 4.2.4(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0))
@@ -138,86 +212,6 @@ importers:
specifier: ^5.0.0
version: 5.0.0(@microsoft/api-extractor@7.58.7(@types/node@25.6.0))(esbuild@0.27.7)(rollup@4.60.2)(typescript@6.0.3)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0))
- templates/vite-react-app:
- dependencies:
- react:
- specifier: ^19.2.5
- version: 19.2.5
- react-dom:
- specifier: ^19.2.5
- version: 19.2.5(react@19.2.5)
- devDependencies:
- '@rollup/plugin-typescript':
- specifier: ^12.3.0
- version: 12.3.0(rollup@4.60.2)(typescript@6.0.3)
- '@types/node':
- specifier: ^25.6.0
- version: 25.6.0
- '@types/react':
- specifier: ^19.2.14
- version: 19.2.14
- '@types/react-dom':
- specifier: ^19.2.3
- version: 19.2.3(@types/react@19.2.14)
- '@vitejs/plugin-react':
- specifier: ~5.2.0
- version: 5.2.0(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0))
- glob:
- specifier: ^13.0.6
- version: 13.0.6
- ts-node:
- specifier: ^10.9.2
- version: 10.9.2(@types/node@25.6.0)(typescript@6.0.3)
- typescript:
- specifier: ~6.0.3
- version: 6.0.3
- vite:
- specifier: ~7.3.2
- version: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)
- vite-plugin-dts:
- specifier: ^4.5.4
- version: 4.5.4(@types/node@25.6.0)(rollup@4.60.2)(typescript@6.0.3)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0))
-
- templates/vite-react-lib:
- dependencies:
- react:
- specifier: ^19
- version: 19.2.5
- react-dom:
- specifier: ^19
- version: 19.2.5(react@19.2.5)
- devDependencies:
- '@rollup/plugin-typescript':
- specifier: ^12.3.0
- version: 12.3.0(rollup@4.60.2)(typescript@6.0.3)
- '@types/node':
- specifier: ^25.6.0
- version: 25.6.0
- '@types/react':
- specifier: ^19.2.14
- version: 19.2.14
- '@types/react-dom':
- specifier: ^19.2.3
- version: 19.2.3(@types/react@19.2.14)
- '@vitejs/plugin-react':
- specifier: ~5.2.0
- version: 5.2.0(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0))
- glob:
- specifier: ^13.0.6
- version: 13.0.6
- ts-node:
- specifier: ^10.9.2
- version: 10.9.2(@types/node@25.6.0)(typescript@6.0.3)
- typescript:
- specifier: ~6.0.3
- version: 6.0.3
- vite:
- specifier: ~7.3.2
- version: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)
- vite-plugin-dts:
- specifier: ^4.5.4
- version: 4.5.4(@types/node@25.6.0)(rollup@4.60.2)(typescript@6.0.3)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0))
-
packages:
'@babel/code-frame@7.29.0':
@@ -338,6 +332,15 @@ packages:
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
engines: {node: '>=12'}
+ '@emnapi/core@1.10.0':
+ resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==}
+
+ '@emnapi/runtime@1.10.0':
+ resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==}
+
+ '@emnapi/wasi-threads@1.2.1':
+ resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==}
+
'@esbuild/aix-ppc64@0.27.7':
resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==}
engines: {node: '>=18'}
@@ -494,6 +497,45 @@ packages:
cpu: [x64]
os: [win32]
+ '@eslint-community/eslint-utils@4.9.1':
+ resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.12.2':
+ resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/config-array@0.23.5':
+ resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@eslint/config-helpers@0.5.5':
+ resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@eslint/core@1.2.1':
+ resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@eslint/js@10.0.1':
+ resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+ peerDependencies:
+ eslint: ^10.0.0
+ peerDependenciesMeta:
+ eslint:
+ optional: true
+
+ '@eslint/object-schema@3.0.5':
+ resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@eslint/plugin-kit@0.7.1':
+ resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
'@floating-ui/core@1.7.5':
resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==}
@@ -509,6 +551,30 @@ packages:
'@floating-ui/utils@0.2.11':
resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==}
+ '@humanfs/core@0.19.2':
+ resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.8':
+ resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/types@0.15.0':
+ resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/retry@0.4.3':
+ resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
+ engines: {node: '>=18.18'}
+
+ '@isaacs/cliui@8.0.2':
+ resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+ engines: {node: '>=12'}
+
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
@@ -541,9 +607,123 @@ packages:
'@microsoft/tsdoc@0.16.0':
resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==}
+ '@napi-rs/wasm-runtime@1.1.4':
+ resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==}
+ peerDependencies:
+ '@emnapi/core': ^1.7.1
+ '@emnapi/runtime': ^1.7.1
+
+ '@oxc-project/types@0.127.0':
+ resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==}
+
+ '@pkgjs/parseargs@0.11.0':
+ resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+ engines: {node: '>=14'}
+
+ '@rolldown/binding-android-arm64@1.0.0-rc.17':
+ resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
+
+ '@rolldown/binding-darwin-arm64@1.0.0-rc.17':
+ resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rolldown/binding-darwin-x64@1.0.0-rc.17':
+ resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rolldown/binding-freebsd-x64@1.0.0-rc.17':
+ resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17':
+ resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17':
+ resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17':
+ resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17':
+ resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17':
+ resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17':
+ resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rolldown/binding-linux-x64-musl@1.0.0-rc.17':
+ resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@rolldown/binding-openharmony-arm64@1.0.0-rc.17':
+ resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rolldown/binding-wasm32-wasi@1.0.0-rc.17':
+ resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [wasm32]
+
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17':
+ resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17':
+ resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@rolldown/pluginutils@1.0.0-rc.17':
+ resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==}
+
'@rolldown/pluginutils@1.0.0-rc.3':
resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==}
+ '@rolldown/pluginutils@1.0.0-rc.7':
+ resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==}
+
'@rollup/plugin-typescript@12.3.0':
resolution: {integrity: sha512-7DP0/p7y3t67+NabT9f8oTBFE6gGkto4SA6Np2oudYmZE/m1dt8RB0SjL1msMxFpLo631qjRCcBlAbq1ml/Big==}
engines: {node: '>=14.0.0'}
@@ -870,6 +1050,9 @@ packages:
cpu: [arm64]
os: [win32]
+ '@tybys/wasm-util@0.10.2':
+ resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==}
+
'@types/argparse@1.0.38':
resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==}
@@ -888,6 +1071,9 @@ packages:
'@types/chrome@0.1.40':
resolution: {integrity: sha512-UnfyRAe8ORu9HSuTH0EqyOEUin3JrWW9Nl/gDXezNfTUrfIoxw+WRZgKOxGz0t5BnjbfXBnS2eCYfW2PxH1wcA==}
+ '@types/esrecurse@4.3.1':
+ resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==}
+
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
@@ -903,6 +1089,12 @@ packages:
'@types/har-format@1.2.16':
resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==}
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/node@24.12.2':
+ resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==}
+
'@types/node@25.6.0':
resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==}
@@ -917,12 +1109,84 @@ packages:
'@types/webextension-polyfill@0.12.5':
resolution: {integrity: sha512-uKSAv6LgcVdINmxXMKBuVIcg/2m5JZugoZO8x20g7j2bXJkPIl/lVGQcDlbV+aXAiTyXT2RA5U5mI4IGCDMQeg==}
+ '@typescript-eslint/eslint-plugin@8.59.2':
+ resolution: {integrity: sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.59.2
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/parser@8.59.2':
+ resolution: {integrity: sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/project-service@8.59.2':
+ resolution: {integrity: sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/scope-manager@8.59.2':
+ resolution: {integrity: sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/tsconfig-utils@8.59.2':
+ resolution: {integrity: sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/type-utils@8.59.2':
+ resolution: {integrity: sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/types@8.59.2':
+ resolution: {integrity: sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@8.59.2':
+ resolution: {integrity: sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/utils@8.59.2':
+ resolution: {integrity: sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/visitor-keys@8.59.2':
+ resolution: {integrity: sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
'@vitejs/plugin-react@5.2.0':
resolution: {integrity: sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==}
engines: {node: ^20.19.0 || >=22.12.0}
peerDependencies:
vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
+ '@vitejs/plugin-react@6.0.1':
+ resolution: {integrity: sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ peerDependencies:
+ '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0
+ babel-plugin-react-compiler: ^1.0.0
+ vite: ^8.0.0
+ peerDependenciesMeta:
+ '@rolldown/plugin-babel':
+ optional: true
+ babel-plugin-react-compiler:
+ optional: true
+
'@volar/language-core@2.4.28':
resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==}
@@ -952,6 +1216,11 @@ packages:
'@vue/shared@3.5.33':
resolution: {integrity: sha512-5vR2QIlmaLG77Ygd4pMP6+SGQ5yox9VhtnbDWTy9DzMzdmeLxZ1QqxrywEZ9sa1AVubfIJyaCG3ytyWU81ufcQ==}
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
acorn-walk@8.3.5:
resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==}
engines: {node: '>=0.4.0'}
@@ -977,12 +1246,31 @@ packages:
ajv:
optional: true
+ ajv@6.15.0:
+ resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==}
+
ajv@8.18.0:
resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==}
alien-signals@0.4.9:
resolution: {integrity: sha512-piRGlMgQ65uRiY06mGU7I432AwPwAGf64TK1RXtM1Px4pPfLMTGI9TmsHTfioW1GukZRsNzkVQ/uHjhhd231Ow==}
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.2.2:
+ resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
+ engines: {node: '>=12'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ ansi-styles@6.2.3:
+ resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
+ engines: {node: '>=12'}
+
arg@4.1.3:
resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
@@ -1016,6 +1304,13 @@ packages:
caniuse-lite@1.0.30001791:
resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==}
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
compare-versions@6.1.1:
resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==}
@@ -1031,6 +1326,10 @@ packages:
create-require@1.1.1:
resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
@@ -1046,6 +1345,9 @@ packages:
supports-color:
optional: true
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
detect-libc@2.1.2:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
@@ -1058,9 +1360,18 @@ packages:
resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==}
engines: {node: '>=0.3.1'}
+ eastasianwidth@0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
electron-to-chromium@1.5.349:
resolution: {integrity: sha512-QsWVGyRuY07Aqb234QytTfwd5d9AJlfNIQ5wIOl1L+PZDzI9d9+Fn0FRale/QYlFxt/bUnB0/nLd1jFPGxGK1A==}
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
enhanced-resolve@5.21.0:
resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==}
engines: {node: '>=10.13.0'}
@@ -1082,15 +1393,78 @@ packages:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ eslint-plugin-react-hooks@7.1.1:
+ resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0
+
+ eslint-plugin-react-refresh@0.5.2:
+ resolution: {integrity: sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==}
+ peerDependencies:
+ eslint: ^9 || ^10
+
+ eslint-scope@9.1.2:
+ resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@5.0.1:
+ resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ eslint@10.3.0:
+ resolution: {integrity: sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+
+ espree@11.2.0:
+ resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ esquery@1.7.0:
+ resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
exsolve@1.0.8:
resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==}
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
fast-uri@3.1.0:
resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==}
@@ -1103,6 +1477,25 @@ packages:
picomatch:
optional: true
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ flat-cache@4.0.0:
+ resolution: {integrity: sha512-EryKbCE/wxpxKniQlyas6PY1I9vwtF3uCBweX+N8KYTCn3Y12RTGtQAJ/bd5pl7kxUAc8v/R3Ake/N17OZiFqA==}
+ engines: {node: '>=16'}
+
+ flatted@3.4.2:
+ resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==}
+
+ foreground-child@3.1.0:
+ resolution: {integrity: sha512-lXeSPRCndWPaipZbtI4CkvTZpF6OPsy19dkvf7+5AHeJD+w+iAKPc9Q78xWBmX4SdR+8xrtY9jTXs/YDv8q+Ug==}
+ engines: {node: '>=14'}
+
fs-extra@11.3.4:
resolution: {integrity: sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==}
engines: {node: '>=14.14'}
@@ -1119,10 +1512,23 @@ packages:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'}
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ glob@10.5.0:
+ resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==}
+ deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
+ hasBin: true
+
glob@13.0.6:
resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==}
engines: {node: 18 || 20 || >=22}
+ globals@17.6.0:
+ resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==}
+ engines: {node: '>=18'}
+
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
@@ -1138,14 +1544,51 @@ packages:
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
hasBin: true
+ hermes-estree@0.25.1:
+ resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==}
+
+ hermes-parser@0.25.1:
+ resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==}
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ ignore@7.0.5:
+ resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
+ engines: {node: '>= 4'}
+
import-lazy@4.0.0:
resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
engines: {node: '>=8'}
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
is-core-module@2.16.1:
resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
engines: {node: '>= 0.4'}
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ jackspeak@3.1.2:
+ resolution: {integrity: sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==}
+ engines: {node: '>=14'}
+
jiti@2.6.1:
resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
hasBin: true
@@ -1161,9 +1604,18 @@ packages:
engines: {node: '>=6'}
hasBin: true
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
json-schema-traverse@1.0.0:
resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
json5@2.2.3:
resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
engines: {node: '>=6'}
@@ -1172,9 +1624,16 @@ packages:
jsonfile@6.2.1:
resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==}
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
kolorist@1.8.0:
resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
lightningcss-android-arm64@1.32.0:
resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
engines: {node: '>= 12.0.0'}
@@ -1253,6 +1712,14 @@ packages:
resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==}
engines: {node: '>=14'}
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ lru-cache@10.2.0:
+ resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==}
+ engines: {node: 14 || >=16.14}
+
lru-cache@11.3.5:
resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==}
engines: {node: 20 || >=22}
@@ -1296,15 +1763,49 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
node-releases@2.0.38:
resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==}
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ p-limit@3.0.2:
+ resolution: {integrity: sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==}
+ engines: {node: '>=10'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+
+ package-json-from-dist@1.0.1:
+ resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
path-browserify@1.0.1:
resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ path-scurry@1.11.1:
+ resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+ engines: {node: '>=16 || 14 >=14.18'}
+
path-scurry@2.0.2:
resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==}
engines: {node: 18 || 20 || >=22}
@@ -1329,6 +1830,18 @@ packages:
resolution: {integrity: sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==}
engines: {node: ^10 || ^12 || >=14}
+ postcss@8.5.14:
+ resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
quansync@0.2.11:
resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
@@ -1357,6 +1870,16 @@ packages:
engines: {node: '>= 0.4'}
hasBin: true
+ rimraf@5.0.5:
+ resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ rolldown@1.0.0-rc.17:
+ resolution: {integrity: sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+
rollup@4.60.2:
resolution: {integrity: sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
@@ -1374,6 +1897,18 @@ packages:
engines: {node: '>=10'}
hasBin: true
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
@@ -1389,6 +1924,22 @@ packages:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
engines: {node: '>=0.6.19'}
+ string-width@4.2.0:
+ resolution: {integrity: sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==}
+ engines: {node: '>=8'}
+
+ string-width@5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.2.0:
+ resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==}
+ engines: {node: '>=12'}
+
supports-color@8.1.1:
resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
engines: {node: '>=10'}
@@ -1421,6 +1972,12 @@ packages:
resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==}
engines: {node: '>=12.0.0'}
+ ts-api-utils@2.5.0:
+ resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ typescript: '>=4.8.4'
+
ts-node@10.9.2:
resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
hasBin: true
@@ -1435,10 +1992,24 @@ packages:
'@swc/wasm':
optional: true
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
turbo@2.9.7:
resolution: {integrity: sha512-epxzqVO2s0IxcSWcgb+qKrtco8isfe7g3VtiS6hkYnEK4A9XQDZbrtavQ6MtWR1KoQn+1fUomaQth2rfRHlUlg==}
hasBin: true
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ typescript-eslint@8.59.2:
+ resolution: {integrity: sha512-pJw051uomb3ZeCzGTpRb8RbEqB5Y4WWet8gl/GcTlU35BSx0PVdZ86/bqkQCyKKuraVQEK7r6kBHQXF+fBhkoQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.1.0'
+
typescript@5.9.3:
resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
engines: {node: '>=14.17'}
@@ -1452,6 +2023,9 @@ packages:
ufo@1.6.4:
resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==}
+ undici-types@7.16.0:
+ resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
+
undici-types@7.19.2:
resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==}
@@ -1499,6 +2073,9 @@ packages:
peerDependencies:
browserslist: '>= 4.21.0'
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
use-sync-external-store@1.6.0:
resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
peerDependencies:
@@ -1570,6 +2147,49 @@ packages:
yaml:
optional: true
+ vite@8.0.10:
+ resolution: {integrity: sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==}
+ 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 || ^0.28.0
+ jiti: '>=1.21.0'
+ less: ^4.0.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
+ '@vitejs/devtools':
+ optional: true
+ esbuild:
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
vscode-uri@3.1.0:
resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
@@ -1579,6 +2199,23 @@ packages:
webpack-virtual-modules@0.6.2:
resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+ which@2.0.1:
+ resolution: {integrity: sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+
+ wrap-ansi@8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
+
yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
@@ -1586,6 +2223,15 @@ packages:
resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
engines: {node: '>=6'}
+ zod-validation-error@4.0.2:
+ resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ zod: ^3.25.0 || ^4.0.0
+
+ zod@4.4.3:
+ resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==}
+
snapshots:
'@babel/code-frame@7.29.0':
@@ -1729,6 +2375,22 @@ snapshots:
dependencies:
'@jridgewell/trace-mapping': 0.3.9
+ '@emnapi/core@1.10.0':
+ dependencies:
+ '@emnapi/wasi-threads': 1.2.1
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/runtime@1.10.0':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/wasi-threads@1.2.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
'@esbuild/aix-ppc64@0.27.7':
optional: true
@@ -1807,6 +2469,40 @@ snapshots:
'@esbuild/win32-x64@0.27.7':
optional: true
+ '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0(jiti@2.6.1))':
+ dependencies:
+ eslint: 10.3.0(jiti@2.6.1)
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.2': {}
+
+ '@eslint/config-array@0.23.5':
+ dependencies:
+ '@eslint/object-schema': 3.0.5
+ debug: 4.4.3
+ minimatch: 10.2.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/config-helpers@0.5.5':
+ dependencies:
+ '@eslint/core': 1.2.1
+
+ '@eslint/core@1.2.1':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/js@10.0.1(eslint@10.3.0(jiti@2.6.1))':
+ optionalDependencies:
+ eslint: 10.3.0(jiti@2.6.1)
+
+ '@eslint/object-schema@3.0.5': {}
+
+ '@eslint/plugin-kit@0.7.1':
+ dependencies:
+ '@eslint/core': 1.2.1
+ levn: 0.4.1
+
'@floating-ui/core@1.7.5':
dependencies:
'@floating-ui/utils': 0.2.11
@@ -1824,6 +2520,31 @@ snapshots:
'@floating-ui/utils@0.2.11': {}
+ '@humanfs/core@0.19.2':
+ dependencies:
+ '@humanfs/types': 0.15.0
+
+ '@humanfs/node@0.16.8':
+ dependencies:
+ '@humanfs/core': 0.19.2
+ '@humanfs/types': 0.15.0
+ '@humanwhocodes/retry': 0.4.3
+
+ '@humanfs/types@0.15.0': {}
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.4.3': {}
+
+ '@isaacs/cliui@8.0.2':
+ dependencies:
+ string-width: 5.1.2
+ string-width-cjs: string-width@4.2.0
+ strip-ansi: 7.2.0
+ strip-ansi-cjs: strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: wrap-ansi@7.0.0
+
'@jridgewell/gen-mapping@0.3.13':
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
@@ -1883,15 +2604,81 @@ snapshots:
'@microsoft/tsdoc@0.16.0': {}
+ '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)':
+ dependencies:
+ '@emnapi/core': 1.10.0
+ '@emnapi/runtime': 1.10.0
+ '@tybys/wasm-util': 0.10.2
+ optional: true
+
+ '@oxc-project/types@0.127.0': {}
+
+ '@pkgjs/parseargs@0.11.0':
+ optional: true
+
+ '@rolldown/binding-android-arm64@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-darwin-arm64@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-darwin-x64@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-freebsd-x64@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-linux-x64-musl@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-openharmony-arm64@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-wasm32-wasi@1.0.0-rc.17':
+ dependencies:
+ '@emnapi/core': 1.10.0
+ '@emnapi/runtime': 1.10.0
+ '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)
+ optional: true
+
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/pluginutils@1.0.0-rc.17': {}
+
'@rolldown/pluginutils@1.0.0-rc.3': {}
- '@rollup/plugin-typescript@12.3.0(rollup@4.60.2)(typescript@6.0.3)':
+ '@rolldown/pluginutils@1.0.0-rc.7': {}
+
+ '@rollup/plugin-typescript@12.3.0(rollup@4.60.2)(tslib@2.8.1)(typescript@6.0.3)':
dependencies:
'@rollup/pluginutils': 5.3.0(rollup@4.60.2)
resolve: 1.22.12
typescript: 6.0.3
optionalDependencies:
rollup: 4.60.2
+ tslib: 2.8.1
'@rollup/pluginutils@5.3.0(rollup@4.60.2)':
dependencies:
@@ -2109,6 +2896,11 @@ snapshots:
'@turbo/windows-arm64@2.9.7':
optional: true
+ '@tybys/wasm-util@0.10.2':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
'@types/argparse@1.0.38': {}
'@types/babel__core@7.20.5':
@@ -2137,6 +2929,8 @@ snapshots:
'@types/filesystem': 0.0.36
'@types/har-format': 1.2.16
+ '@types/esrecurse@4.3.1': {}
+
'@types/estree@1.0.8': {}
'@types/filesystem@0.0.36':
@@ -2149,6 +2943,12 @@ snapshots:
'@types/har-format@1.2.16': {}
+ '@types/json-schema@7.0.15': {}
+
+ '@types/node@24.12.2':
+ dependencies:
+ undici-types: 7.16.0
+
'@types/node@25.6.0':
dependencies:
undici-types: 7.19.2
@@ -2163,6 +2963,97 @@ snapshots:
'@types/webextension-polyfill@0.12.5': {}
+ '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.2
+ '@typescript-eslint/parser': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)
+ '@typescript-eslint/scope-manager': 8.59.2
+ '@typescript-eslint/type-utils': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)
+ '@typescript-eslint/visitor-keys': 8.59.2
+ eslint: 10.3.0(jiti@2.6.1)
+ ignore: 7.0.5
+ natural-compare: 1.4.0
+ ts-api-utils: 2.5.0(typescript@6.0.3)
+ typescript: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.59.2
+ '@typescript-eslint/types': 8.59.2
+ '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3)
+ '@typescript-eslint/visitor-keys': 8.59.2
+ debug: 4.4.3
+ eslint: 10.3.0(jiti@2.6.1)
+ typescript: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/project-service@8.59.2(typescript@6.0.3)':
+ dependencies:
+ '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3)
+ '@typescript-eslint/types': 8.59.2
+ debug: 4.4.3
+ typescript: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@8.59.2':
+ dependencies:
+ '@typescript-eslint/types': 8.59.2
+ '@typescript-eslint/visitor-keys': 8.59.2
+
+ '@typescript-eslint/tsconfig-utils@8.59.2(typescript@6.0.3)':
+ dependencies:
+ typescript: 6.0.3
+
+ '@typescript-eslint/type-utils@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)':
+ dependencies:
+ '@typescript-eslint/types': 8.59.2
+ '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)
+ debug: 4.4.3
+ eslint: 10.3.0(jiti@2.6.1)
+ ts-api-utils: 2.5.0(typescript@6.0.3)
+ typescript: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/types@8.59.2': {}
+
+ '@typescript-eslint/typescript-estree@8.59.2(typescript@6.0.3)':
+ dependencies:
+ '@typescript-eslint/project-service': 8.59.2(typescript@6.0.3)
+ '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3)
+ '@typescript-eslint/types': 8.59.2
+ '@typescript-eslint/visitor-keys': 8.59.2
+ debug: 4.4.3
+ minimatch: 10.2.5
+ semver: 7.7.4
+ tinyglobby: 0.2.16
+ ts-api-utils: 2.5.0(typescript@6.0.3)
+ typescript: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.6.1))
+ '@typescript-eslint/scope-manager': 8.59.2
+ '@typescript-eslint/types': 8.59.2
+ '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3)
+ eslint: 10.3.0(jiti@2.6.1)
+ typescript: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/visitor-keys@8.59.2':
+ dependencies:
+ '@typescript-eslint/types': 8.59.2
+ eslint-visitor-keys: 5.0.1
+
'@vitejs/plugin-react@5.2.0(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0))':
dependencies:
'@babel/core': 7.29.0
@@ -2175,6 +3066,16 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@vitejs/plugin-react@6.0.1(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1))':
+ dependencies:
+ '@rolldown/pluginutils': 1.0.0-rc.7
+ vite: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1)
+
+ '@vitejs/plugin-react@6.0.1(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1))':
+ dependencies:
+ '@rolldown/pluginutils': 1.0.0-rc.7
+ vite: 8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)
+
'@volar/language-core@2.4.28':
dependencies:
'@volar/source-map': 2.4.28
@@ -2220,6 +3121,10 @@ snapshots:
'@vue/shared@3.5.33': {}
+ acorn-jsx@5.3.2(acorn@8.16.0):
+ dependencies:
+ acorn: 8.16.0
+
acorn-walk@8.3.5:
dependencies:
acorn: 8.16.0
@@ -2234,6 +3139,13 @@ snapshots:
optionalDependencies:
ajv: 8.18.0
+ ajv@6.15.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
ajv@8.18.0:
dependencies:
fast-deep-equal: 3.1.3
@@ -2243,6 +3155,16 @@ snapshots:
alien-signals@0.4.9: {}
+ ansi-regex@5.0.1: {}
+
+ ansi-regex@6.2.2: {}
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ ansi-styles@6.2.3: {}
+
arg@4.1.3: {}
argparse@1.0.10:
@@ -2273,6 +3195,12 @@ snapshots:
caniuse-lite@1.0.30001791: {}
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
compare-versions@6.1.1: {}
confbox@0.1.8: {}
@@ -2283,6 +3211,12 @@ snapshots:
create-require@1.1.1: {}
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.1
+
csstype@3.2.3: {}
de-indent@1.0.2: {}
@@ -2291,14 +3225,22 @@ snapshots:
dependencies:
ms: 2.1.3
+ deep-is@0.1.4: {}
+
detect-libc@2.1.2: {}
diff@4.0.4: {}
diff@8.0.4: {}
+ eastasianwidth@0.2.0: {}
+
electron-to-chromium@1.5.349: {}
+ emoji-regex@8.0.0: {}
+
+ emoji-regex@9.2.2: {}
+
enhanced-resolve@5.21.0:
dependencies:
graceful-fs: 4.2.11
@@ -2339,18 +3281,127 @@ snapshots:
escalade@3.2.0: {}
+ escape-string-regexp@4.0.0: {}
+
+ eslint-plugin-react-hooks@7.1.1(eslint@10.3.0(jiti@2.6.1)):
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/parser': 7.29.3
+ eslint: 10.3.0(jiti@2.6.1)
+ hermes-parser: 0.25.1
+ zod: 4.4.3
+ zod-validation-error: 4.0.2(zod@4.4.3)
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-react-refresh@0.5.2(eslint@10.3.0(jiti@2.6.1)):
+ dependencies:
+ eslint: 10.3.0(jiti@2.6.1)
+
+ eslint-scope@9.1.2:
+ dependencies:
+ '@types/esrecurse': 4.3.1
+ '@types/estree': 1.0.8
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint-visitor-keys@5.0.1: {}
+
+ eslint@10.3.0(jiti@2.6.1):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.6.1))
+ '@eslint-community/regexpp': 4.12.2
+ '@eslint/config-array': 0.23.5
+ '@eslint/config-helpers': 0.5.5
+ '@eslint/core': 1.2.1
+ '@eslint/plugin-kit': 0.7.1
+ '@humanfs/node': 0.16.8
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.4.3
+ '@types/estree': 1.0.8
+ ajv: 6.15.0
+ cross-spawn: 7.0.6
+ debug: 4.4.3
+ escape-string-regexp: 4.0.0
+ eslint-scope: 9.1.2
+ eslint-visitor-keys: 5.0.1
+ espree: 11.2.0
+ esquery: 1.7.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 8.0.0
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ json-stable-stringify-without-jsonify: 1.0.1
+ minimatch: 10.2.5
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ optionalDependencies:
+ jiti: 2.6.1
+ transitivePeerDependencies:
+ - supports-color
+
+ espree@11.2.0:
+ dependencies:
+ acorn: 8.16.0
+ acorn-jsx: 5.3.2(acorn@8.16.0)
+ eslint-visitor-keys: 5.0.1
+
+ esquery@1.7.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@5.3.0: {}
+
estree-walker@2.0.2: {}
+ esutils@2.0.3: {}
+
exsolve@1.0.8: {}
fast-deep-equal@3.1.3: {}
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-levenshtein@2.0.6: {}
+
fast-uri@3.1.0: {}
fdir@6.5.0(picomatch@4.0.4):
optionalDependencies:
picomatch: 4.0.4
+ file-entry-cache@8.0.0:
+ dependencies:
+ flat-cache: 4.0.0
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ flat-cache@4.0.0:
+ dependencies:
+ flatted: 3.4.2
+ keyv: 4.5.4
+ rimraf: 5.0.5
+
+ flatted@3.4.2: {}
+
+ foreground-child@3.1.0:
+ dependencies:
+ cross-spawn: 7.0.6
+ signal-exit: 4.1.0
+
fs-extra@11.3.4:
dependencies:
graceful-fs: 4.2.11
@@ -2364,12 +3415,27 @@ snapshots:
gensync@1.0.0-beta.2: {}
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob@10.5.0:
+ dependencies:
+ foreground-child: 3.1.0
+ jackspeak: 3.1.2
+ minimatch: 9.0.9
+ minipass: 7.1.3
+ package-json-from-dist: 1.0.1
+ path-scurry: 1.11.1
+
glob@13.0.6:
dependencies:
minimatch: 10.2.5
minipass: 7.1.3
path-scurry: 2.0.2
+ globals@17.6.0: {}
+
graceful-fs@4.2.11: {}
has-flag@4.0.0: {}
@@ -2380,12 +3446,40 @@ snapshots:
he@1.2.0: {}
+ hermes-estree@0.25.1: {}
+
+ hermes-parser@0.25.1:
+ dependencies:
+ hermes-estree: 0.25.1
+
+ ignore@5.3.2: {}
+
+ ignore@7.0.5: {}
+
import-lazy@4.0.0: {}
+ imurmurhash@0.1.4: {}
+
is-core-module@2.16.1:
dependencies:
hasown: 2.0.3
+ is-extglob@2.1.1: {}
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ isexe@2.0.0: {}
+
+ jackspeak@3.1.2:
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
+
jiti@2.6.1: {}
jju@1.4.0: {}
@@ -2394,8 +3488,14 @@ snapshots:
jsesc@3.1.0: {}
+ json-buffer@3.0.1: {}
+
+ json-schema-traverse@0.4.1: {}
+
json-schema-traverse@1.0.0: {}
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
json5@2.2.3: {}
jsonfile@6.2.1:
@@ -2404,8 +3504,17 @@ snapshots:
optionalDependencies:
graceful-fs: 4.2.11
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
+
kolorist@1.8.0: {}
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
lightningcss-android-arm64@1.32.0:
optional: true
@@ -2461,6 +3570,12 @@ snapshots:
pkg-types: 2.3.1
quansync: 0.2.11
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ lru-cache@10.2.0: {}
+
lru-cache@11.3.5: {}
lru-cache@5.1.1:
@@ -2500,12 +3615,44 @@ snapshots:
nanoid@3.3.12: {}
+ natural-compare@1.4.0: {}
+
node-releases@2.0.38: {}
+ optionator@0.9.4:
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+
+ p-limit@3.0.2:
+ dependencies:
+ p-try: 2.2.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.0.2
+
+ p-try@2.2.0: {}
+
+ package-json-from-dist@1.0.1: {}
+
path-browserify@1.0.1: {}
+ path-exists@4.0.0: {}
+
+ path-key@3.1.1: {}
+
path-parse@1.0.7: {}
+ path-scurry@1.11.1:
+ dependencies:
+ lru-cache: 10.2.0
+ minipass: 7.1.3
+
path-scurry@2.0.2:
dependencies:
lru-cache: 11.3.5
@@ -2535,6 +3682,16 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
+ postcss@8.5.14:
+ dependencies:
+ nanoid: 3.3.12
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ prelude-ls@1.2.1: {}
+
+ punycode@2.3.1: {}
+
quansync@0.2.11: {}
react-dom@19.2.5(react@19.2.5):
@@ -2557,6 +3714,31 @@ snapshots:
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
+ rimraf@5.0.5:
+ dependencies:
+ glob: 10.5.0
+
+ rolldown@1.0.0-rc.17:
+ dependencies:
+ '@oxc-project/types': 0.127.0
+ '@rolldown/pluginutils': 1.0.0-rc.17
+ optionalDependencies:
+ '@rolldown/binding-android-arm64': 1.0.0-rc.17
+ '@rolldown/binding-darwin-arm64': 1.0.0-rc.17
+ '@rolldown/binding-darwin-x64': 1.0.0-rc.17
+ '@rolldown/binding-freebsd-x64': 1.0.0-rc.17
+ '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.17
+ '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.17
+ '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.17
+ '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.17
+ '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.17
+ '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.17
+ '@rolldown/binding-linux-x64-musl': 1.0.0-rc.17
+ '@rolldown/binding-openharmony-arm64': 1.0.0-rc.17
+ '@rolldown/binding-wasm32-wasi': 1.0.0-rc.17
+ '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.17
+ '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17
+
rollup@4.60.2:
dependencies:
'@types/estree': 1.0.8
@@ -2594,6 +3776,14 @@ snapshots:
semver@7.7.4: {}
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ signal-exit@4.1.0: {}
+
source-map-js@1.2.1: {}
source-map@0.6.1: {}
@@ -2602,6 +3792,26 @@ snapshots:
string-argv@0.3.2: {}
+ string-width@4.2.0:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ string-width@5.1.2:
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.2.0
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-ansi@7.2.0:
+ dependencies:
+ ansi-regex: 6.2.2
+
supports-color@8.1.1:
dependencies:
has-flag: 4.0.0
@@ -2625,6 +3835,10 @@ snapshots:
fdir: 6.5.0(picomatch@4.0.4)
picomatch: 4.0.4
+ ts-api-utils@2.5.0(typescript@6.0.3):
+ dependencies:
+ typescript: 6.0.3
+
ts-node@10.9.2(@types/node@25.6.0)(typescript@6.0.3):
dependencies:
'@cspotcode/source-map-support': 0.8.1
@@ -2643,6 +3857,9 @@ snapshots:
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
+ tslib@2.8.1:
+ optional: true
+
turbo@2.9.7:
optionalDependencies:
'@turbo/darwin-64': 2.9.7
@@ -2652,12 +3869,29 @@ snapshots:
'@turbo/windows-64': 2.9.7
'@turbo/windows-arm64': 2.9.7
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ typescript-eslint@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3):
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3))(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)
+ '@typescript-eslint/parser': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)
+ '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.59.2(eslint@10.3.0(jiti@2.6.1))(typescript@6.0.3)
+ eslint: 10.3.0(jiti@2.6.1)
+ typescript: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
typescript@5.9.3: {}
typescript@6.0.3: {}
ufo@1.6.4: {}
+ undici-types@7.16.0: {}
+
undici-types@7.19.2: {}
universalify@2.0.1: {}
@@ -2693,6 +3927,10 @@ snapshots:
escalade: 3.2.0
picocolors: 1.1.1
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
use-sync-external-store@1.6.0(react@19.2.5):
dependencies:
react: 19.2.5
@@ -2748,12 +3986,62 @@ snapshots:
jiti: 2.6.1
lightningcss: 1.32.0
+ vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.6.1):
+ dependencies:
+ lightningcss: 1.32.0
+ picomatch: 4.0.4
+ postcss: 8.5.14
+ rolldown: 1.0.0-rc.17
+ tinyglobby: 0.2.16
+ optionalDependencies:
+ '@types/node': 24.12.2
+ esbuild: 0.27.7
+ fsevents: 2.3.3
+ jiti: 2.6.1
+
+ vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1):
+ dependencies:
+ lightningcss: 1.32.0
+ picomatch: 4.0.4
+ postcss: 8.5.14
+ rolldown: 1.0.0-rc.17
+ tinyglobby: 0.2.16
+ optionalDependencies:
+ '@types/node': 25.6.0
+ esbuild: 0.27.7
+ fsevents: 2.3.3
+ jiti: 2.6.1
+
vscode-uri@3.1.0: {}
webextension-polyfill@0.12.0: {}
webpack-virtual-modules@0.6.2: {}
+ which@2.0.1:
+ dependencies:
+ isexe: 2.0.0
+
+ word-wrap@1.2.5: {}
+
+ wrap-ansi@7.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.0
+ strip-ansi: 6.0.1
+
+ wrap-ansi@8.1.0:
+ dependencies:
+ ansi-styles: 6.2.3
+ string-width: 5.1.2
+ strip-ansi: 7.2.0
+
yallist@3.1.1: {}
yn@3.1.1: {}
+
+ zod-validation-error@4.0.2(zod@4.4.3):
+ dependencies:
+ zod: 4.4.3
+
+ zod@4.4.3: {}
diff --git a/templates/vite-react-app/.npmrc b/templates/vite-react-app/.npmrc
deleted file mode 100644
index 8b02f75..0000000
--- a/templates/vite-react-app/.npmrc
+++ /dev/null
@@ -1 +0,0 @@
-registry = https://registry.npmmirror.com/
\ No newline at end of file
diff --git a/templates/vite-react-app/.vscode/settings.json b/templates/vite-react-app/.vscode/settings.json
deleted file mode 100644
index 772343c..0000000
--- a/templates/vite-react-app/.vscode/settings.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "json.schemas": [
- {
- "fileMatch": ["/tsconfig.build.json", "/tsconfig.base.json"],
- "schema": {}
- }
- ]
-}
diff --git a/templates/vite-react-app/index.html b/templates/vite-react-app/index.html
deleted file mode 100644
index cffe571..0000000
--- a/templates/vite-react-app/index.html
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
- DefGov UI Web
-
-
-
-
-
-
diff --git a/templates/vite-react-app/package.json b/templates/vite-react-app/package.json
deleted file mode 100644
index 73c668c..0000000
--- a/templates/vite-react-app/package.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "name": "vite-react-app",
- "version": "0.0.0",
- "private": true,
- "type": "module",
- "sideEffects": [
- "*.css"
- ],
- "module": "./dist/index.es.js",
- "main": "./dist/index.cjs.js",
- "types": "./dist/index.d.ts",
- "style": "./dist/index.css",
- "exports": {
- ".": {
- "import": "./dist/index.es.js",
- "require": "./dist/index.cjs.js",
- "types": "./dist/index.d.ts"
- },
- "./index.css": "./dist/index.css"
- },
- "files": [
- "dist"
- ],
- "scripts": {
- "gen-css": "ts-node scripts/gen-index-css.ts",
- "gen-ts": "ts-node scripts/gen-index-ts.ts",
- "gen-index": "pnpm run gen-css && pnpm run gen-ts",
- "dev": "pnpm run gen-index && vite build --watch",
- "build": "pnpm run gen-index && tsc -p tsconfig.build.json && vite build"
- },
- "devDependencies": {
- "@rollup/plugin-typescript": "^12.3.0",
- "@types/node": "^25.6.0",
- "@types/react": "^19.2.14",
- "@types/react-dom": "^19.2.3",
- "@vitejs/plugin-react": "~5.2.0",
- "glob": "^13.0.6",
- "typescript": "~6.0.3",
- "vite": "~7.3.2",
- "vite-plugin-dts": "^4.5.4",
- "ts-node": "^10.9.2"
- },
- "dependencies": {
- "react": "^19.2.5",
- "react-dom": "^19.2.5"
- }
-}
diff --git a/templates/vite-react-app/scripts/gen-index-css.ts b/templates/vite-react-app/scripts/gen-index-css.ts
deleted file mode 100644
index fdddef4..0000000
--- a/templates/vite-react-app/scripts/gen-index-css.ts
+++ /dev/null
@@ -1,121 +0,0 @@
-import fs from "fs";
-import path from "path";
-import { globSync } from "glob";
-
-interface Config {
- targetDirs: string[];
- includeExtensions: string[];
- excludeKeywords: {
- dirs: string[];
- fileSuffixes: string[];
- filePatterns: RegExp[];
- };
-}
-
-const CONFIG: Config = {
- targetDirs: ["src"],
- includeExtensions: [".ts", ".tsx", ".vue"],
- excludeKeywords: {
- dirs: ["__tests__", "tests", "story", "stories", "types"],
- fileSuffixes: [".d.ts"],
- filePatterns: [
- /^index\.(ts|tsx|js|jsx)$/,
- /\.(test|spec)\./,
- /\.(story|stories)\./,
- ],
- },
-};
-
-const normalizePath = (p: string) => p.replace(/\\/g, "/");
-
-const isInExcludeDir = (filePath: string) => {
- const normalized = normalizePath(filePath);
- return CONFIG.excludeKeywords.dirs.some((dir) =>
- normalized.includes(`/${dir}/`),
- );
-};
-
-const isExcludeSuffix = (filePath: string) =>
- CONFIG.excludeKeywords.fileSuffixes.some((suffix) =>
- filePath.endsWith(suffix),
- );
-
-const isMatchExcludePattern = (fileName: string) =>
- CONFIG.excludeKeywords.filePatterns.some((pattern) => pattern.test(fileName));
-
-function isValidFile(filePath: string): boolean {
- const fileName = filePath.split(/[\\/]/).pop()!;
-
- if (isInExcludeDir(filePath)) return false;
- if (isExcludeSuffix(filePath)) return false;
- if (isMatchExcludePattern(fileName)) return false;
-
- const ext = path.extname(filePath);
- return CONFIG.includeExtensions.includes(ext);
-}
-
-function generateIndexFile(dirPath: string) {
- const searchPattern = path.resolve(dirPath, "**", "*.*");
-
- const allFiles = globSync(searchPattern, {
- nodir: true,
- absolute: true,
- windowsPathsNoEscape: true,
- dot: false,
- follow: true,
- });
-
- const validFiles = allFiles.filter(isValidFile);
- if (validFiles.length === 0) {
- console.log("⚠️ 未找到符合条件的文件,跳过生成 index.ts");
- return;
- }
-
- validFiles.sort();
-
- const exportStatements = validFiles.map((file) => {
- const relPath = path.relative(dirPath, file);
- const importPath = `./${relPath
- .replace(/\.[^.]+$/, "")
- .replace(/\\/g, "/")}`;
- return `export * from '${importPath}';`;
- });
-
- const indexContent = `
-import './index.css';
-
-${exportStatements.join("\n")}
-`.trim();
-
- const indexFilePath = path.resolve(dirPath, "index.ts");
-
- // ✅ 内容比对,避免重复写入
- if (fs.existsSync(indexFilePath)) {
- const old = fs.readFileSync(indexFilePath, "utf8");
- if (old === indexContent) {
- console.log("✅ index.ts 内容无变化,无需重新生成");
- return;
- }
- }
-
- fs.writeFileSync(indexFilePath, indexContent, "utf8");
- console.log(`✅ 成功生成 index.ts: ${indexFilePath}`);
-}
-
-// 脚本入口
-const [targetDir] = CONFIG.targetDirs;
-if (!targetDir) {
- console.error("❌ CONFIG.targetDirs 不能为空");
- process.exit(1);
-}
-
-const absTargetDir = path.resolve(process.cwd(), targetDir);
-
-try {
- console.log(`🚀 开始扫描目录: ${absTargetDir}`);
- generateIndexFile(absTargetDir);
-} catch (err) {
- const msg = err instanceof Error ? err.message : String(err);
- console.error(`❌ [gen-index-ts] 执行失败: ${msg}`);
- process.exit(1);
-}
diff --git a/templates/vite-react-app/scripts/gen-index-ts.ts b/templates/vite-react-app/scripts/gen-index-ts.ts
deleted file mode 100644
index fdddef4..0000000
--- a/templates/vite-react-app/scripts/gen-index-ts.ts
+++ /dev/null
@@ -1,121 +0,0 @@
-import fs from "fs";
-import path from "path";
-import { globSync } from "glob";
-
-interface Config {
- targetDirs: string[];
- includeExtensions: string[];
- excludeKeywords: {
- dirs: string[];
- fileSuffixes: string[];
- filePatterns: RegExp[];
- };
-}
-
-const CONFIG: Config = {
- targetDirs: ["src"],
- includeExtensions: [".ts", ".tsx", ".vue"],
- excludeKeywords: {
- dirs: ["__tests__", "tests", "story", "stories", "types"],
- fileSuffixes: [".d.ts"],
- filePatterns: [
- /^index\.(ts|tsx|js|jsx)$/,
- /\.(test|spec)\./,
- /\.(story|stories)\./,
- ],
- },
-};
-
-const normalizePath = (p: string) => p.replace(/\\/g, "/");
-
-const isInExcludeDir = (filePath: string) => {
- const normalized = normalizePath(filePath);
- return CONFIG.excludeKeywords.dirs.some((dir) =>
- normalized.includes(`/${dir}/`),
- );
-};
-
-const isExcludeSuffix = (filePath: string) =>
- CONFIG.excludeKeywords.fileSuffixes.some((suffix) =>
- filePath.endsWith(suffix),
- );
-
-const isMatchExcludePattern = (fileName: string) =>
- CONFIG.excludeKeywords.filePatterns.some((pattern) => pattern.test(fileName));
-
-function isValidFile(filePath: string): boolean {
- const fileName = filePath.split(/[\\/]/).pop()!;
-
- if (isInExcludeDir(filePath)) return false;
- if (isExcludeSuffix(filePath)) return false;
- if (isMatchExcludePattern(fileName)) return false;
-
- const ext = path.extname(filePath);
- return CONFIG.includeExtensions.includes(ext);
-}
-
-function generateIndexFile(dirPath: string) {
- const searchPattern = path.resolve(dirPath, "**", "*.*");
-
- const allFiles = globSync(searchPattern, {
- nodir: true,
- absolute: true,
- windowsPathsNoEscape: true,
- dot: false,
- follow: true,
- });
-
- const validFiles = allFiles.filter(isValidFile);
- if (validFiles.length === 0) {
- console.log("⚠️ 未找到符合条件的文件,跳过生成 index.ts");
- return;
- }
-
- validFiles.sort();
-
- const exportStatements = validFiles.map((file) => {
- const relPath = path.relative(dirPath, file);
- const importPath = `./${relPath
- .replace(/\.[^.]+$/, "")
- .replace(/\\/g, "/")}`;
- return `export * from '${importPath}';`;
- });
-
- const indexContent = `
-import './index.css';
-
-${exportStatements.join("\n")}
-`.trim();
-
- const indexFilePath = path.resolve(dirPath, "index.ts");
-
- // ✅ 内容比对,避免重复写入
- if (fs.existsSync(indexFilePath)) {
- const old = fs.readFileSync(indexFilePath, "utf8");
- if (old === indexContent) {
- console.log("✅ index.ts 内容无变化,无需重新生成");
- return;
- }
- }
-
- fs.writeFileSync(indexFilePath, indexContent, "utf8");
- console.log(`✅ 成功生成 index.ts: ${indexFilePath}`);
-}
-
-// 脚本入口
-const [targetDir] = CONFIG.targetDirs;
-if (!targetDir) {
- console.error("❌ CONFIG.targetDirs 不能为空");
- process.exit(1);
-}
-
-const absTargetDir = path.resolve(process.cwd(), targetDir);
-
-try {
- console.log(`🚀 开始扫描目录: ${absTargetDir}`);
- generateIndexFile(absTargetDir);
-} catch (err) {
- const msg = err instanceof Error ? err.message : String(err);
- console.error(`❌ [gen-index-ts] 执行失败: ${msg}`);
- process.exit(1);
-}
diff --git a/templates/vite-react-app/src/App.tsx b/templates/vite-react-app/src/App.tsx
deleted file mode 100644
index 97e63ad..0000000
--- a/templates/vite-react-app/src/App.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function App() {
- return <>>;
-}
diff --git a/templates/vite-react-app/src/main.tsx b/templates/vite-react-app/src/main.tsx
deleted file mode 100644
index 4930e42..0000000
--- a/templates/vite-react-app/src/main.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { createRoot } from "react-dom/client";
-import App from "./App";
-
-const container = document.getElementById("root")!;
-const root = createRoot(container);
-
-root.render();
diff --git a/templates/vite-react-app/src/types/css.d.ts b/templates/vite-react-app/src/types/css.d.ts
deleted file mode 100644
index d535de2..0000000
--- a/templates/vite-react-app/src/types/css.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-declare module '*.css' {
- const content: { [className: string]: string };
- export default content;
-}
\ No newline at end of file
diff --git a/templates/vite-react-app/src/types/env.d.ts b/templates/vite-react-app/src/types/env.d.ts
deleted file mode 100644
index 7ba6254..0000000
--- a/templates/vite-react-app/src/types/env.d.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-///
-
-declare module "*.svg" {
- import * as React from "react";
- export const ReactComponent: React.FC>;
- const src: string;
- export default src;
-}
-
-declare module "*.png" {
- const src: string;
- export default src;
-}
-
-declare module "*.jpg" {
- const src: string;
- export default src;
-}
-
-declare module "*.jpeg" {
- const src: string;
- export default src;
-}
-
-declare module "*.gif" {
- const src: string;
- export default src;
-}
-
-declare module "*.webp" {
- const src: string;
- export default src;
-}
-
-interface ImportMetaEnv {
- readonly MODE: "development" | "production" | "test";
- readonly BASE_URL: string;
- readonly PROD: boolean;
- readonly DEV: boolean;
- readonly SSR: boolean;
-
- // ===== 业务环境变量 =====
- readonly VITE_API_BASE: string;
- readonly VITE_UPLOAD_URL?: string;
- readonly VITE_ENABLE_MOCK?: "true" | "false";
- readonly VITE_SENTRY_DSN?: string;
-}
-
-interface ImportMeta {
- readonly env: ImportMetaEnv;
-}
diff --git a/templates/vite-react-app/tsconfig.base.json b/templates/vite-react-app/tsconfig.base.json
deleted file mode 100644
index a7f1b39..0000000
--- a/templates/vite-react-app/tsconfig.base.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "compilerOptions": {
- "module": "es2022",
- "moduleResolution": "bundler",
- "lib": ["ES2025", "DOM", "DOM.Iterable"],
- "strict": true,
- "esModuleInterop": true,
- "skipLibCheck": true,
- "isolatedModules": true,
- "verbatimModuleSyntax": true
- }
-}
diff --git a/templates/vite-react-app/tsconfig.json b/templates/vite-react-app/tsconfig.json
deleted file mode 100644
index 1f65a23..0000000
--- a/templates/vite-react-app/tsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "extends": "./tsconfig.base.json",
- "compilerOptions": {
- "jsx": "react-jsx",
- "noEmit": true
- },
- "include": ["."]
-}
diff --git a/templates/vite-react-app/vite.config.ts b/templates/vite-react-app/vite.config.ts
deleted file mode 100644
index 969388a..0000000
--- a/templates/vite-react-app/vite.config.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { defineConfig } from "vite";
-import react from "@vitejs/plugin-react";
-import dts from "vite-plugin-dts";
-import typescript from "@rollup/plugin-typescript";
-
-export default defineConfig({
- plugins: [
- react(),
- dts({
- insertTypesEntry: true,
- }),
- ],
-
- esbuild: false,
-
- build: {
- rollupOptions: {
- plugins: [typescript({ tsconfig: "./tsconfig.build.json" })],
- external: ["react", "react-dom", "react/jsx-runtime"],
- output: {
- globals: {
- react: "React",
- "react-dom": "ReactDOM",
- },
- },
- },
-
- sourcemap: true,
- cssCodeSplit: true,
- },
-});
diff --git a/templates/vite-react-lib/.npmrc b/templates/vite-react-lib/.npmrc
deleted file mode 100644
index 8b02f75..0000000
--- a/templates/vite-react-lib/.npmrc
+++ /dev/null
@@ -1 +0,0 @@
-registry = https://registry.npmmirror.com/
\ No newline at end of file
diff --git a/templates/vite-react-lib/.vscode/settings.json b/templates/vite-react-lib/.vscode/settings.json
deleted file mode 100644
index 772343c..0000000
--- a/templates/vite-react-lib/.vscode/settings.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "json.schemas": [
- {
- "fileMatch": ["/tsconfig.build.json", "/tsconfig.base.json"],
- "schema": {}
- }
- ]
-}
diff --git a/templates/vite-react-lib/package.json b/templates/vite-react-lib/package.json
index c55b94d..5c912a2 100644
--- a/templates/vite-react-lib/package.json
+++ b/templates/vite-react-lib/package.json
@@ -1,5 +1,5 @@
{
- "name": "vite-react-lib",
+ "name": "@defgov/vite-react-lib",
"version": "0.0.0",
"private": true,
"type": "module",
@@ -22,23 +22,18 @@
"dist"
],
"scripts": {
- "gen-css": "ts-node scripts/gen-index-css.ts",
- "gen-ts": "ts-node scripts/gen-index-ts.ts",
- "gen-index": "pnpm run gen-css && pnpm run gen-ts",
- "dev": "pnpm run gen-index && vite build --watch",
- "build": "pnpm run gen-index && tsc -p tsconfig.build.json && vite build"
+ "gen-index": "ts-node scripts/gen-index.ts",
+ "gen-dts": "tsc -p tsconfig.build.json",
+ "dev": "pnpm gen-index && vite build --watch",
+ "build": "pnpm gen-index && vite build && pnpm gen-dts"
},
"devDependencies": {
- "@rollup/plugin-typescript": "^12.3.0",
"@types/node": "^25.6.0",
- "@types/react": "^19.2.14",
- "@types/react-dom": "^19.2.3",
- "@vitejs/plugin-react": "~5.2.0",
+ "@vitejs/plugin-react": "^6.0.1",
"glob": "^13.0.6",
- "typescript": "~6.0.3",
- "vite": "~7.3.2",
- "vite-plugin-dts": "^4.5.4",
- "ts-node": "^10.9.2"
+ "ts-node": "^10.9.2",
+ "typescript": "^6.0.3",
+ "vite": "^8.0.10"
},
"peerDependencies": {
"react": "^19",
diff --git a/templates/vite-react-lib/scripts/gen-index-css.ts b/templates/vite-react-lib/scripts/gen-index-css.ts
deleted file mode 100644
index fdddef4..0000000
--- a/templates/vite-react-lib/scripts/gen-index-css.ts
+++ /dev/null
@@ -1,121 +0,0 @@
-import fs from "fs";
-import path from "path";
-import { globSync } from "glob";
-
-interface Config {
- targetDirs: string[];
- includeExtensions: string[];
- excludeKeywords: {
- dirs: string[];
- fileSuffixes: string[];
- filePatterns: RegExp[];
- };
-}
-
-const CONFIG: Config = {
- targetDirs: ["src"],
- includeExtensions: [".ts", ".tsx", ".vue"],
- excludeKeywords: {
- dirs: ["__tests__", "tests", "story", "stories", "types"],
- fileSuffixes: [".d.ts"],
- filePatterns: [
- /^index\.(ts|tsx|js|jsx)$/,
- /\.(test|spec)\./,
- /\.(story|stories)\./,
- ],
- },
-};
-
-const normalizePath = (p: string) => p.replace(/\\/g, "/");
-
-const isInExcludeDir = (filePath: string) => {
- const normalized = normalizePath(filePath);
- return CONFIG.excludeKeywords.dirs.some((dir) =>
- normalized.includes(`/${dir}/`),
- );
-};
-
-const isExcludeSuffix = (filePath: string) =>
- CONFIG.excludeKeywords.fileSuffixes.some((suffix) =>
- filePath.endsWith(suffix),
- );
-
-const isMatchExcludePattern = (fileName: string) =>
- CONFIG.excludeKeywords.filePatterns.some((pattern) => pattern.test(fileName));
-
-function isValidFile(filePath: string): boolean {
- const fileName = filePath.split(/[\\/]/).pop()!;
-
- if (isInExcludeDir(filePath)) return false;
- if (isExcludeSuffix(filePath)) return false;
- if (isMatchExcludePattern(fileName)) return false;
-
- const ext = path.extname(filePath);
- return CONFIG.includeExtensions.includes(ext);
-}
-
-function generateIndexFile(dirPath: string) {
- const searchPattern = path.resolve(dirPath, "**", "*.*");
-
- const allFiles = globSync(searchPattern, {
- nodir: true,
- absolute: true,
- windowsPathsNoEscape: true,
- dot: false,
- follow: true,
- });
-
- const validFiles = allFiles.filter(isValidFile);
- if (validFiles.length === 0) {
- console.log("⚠️ 未找到符合条件的文件,跳过生成 index.ts");
- return;
- }
-
- validFiles.sort();
-
- const exportStatements = validFiles.map((file) => {
- const relPath = path.relative(dirPath, file);
- const importPath = `./${relPath
- .replace(/\.[^.]+$/, "")
- .replace(/\\/g, "/")}`;
- return `export * from '${importPath}';`;
- });
-
- const indexContent = `
-import './index.css';
-
-${exportStatements.join("\n")}
-`.trim();
-
- const indexFilePath = path.resolve(dirPath, "index.ts");
-
- // ✅ 内容比对,避免重复写入
- if (fs.existsSync(indexFilePath)) {
- const old = fs.readFileSync(indexFilePath, "utf8");
- if (old === indexContent) {
- console.log("✅ index.ts 内容无变化,无需重新生成");
- return;
- }
- }
-
- fs.writeFileSync(indexFilePath, indexContent, "utf8");
- console.log(`✅ 成功生成 index.ts: ${indexFilePath}`);
-}
-
-// 脚本入口
-const [targetDir] = CONFIG.targetDirs;
-if (!targetDir) {
- console.error("❌ CONFIG.targetDirs 不能为空");
- process.exit(1);
-}
-
-const absTargetDir = path.resolve(process.cwd(), targetDir);
-
-try {
- console.log(`🚀 开始扫描目录: ${absTargetDir}`);
- generateIndexFile(absTargetDir);
-} catch (err) {
- const msg = err instanceof Error ? err.message : String(err);
- console.error(`❌ [gen-index-ts] 执行失败: ${msg}`);
- process.exit(1);
-}
diff --git a/templates/vite-react-lib/scripts/gen-index-ts.ts b/templates/vite-react-lib/scripts/gen-index-ts.ts
deleted file mode 100644
index fdddef4..0000000
--- a/templates/vite-react-lib/scripts/gen-index-ts.ts
+++ /dev/null
@@ -1,121 +0,0 @@
-import fs from "fs";
-import path from "path";
-import { globSync } from "glob";
-
-interface Config {
- targetDirs: string[];
- includeExtensions: string[];
- excludeKeywords: {
- dirs: string[];
- fileSuffixes: string[];
- filePatterns: RegExp[];
- };
-}
-
-const CONFIG: Config = {
- targetDirs: ["src"],
- includeExtensions: [".ts", ".tsx", ".vue"],
- excludeKeywords: {
- dirs: ["__tests__", "tests", "story", "stories", "types"],
- fileSuffixes: [".d.ts"],
- filePatterns: [
- /^index\.(ts|tsx|js|jsx)$/,
- /\.(test|spec)\./,
- /\.(story|stories)\./,
- ],
- },
-};
-
-const normalizePath = (p: string) => p.replace(/\\/g, "/");
-
-const isInExcludeDir = (filePath: string) => {
- const normalized = normalizePath(filePath);
- return CONFIG.excludeKeywords.dirs.some((dir) =>
- normalized.includes(`/${dir}/`),
- );
-};
-
-const isExcludeSuffix = (filePath: string) =>
- CONFIG.excludeKeywords.fileSuffixes.some((suffix) =>
- filePath.endsWith(suffix),
- );
-
-const isMatchExcludePattern = (fileName: string) =>
- CONFIG.excludeKeywords.filePatterns.some((pattern) => pattern.test(fileName));
-
-function isValidFile(filePath: string): boolean {
- const fileName = filePath.split(/[\\/]/).pop()!;
-
- if (isInExcludeDir(filePath)) return false;
- if (isExcludeSuffix(filePath)) return false;
- if (isMatchExcludePattern(fileName)) return false;
-
- const ext = path.extname(filePath);
- return CONFIG.includeExtensions.includes(ext);
-}
-
-function generateIndexFile(dirPath: string) {
- const searchPattern = path.resolve(dirPath, "**", "*.*");
-
- const allFiles = globSync(searchPattern, {
- nodir: true,
- absolute: true,
- windowsPathsNoEscape: true,
- dot: false,
- follow: true,
- });
-
- const validFiles = allFiles.filter(isValidFile);
- if (validFiles.length === 0) {
- console.log("⚠️ 未找到符合条件的文件,跳过生成 index.ts");
- return;
- }
-
- validFiles.sort();
-
- const exportStatements = validFiles.map((file) => {
- const relPath = path.relative(dirPath, file);
- const importPath = `./${relPath
- .replace(/\.[^.]+$/, "")
- .replace(/\\/g, "/")}`;
- return `export * from '${importPath}';`;
- });
-
- const indexContent = `
-import './index.css';
-
-${exportStatements.join("\n")}
-`.trim();
-
- const indexFilePath = path.resolve(dirPath, "index.ts");
-
- // ✅ 内容比对,避免重复写入
- if (fs.existsSync(indexFilePath)) {
- const old = fs.readFileSync(indexFilePath, "utf8");
- if (old === indexContent) {
- console.log("✅ index.ts 内容无变化,无需重新生成");
- return;
- }
- }
-
- fs.writeFileSync(indexFilePath, indexContent, "utf8");
- console.log(`✅ 成功生成 index.ts: ${indexFilePath}`);
-}
-
-// 脚本入口
-const [targetDir] = CONFIG.targetDirs;
-if (!targetDir) {
- console.error("❌ CONFIG.targetDirs 不能为空");
- process.exit(1);
-}
-
-const absTargetDir = path.resolve(process.cwd(), targetDir);
-
-try {
- console.log(`🚀 开始扫描目录: ${absTargetDir}`);
- generateIndexFile(absTargetDir);
-} catch (err) {
- const msg = err instanceof Error ? err.message : String(err);
- console.error(`❌ [gen-index-ts] 执行失败: ${msg}`);
- process.exit(1);
-}
diff --git a/templates/vite-react-lib/scripts/gen-index.ts b/templates/vite-react-lib/scripts/gen-index.ts
new file mode 100644
index 0000000..e03849c
--- /dev/null
+++ b/templates/vite-react-lib/scripts/gen-index.ts
@@ -0,0 +1,147 @@
+import fs from "fs";
+import path from "path";
+import { globSync } from "glob";
+
+interface Config {
+ outputDir: string;
+ outputFilenameWithExt: string;
+ scanDirs: string[];
+ importPrefix: string;
+ predefineStatements: string[];
+ includeExtensions: string[];
+ excludeDirs: string[];
+ excludeFileExtensions: string[];
+ excludePatterns: RegExp[];
+}
+
+const cssConfig: Config = {
+ outputDir: "src",
+ outputFilenameWithExt: "index.css",
+ scanDirs: ["src"],
+ importPrefix: "@import",
+ predefineStatements: [],
+ includeExtensions: [".css"],
+ excludeDirs: ["__tests__", "tests", "story", "stories", "types"],
+ excludeFileExtensions: [],
+ excludePatterns: [/^index\.(css)$/, /\.(test|spec)\./, /\.(story|stories)\./],
+};
+
+const tsConfig: Config = {
+ outputDir: "src",
+ outputFilenameWithExt: "index.ts",
+ scanDirs: ["src"],
+ importPrefix: "export * from",
+ predefineStatements: ["import './index.css'"],
+ includeExtensions: [".ts", "tsx", "js", "jsx"],
+ excludeDirs: ["__tests__", "tests", "story", "stories", "types"],
+ excludeFileExtensions: [".d.ts"],
+ excludePatterns: [
+ /^index\.(ts|tsx|js|jsx)$/,
+ /\.(test|spec)\./,
+ /\.(story|stories)\./,
+ ],
+};
+
+const normalizePath = (p: string) => p.replace(/\\/g, "/");
+
+const isExcludeDir = (filePath: string, excludeDirs: string[]) => {
+ const normalized = normalizePath(filePath);
+ return excludeDirs.some((dir) => normalized.includes(`/${dir}/`));
+};
+
+const isExcludeFileExtensions = (
+ filePath: string,
+ excludeFileExtensions: string[],
+) => excludeFileExtensions.some((ext) => filePath.endsWith(ext));
+
+const isExcludePattern = (fileName: string, excludePatterns: RegExp[]) =>
+ excludePatterns.some((pattern) => pattern.test(fileName));
+
+// ----------------------------------------
+function isValidFile(filePath: string, config: Config): boolean {
+ const fileName = filePath.split(/[\\/]/).pop()!;
+
+ if (isExcludeDir(filePath, config.excludeDirs)) return false;
+ if (isExcludeFileExtensions(filePath, config.excludeFileExtensions))
+ return false;
+ if (isExcludePattern(fileName, config.excludePatterns)) return false;
+
+ const ext = path.extname(filePath);
+ return config.includeExtensions.includes(ext);
+}
+// -----------------------------------------
+function generateIndexFile(config: Config) {
+ const currentPath = process.cwd();
+ const outputPath = path.resolve(currentPath, config.outputDir);
+ let exportStatements: string[] = [];
+
+ // ------ scanDirs forEach start ------------------------
+ config.scanDirs.forEach((dir) => {
+ const scanPattern = path.resolve(currentPath, dir, "**", "*.*");
+
+ const allFilePath = globSync(scanPattern, {
+ absolute: true,
+ windowsPathsNoEscape: true,
+ dot: false,
+ follow: true,
+ });
+
+ const validFiles = allFilePath.filter((filePath) => {
+ return isValidFile(filePath, config);
+ });
+
+ if (validFiles.length === 0) {
+ console.log(
+ `⚠️ 未找到符合条件的文件,跳过生成 ${config.outputFilenameWithExt}`,
+ );
+ return;
+ }
+
+ validFiles.sort();
+
+ validFiles.forEach((file) => {
+ const relativePath = path.relative(outputPath, file);
+ const importPath = `./${relativePath.replace(/\\/g, "/")}`;
+ exportStatements.push(`${config.importPrefix} '${importPath}';`);
+ });
+ });
+
+ // --------- scanDirs forEach end ----------------
+
+ const indexFileContent = `
+${config.predefineStatements.join("\n")}
+${exportStatements.join("\n")}
+`.trim();
+
+ const indexFilePath = path.resolve(
+ currentPath,
+ config.outputDir,
+ config.outputFilenameWithExt,
+ );
+
+ // ✅ 内容比对,避免重复写入
+ if (fs.existsSync(indexFilePath)) {
+ const old = fs.readFileSync(indexFilePath, "utf8");
+ if (old === indexFileContent) {
+ console.log(
+ `✅ ${config.outputFilenameWithExt} 内容无变化,无需重新生成`,
+ );
+ return;
+ }
+ }
+
+ fs.writeFileSync(indexFilePath, indexFileContent, "utf8");
+ console.log(`✅ 成功生成 ${config.outputFilenameWithExt}: ${indexFilePath}`);
+}
+
+// --------------------------------------------------
+
+try {
+ console.log(`🚀 [gen-index] 开始扫描`);
+ generateIndexFile(cssConfig);
+ generateIndexFile(tsConfig);
+} catch (err) {
+ const msg = err instanceof Error ? err.message : String(err);
+ console.error(`❌ [gen-index] 执行失败: ${msg}`);
+ process.exit(1);
+}
diff --git a/templates/vite-react-lib/src/types/css.d.ts b/templates/vite-react-lib/src/types/css.d.ts
deleted file mode 100644
index d535de2..0000000
--- a/templates/vite-react-lib/src/types/css.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-declare module '*.css' {
- const content: { [className: string]: string };
- export default content;
-}
\ No newline at end of file
diff --git a/templates/vite-react-lib/src/types/env.d.ts b/templates/vite-react-lib/src/types/env.d.ts
index 7ba6254..31058d4 100644
--- a/templates/vite-react-lib/src/types/env.d.ts
+++ b/templates/vite-react-lib/src/types/env.d.ts
@@ -1,51 +1,4 @@
-///
-
-declare module "*.svg" {
- import * as React from "react";
- export const ReactComponent: React.FC>;
- const src: string;
- export default src;
-}
-
-declare module "*.png" {
- const src: string;
- export default src;
-}
-
-declare module "*.jpg" {
- const src: string;
- export default src;
-}
-
-declare module "*.jpeg" {
- const src: string;
- export default src;
-}
-
-declare module "*.gif" {
- const src: string;
- export default src;
-}
-
-declare module "*.webp" {
- const src: string;
- export default src;
-}
-
-interface ImportMetaEnv {
- readonly MODE: "development" | "production" | "test";
- readonly BASE_URL: string;
- readonly PROD: boolean;
- readonly DEV: boolean;
- readonly SSR: boolean;
-
- // ===== 业务环境变量 =====
- readonly VITE_API_BASE: string;
- readonly VITE_UPLOAD_URL?: string;
- readonly VITE_ENABLE_MOCK?: "true" | "false";
- readonly VITE_SENTRY_DSN?: string;
-}
-
-interface ImportMeta {
- readonly env: ImportMetaEnv;
+declare module "*.css" {
+ const content: string;
+ export default content;
}
diff --git a/templates/vite-react-lib/tsconfig.base.json b/templates/vite-react-lib/tsconfig.base.json
deleted file mode 100644
index a7f1b39..0000000
--- a/templates/vite-react-lib/tsconfig.base.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "compilerOptions": {
- "module": "es2022",
- "moduleResolution": "bundler",
- "lib": ["ES2025", "DOM", "DOM.Iterable"],
- "strict": true,
- "esModuleInterop": true,
- "skipLibCheck": true,
- "isolatedModules": true,
- "verbatimModuleSyntax": true
- }
-}
diff --git a/templates/vite-react-lib/tsconfig.build.json b/templates/vite-react-lib/tsconfig.build.json
index 60d26ca..a5bcc27 100644
--- a/templates/vite-react-lib/tsconfig.build.json
+++ b/templates/vite-react-lib/tsconfig.build.json
@@ -1,28 +1,24 @@
{
- "extends": "./tsconfig.base.json",
+ "extends": "./tsconfig.json",
"compilerOptions": {
- "outDir": "./dist",
+ "noEmit": false,
+ "emitDeclarationOnly": true,
+ "declaration": true,
"rootDir": "./src",
- "jsx": "react-jsx",
- "declaration": true
+ "outDir": "./dist",
+ "declarationDir": "./dist"
},
"include": ["src"],
"exclude": [
"node_modules",
"dist",
-
- // ---------- build / cache ----------
".turbo/**/*",
".cache/**/*",
".vite/**/*",
-
- // ---------- 配置文件 ----------
"vite.config.ts",
"*.config.ts",
"*.config.js",
"tsconfig.*.json",
-
- // ---------- 测试相关 ----------
"__tests__/**/*",
"test/**/*",
"tests/**/*",
@@ -30,22 +26,14 @@
"**/*.test.tsx",
"**/*.spec.ts",
"**/*.spec.tsx",
-
- // ---------- Storybook ----------
".storybook/**/*",
"stories/**/*",
-
- // ---------- 示例 / 脚本 ----------
"example/**/*",
"examples/**/*",
"scripts/**/*",
-
- // ---------- 环境与静态资源 ----------
".env",
".env.*",
"public/**/*",
-
- // ---------- 文档 ----------
"docs/**/*",
"README.md",
"LICENSE"
diff --git a/templates/vite-react-lib/tsconfig.json b/templates/vite-react-lib/tsconfig.json
index 1f65a23..eb90b48 100644
--- a/templates/vite-react-lib/tsconfig.json
+++ b/templates/vite-react-lib/tsconfig.json
@@ -1,8 +1,26 @@
{
- "extends": "./tsconfig.base.json",
"compilerOptions": {
+ "target": "es2025",
+ "lib": ["ES2025", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "types": ["node", "vite/client"],
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
"jsx": "react-jsx",
- "noEmit": true
+
+ /* Linting */
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true
},
- "include": ["."]
+ "include": ["src", "scripts", "vite.config.ts"]
}
diff --git a/templates/vite-react-lib/vite.config.ts b/templates/vite-react-lib/vite.config.ts
index 626fb35..c632b6e 100644
--- a/templates/vite-react-lib/vite.config.ts
+++ b/templates/vite-react-lib/vite.config.ts
@@ -1,30 +1,28 @@
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
-import dts from "vite-plugin-dts";
import path from "path";
-import typescript from "@rollup/plugin-typescript";
export default defineConfig({
- plugins: [
- react(),
- dts({
- insertTypesEntry: true,
- }),
- ],
-
- esbuild: false,
+ // d.ts 由 tsc 完成,使用专门配置 tsconfig.build.json
+ // 转换由 oxc 完成
+ // 打包由 rolldown 完成
+ plugins: [react()],
build: {
+ cssMinify: false,
lib: {
- entry: path.resolve(__dirname, "src/index.ts"),
- name: "DefgovUIWeb",
+ entry: path.resolve(import.meta.dirname, "src/index.ts"),
+ // 不写 vite 默认是 index.mjs 和 index.js,不方便识别
formats: ["es", "cjs"],
+ // package.json 管别人怎么使用,
+ // build.lib 管怎么打包,生成什么
+ // 如果不一致,就会报错,指向文件不存在
fileName: (format) => `index.${format}.js`,
},
-
- rollupOptions: {
- plugins: [typescript({ tsconfig: "./tsconfig.build.json" })],
+ rolldownOptions: {
+ // 避免这些被打包,peerDependencies 对 rolldown 是无效的,不会自动 external
external: ["react", "react-dom", "react/jsx-runtime"],
+ // 专门给 UMD / IIFE 的映射表
output: {
globals: {
react: "React",
@@ -33,7 +31,9 @@ export default defineConfig({
},
},
- sourcemap: true,
- cssCodeSplit: true,
+ emptyOutDir: true, // 防止旧产物残留
+ sourcemap: true, // 方便调试
+ cssCodeSplit: false, // 合并成一个css文件
+ outDir: "dist", // 专管打包输出目录,tsconfig.build.json 中的 outDir 管的是 d.ts 输出目录
},
});
Connect with us
+Join the Vite community
++-
+
+
+ GitHub
+
+
+ -
+
+
+ Discord
+
+
+ -
+
+
+ X.com
+
+
+ -
+
+
+ Bluesky
+
+
+
+