├── .editorconfig ├── .env ├── .gitignore ├── .nvmrc ├── .prettierrc ├── LICENSE ├── README.md ├── generated └── .gitignore ├── package.json ├── pnpm-lock.yaml ├── scripts └── generate-all.sh ├── src ├── generator │ ├── apply-component-library.ts │ ├── apply-map-library.ts │ ├── create-env-file.ts │ ├── index.ts │ ├── merge-package-dependencies.ts │ ├── process-readme.ts │ ├── replace-in-file.ts │ ├── setup-git-hooks.ts │ └── template-paths.ts ├── index.ts └── types.ts ├── templates ├── base │ ├── .babelrc │ ├── .editorconfig │ ├── .gitignore │ ├── .husky │ │ ├── pre-commit │ │ └── pre-push │ ├── .nvmrc │ ├── .prettierrc │ ├── .stylelintrc.json │ ├── LICENSE │ ├── _README.md │ ├── app │ │ ├── app.tsx │ │ ├── main.tsx │ │ ├── media │ │ │ └── layout │ │ │ │ └── ds-logo-pos.svg │ │ └── vite-env.d.ts │ ├── eslint.config.mjs │ ├── index.html │ ├── jest.config.js │ ├── jest.setup.ts │ ├── package.json │ ├── public │ │ └── meta │ │ │ ├── android-chrome.png │ │ │ ├── apple-touch-icon.png │ │ │ ├── favicon.png │ │ │ └── meta-image.png │ ├── test │ │ └── example.test.ts │ ├── tsconfig.app.json │ ├── tsconfig.json │ ├── tsconfig.node.json │ └── vite.config.mts ├── component-library │ ├── chakra │ │ ├── main.tsx │ │ ├── package.json │ │ └── styles │ │ │ ├── color-palette.ts │ │ │ └── theme.ts │ ├── none │ │ ├── main.tsx │ │ └── package.json │ └── uswds │ │ ├── app.tsx │ │ ├── main.tsx │ │ └── package.json └── map │ ├── mapbox-gl │ ├── app.tsx │ └── package.json │ └── maplibre-gl │ ├── app.tsx │ └── package.json ├── tsconfig.json └── tsup.config.ts /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | end_of_line = lf 9 | insert_final_newline = true 10 | 11 | # Matches multiple files with brace expansion notation 12 | # Set default charset 13 | [*.{js}] 14 | charset = utf-8 15 | 16 | # Indentation override for all JS under lib directory 17 | [lib/**.js] 18 | indent_style = space 19 | indent_size = 2 20 | 21 | # Matches the exact files either package.json or .travis.yml 22 | [{package.json,.travis.yml}] 23 | indent_style = space 24 | indent_size = 2 25 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | VITE_APP_TITLE=Project Seed 2 | VITE_APP_DESCRIPTION=Starter application by Development Seed 3 | 4 | # If the app is being served in from a subfolder, the domain url must be set. 5 | # For example, if the app is served from /mysite: 6 | # VITE_BASE_URL=http://example.com/mysite -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | .env* 4 | !.env.example 5 | *.log 6 | 7 | *~ 8 | *# 9 | .DS_STORE 10 | .DS_Store 11 | .idea 12 | .resources 13 | .node_history 14 | temp 15 | tmp 16 | .tmp -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 22 -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "trailingComma": "none", 4 | "singleQuote": true, 5 | "jsxSingleQuote": true, 6 | "printWidth": 80 7 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Development Seed 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # project-seed CLI 2 | 3 | Command line interface for scaffolding web map applications. 4 | 5 | ## Installation 6 | 7 | The CLI is part of the project-seed repository and can be used locally during development. 8 | 9 | ### Node version 10 | 11 | This repository defines the Node version via `.nvmrc`. Before running any commands, select the right version: 12 | 13 | ```bash 14 | nvm use 15 | ``` 16 | 17 | ## Usage 18 | 19 | ### Option 1: Run Directly from Source (Development) 20 | 21 | For development and testing, you can run the CLI directly from the TypeScript source: 22 | 23 | ```bash 24 | # Install dependencies first 25 | pnpm install 26 | 27 | # Run using the convenience script 28 | pnpm start 29 | 30 | # Generate with specific project name and component library 31 | pnpm start my-project-name --component-library chakra 32 | 33 | # Generate with specific project name, component library, and map library 34 | pnpm start my-project-name --component-library chakra --map-library mapbox-gl 35 | 36 | # Show help 37 | pnpm start --help 38 | 39 | # Show version 40 | pnpm start --version 41 | ``` 42 | 43 | ### Option 2: Build and Run (Production) 44 | 45 | For production use or when you want to run the compiled version: 46 | 47 | ```bash 48 | # Build the CLI 49 | pnpm build 50 | 51 | # Run the built version 52 | pnpm generate 53 | 54 | # Generate with specific project name and component library 55 | pnpm generate my-project-name --component-library chakra 56 | 57 | # Generate with specific project name, component library, and map library 58 | pnpm generate my-project-name --component-library chakra --map-library mapbox-gl 59 | 60 | # Show help 61 | pnpm generate --help 62 | 63 | # Show version 64 | pnpm generate --version 65 | ``` 66 | 67 | ### Component Library Options 68 | 69 | The CLI supports three component library variants: 70 | 71 | - **`none`** - Plain React with minimal dependencies 72 | - **`chakra`** - Chakra UI with theme and provider (default) 73 | - **`uswds`** - USWDS design system with government styling 74 | 75 | ### Map Library Options 76 | 77 | The CLI supports three map library variants: 78 | 79 | - **`none`** - No map functionality (default) 80 | - **`mapbox-gl`** - Mapbox GL JS for interactive maps 81 | - **`maplibre-gl`** - MapLibre GL JS (open source alternative) 82 | 83 | ### Interactive Mode 84 | 85 | When run without arguments, the CLI will prompt for: 86 | 87 | 1. Project name (with validation) 88 | 2. Component library selection 89 | 3. Map library selection 90 | 91 | ## Development 92 | 93 | ### Setup 94 | 95 | ```bash 96 | pnpm install 97 | ``` 98 | 99 | ### Development Mode 100 | 101 | ```bash 102 | pnpm dev 103 | ``` 104 | 105 | Runs tsup in watch mode, automatically rebuilding on file changes. 106 | 107 | ### Generate All Combinations 108 | 109 | For testing and development purposes, you can generate all possible combinations of component libraries and map libraries: 110 | 111 | ```bash 112 | pnpm generate-all 113 | ``` 114 | 115 | This generates all the projects in the `generated/` directory with descriptive names like `project-seed-chakra-mapbox-gl`. Useful for testing template combinations and QA. 116 | 117 | ### Linting 118 | 119 | ```bash 120 | pnpm lint 121 | ``` 122 | 123 | ### Type Checking 124 | 125 | ```bash 126 | pnpm type-check 127 | ``` 128 | 129 | ## Generated Projects 130 | 131 | Projects are generated in `generated/` directory. This directory is gitignored to prevent generated projects from being committed. 132 | 133 | ### What Gets Generated 134 | 135 | - Complete copy of the base template 136 | - Component library specific files and dependencies 137 | - Project name replaced in `package.json` 138 | - Template placeholders replaced in `README.md` 139 | - `.env` file with default Vite environment variables 140 | - All development dependencies and configuration files 141 | 142 | ### Template Structure 143 | 144 | The CLI uses a modular template system: 145 | 146 | ``` 147 | templates/ 148 | ├── base/ # Base template (core project files) 149 | │ ├── app/ 150 | │ ├── public/ 151 | │ ├── package.json # Core dependencies only 152 | │ └── ... 153 | ├── component-library/ # Component library variants 154 | │ ├── none/ 155 | │ │ ├── main.tsx # Plain React 156 | │ │ └── package.json # Empty dependencies 157 | │ ├── chakra/ 158 | │ │ ├── main.tsx # Chakra UI provider 159 | │ │ ├── styles/ # Theme files 160 | │ │ └── package.json # Chakra UI dependencies 161 | │ └── uswds/ 162 | │ ├── main.tsx # USWDS components 163 | │ └── package.json # USWDS dependencies 164 | └── map/ # Map library variants 165 | ├── mapbox-gl/ 166 | │ ├── app.tsx # Mapbox GL map component 167 | │ └── package.json # Mapbox GL dependencies 168 | └── maplibre-gl/ 169 | ├── app.tsx # MapLibre GL map component 170 | └── package.json # MapLibre GL dependencies 171 | ``` 172 | 173 | ### Template Processing 174 | 175 | The generator: 176 | 177 | 1. Copies all files from the base template 178 | 2. Applies component library variant (main.tsx + package.json mixin) 179 | 3. Applies map library variant (app.tsx + package.json mixin) 180 | 4. Replaces project name in `package.json` 181 | 5. Processes `_README.md` template and renames it to `README.md` 182 | 6. Creates `.env` file with default environment variables 183 | 184 | ### Adding New Component Libraries 185 | 186 | To add a new component library variant: 187 | 188 | 1. Create a new folder in `templates/component-library/` 189 | 2. Add `main.tsx` with the component library setup 190 | 3. Add `package.json` with component library dependencies 191 | 4. Update the CLI choices in `src/index.ts` 192 | 5. Test the new variant 193 | 194 | ### Adding New Map Libraries 195 | 196 | To add a new map library variant: 197 | 198 | 1. Create a new folder in `templates/map/` 199 | 2. Add `app.tsx` with the map library setup 200 | 3. Add `package.json` with map library dependencies 201 | 4. Update the CLI choices in `src/index.ts` 202 | 5. Test the new variant 203 | -------------------------------------------------------------------------------- /generated/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore all generated projects 2 | * 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "project-seed", 3 | "description": "Command line interface for project-seed", 4 | "version": "9.0.0", 5 | "type": "module", 6 | "bin": { 7 | "project-seed": "./dist/index.js" 8 | }, 9 | "files": [ 10 | "dist" 11 | ], 12 | "scripts": { 13 | "dev": "tsup --watch", 14 | "start": "tsx src/index.ts", 15 | "build": "tsup", 16 | "generate": "node ./dist/index.js", 17 | "generate-all": "./scripts/generate-all.sh", 18 | "lint": "eslint src/", 19 | "type-check": "tsc --noEmit" 20 | }, 21 | "dependencies": { 22 | "commander": "^14.0.0", 23 | "fs-extra": "^11.2.0", 24 | "inquirer": "^12.7.0" 25 | }, 26 | "devDependencies": { 27 | "@types/fs-extra": "^11.0.4", 28 | "@types/inquirer": "^9.0.7", 29 | "@types/node": "^22.10.7", 30 | "eslint": "^9.21.0", 31 | "tsup": "^8.0.2", 32 | "tsx": "^4.19.2", 33 | "typescript": "~5.8.3" 34 | }, 35 | "engines": { 36 | "node": ">=18.0.0" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | commander: 12 | specifier: ^14.0.0 13 | version: 14.0.0 14 | fs-extra: 15 | specifier: ^11.2.0 16 | version: 11.3.0 17 | inquirer: 18 | specifier: ^12.7.0 19 | version: 12.7.0(@types/node@22.16.0) 20 | devDependencies: 21 | '@types/fs-extra': 22 | specifier: ^11.0.4 23 | version: 11.0.4 24 | '@types/inquirer': 25 | specifier: ^9.0.7 26 | version: 9.0.8 27 | '@types/node': 28 | specifier: ^22.10.7 29 | version: 22.16.0 30 | eslint: 31 | specifier: ^9.21.0 32 | version: 9.30.1 33 | tsup: 34 | specifier: ^8.0.2 35 | version: 8.5.0(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3) 36 | tsx: 37 | specifier: ^4.19.2 38 | version: 4.20.3 39 | typescript: 40 | specifier: ~5.8.3 41 | version: 5.8.3 42 | 43 | packages: 44 | 45 | '@esbuild/aix-ppc64@0.25.5': 46 | resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} 47 | engines: {node: '>=18'} 48 | cpu: [ppc64] 49 | os: [aix] 50 | 51 | '@esbuild/android-arm64@0.25.5': 52 | resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} 53 | engines: {node: '>=18'} 54 | cpu: [arm64] 55 | os: [android] 56 | 57 | '@esbuild/android-arm@0.25.5': 58 | resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} 59 | engines: {node: '>=18'} 60 | cpu: [arm] 61 | os: [android] 62 | 63 | '@esbuild/android-x64@0.25.5': 64 | resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} 65 | engines: {node: '>=18'} 66 | cpu: [x64] 67 | os: [android] 68 | 69 | '@esbuild/darwin-arm64@0.25.5': 70 | resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} 71 | engines: {node: '>=18'} 72 | cpu: [arm64] 73 | os: [darwin] 74 | 75 | '@esbuild/darwin-x64@0.25.5': 76 | resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} 77 | engines: {node: '>=18'} 78 | cpu: [x64] 79 | os: [darwin] 80 | 81 | '@esbuild/freebsd-arm64@0.25.5': 82 | resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} 83 | engines: {node: '>=18'} 84 | cpu: [arm64] 85 | os: [freebsd] 86 | 87 | '@esbuild/freebsd-x64@0.25.5': 88 | resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} 89 | engines: {node: '>=18'} 90 | cpu: [x64] 91 | os: [freebsd] 92 | 93 | '@esbuild/linux-arm64@0.25.5': 94 | resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} 95 | engines: {node: '>=18'} 96 | cpu: [arm64] 97 | os: [linux] 98 | 99 | '@esbuild/linux-arm@0.25.5': 100 | resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} 101 | engines: {node: '>=18'} 102 | cpu: [arm] 103 | os: [linux] 104 | 105 | '@esbuild/linux-ia32@0.25.5': 106 | resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} 107 | engines: {node: '>=18'} 108 | cpu: [ia32] 109 | os: [linux] 110 | 111 | '@esbuild/linux-loong64@0.25.5': 112 | resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} 113 | engines: {node: '>=18'} 114 | cpu: [loong64] 115 | os: [linux] 116 | 117 | '@esbuild/linux-mips64el@0.25.5': 118 | resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} 119 | engines: {node: '>=18'} 120 | cpu: [mips64el] 121 | os: [linux] 122 | 123 | '@esbuild/linux-ppc64@0.25.5': 124 | resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} 125 | engines: {node: '>=18'} 126 | cpu: [ppc64] 127 | os: [linux] 128 | 129 | '@esbuild/linux-riscv64@0.25.5': 130 | resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} 131 | engines: {node: '>=18'} 132 | cpu: [riscv64] 133 | os: [linux] 134 | 135 | '@esbuild/linux-s390x@0.25.5': 136 | resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} 137 | engines: {node: '>=18'} 138 | cpu: [s390x] 139 | os: [linux] 140 | 141 | '@esbuild/linux-x64@0.25.5': 142 | resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} 143 | engines: {node: '>=18'} 144 | cpu: [x64] 145 | os: [linux] 146 | 147 | '@esbuild/netbsd-arm64@0.25.5': 148 | resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} 149 | engines: {node: '>=18'} 150 | cpu: [arm64] 151 | os: [netbsd] 152 | 153 | '@esbuild/netbsd-x64@0.25.5': 154 | resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} 155 | engines: {node: '>=18'} 156 | cpu: [x64] 157 | os: [netbsd] 158 | 159 | '@esbuild/openbsd-arm64@0.25.5': 160 | resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} 161 | engines: {node: '>=18'} 162 | cpu: [arm64] 163 | os: [openbsd] 164 | 165 | '@esbuild/openbsd-x64@0.25.5': 166 | resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} 167 | engines: {node: '>=18'} 168 | cpu: [x64] 169 | os: [openbsd] 170 | 171 | '@esbuild/sunos-x64@0.25.5': 172 | resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} 173 | engines: {node: '>=18'} 174 | cpu: [x64] 175 | os: [sunos] 176 | 177 | '@esbuild/win32-arm64@0.25.5': 178 | resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} 179 | engines: {node: '>=18'} 180 | cpu: [arm64] 181 | os: [win32] 182 | 183 | '@esbuild/win32-ia32@0.25.5': 184 | resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} 185 | engines: {node: '>=18'} 186 | cpu: [ia32] 187 | os: [win32] 188 | 189 | '@esbuild/win32-x64@0.25.5': 190 | resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} 191 | engines: {node: '>=18'} 192 | cpu: [x64] 193 | os: [win32] 194 | 195 | '@eslint-community/eslint-utils@4.7.0': 196 | resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} 197 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 198 | peerDependencies: 199 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 200 | 201 | '@eslint-community/regexpp@4.12.1': 202 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 203 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 204 | 205 | '@eslint/config-array@0.21.0': 206 | resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} 207 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 208 | 209 | '@eslint/config-helpers@0.3.0': 210 | resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} 211 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 212 | 213 | '@eslint/core@0.14.0': 214 | resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} 215 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 216 | 217 | '@eslint/core@0.15.1': 218 | resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} 219 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 220 | 221 | '@eslint/eslintrc@3.3.1': 222 | resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 223 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 224 | 225 | '@eslint/js@9.30.1': 226 | resolution: {integrity: sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==} 227 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 228 | 229 | '@eslint/object-schema@2.1.6': 230 | resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 231 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 232 | 233 | '@eslint/plugin-kit@0.3.3': 234 | resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} 235 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 236 | 237 | '@humanfs/core@0.19.1': 238 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 239 | engines: {node: '>=18.18.0'} 240 | 241 | '@humanfs/node@0.16.6': 242 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 243 | engines: {node: '>=18.18.0'} 244 | 245 | '@humanwhocodes/module-importer@1.0.1': 246 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 247 | engines: {node: '>=12.22'} 248 | 249 | '@humanwhocodes/retry@0.3.1': 250 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 251 | engines: {node: '>=18.18'} 252 | 253 | '@humanwhocodes/retry@0.4.3': 254 | resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 255 | engines: {node: '>=18.18'} 256 | 257 | '@inquirer/checkbox@4.1.9': 258 | resolution: {integrity: sha512-DBJBkzI5Wx4jFaYm221LHvAhpKYkhVS0k9plqHwaHhofGNxvYB7J3Bz8w+bFJ05zaMb0sZNHo4KdmENQFlNTuQ==} 259 | engines: {node: '>=18'} 260 | peerDependencies: 261 | '@types/node': '>=18' 262 | peerDependenciesMeta: 263 | '@types/node': 264 | optional: true 265 | 266 | '@inquirer/confirm@5.1.13': 267 | resolution: {integrity: sha512-EkCtvp67ICIVVzjsquUiVSd+V5HRGOGQfsqA4E4vMWhYnB7InUL0pa0TIWt1i+OfP16Gkds8CdIu6yGZwOM1Yw==} 268 | engines: {node: '>=18'} 269 | peerDependencies: 270 | '@types/node': '>=18' 271 | peerDependenciesMeta: 272 | '@types/node': 273 | optional: true 274 | 275 | '@inquirer/core@10.1.14': 276 | resolution: {integrity: sha512-Ma+ZpOJPewtIYl6HZHZckeX1STvDnHTCB2GVINNUlSEn2Am6LddWwfPkIGY0IUFVjUUrr/93XlBwTK6mfLjf0A==} 277 | engines: {node: '>=18'} 278 | peerDependencies: 279 | '@types/node': '>=18' 280 | peerDependenciesMeta: 281 | '@types/node': 282 | optional: true 283 | 284 | '@inquirer/editor@4.2.14': 285 | resolution: {integrity: sha512-yd2qtLl4QIIax9DTMZ1ZN2pFrrj+yL3kgIWxm34SS6uwCr0sIhsNyudUjAo5q3TqI03xx4SEBkUJqZuAInp9uA==} 286 | engines: {node: '>=18'} 287 | peerDependencies: 288 | '@types/node': '>=18' 289 | peerDependenciesMeta: 290 | '@types/node': 291 | optional: true 292 | 293 | '@inquirer/expand@4.0.16': 294 | resolution: {integrity: sha512-oiDqafWzMtofeJyyGkb1CTPaxUkjIcSxePHHQCfif8t3HV9pHcw1Kgdw3/uGpDvaFfeTluwQtWiqzPVjAqS3zA==} 295 | engines: {node: '>=18'} 296 | peerDependencies: 297 | '@types/node': '>=18' 298 | peerDependenciesMeta: 299 | '@types/node': 300 | optional: true 301 | 302 | '@inquirer/figures@1.0.12': 303 | resolution: {integrity: sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==} 304 | engines: {node: '>=18'} 305 | 306 | '@inquirer/input@4.2.0': 307 | resolution: {integrity: sha512-opqpHPB1NjAmDISi3uvZOTrjEEU5CWVu/HBkDby8t93+6UxYX0Z7Ps0Ltjm5sZiEbWenjubwUkivAEYQmy9xHw==} 308 | engines: {node: '>=18'} 309 | peerDependencies: 310 | '@types/node': '>=18' 311 | peerDependenciesMeta: 312 | '@types/node': 313 | optional: true 314 | 315 | '@inquirer/number@3.0.16': 316 | resolution: {integrity: sha512-kMrXAaKGavBEoBYUCgualbwA9jWUx2TjMA46ek+pEKy38+LFpL9QHlTd8PO2kWPUgI/KB+qi02o4y2rwXbzr3Q==} 317 | engines: {node: '>=18'} 318 | peerDependencies: 319 | '@types/node': '>=18' 320 | peerDependenciesMeta: 321 | '@types/node': 322 | optional: true 323 | 324 | '@inquirer/password@4.0.16': 325 | resolution: {integrity: sha512-g8BVNBj5Zeb5/Y3cSN+hDUL7CsIFDIuVxb9EPty3lkxBaYpjL5BNRKSYOF9yOLe+JOcKFd+TSVeADQ4iSY7rbg==} 326 | engines: {node: '>=18'} 327 | peerDependencies: 328 | '@types/node': '>=18' 329 | peerDependenciesMeta: 330 | '@types/node': 331 | optional: true 332 | 333 | '@inquirer/prompts@7.6.0': 334 | resolution: {integrity: sha512-jAhL7tyMxB3Gfwn4HIJ0yuJ5pvcB5maYUcouGcgd/ub79f9MqZ+aVnBtuFf+VC2GTkCBF+R+eo7Vi63w5VZlzw==} 335 | engines: {node: '>=18'} 336 | peerDependencies: 337 | '@types/node': '>=18' 338 | peerDependenciesMeta: 339 | '@types/node': 340 | optional: true 341 | 342 | '@inquirer/rawlist@4.1.4': 343 | resolution: {integrity: sha512-5GGvxVpXXMmfZNtvWw4IsHpR7RzqAR624xtkPd1NxxlV5M+pShMqzL4oRddRkg8rVEOK9fKdJp1jjVML2Lr7TQ==} 344 | engines: {node: '>=18'} 345 | peerDependencies: 346 | '@types/node': '>=18' 347 | peerDependenciesMeta: 348 | '@types/node': 349 | optional: true 350 | 351 | '@inquirer/search@3.0.16': 352 | resolution: {integrity: sha512-POCmXo+j97kTGU6aeRjsPyuCpQQfKcMXdeTMw708ZMtWrj5aykZvlUxH4Qgz3+Y1L/cAVZsSpA+UgZCu2GMOMg==} 353 | engines: {node: '>=18'} 354 | peerDependencies: 355 | '@types/node': '>=18' 356 | peerDependenciesMeta: 357 | '@types/node': 358 | optional: true 359 | 360 | '@inquirer/select@4.2.4': 361 | resolution: {integrity: sha512-unTppUcTjmnbl/q+h8XeQDhAqIOmwWYWNyiiP2e3orXrg6tOaa5DHXja9PChCSbChOsktyKgOieRZFnajzxoBg==} 362 | engines: {node: '>=18'} 363 | peerDependencies: 364 | '@types/node': '>=18' 365 | peerDependenciesMeta: 366 | '@types/node': 367 | optional: true 368 | 369 | '@inquirer/type@3.0.7': 370 | resolution: {integrity: sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==} 371 | engines: {node: '>=18'} 372 | peerDependencies: 373 | '@types/node': '>=18' 374 | peerDependenciesMeta: 375 | '@types/node': 376 | optional: true 377 | 378 | '@isaacs/cliui@8.0.2': 379 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 380 | engines: {node: '>=12'} 381 | 382 | '@jridgewell/gen-mapping@0.3.12': 383 | resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} 384 | 385 | '@jridgewell/resolve-uri@3.1.2': 386 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 387 | engines: {node: '>=6.0.0'} 388 | 389 | '@jridgewell/sourcemap-codec@1.5.4': 390 | resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} 391 | 392 | '@jridgewell/trace-mapping@0.3.29': 393 | resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} 394 | 395 | '@oxlint/darwin-arm64@1.6.0': 396 | resolution: {integrity: sha512-m3wyqBh1TOHjpr/dXeIZY7OoX+MQazb+bMHQdDtwUvefrafUx+5YHRvulYh1sZSQ449nQ3nk3qj5qj535vZRjg==} 397 | cpu: [arm64] 398 | os: [darwin] 399 | 400 | '@oxlint/darwin-x64@1.6.0': 401 | resolution: {integrity: sha512-75fJfF/9xNypr7cnOYoZBhfmG1yP7ex3pUOeYGakmtZRffO9z1i1quLYhjZsmaDXsAIZ3drMhenYHMmFKS3SRg==} 402 | cpu: [x64] 403 | os: [darwin] 404 | 405 | '@oxlint/linux-arm64-gnu@1.6.0': 406 | resolution: {integrity: sha512-YhXGf0FXa72bEt4F7eTVKx5X3zWpbAOPnaA/dZ6/g8tGhw1m9IFjrabVHFjzcx3dQny4MgA59EhyElkDvpUe8A==} 407 | cpu: [arm64] 408 | os: [linux] 409 | 410 | '@oxlint/linux-arm64-musl@1.6.0': 411 | resolution: {integrity: sha512-T3JDhx8mjGjvh5INsPZJrlKHmZsecgDYvtvussKRdkc1Nnn7WC+jH9sh5qlmYvwzvmetlPVNezAoNvmGO9vtMg==} 412 | cpu: [arm64] 413 | os: [linux] 414 | 415 | '@oxlint/linux-x64-gnu@1.6.0': 416 | resolution: {integrity: sha512-Dx7ghtAl8aXBdqofJpi338At6lkeCtTfoinTYQXd9/TEJx+f+zCGNlQO6nJz3ydJBX48FDuOFKkNC+lUlWrd8w==} 417 | cpu: [x64] 418 | os: [linux] 419 | 420 | '@oxlint/linux-x64-musl@1.6.0': 421 | resolution: {integrity: sha512-7KvMGdWmAZtAtg6IjoEJHKxTXdAcrHnUnqfgs0JpXst7trquV2mxBeRZusQXwxpu4HCSomKMvJfsp1qKaqSFDg==} 422 | cpu: [x64] 423 | os: [linux] 424 | 425 | '@oxlint/win32-arm64@1.6.0': 426 | resolution: {integrity: sha512-iSGC9RwX+dl7o5KFr5aH7Gq3nFbkq/3Gda6mxNPMvNkWrgXdIyiINxpyD8hJu566M+QSv1wEAu934BZotFDyoQ==} 427 | cpu: [arm64] 428 | os: [win32] 429 | 430 | '@oxlint/win32-x64@1.6.0': 431 | resolution: {integrity: sha512-jOj3L/gfLc0IwgOTkZMiZ5c673i/hbAmidlaylT0gE6H18hln9HxPgp5GCf4E4y6mwEJlW8QC5hQi221+9otdA==} 432 | cpu: [x64] 433 | os: [win32] 434 | 435 | '@pkgjs/parseargs@0.11.0': 436 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 437 | engines: {node: '>=14'} 438 | 439 | '@rollup/rollup-android-arm-eabi@4.44.1': 440 | resolution: {integrity: sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==} 441 | cpu: [arm] 442 | os: [android] 443 | 444 | '@rollup/rollup-android-arm64@4.44.1': 445 | resolution: {integrity: sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==} 446 | cpu: [arm64] 447 | os: [android] 448 | 449 | '@rollup/rollup-darwin-arm64@4.44.1': 450 | resolution: {integrity: sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==} 451 | cpu: [arm64] 452 | os: [darwin] 453 | 454 | '@rollup/rollup-darwin-x64@4.44.1': 455 | resolution: {integrity: sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==} 456 | cpu: [x64] 457 | os: [darwin] 458 | 459 | '@rollup/rollup-freebsd-arm64@4.44.1': 460 | resolution: {integrity: sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==} 461 | cpu: [arm64] 462 | os: [freebsd] 463 | 464 | '@rollup/rollup-freebsd-x64@4.44.1': 465 | resolution: {integrity: sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==} 466 | cpu: [x64] 467 | os: [freebsd] 468 | 469 | '@rollup/rollup-linux-arm-gnueabihf@4.44.1': 470 | resolution: {integrity: sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==} 471 | cpu: [arm] 472 | os: [linux] 473 | 474 | '@rollup/rollup-linux-arm-musleabihf@4.44.1': 475 | resolution: {integrity: sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==} 476 | cpu: [arm] 477 | os: [linux] 478 | 479 | '@rollup/rollup-linux-arm64-gnu@4.44.1': 480 | resolution: {integrity: sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==} 481 | cpu: [arm64] 482 | os: [linux] 483 | 484 | '@rollup/rollup-linux-arm64-musl@4.44.1': 485 | resolution: {integrity: sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==} 486 | cpu: [arm64] 487 | os: [linux] 488 | 489 | '@rollup/rollup-linux-loongarch64-gnu@4.44.1': 490 | resolution: {integrity: sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==} 491 | cpu: [loong64] 492 | os: [linux] 493 | 494 | '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': 495 | resolution: {integrity: sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==} 496 | cpu: [ppc64] 497 | os: [linux] 498 | 499 | '@rollup/rollup-linux-riscv64-gnu@4.44.1': 500 | resolution: {integrity: sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==} 501 | cpu: [riscv64] 502 | os: [linux] 503 | 504 | '@rollup/rollup-linux-riscv64-musl@4.44.1': 505 | resolution: {integrity: sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==} 506 | cpu: [riscv64] 507 | os: [linux] 508 | 509 | '@rollup/rollup-linux-s390x-gnu@4.44.1': 510 | resolution: {integrity: sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==} 511 | cpu: [s390x] 512 | os: [linux] 513 | 514 | '@rollup/rollup-linux-x64-gnu@4.44.1': 515 | resolution: {integrity: sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==} 516 | cpu: [x64] 517 | os: [linux] 518 | 519 | '@rollup/rollup-linux-x64-musl@4.44.1': 520 | resolution: {integrity: sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==} 521 | cpu: [x64] 522 | os: [linux] 523 | 524 | '@rollup/rollup-win32-arm64-msvc@4.44.1': 525 | resolution: {integrity: sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==} 526 | cpu: [arm64] 527 | os: [win32] 528 | 529 | '@rollup/rollup-win32-ia32-msvc@4.44.1': 530 | resolution: {integrity: sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==} 531 | cpu: [ia32] 532 | os: [win32] 533 | 534 | '@rollup/rollup-win32-x64-msvc@4.44.1': 535 | resolution: {integrity: sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==} 536 | cpu: [x64] 537 | os: [win32] 538 | 539 | '@types/estree@1.0.8': 540 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 541 | 542 | '@types/fs-extra@11.0.4': 543 | resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} 544 | 545 | '@types/inquirer@9.0.8': 546 | resolution: {integrity: sha512-CgPD5kFGWsb8HJ5K7rfWlifao87m4ph8uioU7OTncJevmE/VLIqAAjfQtko578JZg7/f69K4FgqYym3gNr7DeA==} 547 | 548 | '@types/json-schema@7.0.15': 549 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 550 | 551 | '@types/jsonfile@6.1.4': 552 | resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} 553 | 554 | '@types/node@22.16.0': 555 | resolution: {integrity: sha512-B2egV9wALML1JCpv3VQoQ+yesQKAmNMBIAY7OteVrikcOcAkWm+dGL6qpeCktPjAv6N1JLnhbNiqS35UpFyBsQ==} 556 | 557 | '@types/through@0.0.33': 558 | resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} 559 | 560 | acorn-jsx@5.3.2: 561 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 562 | peerDependencies: 563 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 564 | 565 | acorn@8.15.0: 566 | resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 567 | engines: {node: '>=0.4.0'} 568 | hasBin: true 569 | 570 | ajv@6.12.6: 571 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 572 | 573 | ansi-escapes@4.3.2: 574 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 575 | engines: {node: '>=8'} 576 | 577 | ansi-regex@5.0.1: 578 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 579 | engines: {node: '>=8'} 580 | 581 | ansi-regex@6.1.0: 582 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 583 | engines: {node: '>=12'} 584 | 585 | ansi-styles@4.3.0: 586 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 587 | engines: {node: '>=8'} 588 | 589 | ansi-styles@6.2.1: 590 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 591 | engines: {node: '>=12'} 592 | 593 | any-promise@1.3.0: 594 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 595 | 596 | argparse@2.0.1: 597 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 598 | 599 | balanced-match@1.0.2: 600 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 601 | 602 | brace-expansion@1.1.12: 603 | resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} 604 | 605 | brace-expansion@2.0.2: 606 | resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 607 | 608 | bundle-require@5.1.0: 609 | resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} 610 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 611 | peerDependencies: 612 | esbuild: '>=0.18' 613 | 614 | cac@6.7.14: 615 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 616 | engines: {node: '>=8'} 617 | 618 | callsites@3.1.0: 619 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 620 | engines: {node: '>=6'} 621 | 622 | chalk@4.1.2: 623 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 624 | engines: {node: '>=10'} 625 | 626 | chardet@0.7.0: 627 | resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} 628 | 629 | chokidar@4.0.3: 630 | resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 631 | engines: {node: '>= 14.16.0'} 632 | 633 | cli-width@4.1.0: 634 | resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} 635 | engines: {node: '>= 12'} 636 | 637 | color-convert@2.0.1: 638 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 639 | engines: {node: '>=7.0.0'} 640 | 641 | color-name@1.1.4: 642 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 643 | 644 | commander@14.0.0: 645 | resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} 646 | engines: {node: '>=20'} 647 | 648 | commander@4.1.1: 649 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 650 | engines: {node: '>= 6'} 651 | 652 | concat-map@0.0.1: 653 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 654 | 655 | confbox@0.1.8: 656 | resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} 657 | 658 | consola@3.4.2: 659 | resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} 660 | engines: {node: ^14.18.0 || >=16.10.0} 661 | 662 | cross-spawn@7.0.6: 663 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 664 | engines: {node: '>= 8'} 665 | 666 | debug@4.4.1: 667 | resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 668 | engines: {node: '>=6.0'} 669 | peerDependencies: 670 | supports-color: '*' 671 | peerDependenciesMeta: 672 | supports-color: 673 | optional: true 674 | 675 | deep-is@0.1.4: 676 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 677 | 678 | eastasianwidth@0.2.0: 679 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 680 | 681 | emoji-regex@8.0.0: 682 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 683 | 684 | emoji-regex@9.2.2: 685 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 686 | 687 | esbuild@0.25.5: 688 | resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} 689 | engines: {node: '>=18'} 690 | hasBin: true 691 | 692 | escape-string-regexp@4.0.0: 693 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 694 | engines: {node: '>=10'} 695 | 696 | eslint-scope@8.4.0: 697 | resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} 698 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 699 | 700 | eslint-visitor-keys@3.4.3: 701 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 702 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 703 | 704 | eslint-visitor-keys@4.2.1: 705 | resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 706 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 707 | 708 | eslint@9.30.1: 709 | resolution: {integrity: sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==} 710 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 711 | hasBin: true 712 | peerDependencies: 713 | jiti: '*' 714 | peerDependenciesMeta: 715 | jiti: 716 | optional: true 717 | 718 | espree@10.4.0: 719 | resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} 720 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 721 | 722 | esquery@1.6.0: 723 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 724 | engines: {node: '>=0.10'} 725 | 726 | esrecurse@4.3.0: 727 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 728 | engines: {node: '>=4.0'} 729 | 730 | estraverse@5.3.0: 731 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 732 | engines: {node: '>=4.0'} 733 | 734 | esutils@2.0.3: 735 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 736 | engines: {node: '>=0.10.0'} 737 | 738 | external-editor@3.1.0: 739 | resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} 740 | engines: {node: '>=4'} 741 | 742 | fast-deep-equal@3.1.3: 743 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 744 | 745 | fast-json-stable-stringify@2.1.0: 746 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 747 | 748 | fast-levenshtein@2.0.6: 749 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 750 | 751 | fdir@6.4.6: 752 | resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} 753 | peerDependencies: 754 | picomatch: ^3 || ^4 755 | peerDependenciesMeta: 756 | picomatch: 757 | optional: true 758 | 759 | file-entry-cache@8.0.0: 760 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 761 | engines: {node: '>=16.0.0'} 762 | 763 | find-up@5.0.0: 764 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 765 | engines: {node: '>=10'} 766 | 767 | fix-dts-default-cjs-exports@1.0.1: 768 | resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} 769 | 770 | flat-cache@4.0.1: 771 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 772 | engines: {node: '>=16'} 773 | 774 | flatted@3.3.3: 775 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 776 | 777 | foreground-child@3.3.1: 778 | resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} 779 | engines: {node: '>=14'} 780 | 781 | fs-extra@11.3.0: 782 | resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} 783 | engines: {node: '>=14.14'} 784 | 785 | fsevents@2.3.3: 786 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 787 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 788 | os: [darwin] 789 | 790 | get-tsconfig@4.10.1: 791 | resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} 792 | 793 | glob-parent@6.0.2: 794 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 795 | engines: {node: '>=10.13.0'} 796 | 797 | glob@10.4.5: 798 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 799 | hasBin: true 800 | 801 | globals@14.0.0: 802 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 803 | engines: {node: '>=18'} 804 | 805 | graceful-fs@4.2.11: 806 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 807 | 808 | has-flag@4.0.0: 809 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 810 | engines: {node: '>=8'} 811 | 812 | iconv-lite@0.4.24: 813 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 814 | engines: {node: '>=0.10.0'} 815 | 816 | ignore@5.3.2: 817 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 818 | engines: {node: '>= 4'} 819 | 820 | import-fresh@3.3.1: 821 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 822 | engines: {node: '>=6'} 823 | 824 | imurmurhash@0.1.4: 825 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 826 | engines: {node: '>=0.8.19'} 827 | 828 | inquirer@12.7.0: 829 | resolution: {integrity: sha512-KKFRc++IONSyE2UYw9CJ1V0IWx5yQKomwB+pp3cWomWs+v2+ZsG11G2OVfAjFS6WWCppKw+RfKmpqGfSzD5QBQ==} 830 | engines: {node: '>=18'} 831 | peerDependencies: 832 | '@types/node': '>=18' 833 | peerDependenciesMeta: 834 | '@types/node': 835 | optional: true 836 | 837 | is-extglob@2.1.1: 838 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 839 | engines: {node: '>=0.10.0'} 840 | 841 | is-fullwidth-code-point@3.0.0: 842 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 843 | engines: {node: '>=8'} 844 | 845 | is-glob@4.0.3: 846 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 847 | engines: {node: '>=0.10.0'} 848 | 849 | isexe@2.0.0: 850 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 851 | 852 | jackspeak@3.4.3: 853 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 854 | 855 | joycon@3.1.1: 856 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 857 | engines: {node: '>=10'} 858 | 859 | js-yaml@4.1.0: 860 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 861 | hasBin: true 862 | 863 | json-buffer@3.0.1: 864 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 865 | 866 | json-schema-traverse@0.4.1: 867 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 868 | 869 | json-stable-stringify-without-jsonify@1.0.1: 870 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 871 | 872 | jsonfile@6.1.0: 873 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 874 | 875 | keyv@4.5.4: 876 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 877 | 878 | levn@0.4.1: 879 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 880 | engines: {node: '>= 0.8.0'} 881 | 882 | lilconfig@3.1.3: 883 | resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} 884 | engines: {node: '>=14'} 885 | 886 | lines-and-columns@1.2.4: 887 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 888 | 889 | load-tsconfig@0.2.5: 890 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 891 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 892 | 893 | locate-path@6.0.0: 894 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 895 | engines: {node: '>=10'} 896 | 897 | lodash.merge@4.6.2: 898 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 899 | 900 | lodash.sortby@4.7.0: 901 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 902 | 903 | lru-cache@10.4.3: 904 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 905 | 906 | magic-string@0.30.17: 907 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 908 | 909 | minimatch@3.1.2: 910 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 911 | 912 | minimatch@9.0.5: 913 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 914 | engines: {node: '>=16 || 14 >=14.17'} 915 | 916 | minipass@7.1.2: 917 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 918 | engines: {node: '>=16 || 14 >=14.17'} 919 | 920 | mlly@1.7.4: 921 | resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} 922 | 923 | ms@2.1.3: 924 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 925 | 926 | mute-stream@2.0.0: 927 | resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} 928 | engines: {node: ^18.17.0 || >=20.5.0} 929 | 930 | mz@2.7.0: 931 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 932 | 933 | nanoid@3.3.11: 934 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 935 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 936 | hasBin: true 937 | 938 | natural-compare@1.4.0: 939 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 940 | 941 | object-assign@4.1.1: 942 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 943 | engines: {node: '>=0.10.0'} 944 | 945 | optionator@0.9.4: 946 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 947 | engines: {node: '>= 0.8.0'} 948 | 949 | os-tmpdir@1.0.2: 950 | resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} 951 | engines: {node: '>=0.10.0'} 952 | 953 | oxlint@1.6.0: 954 | resolution: {integrity: sha512-jtaD65PqzIa1udvSxxscTKBxYKuZoFXyKGLiU1Qjo1ulq3uv/fQDtoV1yey1FrQZrQjACGPi1Widsy1TucC7Jg==} 955 | engines: {node: '>=8.*'} 956 | hasBin: true 957 | 958 | p-limit@3.1.0: 959 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 960 | engines: {node: '>=10'} 961 | 962 | p-locate@5.0.0: 963 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 964 | engines: {node: '>=10'} 965 | 966 | package-json-from-dist@1.0.1: 967 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 968 | 969 | parent-module@1.0.1: 970 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 971 | engines: {node: '>=6'} 972 | 973 | path-exists@4.0.0: 974 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 975 | engines: {node: '>=8'} 976 | 977 | path-key@3.1.1: 978 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 979 | engines: {node: '>=8'} 980 | 981 | path-scurry@1.11.1: 982 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 983 | engines: {node: '>=16 || 14 >=14.18'} 984 | 985 | pathe@2.0.3: 986 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 987 | 988 | picocolors@1.1.1: 989 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 990 | 991 | picomatch@4.0.2: 992 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 993 | engines: {node: '>=12'} 994 | 995 | pirates@4.0.7: 996 | resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} 997 | engines: {node: '>= 6'} 998 | 999 | pkg-types@1.3.1: 1000 | resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} 1001 | 1002 | postcss-load-config@6.0.1: 1003 | resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} 1004 | engines: {node: '>= 18'} 1005 | peerDependencies: 1006 | jiti: '>=1.21.0' 1007 | postcss: '>=8.0.9' 1008 | tsx: ^4.8.1 1009 | yaml: ^2.4.2 1010 | peerDependenciesMeta: 1011 | jiti: 1012 | optional: true 1013 | postcss: 1014 | optional: true 1015 | tsx: 1016 | optional: true 1017 | yaml: 1018 | optional: true 1019 | 1020 | postcss@8.5.6: 1021 | resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 1022 | engines: {node: ^10 || ^12 || >=14} 1023 | 1024 | prelude-ls@1.2.1: 1025 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1026 | engines: {node: '>= 0.8.0'} 1027 | 1028 | prettier@3.6.2: 1029 | resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} 1030 | engines: {node: '>=14'} 1031 | hasBin: true 1032 | 1033 | punycode@2.3.1: 1034 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1035 | engines: {node: '>=6'} 1036 | 1037 | readdirp@4.1.2: 1038 | resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1039 | engines: {node: '>= 14.18.0'} 1040 | 1041 | resolve-from@4.0.0: 1042 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1043 | engines: {node: '>=4'} 1044 | 1045 | resolve-from@5.0.0: 1046 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1047 | engines: {node: '>=8'} 1048 | 1049 | resolve-pkg-maps@1.0.0: 1050 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1051 | 1052 | rollup@4.44.1: 1053 | resolution: {integrity: sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==} 1054 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1055 | hasBin: true 1056 | 1057 | run-async@4.0.4: 1058 | resolution: {integrity: sha512-2cgeRHnV11lSXBEhq7sN7a5UVjTKm9JTb9x8ApIT//16D7QL96AgnNeWSGoB4gIHc0iYw/Ha0Z+waBaCYZVNhg==} 1059 | engines: {node: '>=0.12.0'} 1060 | 1061 | rxjs@7.8.2: 1062 | resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} 1063 | 1064 | safer-buffer@2.1.2: 1065 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1066 | 1067 | shebang-command@2.0.0: 1068 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1069 | engines: {node: '>=8'} 1070 | 1071 | shebang-regex@3.0.0: 1072 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1073 | engines: {node: '>=8'} 1074 | 1075 | signal-exit@4.1.0: 1076 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1077 | engines: {node: '>=14'} 1078 | 1079 | source-map-js@1.2.1: 1080 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1081 | engines: {node: '>=0.10.0'} 1082 | 1083 | source-map@0.8.0-beta.0: 1084 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 1085 | engines: {node: '>= 8'} 1086 | 1087 | string-width@4.2.3: 1088 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1089 | engines: {node: '>=8'} 1090 | 1091 | string-width@5.1.2: 1092 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1093 | engines: {node: '>=12'} 1094 | 1095 | strip-ansi@6.0.1: 1096 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1097 | engines: {node: '>=8'} 1098 | 1099 | strip-ansi@7.1.0: 1100 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1101 | engines: {node: '>=12'} 1102 | 1103 | strip-json-comments@3.1.1: 1104 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1105 | engines: {node: '>=8'} 1106 | 1107 | sucrase@3.35.0: 1108 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1109 | engines: {node: '>=16 || 14 >=14.17'} 1110 | hasBin: true 1111 | 1112 | supports-color@7.2.0: 1113 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1114 | engines: {node: '>=8'} 1115 | 1116 | thenify-all@1.6.0: 1117 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1118 | engines: {node: '>=0.8'} 1119 | 1120 | thenify@3.3.1: 1121 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1122 | 1123 | tinyexec@0.3.2: 1124 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1125 | 1126 | tinyglobby@0.2.14: 1127 | resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 1128 | engines: {node: '>=12.0.0'} 1129 | 1130 | tmp@0.0.33: 1131 | resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} 1132 | engines: {node: '>=0.6.0'} 1133 | 1134 | tr46@1.0.1: 1135 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 1136 | 1137 | tree-kill@1.2.2: 1138 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1139 | hasBin: true 1140 | 1141 | ts-interface-checker@0.1.13: 1142 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1143 | 1144 | tslib@2.8.1: 1145 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1146 | 1147 | tsup@8.5.0: 1148 | resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} 1149 | engines: {node: '>=18'} 1150 | hasBin: true 1151 | peerDependencies: 1152 | '@microsoft/api-extractor': ^7.36.0 1153 | '@swc/core': ^1 1154 | postcss: ^8.4.12 1155 | typescript: '>=4.5.0' 1156 | peerDependenciesMeta: 1157 | '@microsoft/api-extractor': 1158 | optional: true 1159 | '@swc/core': 1160 | optional: true 1161 | postcss: 1162 | optional: true 1163 | typescript: 1164 | optional: true 1165 | 1166 | tsx@4.20.3: 1167 | resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} 1168 | engines: {node: '>=18.0.0'} 1169 | hasBin: true 1170 | 1171 | type-check@0.4.0: 1172 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1173 | engines: {node: '>= 0.8.0'} 1174 | 1175 | type-fest@0.21.3: 1176 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 1177 | engines: {node: '>=10'} 1178 | 1179 | typescript@5.8.3: 1180 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 1181 | engines: {node: '>=14.17'} 1182 | hasBin: true 1183 | 1184 | ufo@1.6.1: 1185 | resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} 1186 | 1187 | undici-types@6.21.0: 1188 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1189 | 1190 | universalify@2.0.1: 1191 | resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} 1192 | engines: {node: '>= 10.0.0'} 1193 | 1194 | uri-js@4.4.1: 1195 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1196 | 1197 | webidl-conversions@4.0.2: 1198 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 1199 | 1200 | whatwg-url@7.1.0: 1201 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 1202 | 1203 | which@2.0.2: 1204 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1205 | engines: {node: '>= 8'} 1206 | hasBin: true 1207 | 1208 | word-wrap@1.2.5: 1209 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1210 | engines: {node: '>=0.10.0'} 1211 | 1212 | wrap-ansi@6.2.0: 1213 | resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} 1214 | engines: {node: '>=8'} 1215 | 1216 | wrap-ansi@7.0.0: 1217 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1218 | engines: {node: '>=10'} 1219 | 1220 | wrap-ansi@8.1.0: 1221 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1222 | engines: {node: '>=12'} 1223 | 1224 | yocto-queue@0.1.0: 1225 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1226 | engines: {node: '>=10'} 1227 | 1228 | yoctocolors-cjs@2.1.2: 1229 | resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} 1230 | engines: {node: '>=18'} 1231 | 1232 | snapshots: 1233 | 1234 | '@esbuild/aix-ppc64@0.25.5': 1235 | optional: true 1236 | 1237 | '@esbuild/android-arm64@0.25.5': 1238 | optional: true 1239 | 1240 | '@esbuild/android-arm@0.25.5': 1241 | optional: true 1242 | 1243 | '@esbuild/android-x64@0.25.5': 1244 | optional: true 1245 | 1246 | '@esbuild/darwin-arm64@0.25.5': 1247 | optional: true 1248 | 1249 | '@esbuild/darwin-x64@0.25.5': 1250 | optional: true 1251 | 1252 | '@esbuild/freebsd-arm64@0.25.5': 1253 | optional: true 1254 | 1255 | '@esbuild/freebsd-x64@0.25.5': 1256 | optional: true 1257 | 1258 | '@esbuild/linux-arm64@0.25.5': 1259 | optional: true 1260 | 1261 | '@esbuild/linux-arm@0.25.5': 1262 | optional: true 1263 | 1264 | '@esbuild/linux-ia32@0.25.5': 1265 | optional: true 1266 | 1267 | '@esbuild/linux-loong64@0.25.5': 1268 | optional: true 1269 | 1270 | '@esbuild/linux-mips64el@0.25.5': 1271 | optional: true 1272 | 1273 | '@esbuild/linux-ppc64@0.25.5': 1274 | optional: true 1275 | 1276 | '@esbuild/linux-riscv64@0.25.5': 1277 | optional: true 1278 | 1279 | '@esbuild/linux-s390x@0.25.5': 1280 | optional: true 1281 | 1282 | '@esbuild/linux-x64@0.25.5': 1283 | optional: true 1284 | 1285 | '@esbuild/netbsd-arm64@0.25.5': 1286 | optional: true 1287 | 1288 | '@esbuild/netbsd-x64@0.25.5': 1289 | optional: true 1290 | 1291 | '@esbuild/openbsd-arm64@0.25.5': 1292 | optional: true 1293 | 1294 | '@esbuild/openbsd-x64@0.25.5': 1295 | optional: true 1296 | 1297 | '@esbuild/sunos-x64@0.25.5': 1298 | optional: true 1299 | 1300 | '@esbuild/win32-arm64@0.25.5': 1301 | optional: true 1302 | 1303 | '@esbuild/win32-ia32@0.25.5': 1304 | optional: true 1305 | 1306 | '@esbuild/win32-x64@0.25.5': 1307 | optional: true 1308 | 1309 | '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1)': 1310 | dependencies: 1311 | eslint: 9.30.1 1312 | eslint-visitor-keys: 3.4.3 1313 | 1314 | '@eslint-community/regexpp@4.12.1': {} 1315 | 1316 | '@eslint/config-array@0.21.0': 1317 | dependencies: 1318 | '@eslint/object-schema': 2.1.6 1319 | debug: 4.4.1 1320 | minimatch: 3.1.2 1321 | transitivePeerDependencies: 1322 | - supports-color 1323 | 1324 | '@eslint/config-helpers@0.3.0': {} 1325 | 1326 | '@eslint/core@0.14.0': 1327 | dependencies: 1328 | '@types/json-schema': 7.0.15 1329 | 1330 | '@eslint/core@0.15.1': 1331 | dependencies: 1332 | '@types/json-schema': 7.0.15 1333 | 1334 | '@eslint/eslintrc@3.3.1': 1335 | dependencies: 1336 | ajv: 6.12.6 1337 | debug: 4.4.1 1338 | espree: 10.4.0 1339 | globals: 14.0.0 1340 | ignore: 5.3.2 1341 | import-fresh: 3.3.1 1342 | js-yaml: 4.1.0 1343 | minimatch: 3.1.2 1344 | strip-json-comments: 3.1.1 1345 | transitivePeerDependencies: 1346 | - supports-color 1347 | 1348 | '@eslint/js@9.30.1': {} 1349 | 1350 | '@eslint/object-schema@2.1.6': {} 1351 | 1352 | '@eslint/plugin-kit@0.3.3': 1353 | dependencies: 1354 | '@eslint/core': 0.15.1 1355 | levn: 0.4.1 1356 | 1357 | '@humanfs/core@0.19.1': {} 1358 | 1359 | '@humanfs/node@0.16.6': 1360 | dependencies: 1361 | '@humanfs/core': 0.19.1 1362 | '@humanwhocodes/retry': 0.3.1 1363 | 1364 | '@humanwhocodes/module-importer@1.0.1': {} 1365 | 1366 | '@humanwhocodes/retry@0.3.1': {} 1367 | 1368 | '@humanwhocodes/retry@0.4.3': {} 1369 | 1370 | '@inquirer/checkbox@4.1.9(@types/node@22.16.0)': 1371 | dependencies: 1372 | '@inquirer/core': 10.1.14(@types/node@22.16.0) 1373 | '@inquirer/figures': 1.0.12 1374 | '@inquirer/type': 3.0.7(@types/node@22.16.0) 1375 | ansi-escapes: 4.3.2 1376 | yoctocolors-cjs: 2.1.2 1377 | optionalDependencies: 1378 | '@types/node': 22.16.0 1379 | 1380 | '@inquirer/confirm@5.1.13(@types/node@22.16.0)': 1381 | dependencies: 1382 | '@inquirer/core': 10.1.14(@types/node@22.16.0) 1383 | '@inquirer/type': 3.0.7(@types/node@22.16.0) 1384 | optionalDependencies: 1385 | '@types/node': 22.16.0 1386 | 1387 | '@inquirer/core@10.1.14(@types/node@22.16.0)': 1388 | dependencies: 1389 | '@inquirer/figures': 1.0.12 1390 | '@inquirer/type': 3.0.7(@types/node@22.16.0) 1391 | ansi-escapes: 4.3.2 1392 | cli-width: 4.1.0 1393 | mute-stream: 2.0.0 1394 | signal-exit: 4.1.0 1395 | wrap-ansi: 6.2.0 1396 | yoctocolors-cjs: 2.1.2 1397 | optionalDependencies: 1398 | '@types/node': 22.16.0 1399 | 1400 | '@inquirer/editor@4.2.14(@types/node@22.16.0)': 1401 | dependencies: 1402 | '@inquirer/core': 10.1.14(@types/node@22.16.0) 1403 | '@inquirer/type': 3.0.7(@types/node@22.16.0) 1404 | external-editor: 3.1.0 1405 | optionalDependencies: 1406 | '@types/node': 22.16.0 1407 | 1408 | '@inquirer/expand@4.0.16(@types/node@22.16.0)': 1409 | dependencies: 1410 | '@inquirer/core': 10.1.14(@types/node@22.16.0) 1411 | '@inquirer/type': 3.0.7(@types/node@22.16.0) 1412 | yoctocolors-cjs: 2.1.2 1413 | optionalDependencies: 1414 | '@types/node': 22.16.0 1415 | 1416 | '@inquirer/figures@1.0.12': {} 1417 | 1418 | '@inquirer/input@4.2.0(@types/node@22.16.0)': 1419 | dependencies: 1420 | '@inquirer/core': 10.1.14(@types/node@22.16.0) 1421 | '@inquirer/type': 3.0.7(@types/node@22.16.0) 1422 | optionalDependencies: 1423 | '@types/node': 22.16.0 1424 | 1425 | '@inquirer/number@3.0.16(@types/node@22.16.0)': 1426 | dependencies: 1427 | '@inquirer/core': 10.1.14(@types/node@22.16.0) 1428 | '@inquirer/type': 3.0.7(@types/node@22.16.0) 1429 | optionalDependencies: 1430 | '@types/node': 22.16.0 1431 | 1432 | '@inquirer/password@4.0.16(@types/node@22.16.0)': 1433 | dependencies: 1434 | '@inquirer/core': 10.1.14(@types/node@22.16.0) 1435 | '@inquirer/type': 3.0.7(@types/node@22.16.0) 1436 | ansi-escapes: 4.3.2 1437 | optionalDependencies: 1438 | '@types/node': 22.16.0 1439 | 1440 | '@inquirer/prompts@7.6.0(@types/node@22.16.0)': 1441 | dependencies: 1442 | '@inquirer/checkbox': 4.1.9(@types/node@22.16.0) 1443 | '@inquirer/confirm': 5.1.13(@types/node@22.16.0) 1444 | '@inquirer/editor': 4.2.14(@types/node@22.16.0) 1445 | '@inquirer/expand': 4.0.16(@types/node@22.16.0) 1446 | '@inquirer/input': 4.2.0(@types/node@22.16.0) 1447 | '@inquirer/number': 3.0.16(@types/node@22.16.0) 1448 | '@inquirer/password': 4.0.16(@types/node@22.16.0) 1449 | '@inquirer/rawlist': 4.1.4(@types/node@22.16.0) 1450 | '@inquirer/search': 3.0.16(@types/node@22.16.0) 1451 | '@inquirer/select': 4.2.4(@types/node@22.16.0) 1452 | optionalDependencies: 1453 | '@types/node': 22.16.0 1454 | 1455 | '@inquirer/rawlist@4.1.4(@types/node@22.16.0)': 1456 | dependencies: 1457 | '@inquirer/core': 10.1.14(@types/node@22.16.0) 1458 | '@inquirer/type': 3.0.7(@types/node@22.16.0) 1459 | yoctocolors-cjs: 2.1.2 1460 | optionalDependencies: 1461 | '@types/node': 22.16.0 1462 | 1463 | '@inquirer/search@3.0.16(@types/node@22.16.0)': 1464 | dependencies: 1465 | '@inquirer/core': 10.1.14(@types/node@22.16.0) 1466 | '@inquirer/figures': 1.0.12 1467 | '@inquirer/type': 3.0.7(@types/node@22.16.0) 1468 | yoctocolors-cjs: 2.1.2 1469 | optionalDependencies: 1470 | '@types/node': 22.16.0 1471 | 1472 | '@inquirer/select@4.2.4(@types/node@22.16.0)': 1473 | dependencies: 1474 | '@inquirer/core': 10.1.14(@types/node@22.16.0) 1475 | '@inquirer/figures': 1.0.12 1476 | '@inquirer/type': 3.0.7(@types/node@22.16.0) 1477 | ansi-escapes: 4.3.2 1478 | yoctocolors-cjs: 2.1.2 1479 | optionalDependencies: 1480 | '@types/node': 22.16.0 1481 | 1482 | '@inquirer/type@3.0.7(@types/node@22.16.0)': 1483 | optionalDependencies: 1484 | '@types/node': 22.16.0 1485 | 1486 | '@isaacs/cliui@8.0.2': 1487 | dependencies: 1488 | string-width: 5.1.2 1489 | string-width-cjs: string-width@4.2.3 1490 | strip-ansi: 7.1.0 1491 | strip-ansi-cjs: strip-ansi@6.0.1 1492 | wrap-ansi: 8.1.0 1493 | wrap-ansi-cjs: wrap-ansi@7.0.0 1494 | 1495 | '@jridgewell/gen-mapping@0.3.12': 1496 | dependencies: 1497 | '@jridgewell/sourcemap-codec': 1.5.4 1498 | '@jridgewell/trace-mapping': 0.3.29 1499 | 1500 | '@jridgewell/resolve-uri@3.1.2': {} 1501 | 1502 | '@jridgewell/sourcemap-codec@1.5.4': {} 1503 | 1504 | '@jridgewell/trace-mapping@0.3.29': 1505 | dependencies: 1506 | '@jridgewell/resolve-uri': 3.1.2 1507 | '@jridgewell/sourcemap-codec': 1.5.4 1508 | 1509 | '@oxlint/darwin-arm64@1.6.0': 1510 | optional: true 1511 | 1512 | '@oxlint/darwin-x64@1.6.0': 1513 | optional: true 1514 | 1515 | '@oxlint/linux-arm64-gnu@1.6.0': 1516 | optional: true 1517 | 1518 | '@oxlint/linux-arm64-musl@1.6.0': 1519 | optional: true 1520 | 1521 | '@oxlint/linux-x64-gnu@1.6.0': 1522 | optional: true 1523 | 1524 | '@oxlint/linux-x64-musl@1.6.0': 1525 | optional: true 1526 | 1527 | '@oxlint/win32-arm64@1.6.0': 1528 | optional: true 1529 | 1530 | '@oxlint/win32-x64@1.6.0': 1531 | optional: true 1532 | 1533 | '@pkgjs/parseargs@0.11.0': 1534 | optional: true 1535 | 1536 | '@rollup/rollup-android-arm-eabi@4.44.1': 1537 | optional: true 1538 | 1539 | '@rollup/rollup-android-arm64@4.44.1': 1540 | optional: true 1541 | 1542 | '@rollup/rollup-darwin-arm64@4.44.1': 1543 | optional: true 1544 | 1545 | '@rollup/rollup-darwin-x64@4.44.1': 1546 | optional: true 1547 | 1548 | '@rollup/rollup-freebsd-arm64@4.44.1': 1549 | optional: true 1550 | 1551 | '@rollup/rollup-freebsd-x64@4.44.1': 1552 | optional: true 1553 | 1554 | '@rollup/rollup-linux-arm-gnueabihf@4.44.1': 1555 | optional: true 1556 | 1557 | '@rollup/rollup-linux-arm-musleabihf@4.44.1': 1558 | optional: true 1559 | 1560 | '@rollup/rollup-linux-arm64-gnu@4.44.1': 1561 | optional: true 1562 | 1563 | '@rollup/rollup-linux-arm64-musl@4.44.1': 1564 | optional: true 1565 | 1566 | '@rollup/rollup-linux-loongarch64-gnu@4.44.1': 1567 | optional: true 1568 | 1569 | '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': 1570 | optional: true 1571 | 1572 | '@rollup/rollup-linux-riscv64-gnu@4.44.1': 1573 | optional: true 1574 | 1575 | '@rollup/rollup-linux-riscv64-musl@4.44.1': 1576 | optional: true 1577 | 1578 | '@rollup/rollup-linux-s390x-gnu@4.44.1': 1579 | optional: true 1580 | 1581 | '@rollup/rollup-linux-x64-gnu@4.44.1': 1582 | optional: true 1583 | 1584 | '@rollup/rollup-linux-x64-musl@4.44.1': 1585 | optional: true 1586 | 1587 | '@rollup/rollup-win32-arm64-msvc@4.44.1': 1588 | optional: true 1589 | 1590 | '@rollup/rollup-win32-ia32-msvc@4.44.1': 1591 | optional: true 1592 | 1593 | '@rollup/rollup-win32-x64-msvc@4.44.1': 1594 | optional: true 1595 | 1596 | '@types/estree@1.0.8': {} 1597 | 1598 | '@types/fs-extra@11.0.4': 1599 | dependencies: 1600 | '@types/jsonfile': 6.1.4 1601 | '@types/node': 22.16.0 1602 | 1603 | '@types/inquirer@9.0.8': 1604 | dependencies: 1605 | '@types/through': 0.0.33 1606 | rxjs: 7.8.2 1607 | 1608 | '@types/json-schema@7.0.15': {} 1609 | 1610 | '@types/jsonfile@6.1.4': 1611 | dependencies: 1612 | '@types/node': 22.16.0 1613 | 1614 | '@types/node@22.16.0': 1615 | dependencies: 1616 | undici-types: 6.21.0 1617 | 1618 | '@types/through@0.0.33': 1619 | dependencies: 1620 | '@types/node': 22.16.0 1621 | 1622 | acorn-jsx@5.3.2(acorn@8.15.0): 1623 | dependencies: 1624 | acorn: 8.15.0 1625 | 1626 | acorn@8.15.0: {} 1627 | 1628 | ajv@6.12.6: 1629 | dependencies: 1630 | fast-deep-equal: 3.1.3 1631 | fast-json-stable-stringify: 2.1.0 1632 | json-schema-traverse: 0.4.1 1633 | uri-js: 4.4.1 1634 | 1635 | ansi-escapes@4.3.2: 1636 | dependencies: 1637 | type-fest: 0.21.3 1638 | 1639 | ansi-regex@5.0.1: {} 1640 | 1641 | ansi-regex@6.1.0: {} 1642 | 1643 | ansi-styles@4.3.0: 1644 | dependencies: 1645 | color-convert: 2.0.1 1646 | 1647 | ansi-styles@6.2.1: {} 1648 | 1649 | any-promise@1.3.0: {} 1650 | 1651 | argparse@2.0.1: {} 1652 | 1653 | balanced-match@1.0.2: {} 1654 | 1655 | brace-expansion@1.1.12: 1656 | dependencies: 1657 | balanced-match: 1.0.2 1658 | concat-map: 0.0.1 1659 | 1660 | brace-expansion@2.0.2: 1661 | dependencies: 1662 | balanced-match: 1.0.2 1663 | 1664 | bundle-require@5.1.0(esbuild@0.25.5): 1665 | dependencies: 1666 | esbuild: 0.25.5 1667 | load-tsconfig: 0.2.5 1668 | 1669 | cac@6.7.14: {} 1670 | 1671 | callsites@3.1.0: {} 1672 | 1673 | chalk@4.1.2: 1674 | dependencies: 1675 | ansi-styles: 4.3.0 1676 | supports-color: 7.2.0 1677 | 1678 | chardet@0.7.0: {} 1679 | 1680 | chokidar@4.0.3: 1681 | dependencies: 1682 | readdirp: 4.1.2 1683 | 1684 | cli-width@4.1.0: {} 1685 | 1686 | color-convert@2.0.1: 1687 | dependencies: 1688 | color-name: 1.1.4 1689 | 1690 | color-name@1.1.4: {} 1691 | 1692 | commander@14.0.0: {} 1693 | 1694 | commander@4.1.1: {} 1695 | 1696 | concat-map@0.0.1: {} 1697 | 1698 | confbox@0.1.8: {} 1699 | 1700 | consola@3.4.2: {} 1701 | 1702 | cross-spawn@7.0.6: 1703 | dependencies: 1704 | path-key: 3.1.1 1705 | shebang-command: 2.0.0 1706 | which: 2.0.2 1707 | 1708 | debug@4.4.1: 1709 | dependencies: 1710 | ms: 2.1.3 1711 | 1712 | deep-is@0.1.4: {} 1713 | 1714 | eastasianwidth@0.2.0: {} 1715 | 1716 | emoji-regex@8.0.0: {} 1717 | 1718 | emoji-regex@9.2.2: {} 1719 | 1720 | esbuild@0.25.5: 1721 | optionalDependencies: 1722 | '@esbuild/aix-ppc64': 0.25.5 1723 | '@esbuild/android-arm': 0.25.5 1724 | '@esbuild/android-arm64': 0.25.5 1725 | '@esbuild/android-x64': 0.25.5 1726 | '@esbuild/darwin-arm64': 0.25.5 1727 | '@esbuild/darwin-x64': 0.25.5 1728 | '@esbuild/freebsd-arm64': 0.25.5 1729 | '@esbuild/freebsd-x64': 0.25.5 1730 | '@esbuild/linux-arm': 0.25.5 1731 | '@esbuild/linux-arm64': 0.25.5 1732 | '@esbuild/linux-ia32': 0.25.5 1733 | '@esbuild/linux-loong64': 0.25.5 1734 | '@esbuild/linux-mips64el': 0.25.5 1735 | '@esbuild/linux-ppc64': 0.25.5 1736 | '@esbuild/linux-riscv64': 0.25.5 1737 | '@esbuild/linux-s390x': 0.25.5 1738 | '@esbuild/linux-x64': 0.25.5 1739 | '@esbuild/netbsd-arm64': 0.25.5 1740 | '@esbuild/netbsd-x64': 0.25.5 1741 | '@esbuild/openbsd-arm64': 0.25.5 1742 | '@esbuild/openbsd-x64': 0.25.5 1743 | '@esbuild/sunos-x64': 0.25.5 1744 | '@esbuild/win32-arm64': 0.25.5 1745 | '@esbuild/win32-ia32': 0.25.5 1746 | '@esbuild/win32-x64': 0.25.5 1747 | 1748 | escape-string-regexp@4.0.0: {} 1749 | 1750 | eslint-scope@8.4.0: 1751 | dependencies: 1752 | esrecurse: 4.3.0 1753 | estraverse: 5.3.0 1754 | 1755 | eslint-visitor-keys@3.4.3: {} 1756 | 1757 | eslint-visitor-keys@4.2.1: {} 1758 | 1759 | eslint@9.30.1: 1760 | dependencies: 1761 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1) 1762 | '@eslint-community/regexpp': 4.12.1 1763 | '@eslint/config-array': 0.21.0 1764 | '@eslint/config-helpers': 0.3.0 1765 | '@eslint/core': 0.14.0 1766 | '@eslint/eslintrc': 3.3.1 1767 | '@eslint/js': 9.30.1 1768 | '@eslint/plugin-kit': 0.3.3 1769 | '@humanfs/node': 0.16.6 1770 | '@humanwhocodes/module-importer': 1.0.1 1771 | '@humanwhocodes/retry': 0.4.3 1772 | '@types/estree': 1.0.8 1773 | '@types/json-schema': 7.0.15 1774 | ajv: 6.12.6 1775 | chalk: 4.1.2 1776 | cross-spawn: 7.0.6 1777 | debug: 4.4.1 1778 | escape-string-regexp: 4.0.0 1779 | eslint-scope: 8.4.0 1780 | eslint-visitor-keys: 4.2.1 1781 | espree: 10.4.0 1782 | esquery: 1.6.0 1783 | esutils: 2.0.3 1784 | fast-deep-equal: 3.1.3 1785 | file-entry-cache: 8.0.0 1786 | find-up: 5.0.0 1787 | glob-parent: 6.0.2 1788 | ignore: 5.3.2 1789 | imurmurhash: 0.1.4 1790 | is-glob: 4.0.3 1791 | json-stable-stringify-without-jsonify: 1.0.1 1792 | lodash.merge: 4.6.2 1793 | minimatch: 3.1.2 1794 | natural-compare: 1.4.0 1795 | optionator: 0.9.4 1796 | transitivePeerDependencies: 1797 | - supports-color 1798 | 1799 | espree@10.4.0: 1800 | dependencies: 1801 | acorn: 8.15.0 1802 | acorn-jsx: 5.3.2(acorn@8.15.0) 1803 | eslint-visitor-keys: 4.2.1 1804 | 1805 | esquery@1.6.0: 1806 | dependencies: 1807 | estraverse: 5.3.0 1808 | 1809 | esrecurse@4.3.0: 1810 | dependencies: 1811 | estraverse: 5.3.0 1812 | 1813 | estraverse@5.3.0: {} 1814 | 1815 | esutils@2.0.3: {} 1816 | 1817 | external-editor@3.1.0: 1818 | dependencies: 1819 | chardet: 0.7.0 1820 | iconv-lite: 0.4.24 1821 | tmp: 0.0.33 1822 | 1823 | fast-deep-equal@3.1.3: {} 1824 | 1825 | fast-json-stable-stringify@2.1.0: {} 1826 | 1827 | fast-levenshtein@2.0.6: {} 1828 | 1829 | fdir@6.4.6(picomatch@4.0.2): 1830 | optionalDependencies: 1831 | picomatch: 4.0.2 1832 | 1833 | file-entry-cache@8.0.0: 1834 | dependencies: 1835 | flat-cache: 4.0.1 1836 | 1837 | find-up@5.0.0: 1838 | dependencies: 1839 | locate-path: 6.0.0 1840 | path-exists: 4.0.0 1841 | 1842 | fix-dts-default-cjs-exports@1.0.1: 1843 | dependencies: 1844 | magic-string: 0.30.17 1845 | mlly: 1.7.4 1846 | rollup: 4.44.1 1847 | 1848 | flat-cache@4.0.1: 1849 | dependencies: 1850 | flatted: 3.3.3 1851 | keyv: 4.5.4 1852 | 1853 | flatted@3.3.3: {} 1854 | 1855 | foreground-child@3.3.1: 1856 | dependencies: 1857 | cross-spawn: 7.0.6 1858 | signal-exit: 4.1.0 1859 | 1860 | fs-extra@11.3.0: 1861 | dependencies: 1862 | graceful-fs: 4.2.11 1863 | jsonfile: 6.1.0 1864 | universalify: 2.0.1 1865 | 1866 | fsevents@2.3.3: 1867 | optional: true 1868 | 1869 | get-tsconfig@4.10.1: 1870 | dependencies: 1871 | resolve-pkg-maps: 1.0.0 1872 | 1873 | glob-parent@6.0.2: 1874 | dependencies: 1875 | is-glob: 4.0.3 1876 | 1877 | glob@10.4.5: 1878 | dependencies: 1879 | foreground-child: 3.3.1 1880 | jackspeak: 3.4.3 1881 | minimatch: 9.0.5 1882 | minipass: 7.1.2 1883 | package-json-from-dist: 1.0.1 1884 | path-scurry: 1.11.1 1885 | 1886 | globals@14.0.0: {} 1887 | 1888 | graceful-fs@4.2.11: {} 1889 | 1890 | has-flag@4.0.0: {} 1891 | 1892 | iconv-lite@0.4.24: 1893 | dependencies: 1894 | safer-buffer: 2.1.2 1895 | 1896 | ignore@5.3.2: {} 1897 | 1898 | import-fresh@3.3.1: 1899 | dependencies: 1900 | parent-module: 1.0.1 1901 | resolve-from: 4.0.0 1902 | 1903 | imurmurhash@0.1.4: {} 1904 | 1905 | inquirer@12.7.0(@types/node@22.16.0): 1906 | dependencies: 1907 | '@inquirer/core': 10.1.14(@types/node@22.16.0) 1908 | '@inquirer/prompts': 7.6.0(@types/node@22.16.0) 1909 | '@inquirer/type': 3.0.7(@types/node@22.16.0) 1910 | ansi-escapes: 4.3.2 1911 | mute-stream: 2.0.0 1912 | run-async: 4.0.4 1913 | rxjs: 7.8.2 1914 | optionalDependencies: 1915 | '@types/node': 22.16.0 1916 | 1917 | is-extglob@2.1.1: {} 1918 | 1919 | is-fullwidth-code-point@3.0.0: {} 1920 | 1921 | is-glob@4.0.3: 1922 | dependencies: 1923 | is-extglob: 2.1.1 1924 | 1925 | isexe@2.0.0: {} 1926 | 1927 | jackspeak@3.4.3: 1928 | dependencies: 1929 | '@isaacs/cliui': 8.0.2 1930 | optionalDependencies: 1931 | '@pkgjs/parseargs': 0.11.0 1932 | 1933 | joycon@3.1.1: {} 1934 | 1935 | js-yaml@4.1.0: 1936 | dependencies: 1937 | argparse: 2.0.1 1938 | 1939 | json-buffer@3.0.1: {} 1940 | 1941 | json-schema-traverse@0.4.1: {} 1942 | 1943 | json-stable-stringify-without-jsonify@1.0.1: {} 1944 | 1945 | jsonfile@6.1.0: 1946 | dependencies: 1947 | universalify: 2.0.1 1948 | optionalDependencies: 1949 | graceful-fs: 4.2.11 1950 | 1951 | keyv@4.5.4: 1952 | dependencies: 1953 | json-buffer: 3.0.1 1954 | 1955 | levn@0.4.1: 1956 | dependencies: 1957 | prelude-ls: 1.2.1 1958 | type-check: 0.4.0 1959 | 1960 | lilconfig@3.1.3: {} 1961 | 1962 | lines-and-columns@1.2.4: {} 1963 | 1964 | load-tsconfig@0.2.5: {} 1965 | 1966 | locate-path@6.0.0: 1967 | dependencies: 1968 | p-locate: 5.0.0 1969 | 1970 | lodash.merge@4.6.2: {} 1971 | 1972 | lodash.sortby@4.7.0: {} 1973 | 1974 | lru-cache@10.4.3: {} 1975 | 1976 | magic-string@0.30.17: 1977 | dependencies: 1978 | '@jridgewell/sourcemap-codec': 1.5.4 1979 | 1980 | minimatch@3.1.2: 1981 | dependencies: 1982 | brace-expansion: 1.1.12 1983 | 1984 | minimatch@9.0.5: 1985 | dependencies: 1986 | brace-expansion: 2.0.2 1987 | 1988 | minipass@7.1.2: {} 1989 | 1990 | mlly@1.7.4: 1991 | dependencies: 1992 | acorn: 8.15.0 1993 | pathe: 2.0.3 1994 | pkg-types: 1.3.1 1995 | ufo: 1.6.1 1996 | 1997 | ms@2.1.3: {} 1998 | 1999 | mute-stream@2.0.0: {} 2000 | 2001 | mz@2.7.0: 2002 | dependencies: 2003 | any-promise: 1.3.0 2004 | object-assign: 4.1.1 2005 | thenify-all: 1.6.0 2006 | 2007 | nanoid@3.3.11: 2008 | optional: true 2009 | 2010 | natural-compare@1.4.0: {} 2011 | 2012 | object-assign@4.1.1: {} 2013 | 2014 | optionator@0.9.4: 2015 | dependencies: 2016 | deep-is: 0.1.4 2017 | fast-levenshtein: 2.0.6 2018 | levn: 0.4.1 2019 | prelude-ls: 1.2.1 2020 | type-check: 0.4.0 2021 | word-wrap: 1.2.5 2022 | 2023 | os-tmpdir@1.0.2: {} 2024 | 2025 | oxlint@1.6.0: 2026 | optionalDependencies: 2027 | '@oxlint/darwin-arm64': 1.6.0 2028 | '@oxlint/darwin-x64': 1.6.0 2029 | '@oxlint/linux-arm64-gnu': 1.6.0 2030 | '@oxlint/linux-arm64-musl': 1.6.0 2031 | '@oxlint/linux-x64-gnu': 1.6.0 2032 | '@oxlint/linux-x64-musl': 1.6.0 2033 | '@oxlint/win32-arm64': 1.6.0 2034 | '@oxlint/win32-x64': 1.6.0 2035 | 2036 | p-limit@3.1.0: 2037 | dependencies: 2038 | yocto-queue: 0.1.0 2039 | 2040 | p-locate@5.0.0: 2041 | dependencies: 2042 | p-limit: 3.1.0 2043 | 2044 | package-json-from-dist@1.0.1: {} 2045 | 2046 | parent-module@1.0.1: 2047 | dependencies: 2048 | callsites: 3.1.0 2049 | 2050 | path-exists@4.0.0: {} 2051 | 2052 | path-key@3.1.1: {} 2053 | 2054 | path-scurry@1.11.1: 2055 | dependencies: 2056 | lru-cache: 10.4.3 2057 | minipass: 7.1.2 2058 | 2059 | pathe@2.0.3: {} 2060 | 2061 | picocolors@1.1.1: {} 2062 | 2063 | picomatch@4.0.2: {} 2064 | 2065 | pirates@4.0.7: {} 2066 | 2067 | pkg-types@1.3.1: 2068 | dependencies: 2069 | confbox: 0.1.8 2070 | mlly: 1.7.4 2071 | pathe: 2.0.3 2072 | 2073 | postcss-load-config@6.0.1(postcss@8.5.6)(tsx@4.20.3): 2074 | dependencies: 2075 | lilconfig: 3.1.3 2076 | optionalDependencies: 2077 | postcss: 8.5.6 2078 | tsx: 4.20.3 2079 | 2080 | postcss@8.5.6: 2081 | dependencies: 2082 | nanoid: 3.3.11 2083 | picocolors: 1.1.1 2084 | source-map-js: 1.2.1 2085 | optional: true 2086 | 2087 | prelude-ls@1.2.1: {} 2088 | 2089 | prettier@3.6.2: {} 2090 | 2091 | punycode@2.3.1: {} 2092 | 2093 | readdirp@4.1.2: {} 2094 | 2095 | resolve-from@4.0.0: {} 2096 | 2097 | resolve-from@5.0.0: {} 2098 | 2099 | resolve-pkg-maps@1.0.0: {} 2100 | 2101 | rollup@4.44.1: 2102 | dependencies: 2103 | '@types/estree': 1.0.8 2104 | optionalDependencies: 2105 | '@rollup/rollup-android-arm-eabi': 4.44.1 2106 | '@rollup/rollup-android-arm64': 4.44.1 2107 | '@rollup/rollup-darwin-arm64': 4.44.1 2108 | '@rollup/rollup-darwin-x64': 4.44.1 2109 | '@rollup/rollup-freebsd-arm64': 4.44.1 2110 | '@rollup/rollup-freebsd-x64': 4.44.1 2111 | '@rollup/rollup-linux-arm-gnueabihf': 4.44.1 2112 | '@rollup/rollup-linux-arm-musleabihf': 4.44.1 2113 | '@rollup/rollup-linux-arm64-gnu': 4.44.1 2114 | '@rollup/rollup-linux-arm64-musl': 4.44.1 2115 | '@rollup/rollup-linux-loongarch64-gnu': 4.44.1 2116 | '@rollup/rollup-linux-powerpc64le-gnu': 4.44.1 2117 | '@rollup/rollup-linux-riscv64-gnu': 4.44.1 2118 | '@rollup/rollup-linux-riscv64-musl': 4.44.1 2119 | '@rollup/rollup-linux-s390x-gnu': 4.44.1 2120 | '@rollup/rollup-linux-x64-gnu': 4.44.1 2121 | '@rollup/rollup-linux-x64-musl': 4.44.1 2122 | '@rollup/rollup-win32-arm64-msvc': 4.44.1 2123 | '@rollup/rollup-win32-ia32-msvc': 4.44.1 2124 | '@rollup/rollup-win32-x64-msvc': 4.44.1 2125 | fsevents: 2.3.3 2126 | 2127 | run-async@4.0.4: 2128 | dependencies: 2129 | oxlint: 1.6.0 2130 | prettier: 3.6.2 2131 | 2132 | rxjs@7.8.2: 2133 | dependencies: 2134 | tslib: 2.8.1 2135 | 2136 | safer-buffer@2.1.2: {} 2137 | 2138 | shebang-command@2.0.0: 2139 | dependencies: 2140 | shebang-regex: 3.0.0 2141 | 2142 | shebang-regex@3.0.0: {} 2143 | 2144 | signal-exit@4.1.0: {} 2145 | 2146 | source-map-js@1.2.1: 2147 | optional: true 2148 | 2149 | source-map@0.8.0-beta.0: 2150 | dependencies: 2151 | whatwg-url: 7.1.0 2152 | 2153 | string-width@4.2.3: 2154 | dependencies: 2155 | emoji-regex: 8.0.0 2156 | is-fullwidth-code-point: 3.0.0 2157 | strip-ansi: 6.0.1 2158 | 2159 | string-width@5.1.2: 2160 | dependencies: 2161 | eastasianwidth: 0.2.0 2162 | emoji-regex: 9.2.2 2163 | strip-ansi: 7.1.0 2164 | 2165 | strip-ansi@6.0.1: 2166 | dependencies: 2167 | ansi-regex: 5.0.1 2168 | 2169 | strip-ansi@7.1.0: 2170 | dependencies: 2171 | ansi-regex: 6.1.0 2172 | 2173 | strip-json-comments@3.1.1: {} 2174 | 2175 | sucrase@3.35.0: 2176 | dependencies: 2177 | '@jridgewell/gen-mapping': 0.3.12 2178 | commander: 4.1.1 2179 | glob: 10.4.5 2180 | lines-and-columns: 1.2.4 2181 | mz: 2.7.0 2182 | pirates: 4.0.7 2183 | ts-interface-checker: 0.1.13 2184 | 2185 | supports-color@7.2.0: 2186 | dependencies: 2187 | has-flag: 4.0.0 2188 | 2189 | thenify-all@1.6.0: 2190 | dependencies: 2191 | thenify: 3.3.1 2192 | 2193 | thenify@3.3.1: 2194 | dependencies: 2195 | any-promise: 1.3.0 2196 | 2197 | tinyexec@0.3.2: {} 2198 | 2199 | tinyglobby@0.2.14: 2200 | dependencies: 2201 | fdir: 6.4.6(picomatch@4.0.2) 2202 | picomatch: 4.0.2 2203 | 2204 | tmp@0.0.33: 2205 | dependencies: 2206 | os-tmpdir: 1.0.2 2207 | 2208 | tr46@1.0.1: 2209 | dependencies: 2210 | punycode: 2.3.1 2211 | 2212 | tree-kill@1.2.2: {} 2213 | 2214 | ts-interface-checker@0.1.13: {} 2215 | 2216 | tslib@2.8.1: {} 2217 | 2218 | tsup@8.5.0(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3): 2219 | dependencies: 2220 | bundle-require: 5.1.0(esbuild@0.25.5) 2221 | cac: 6.7.14 2222 | chokidar: 4.0.3 2223 | consola: 3.4.2 2224 | debug: 4.4.1 2225 | esbuild: 0.25.5 2226 | fix-dts-default-cjs-exports: 1.0.1 2227 | joycon: 3.1.1 2228 | picocolors: 1.1.1 2229 | postcss-load-config: 6.0.1(postcss@8.5.6)(tsx@4.20.3) 2230 | resolve-from: 5.0.0 2231 | rollup: 4.44.1 2232 | source-map: 0.8.0-beta.0 2233 | sucrase: 3.35.0 2234 | tinyexec: 0.3.2 2235 | tinyglobby: 0.2.14 2236 | tree-kill: 1.2.2 2237 | optionalDependencies: 2238 | postcss: 8.5.6 2239 | typescript: 5.8.3 2240 | transitivePeerDependencies: 2241 | - jiti 2242 | - supports-color 2243 | - tsx 2244 | - yaml 2245 | 2246 | tsx@4.20.3: 2247 | dependencies: 2248 | esbuild: 0.25.5 2249 | get-tsconfig: 4.10.1 2250 | optionalDependencies: 2251 | fsevents: 2.3.3 2252 | 2253 | type-check@0.4.0: 2254 | dependencies: 2255 | prelude-ls: 1.2.1 2256 | 2257 | type-fest@0.21.3: {} 2258 | 2259 | typescript@5.8.3: {} 2260 | 2261 | ufo@1.6.1: {} 2262 | 2263 | undici-types@6.21.0: {} 2264 | 2265 | universalify@2.0.1: {} 2266 | 2267 | uri-js@4.4.1: 2268 | dependencies: 2269 | punycode: 2.3.1 2270 | 2271 | webidl-conversions@4.0.2: {} 2272 | 2273 | whatwg-url@7.1.0: 2274 | dependencies: 2275 | lodash.sortby: 4.7.0 2276 | tr46: 1.0.1 2277 | webidl-conversions: 4.0.2 2278 | 2279 | which@2.0.2: 2280 | dependencies: 2281 | isexe: 2.0.0 2282 | 2283 | word-wrap@1.2.5: {} 2284 | 2285 | wrap-ansi@6.2.0: 2286 | dependencies: 2287 | ansi-styles: 4.3.0 2288 | string-width: 4.2.3 2289 | strip-ansi: 6.0.1 2290 | 2291 | wrap-ansi@7.0.0: 2292 | dependencies: 2293 | ansi-styles: 4.3.0 2294 | string-width: 4.2.3 2295 | strip-ansi: 6.0.1 2296 | 2297 | wrap-ansi@8.1.0: 2298 | dependencies: 2299 | ansi-styles: 6.2.1 2300 | string-width: 5.1.2 2301 | strip-ansi: 7.1.0 2302 | 2303 | yocto-queue@0.1.0: {} 2304 | 2305 | yoctocolors-cjs@2.1.2: {} 2306 | -------------------------------------------------------------------------------- /scripts/generate-all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Script to generate all component library and map library combinations for easy inspection 4 | 5 | set -e # Exit on any error 6 | 7 | # Load nvm and use the correct Node version 8 | export NVM_DIR="$HOME/.nvm" 9 | [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 10 | [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion 11 | 12 | # Use the Node version specified in .nvmrc if it exists 13 | if [ -f ".nvmrc" ]; then 14 | nvm use 15 | fi 16 | 17 | echo "Generating all component library and map library combinations..." 18 | echo "" 19 | 20 | # Define the variants 21 | component_libraries=("none" "chakra" "uswds") 22 | map_libraries=("none" "mapbox-gl" "maplibre-gl") 23 | 24 | # Counter for total projects 25 | total_projects=0 26 | 27 | # Generate each combination 28 | for component_lib in "${component_libraries[@]}"; do 29 | for map_lib in "${map_libraries[@]}"; do 30 | # Create a descriptive project name 31 | if [ "$map_lib" = "none" ]; then 32 | project_name="project-seed-${component_lib}" 33 | else 34 | project_name="project-seed-${component_lib}-${map_lib}" 35 | fi 36 | 37 | echo "Generating $component_lib + $map_lib variant..." 38 | echo "Project name: $project_name" 39 | 40 | # Generate the project with both component library and map library 41 | pnpm start "$project_name" --component-library "$component_lib" --map-library "$map_lib" --force 42 | 43 | echo "✅ Generated $component_lib + $map_lib variant" 44 | echo "" 45 | 46 | ((total_projects++)) 47 | done 48 | done 49 | 50 | echo "🎉 All combinations generated successfully!" 51 | echo "" 52 | echo "Generated projects ($total_projects total):" 53 | echo "" 54 | 55 | # List all generated projects 56 | for component_lib in "${component_libraries[@]}"; do 57 | for map_lib in "${map_libraries[@]}"; do 58 | if [ "$map_lib" = "none" ]; then 59 | project_name="project-seed-${component_lib}" 60 | echo " - $project_name ($component_lib component library, no map)" 61 | else 62 | project_name="project-seed-${component_lib}-${map_lib}" 63 | echo " - $project_name ($component_lib component library + $map_lib map)" 64 | fi 65 | done 66 | done 67 | -------------------------------------------------------------------------------- /src/generator/apply-component-library.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs-extra'; 2 | import path from 'path'; 3 | import { mergePackageDependencies } from './merge-package-dependencies'; 4 | import { getTemplatePath } from './template-paths'; 5 | 6 | /** 7 | * Applies the selected component library template to the generated project. 8 | * Copies files from the component library template directory and merges dependencies 9 | * from the template's package.json into the main project's package.json. 10 | * 11 | * @param targetDir - Target directory where the project is being generated 12 | * @param componentLibrary - Name of the component library template to apply 13 | * @throws {Error} When the component library template directory is not found 14 | */ 15 | export async function applyComponentLibrary( 16 | targetDir: string, 17 | componentLibrary: string 18 | ): Promise { 19 | const componentLibDir = await getTemplatePath( 20 | 'component-library', 21 | componentLibrary 22 | ); 23 | if (!(await fs.pathExists(componentLibDir))) { 24 | throw new Error( 25 | `Component library template not found: ${componentLibrary}` 26 | ); 27 | } 28 | const items = await fs.readdir(componentLibDir); 29 | for (const item of items) { 30 | if (item === 'package.json') continue; 31 | const srcPath = path.join(componentLibDir, item); 32 | const destPath = path.join(targetDir, 'app', item); 33 | await fs.copy(srcPath, destPath); 34 | } 35 | const variantPackagePath = path.join(componentLibDir, 'package.json'); 36 | await mergePackageDependencies(targetDir, variantPackagePath); 37 | } 38 | -------------------------------------------------------------------------------- /src/generator/apply-map-library.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs-extra'; 2 | import path from 'path'; 3 | import { mergePackageDependencies } from './merge-package-dependencies'; 4 | import { getTemplatePath } from './template-paths'; 5 | 6 | /** 7 | * Applies the selected map library template to the generated project. 8 | * Copies files from the map library template directory and merges dependencies 9 | * from the template's package.json into the main project's package.json. 10 | * 11 | * @param targetDir - Target directory where the project is being generated 12 | * @param mapLibrary - Name of the map library template to apply 13 | * @throws {Error} When the map library template directory is not found 14 | */ 15 | export async function applyMapLibrary( 16 | targetDir: string, 17 | mapLibrary: string 18 | ): Promise { 19 | if (mapLibrary === 'none') { 20 | return; 21 | } 22 | 23 | const mapLibDir = await getTemplatePath('map', mapLibrary); 24 | 25 | if (!(await fs.pathExists(mapLibDir))) { 26 | throw new Error(`Map library template not found: ${mapLibrary}`); 27 | } 28 | 29 | const items = await fs.readdir(mapLibDir); 30 | 31 | for (const item of items) { 32 | if (item === 'package.json' || item === 'main.tsx') continue; 33 | 34 | const srcPath = path.join(mapLibDir, item); 35 | const destPath = path.join(targetDir, 'app', item); 36 | await fs.copy(srcPath, destPath); 37 | } 38 | 39 | const variantPackagePath = path.join(mapLibDir, 'package.json'); 40 | await mergePackageDependencies(targetDir, variantPackagePath); 41 | } 42 | -------------------------------------------------------------------------------- /src/generator/create-env-file.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs-extra'; 2 | import path from 'path'; 3 | 4 | /** 5 | * Creates a .env file in the target directory with default Vite environment variables. 6 | * Sets the app title and description based on the project name. 7 | * Includes comments explaining the purpose of each variable for development guidance. 8 | * Shows warning for Mapbox token when mapbox-gl is selected. 9 | * 10 | * @param targetDir - Directory where the .env file will be created 11 | * @param projectName - Project name to use for the app title and description 12 | * @param mapLibrary - Map library being used (e.g., 'mapbox-gl', 'maplibre-gl', 'none') 13 | */ 14 | export async function createEnvFile( 15 | targetDir: string, 16 | projectName: string, 17 | mapLibrary: string 18 | ): Promise { 19 | // Show warning for Mapbox token if mapbox-gl is selected 20 | if (mapLibrary === 'mapbox-gl') { 21 | // eslint-disable-next-line no-console 22 | console.log('⚠️ Note: Mapbox GL requires an access token.'); 23 | // eslint-disable-next-line no-console 24 | console.log( 25 | ' Please set VITE_MAPBOX_ACCESS_TOKEN in your .env file after generation.' 26 | ); 27 | } 28 | 29 | // Create .env.example file with placeholder for Mapbox token 30 | let envContent = `# ============================================= 31 | # Environment Example File 32 | # ============================================= 33 | # IMPORTANT: DO NOT MODIFY THIS FILE! 34 | # Instead, create a copy named '.env' and modify that file. 35 | # This example file serves as a template and documentation. 36 | # ============================================= 37 | 38 | # ================= 39 | # App Configuration 40 | # ================= 41 | 42 | VITE_BASE_URL= 43 | VITE_APP_TITLE=${projectName} 44 | VITE_APP_DESCRIPTION=A web application built with Vite and React 45 | `; 46 | 47 | if (mapLibrary === 'mapbox-gl') { 48 | envContent += `\n# Mapbox API Token (required for Mapbox maps)\nVITE_MAPBOX_ACCESS_TOKEN=your_mapbox_token_here\n`; 49 | } 50 | 51 | await fs.writeFile(path.join(targetDir, '.env'), envContent); 52 | await fs.writeFile(path.join(targetDir, '.env.example'), envContent); 53 | } 54 | -------------------------------------------------------------------------------- /src/generator/index.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs-extra'; 2 | import path from 'path'; 3 | import { createEnvFile } from './create-env-file'; 4 | import { processReadme } from './process-readme'; 5 | import { applyComponentLibrary } from './apply-component-library'; 6 | import { applyMapLibrary } from './apply-map-library'; 7 | import { getTemplatePath } from './template-paths'; 8 | import { setupGitHooks } from './setup-git-hooks'; 9 | 10 | /** 11 | * Main project generation function that orchestrates the entire project creation process. 12 | * Copies base template files, applies component library modifications, applies map library 13 | * modifications, updates configuration files, and handles error cleanup if the generation fails. 14 | * 15 | * @param projectName - Name of the project to generate 16 | * @param componentLibrary - Component library template to apply (e.g., 'chakra', 'uswds', 'none') 17 | * @param mapLibrary - Map library template to apply (e.g., 'mapbox-gl', 'maplibre-gl', 'none') 18 | * @param force - Whether to overwrite existing directory if it exists 19 | * @param targetDir - Target directory where the project will be generated 20 | * @throws {Error} When target directory exists and force is false, or when generation fails 21 | */ 22 | export async function generateProject( 23 | projectName: string, 24 | componentLibrary: string, 25 | mapLibrary: string, 26 | force: boolean, 27 | targetDir: string 28 | ): Promise { 29 | const baseTemplateDir = await getTemplatePath('base'); 30 | 31 | if (await fs.pathExists(targetDir)) { 32 | if (!force) { 33 | throw new Error( 34 | `Target directory ${targetDir} already exists. Use --force to overwrite.` 35 | ); 36 | } 37 | // Remove existing directory if force is enabled 38 | await fs.remove(targetDir); 39 | } 40 | 41 | try { 42 | // Copy base template files 43 | await fs.copy(baseTemplateDir, targetDir); 44 | 45 | // Apply component library specific modifications 46 | await applyComponentLibrary(targetDir, componentLibrary); 47 | 48 | // Apply map library specific modifications 49 | await applyMapLibrary(targetDir, mapLibrary); 50 | 51 | // Update package.json with project name 52 | const pkgPath = path.join(targetDir, 'package.json'); 53 | if (await fs.pathExists(pkgPath)) { 54 | const pkg = await fs.readJson(pkgPath); 55 | await fs.writeJson(pkgPath, { ...pkg, name: projectName }, { spaces: 2 }); 56 | } else { 57 | throw new Error( 58 | 'Template package.json not found. Please check the template directory.' 59 | ); 60 | } 61 | 62 | await processReadme(targetDir, projectName); 63 | await createEnvFile(targetDir, projectName, mapLibrary); 64 | 65 | // Initialize git and set up husky hooks 66 | await setupGitHooks(targetDir); 67 | 68 | // eslint-disable-next-line no-console 69 | console.log(`Project generated at ${targetDir}`); 70 | } catch (error) { 71 | if (await fs.pathExists(targetDir)) { 72 | await fs.remove(targetDir); 73 | } 74 | throw error; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/generator/merge-package-dependencies.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs-extra'; 2 | import path from 'path'; 3 | 4 | /** 5 | * Merges dependencies from a variant package.json into the main project's package.json. 6 | * This function reads the variant package.json file and merges its dependencies 7 | * into the target project's package.json file. 8 | * 9 | * @param targetDir - Target directory where the project is being generated 10 | * @param variantPackagePath - Path to the variant package.json file to merge 11 | */ 12 | export async function mergePackageDependencies( 13 | targetDir: string, 14 | variantPackagePath: string 15 | ): Promise { 16 | if (await fs.pathExists(variantPackagePath)) { 17 | const packageJsonPath = path.join(targetDir, 'package.json'); 18 | const basePackage = await fs.readJson(packageJsonPath); 19 | const variantPackage = await fs.readJson(variantPackagePath); 20 | 21 | basePackage.dependencies = { 22 | ...basePackage.dependencies, 23 | ...variantPackage.dependencies 24 | }; 25 | 26 | await fs.writeJson(packageJsonPath, basePackage, { spaces: 2 }); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/generator/process-readme.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs-extra'; 2 | import path from 'path'; 3 | import { replaceInFile } from './replace-in-file'; 4 | 5 | /** 6 | * Processes the _README.md template file by replacing placeholders and renaming it to README.md. 7 | * Converts the project name to a title case format and creates a descriptive summary. 8 | * Uses regex replacement to update template placeholders with actual project information. 9 | * 10 | * @param targetDir - Directory containing the _README.md template file 11 | * @param projectName - Project name to use for title and description replacements 12 | */ 13 | export async function processReadme( 14 | targetDir: string, 15 | projectName: string 16 | ): Promise { 17 | const readmePath = path.join(targetDir, '_README.md'); 18 | if (await fs.pathExists(readmePath)) { 19 | const projectTitle = projectName.replace(/(^|[-_])([a-z])/g, (s) => 20 | s.toUpperCase() 21 | ); 22 | await replaceInFile(readmePath, { 23 | '{{Project name}}': projectTitle, 24 | '{{Description}}': `A web application built with Vite and React for ${projectTitle}` 25 | }); 26 | const finalReadme = path.join(targetDir, 'README.md'); 27 | await fs.move(readmePath, finalReadme, { overwrite: true }); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/generator/replace-in-file.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs-extra'; 2 | 3 | /** 4 | * Replaces all occurrences of given patterns in a file with provided replacements. 5 | * Reads the file content, applies regex-based replacements, and writes the result back. 6 | * Uses global regex matching to replace all instances of each pattern. 7 | * 8 | * @param filePath - Path to the file to be processed 9 | * @param replacements - Object mapping search patterns to replacement strings 10 | */ 11 | export async function replaceInFile( 12 | filePath: string, 13 | replacements: Record 14 | ): Promise { 15 | let content = await fs.readFile(filePath, 'utf8'); 16 | for (const [search, replace] of Object.entries(replacements)) { 17 | content = content.replace(new RegExp(search, 'g'), replace); 18 | } 19 | await fs.writeFile(filePath, content); 20 | } 21 | -------------------------------------------------------------------------------- /src/generator/setup-git-hooks.ts: -------------------------------------------------------------------------------- 1 | import { execSync } from 'child_process'; 2 | import fs from 'fs-extra'; 3 | import path from 'path'; 4 | 5 | /** 6 | * Initializes git repository and sets up husky git hooks for the generated project. 7 | * This ensures that git hooks work properly when the user runs pnpm install. 8 | * 9 | * @param targetDir - The target directory where the project was generated 10 | */ 11 | export async function setupGitHooks(targetDir: string): Promise { 12 | try { 13 | // Initialize git repository if it doesn't exist 14 | const gitDir = path.join(targetDir, '.git'); 15 | if (!(await fs.pathExists(gitDir))) { 16 | try { 17 | execSync('git init', { cwd: targetDir, stdio: 'inherit' }); 18 | } catch (gitInitError) { 19 | if (gitInitError instanceof Error) { 20 | // eslint-disable-next-line no-console 21 | console.error( 22 | `Error: Failed to initialize Git repository in ${targetDir}.` 23 | ); 24 | // eslint-disable-next-line no-console 25 | console.error(`Details: ${gitInitError.message}`); 26 | } else { 27 | // eslint-disable-next-line no-console 28 | console.error( 29 | 'Error: An unknown error occurred while initializing Git.' 30 | ); 31 | } 32 | throw gitInitError; // Re-throw to allow outer catch block to handle it 33 | } 34 | } 35 | 36 | // Set git hooks path to .husky directory 37 | execSync('git config core.hooksPath .husky', { 38 | cwd: targetDir, 39 | stdio: 'inherit' 40 | }); 41 | 42 | // Make sure hook files are executable 43 | const huskyDir = path.join(targetDir, '.husky'); 44 | if (await fs.pathExists(huskyDir)) { 45 | const hookFiles = await fs.readdir(huskyDir); 46 | for (const file of hookFiles) { 47 | // Skip directories and special files 48 | if (file.startsWith('.') || file === '_') continue; 49 | 50 | const hookPath = path.join(huskyDir, file); 51 | const stats = await fs.stat(hookPath); 52 | if (stats.isFile()) { 53 | // Make the hook file executable (0o755 = rwxr-xr-x) 54 | await fs.chmod(hookPath, 0o755); 55 | } 56 | } 57 | } 58 | 59 | // eslint-disable-next-line no-console 60 | console.log('Git hooks configured successfully'); 61 | } catch (error) { 62 | // eslint-disable-next-line no-console 63 | console.warn('Warning: Failed to set up git hooks:', error); 64 | // Don't throw error - this is not critical for project generation 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/generator/template-paths.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import { fileURLToPath } from 'url'; 3 | import fs from 'fs/promises'; 4 | 5 | /** 6 | * Finds the nearest ancestor directory (including the starting directory) that contains a package.json file. 7 | * Traverses up the directory tree from the given start directory. 8 | * 9 | * @param {string} startDir - The directory to start searching from. 10 | * @returns {Promise} The path to the directory containing package.json. 11 | * @throws {Error} When no package.json is found in any parent directory. 12 | */ 13 | async function findProjectRoot(startDir: string): Promise { 14 | let dir = startDir; 15 | while (dir !== path.dirname(dir)) { 16 | try { 17 | await fs.access(path.join(dir, 'package.json')); 18 | return dir; 19 | } catch { 20 | // package.json not found in this directory, continue searching up 21 | } 22 | dir = path.dirname(dir); 23 | } 24 | throw new Error( 25 | `Could not find project root from starting directory: ${startDir}. No package.json found in any parent directory.` 26 | ); 27 | } 28 | 29 | /** 30 | * Gets the absolute path to a specific template subdirectory. 31 | * 32 | * @param subdir - The subdirectory within templates (e.g., 'base', 'component-library', 'map') 33 | * @param name - Optional specific template name within the subdirectory 34 | * @returns The absolute path to the template directory 35 | */ 36 | export async function getTemplatePath( 37 | subdir: string, 38 | name?: string 39 | ): Promise { 40 | const currentFile = fileURLToPath(import.meta.url); 41 | const root = await findProjectRoot(path.dirname(currentFile)); 42 | return name 43 | ? path.join(root, 'templates', subdir, name) 44 | : path.join(root, 'templates', subdir); 45 | } 46 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { Command } from 'commander'; 4 | import inquirer from 'inquirer'; 5 | import { generateProject } from './generator/index.ts'; 6 | import pkg from '../package.json'; 7 | import fs from 'fs-extra'; 8 | import path from 'path'; 9 | import { fileURLToPath } from 'url'; 10 | 11 | const program = new Command(); 12 | 13 | program.name(pkg.name).description(pkg.description).version(pkg.version); 14 | 15 | program 16 | .argument('[project-name]', 'Name of the project to create') 17 | .option( 18 | '-c, --component-library ', 19 | 'Component library to use (none, chakra, uswds)' 20 | ) 21 | .option('-m, --map', 'Include map functionality') 22 | .option( 23 | '-l, --map-library ', 24 | 'Map library to use (mapbox-gl, maplibre-gl)' 25 | ) 26 | .option('-f, --force', 'Overwrite existing directory if it exists') 27 | .action( 28 | async ( 29 | projectName: string | undefined, 30 | options: { 31 | componentLibrary?: string; 32 | map?: boolean; 33 | mapLibrary?: string; 34 | force?: boolean; 35 | } 36 | ) => { 37 | try { 38 | let finalProjectName = projectName; 39 | let componentLibrary = options.componentLibrary; 40 | let mapLibrary = options.mapLibrary; 41 | 42 | // If project name is not provided, prompt for it 43 | if (!finalProjectName) { 44 | const { name } = await inquirer.prompt([ 45 | { 46 | type: 'input', 47 | name: 'name', 48 | message: 'What is the name of your project?', 49 | validate: (input: string) => { 50 | if (!input.trim()) { 51 | return 'Project name is required'; 52 | } 53 | if (!/^[a-z0-9-]+$/.test(input)) { 54 | return 'Project name must contain only lowercase letters, numbers, and hyphens'; 55 | } 56 | return true; 57 | } 58 | } 59 | ]); 60 | finalProjectName = name; 61 | } 62 | 63 | // Ensure we have a valid project name 64 | if (!finalProjectName || !finalProjectName.trim()) { 65 | throw new Error('Project name is required'); 66 | } 67 | 68 | // If component library is not provided, prompt for it 69 | if (!componentLibrary) { 70 | const { library } = await inquirer.prompt([ 71 | { 72 | type: 'list', 73 | name: 'library', 74 | message: 'Which component library would you like to use?', 75 | choices: [ 76 | { name: 'No component library (plain React)', value: 'none' }, 77 | { name: 'Chakra UI', value: 'chakra' }, 78 | { name: 'React USWDS', value: 'uswds' } 79 | ] 80 | } 81 | ]); 82 | componentLibrary = library; 83 | } 84 | 85 | // Ensure we have a valid component library 86 | if (!componentLibrary) { 87 | throw new Error('Component library is required'); 88 | } 89 | 90 | // If map library is not provided, prompt for it 91 | if (!mapLibrary) { 92 | const { mapChoice } = await inquirer.prompt([ 93 | { 94 | type: 'list', 95 | name: 'mapChoice', 96 | message: 'Would you like to add a map to your project?', 97 | choices: [ 98 | { name: 'No map', value: 'none' }, 99 | { name: 'Mapbox GL', value: 'mapbox-gl' }, 100 | { name: 'MapLibre GL', value: 'maplibre-gl' } 101 | ], 102 | default: 'none' 103 | } 104 | ]); 105 | mapLibrary = mapChoice; 106 | } 107 | 108 | // Check if directory exists and handle interactive confirmation 109 | const projectRoot = path.resolve( 110 | path.dirname(fileURLToPath(import.meta.url)), 111 | '..' 112 | ); 113 | const targetDir = path.join( 114 | projectRoot, 115 | 'generated', 116 | finalProjectName! 117 | ); 118 | 119 | if (await fs.pathExists(targetDir)) { 120 | if (options.force) { 121 | // Force is set, proceed with overwrite 122 | } else { 123 | // Force is not set, ask user for confirmation 124 | const { overwrite } = await inquirer.prompt([ 125 | { 126 | type: 'confirm', 127 | name: 'overwrite', 128 | message: `Directory '${finalProjectName}' already exists. Do you want to overwrite it?`, 129 | default: false 130 | } 131 | ]); 132 | 133 | if (!overwrite) { 134 | // eslint-disable-next-line no-console 135 | console.log('Project generation cancelled.'); 136 | return; 137 | } 138 | 139 | // Set force to true if user confirms overwrite 140 | options.force = true; 141 | } 142 | } 143 | 144 | await generateProject( 145 | finalProjectName!, 146 | componentLibrary, 147 | mapLibrary || 'none', 148 | options.force || false, 149 | targetDir 150 | ); 151 | } catch (error) { 152 | // eslint-disable-next-line no-console 153 | console.error('Error generating project:', error); 154 | process.exit(1); 155 | } 156 | } 157 | ); 158 | 159 | program.parse(); 160 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export interface GeneratorOptions { 2 | projectName?: string; 3 | componentLibrary?: 'none' | 'chakra' | 'uswds'; 4 | includeMap?: boolean; 5 | mapLibrary?: 'mapbox-gl' | 'maplibre-gl'; 6 | } 7 | 8 | export interface ProjectConfig { 9 | name: string; 10 | } 11 | -------------------------------------------------------------------------------- /templates/base/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "test": { 4 | "presets": ["@babel/preset-react", "@babel/preset-typescript"], 5 | "plugins": ["@babel/plugin-transform-modules-commonjs"] 6 | } 7 | }, 8 | "plugins": ["babel-plugin-styled-components"] 9 | } 10 | -------------------------------------------------------------------------------- /templates/base/.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | end_of_line = lf 9 | insert_final_newline = true 10 | 11 | # Matches multiple files with brace expansion notation 12 | # Set default charset 13 | [*.{js}] 14 | charset = utf-8 15 | 16 | # Indentation override for all JS under lib directory 17 | [lib/**.js] 18 | indent_style = space 19 | indent_size = 2 20 | 21 | # Matches the exact files either package.json or .travis.yml 22 | [{package.json,.travis.yml}] 23 | indent_style = space 24 | indent_size = 2 25 | -------------------------------------------------------------------------------- /templates/base/.gitignore: -------------------------------------------------------------------------------- 1 | ################################################ 2 | ############### .gitignore ################## 3 | ################################################ 4 | # 5 | # This file is only relevant if you are using git. 6 | # 7 | # Files which match the splat patterns below will 8 | # be ignored by git. This keeps random crap and 9 | # and sensitive credentials from being uploaded to 10 | # your repository. It allows you to configure your 11 | # app for your machine without accidentally 12 | # committing settings which will smash the local 13 | # settings of other developers on your team. 14 | # 15 | # Some reasonable defaults are included below, 16 | # but, of course, you should modify/extend/prune 17 | # to fit your needs! 18 | ################################################ 19 | 20 | app/scripts/time.json 21 | 22 | node_modules 23 | bower_components 24 | .sass-cache 25 | test/bower_components 26 | 27 | 28 | ################################################ 29 | # Node.js / NPM 30 | # 31 | # Common files generated by Node, NPM, and the 32 | # related ecosystem. 33 | ################################################ 34 | 35 | lib-cov 36 | *.seed 37 | *.log 38 | *.out 39 | *.pid 40 | npm-debug.log 41 | yarn-error.log 42 | .parcel-cache 43 | 44 | ################################################ 45 | # Environment files 46 | # 47 | # Common files used to store environment 48 | ################################################ 49 | 50 | .env* 51 | !.env.example 52 | 53 | ################################################ 54 | # Apidocs 55 | # 56 | # Common files generated by apidocs and other docs 57 | ################################################ 58 | 59 | 60 | ################################################ 61 | # Miscellaneous 62 | # 63 | # Common files generated by text editors, 64 | # operating systems, file systems, etc. 65 | ################################################ 66 | 67 | *~ 68 | *# 69 | .DS_STORE 70 | .DS_Store 71 | .netbeans 72 | nbproject 73 | .idea 74 | .resources 75 | .node_history 76 | temp 77 | tmp 78 | .tmp 79 | dist 80 | parcel-bundle-reports -------------------------------------------------------------------------------- /templates/base/.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | pnpm lint 4 | -------------------------------------------------------------------------------- /templates/base/.husky/pre-push: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | pnpm test 4 | -------------------------------------------------------------------------------- /templates/base/.nvmrc: -------------------------------------------------------------------------------- 1 | 22 -------------------------------------------------------------------------------- /templates/base/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "trailingComma": "none", 4 | "singleQuote": true, 5 | "jsxSingleQuote": true, 6 | "printWidth": 80 7 | } -------------------------------------------------------------------------------- /templates/base/.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "stylelint-config-standard", 4 | "stylelint-config-styled-components" 5 | ], 6 | "customSyntax": "postcss-styled-syntax", 7 | "rules": { 8 | "font-family-no-missing-generic-family-keyword": null, 9 | "no-descending-specificity": [ 10 | true, 11 | { 12 | "severity": "warning" 13 | } 14 | ] 15 | }, 16 | "ignoreFiles": [ 17 | "**/*.d.ts" 18 | ] 19 | } -------------------------------------------------------------------------------- /templates/base/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Development Seed 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /templates/base/_README.md: -------------------------------------------------------------------------------- 1 | # {{Project name}} 2 | 3 | {{Description}} 4 | 5 | ## Installation and Usage 6 | 7 | The steps below will walk you through setting up your own instance of the project. 8 | 9 | ### Install Project Dependencies 10 | 11 | To set up the development environment for this website, you'll need to install the following on your system: 12 | 13 | - [Node](http://nodejs.org/) (see version in [.nvmrc](.nvmrc)) (To manage multiple node versions we recommend [nvm](https://github.com/creationix/nvm)) 14 | - [pnpm](https://pnpm.io/) Install using corepack (`corepack enable pnpm`) 15 | 16 | ### Install Application Dependencies 17 | 18 | If you use [`nvm`](https://github.com/creationix/nvm), activate the desired Node version: 19 | 20 | ```sh 21 | nvm install 22 | ``` 23 | 24 | Install Node modules: 25 | 26 | ```sh 27 | pnpm install 28 | ``` 29 | 30 | ## Usage 31 | 32 | ### Environment Configuration 33 | 34 | The application uses [dot.env](https://vite.dev/guide/env-and-mode#env-files) files with environment variables for configuration. A template file `.env.example` is provided as a template. 35 | 36 | To configure the application: 37 | 1. Copy `.env.example` to `.env` 38 | 2. Modify the `.env` file with your specific configuration values 39 | 3. Never modify `.env.example` directly as it serves as documentation 40 | 41 | ### Starting the app 42 | 43 | ```sh 44 | pnpm dev 45 | ``` 46 | 47 | Compiles the sass files, javascript, and launches the server making the site available at `http://localhost:9000/` 48 | The system will watch files and execute tasks whenever one of them changes. 49 | The site will automatically refresh since it is bundled with livereload. 50 | 51 | ## Deployment 52 | 53 | To prepare the app for deployment run: 54 | 55 | ```sh 56 | pnpm build 57 | ``` 58 | 59 | or 60 | 61 | ```sh 62 | pnpm stage 63 | ``` 64 | 65 | This will package the app and place all the contents in the `dist` directory. 66 | The app can then be run by any web server. 67 | 68 | **When building the site for deployment provide the base url trough the `VITE_BASE_URL` environment variable. Omit the leading slash. (E.g. )** 69 | -------------------------------------------------------------------------------- /templates/base/app/app.tsx: -------------------------------------------------------------------------------- 1 | export default function App() { 2 | return
Hello World
; 3 | } 4 | -------------------------------------------------------------------------------- /templates/base/app/main.tsx: -------------------------------------------------------------------------------- 1 | // This entry point serves as a placeholder and will be substituted with the 2 | // component library's variant entry points. 3 | -------------------------------------------------------------------------------- /templates/base/app/media/layout/ds-logo-pos.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/base/app/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | interface ImportMetaEnv { 4 | readonly VITE_MAPBOX_ACCESS_TOKEN?: string; 5 | } 6 | 7 | interface ImportMeta { 8 | readonly env: ImportMetaEnv; 9 | } 10 | -------------------------------------------------------------------------------- /templates/base/eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import globals from 'globals'; 2 | import pluginJs from '@eslint/js'; 3 | import tseslint from 'typescript-eslint'; 4 | import pluginReact from 'eslint-plugin-react'; 5 | import reactHooks from 'eslint-plugin-react-hooks'; 6 | import reactRefresh from 'eslint-plugin-react-refresh'; 7 | import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'; 8 | 9 | /** @type {import('eslint').Linter.Config[]} */ 10 | export default [ 11 | { 12 | files: ['**/*.{js,mjs,cjs,ts,jsx,tsx}'], 13 | settings: { react: { version: 'detect' } }, 14 | languageOptions: { ecmaVersion: 2020, globals: globals.browser }, 15 | plugins: { 'react-hooks': reactHooks, 'react-refresh': reactRefresh } 16 | }, 17 | pluginJs.configs.recommended, 18 | ...tseslint.configs.recommended, 19 | pluginReact.configs.flat.recommended, 20 | eslintPluginPrettierRecommended, 21 | { 22 | name: 'Custom Rules', 23 | rules: { 24 | // Helps with cleaning debug statements by erroring on console. 25 | 'no-console': 'error', 26 | // It's no longer needed to import React, so this just prevents weird 27 | // errors when you don't. 28 | 'react/react-in-jsx-scope': 'off', 29 | // Array indexes as keys should not be used. The occasional time it is 30 | // needed, an ignore can be added. 31 | 'react/no-array-index-key': 'error', 32 | // Helps with enforcing rules of hooks. Very helpful to catch wrongly 33 | // placed hooks, like conditional usage. 34 | 'react-hooks/rules-of-hooks': 'error', 35 | // Ensure that components are PascalCase 36 | 'react/jsx-pascal-case': 'error', 37 | // Force self closing components when there are no children. 38 | // Prevents `` 39 | 'react/self-closing-comp': 'error', 40 | // Disable unused vars, handles TS-specific cases (type params, 41 | // interfaces) better than base rule. 42 | // https://typescript-eslint.io/rules/no-unused-vars/#what-benefits-does-this-rule-have-over-typescript 43 | '@typescript-eslint/no-unused-vars': [ 44 | 'error', 45 | { 46 | args: 'all', 47 | argsIgnorePattern: '^_', 48 | caughtErrors: 'all', 49 | caughtErrorsIgnorePattern: '^_', 50 | destructuredArrayIgnorePattern: '^_', 51 | varsIgnorePattern: '^_', 52 | ignoreRestSiblings: true 53 | } 54 | ], 55 | // Warn when `any` type is used. It's sometimes necessary, but should be 56 | // avoided when possible. 57 | '@typescript-eslint/no-explicit-any': 'warn' 58 | } 59 | } 60 | ]; 61 | -------------------------------------------------------------------------------- /templates/base/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | %VITE_APP_TITLE% 17 | 18 | 19 | 20 | 46 | 47 | 48 | 49 | 50 |
51 | Development Seed logotype 52 |

In the beginning the Universe was created.

53 |

This has made a lot of people very angry and been widely regarded as a bad move.

54 |
55 | 56 |
57 | 58 |
59 | 60 | 71 | 72 | 81 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /templates/base/jest.config.js: -------------------------------------------------------------------------------- 1 | const pkg = require('./package.json'); 2 | 3 | /* 4 | * For a detailed explanation regarding each configuration property, visit: 5 | * https://jestjs.io/docs/configuration 6 | */ 7 | 8 | module.exports = { 9 | // All imported modules in your tests should be mocked automatically 10 | // automock: false, 11 | 12 | // Stop running tests after `n` failures 13 | // bail: 0, 14 | 15 | // The directory where Jest should store its cached dependency information 16 | // cacheDirectory: "/private/var/folders/bz/vry80ww15sg533jytwfj7fdc0000gn/T/jest_dx", 17 | 18 | // Automatically clear mock calls, instances and results before every test 19 | // clearMocks: false, 20 | 21 | // Indicates whether the coverage information should be collected while executing the test 22 | // collectCoverage: false, 23 | 24 | // An array of glob patterns indicating a set of files for which coverage information should be collected 25 | // collectCoverageFrom: undefined, 26 | 27 | // The directory where Jest should output its coverage files 28 | // coverageDirectory: undefined, 29 | 30 | // An array of regexp pattern strings used to skip coverage collection 31 | // coveragePathIgnorePatterns: [ 32 | // "/node_modules/" 33 | // ], 34 | 35 | // Indicates which provider should be used to instrument code for coverage 36 | // coverageProvider: "babel", 37 | 38 | // A list of reporter names that Jest uses when writing coverage reports 39 | // coverageReporters: [ 40 | // "json", 41 | // "text", 42 | // "lcov", 43 | // "clover" 44 | // ], 45 | 46 | // An object that configures minimum threshold enforcement for coverage results 47 | // coverageThreshold: undefined, 48 | 49 | // A path to a custom dependency extractor 50 | // dependencyExtractor: undefined, 51 | 52 | // Make calling deprecated APIs throw helpful error messages 53 | // errorOnDeprecated: false, 54 | 55 | // Force coverage collection from ignored files using an array of glob patterns 56 | // forceCoverageMatch: [], 57 | 58 | // A path to a module which exports an async function that is triggered once before all test suites 59 | // globalSetup: undefined, 60 | 61 | // A path to a module which exports an async function that is triggered once after all test suites 62 | // globalTeardown: undefined, 63 | 64 | // A set of global variables that need to be available in all test environments 65 | globals: { 66 | NODE_ENV: 'test' 67 | }, 68 | 69 | // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. 70 | // maxWorkers: "50%", 71 | 72 | // An array of directory names to be searched recursively up from the requiring module's location 73 | moduleDirectories: ['node_modules'], 74 | 75 | // An array of file extensions your modules use 76 | moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx', 'json', 'node', 'css'], 77 | 78 | // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module 79 | // This has to be kept in sync with the alias field of package.json 80 | moduleNameMapper: { 81 | // To simplify keeping the alias in sync the code below converts the aliases 82 | // defined in the package.json to module mappings: 83 | // From: 84 | // "$styles": "~/app/scripts/styles" 85 | // To: 86 | // '^\\$styles(.*)$': '/app/scripts/styles$1' 87 | ...Object.entries(pkg.alias ?? {}).reduce((acc, [key, value]) => { 88 | return value.startsWith('~/') 89 | ? { 90 | ...acc, 91 | [`^\\${key}(.*)$`]: `${value.substring(1)}$1` 92 | } 93 | : acc; 94 | }, {}), 95 | '.+\\.(css|styl|less|sass|scss)$': 96 | '/node_modules/jest-css-modules-transform' 97 | }, 98 | 99 | // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader 100 | // modulePathIgnorePatterns: [], 101 | 102 | // Activates notifications for test results 103 | // notify: false, 104 | 105 | // An enum that specifies notification mode. Requires { notify: true } 106 | // notifyMode: "failure-change", 107 | 108 | // A preset that is used as a base for Jest's configuration 109 | preset: 'ts-jest', 110 | 111 | // Run tests from one or more projects 112 | // projects: undefined, 113 | 114 | // Use this configuration option to add custom reporters to Jest 115 | // reporters: undefined, 116 | 117 | // Automatically reset mock state before every test 118 | // resetMocks: false, 119 | 120 | // Reset the module registry before running each individual test 121 | // resetModules: false, 122 | 123 | // A path to a custom resolver 124 | // resolver: undefined, 125 | 126 | // Automatically restore mock state and implementation before every test 127 | // restoreMocks: false, 128 | 129 | // The root directory that Jest should scan for tests and modules within 130 | // rootDir: undefined, 131 | 132 | // A list of paths to directories that Jest should use to search for files in 133 | // roots: [ 134 | // "" 135 | // ], 136 | 137 | // Allows you to use a custom runner instead of Jest's default test runner 138 | // runner: "jest-runner", 139 | 140 | // The paths to modules that run some code to configure or set up the testing environment before each test 141 | // setupFiles: [], 142 | 143 | // A list of paths to modules that run some code to configure or set up the testing framework before each test 144 | // setupFilesAfterEnv: [], 145 | 146 | // The number of seconds after which a test is considered as slow and reported as such in the results. 147 | // slowTestThreshold: 5, 148 | 149 | // A list of paths to snapshot serializer modules Jest should use for snapshot testing 150 | // snapshotSerializers: [], 151 | 152 | // The test environment that will be used for testing 153 | testEnvironment: 'jsdom', 154 | 155 | // Options that will be passed to the testEnvironment 156 | // testEnvironmentOptions: {}, 157 | 158 | // Adds a location field to test results 159 | // testLocationInResults: false, 160 | 161 | // The glob patterns Jest uses to detect test files 162 | // testMatch: [ 163 | // "**/__tests__/**/*.[jt]s?(x)", 164 | // "**/?(*.)+(spec|test).[tj]s?(x)" 165 | // ], 166 | 167 | // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped 168 | // testPathIgnorePatterns: [ 169 | // "/node_modules/" 170 | // ], 171 | 172 | // The regexp pattern or array of patterns that Jest uses to detect test files 173 | // testRegex: [], 174 | 175 | // This option allows the use of a custom results processor 176 | // testResultsProcessor: undefined, 177 | 178 | // This option allows use of a custom test runner 179 | // testRunner: "jest-circus/runner", 180 | 181 | // This option sets the URL for the jsdom environment. It is reflected in properties such as location.href 182 | // testURL: "http://localhost", 183 | 184 | // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout" 185 | // timers: "real", 186 | 187 | // A map from regular expressions to paths to transformers 188 | transform: { 189 | '^.+\\.(js|jsx)$': 'babel-jest', 190 | '^.+\\.(ts|tsx)?$': ['ts-jest', { tsconfig: 'tsconfig.app.json' }] 191 | }, 192 | 193 | // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation 194 | // transformIgnorePatterns: [ 195 | // "/node_modules/", 196 | // "\\.pnp\\.[^\\/]+$" 197 | // ], 198 | 199 | // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them 200 | // unmockedModulePathPatterns: undefined, 201 | 202 | // Indicates whether each individual test should be reported during the run 203 | verbose: true, 204 | 205 | // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode 206 | // watchPathIgnorePatterns: [], 207 | 208 | // Whether to use watchman for file crawling 209 | // watchman: true, 210 | setupFilesAfterEnv: ['/jest.setup.ts'] 211 | }; 212 | -------------------------------------------------------------------------------- /templates/base/jest.setup.ts: -------------------------------------------------------------------------------- 1 | // jest.setup.ts 2 | import '@testing-library/jest-dom'; 3 | 4 | // implementation of structuredClone polyfill 5 | 6 | if (typeof global.structuredClone !== 'function') { 7 | global.structuredClone = function structuredClone(value) { 8 | if (value === null || value === undefined) { 9 | return value; 10 | } 11 | 12 | try { 13 | // For objects and arrays, use JSON methods 14 | if (typeof value === 'object') { 15 | return JSON.parse(JSON.stringify(value)); 16 | } 17 | 18 | // For primitive values, return directly 19 | return value; 20 | } catch (error) { 21 | // eslint-disable-next-line no-console 22 | console.warn('structuredClone polyfill failed:', error); 23 | 24 | // Returns a shallow copy as fallback 25 | return Array.isArray(value) ? [...value] : { ...value }; 26 | } 27 | }; 28 | } 29 | -------------------------------------------------------------------------------- /templates/base/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "project-seed", 3 | "description": "Starter application by Development Seed", 4 | "version": "8.0.1", 5 | "repository": { 6 | "type": "git", 7 | "url": "https://github.com/developmentseed/project-seed.git" 8 | }, 9 | "author": { 10 | "name": "Development Seed", 11 | "url": "https://developmentseed.org" 12 | }, 13 | "license": "MIT", 14 | "bugs": { 15 | "url": "https://github.com/developmentseed/project-seed/issues" 16 | }, 17 | "homepage": "https://github.com/developmentseed/project-seed", 18 | "scripts": { 19 | "prepare": "husky", 20 | "dev": "pnpm clean && NODE_ENV=development vite", 21 | "build": "pnpm clean && NODE_ENV=production tsc -b && vite build", 22 | "stage": "pnpm clean && NODE_ENV=staging tsc -b && vite build", 23 | "clean": "rm -rf dist node_modules/.vite", 24 | "lint": "pnpm lint:scripts", 25 | "lint:scripts": "eslint app/", 26 | "ts-check": "npx tsc --noEmit --skipLibCheck", 27 | "test": "jest" 28 | }, 29 | "engines": { 30 | "node": "22.x" 31 | }, 32 | "browserslist": "> 0.5%, last 2 versions, not dead", 33 | "devDependencies": { 34 | "@eslint/js": "^9.35.0", 35 | "@types/babel__core": "^7", 36 | "@types/jest": "^30.0.0", 37 | "@types/node": "^22.10.7", 38 | "@types/react": "^19.1.13", 39 | "@types/react-dom": "^19.1.9", 40 | "@vitejs/plugin-react": "^5.0.2", 41 | "babel-jest": "^30.1.2", 42 | "eslint": "^9.35.0", 43 | "eslint-config-prettier": "^10.1.8", 44 | "eslint-plugin-prettier": "^5.5.4", 45 | "eslint-plugin-react": "^7.37.5", 46 | "eslint-plugin-react-hooks": "^5.2.0", 47 | "eslint-plugin-react-refresh": "^0.4.20", 48 | "globals": "^16.4.0", 49 | "husky": "^9.1.7", 50 | "jest": "^30.1.3", 51 | "jest-environment-jsdom": "^30.1.2", 52 | "prettier": "^3.6.2", 53 | "ts-jest": "^29.4.2", 54 | "ts-node": "^10.9.2", 55 | "typescript": "~5.9.2", 56 | "typescript-eslint": "^8.44.0", 57 | "vite": "^7.1.5" 58 | }, 59 | "dependencies": { 60 | "@testing-library/jest-dom": "^6.8.0", 61 | "@testing-library/react": "^16.3.0", 62 | "@testing-library/user-event": "^14.6.1", 63 | "react": "^19.1.1", 64 | "react-dom": "^19.1.1" 65 | }, 66 | "alias": { 67 | "$components": "~/app/components", 68 | "$styles": "~/app/styles", 69 | "$utils": "~/app/utils", 70 | "$hooks": "~/app/hooks", 71 | "$pages": "~/app/pages", 72 | "$test": "~/test" 73 | }, 74 | "packageManager": "pnpm@10.16.1" 75 | } 76 | -------------------------------------------------------------------------------- /templates/base/public/meta/android-chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/developmentseed/project-seed/08d6c32b1b5ff6d2d8fe6ff293da33de992fde10/templates/base/public/meta/android-chrome.png -------------------------------------------------------------------------------- /templates/base/public/meta/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/developmentseed/project-seed/08d6c32b1b5ff6d2d8fe6ff293da33de992fde10/templates/base/public/meta/apple-touch-icon.png -------------------------------------------------------------------------------- /templates/base/public/meta/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/developmentseed/project-seed/08d6c32b1b5ff6d2d8fe6ff293da33de992fde10/templates/base/public/meta/favicon.png -------------------------------------------------------------------------------- /templates/base/public/meta/meta-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/developmentseed/project-seed/08d6c32b1b5ff6d2d8fe6ff293da33de992fde10/templates/base/public/meta/meta-image.png -------------------------------------------------------------------------------- /templates/base/test/example.test.ts: -------------------------------------------------------------------------------- 1 | describe('Main test suite', () => { 2 | it('should pass this demo test', () => { 3 | expect(true).toBe(true); 4 | }); 5 | }); -------------------------------------------------------------------------------- /templates/base/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 4 | "target": "ES2020", 5 | "useDefineForClassFields": true, 6 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 | "module": "ESNext", 8 | "skipLibCheck": true, 9 | 10 | /* Bundler mode */ 11 | "moduleResolution": "bundler", 12 | "allowImportingTsExtensions": true, 13 | "isolatedModules": true, 14 | "moduleDetection": "force", 15 | "noEmit": true, 16 | "jsx": "react-jsx", 17 | "paths": { 18 | /* Specify a set of entries that re-map imports to additional lookup locations. */ 19 | "$components/*": ["./app/components/*"], 20 | "$utils/*": ["./app/utils/*"], 21 | "$styles/*": ["./app/styles/*"], 22 | "$hooks/*": ["./app/hooks/*"], 23 | "$pages/*": ["./app/pages/*"] 24 | }, 25 | 26 | /* Linting */ 27 | "strict": true, 28 | "noUnusedLocals": true, 29 | "noUnusedParameters": true, 30 | "noFallthroughCasesInSwitch": true, 31 | "noUncheckedSideEffectImports": true 32 | }, 33 | "include": ["app"] 34 | } 35 | -------------------------------------------------------------------------------- /templates/base/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /templates/base/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 | "target": "ES2022", 5 | "lib": ["ES2023"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | 16 | /* Linting */ 17 | "strict": true, 18 | "noUnusedLocals": true, 19 | "noUnusedParameters": true, 20 | "noFallthroughCasesInSwitch": true, 21 | "noUncheckedSideEffectImports": true 22 | }, 23 | "include": ["vite.config.mts"] 24 | } 25 | -------------------------------------------------------------------------------- /templates/base/vite.config.mts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import react from '@vitejs/plugin-react'; 3 | import { fileURLToPath } from 'url'; 4 | import * as path from 'path'; 5 | 6 | import pkg from './package.json'; 7 | 8 | const alias = Object.entries(pkg.alias).reduce((acc, [key, value]) => { 9 | // Resolve the alias path relative to the current file 10 | const basePath = path.dirname(fileURLToPath(import.meta.url)); 11 | return { 12 | ...acc, 13 | [key]: path.resolve(basePath, value.replace('~/', './')) 14 | }; 15 | }, {}); 16 | 17 | 18 | // https://vite.dev/config/ 19 | export default defineConfig({ 20 | plugins: [react()], 21 | define: { 22 | APP_VERSION: JSON.stringify(pkg.version) 23 | }, 24 | server: { 25 | port: 9000 26 | }, 27 | resolve: { 28 | alias 29 | } 30 | }); 31 | -------------------------------------------------------------------------------- /templates/component-library/chakra/main.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import { createRoot } from 'react-dom/client'; 3 | import { ChakraProvider } from '@chakra-ui/react'; 4 | import App from './app'; 5 | 6 | import system from './styles/theme'; 7 | 8 | // Root component. 9 | function Root() { 10 | useEffect(() => { 11 | dispatchEvent(new Event('app-ready')); 12 | }, []); 13 | 14 | return ( 15 | 16 | 17 | 18 | ); 19 | } 20 | 21 | const rootNode = document.querySelector('#app-container')!; 22 | const root = createRoot(rootNode); 23 | root.render(); 24 | -------------------------------------------------------------------------------- /templates/component-library/chakra/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "@chakra-ui/react": "^3.23.0", 4 | "@emotion/react": "^11.14.0", 5 | "polished": "^4.3.1" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /templates/component-library/chakra/styles/color-palette.ts: -------------------------------------------------------------------------------- 1 | import { rgba, tint, shade } from 'polished'; 2 | 3 | /** 4 | * Curry the polished rgba function to allow switching the parameters. 5 | */ 6 | const _rgba = (alpha: number) => (color: string) => rgba(color, alpha); 7 | 8 | const colorPaletteSettings = [ 9 | { 10 | code: '50', 11 | colorFn: tint(0.96) 12 | }, 13 | { 14 | code: '50a', 15 | colorFn: _rgba(0.04) 16 | }, 17 | { 18 | code: '100', 19 | colorFn: tint(0.92) 20 | }, 21 | { 22 | code: '100a', 23 | colorFn: _rgba(0.08) 24 | }, 25 | { 26 | code: '200', 27 | colorFn: tint(0.84) 28 | }, 29 | { 30 | code: '200a', 31 | colorFn: _rgba(0.16) 32 | }, 33 | { 34 | code: '300', 35 | colorFn: tint(0.68) 36 | }, 37 | { 38 | code: '300a', 39 | colorFn: _rgba(0.32) 40 | }, 41 | { 42 | code: '400', 43 | colorFn: tint(0.36) 44 | }, 45 | { 46 | code: '400a', 47 | colorFn: _rgba(0.64) 48 | }, 49 | { 50 | code: '500', 51 | colorFn: (v: string) => v 52 | }, 53 | { 54 | code: '600', 55 | colorFn: shade(0.16) 56 | }, 57 | { 58 | code: '700', 59 | colorFn: shade(0.32) 60 | }, 61 | { 62 | code: '800', 63 | colorFn: shade(0.48) 64 | }, 65 | { 66 | code: '900', 67 | colorFn: shade(0.64) 68 | } 69 | ]; 70 | 71 | /** 72 | * Creates a color palette base off of the provided base color including 73 | * lightened/darkened/transparent versions of that color. 74 | * 75 | * Uses a scale from 50 - 900 to indicate the color value. Values lower than 500 76 | * are lightened, above 500 are darkened and values ending with `a` have a alpha 77 | * channel. 78 | * 79 | * List of returned colors: 80 | * name.50 Lightened 96% 81 | * name.50a Opacity 4% 82 | * name.100 Lightened 92% 83 | * name.100a Opacity 8% 84 | * name.200 Lightened 84% 85 | * name.200a Opacity 16% 86 | * name.300 Lightened 68% 87 | * name.300a Opacity 32% 88 | * name.400 Lightened 36% 89 | * name.400a Opacity 64% 90 | * name.500 Same as base color 91 | * name.600 Darkened 16% 92 | * name.700 Darkened 32% 93 | * name.800 Darkened 48% 94 | * name.900 Darkened 64% 95 | * 96 | * @param {string} name Name of the color variable 97 | * @param {string} baseColor Base color for the palette. Used as middle color 98 | * with value 500. 99 | * 100 | * @returns object 101 | */ 102 | export function createColorPalette(baseColor: string) { 103 | return colorPaletteSettings.reduce( 104 | (acc, c) => ({ 105 | ...acc, 106 | [c.code]: { value: c.colorFn(baseColor) } 107 | }), 108 | {} 109 | ); 110 | } 111 | -------------------------------------------------------------------------------- /templates/component-library/chakra/styles/theme.ts: -------------------------------------------------------------------------------- 1 | import { createSystem, defaultConfig, defineConfig } from '@chakra-ui/react'; 2 | import { createColorPalette } from './color-palette'; 3 | 4 | const config = defineConfig({ 5 | theme: { 6 | tokens: { 7 | colors: { 8 | primary: createColorPalette('#1E7BC6'), 9 | secondary: createColorPalette('#5FAD56'), 10 | base: createColorPalette('#2B2D42'), 11 | danger: createColorPalette('#D65108'), 12 | warning: createColorPalette('#EFA00B'), 13 | success: createColorPalette('#5FAD56'), 14 | info: createColorPalette('#1E7BC6'), 15 | surface: createColorPalette('#FFF') 16 | } 17 | } 18 | } 19 | }); 20 | 21 | export default createSystem(defaultConfig, config); 22 | -------------------------------------------------------------------------------- /templates/component-library/none/main.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import { createRoot } from 'react-dom/client'; 3 | import App from './app'; 4 | 5 | // Root component. 6 | function Root() { 7 | useEffect(() => { 8 | dispatchEvent(new Event('app-ready')); 9 | }, []); 10 | 11 | return ; 12 | } 13 | 14 | const rootNode = document.querySelector('#app-container')!; 15 | const root = createRoot(rootNode); 16 | root.render(); 17 | -------------------------------------------------------------------------------- /templates/component-library/none/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": {} 3 | } 4 | -------------------------------------------------------------------------------- /templates/component-library/uswds/app.tsx: -------------------------------------------------------------------------------- 1 | import { Header, Grid, GridContainer, Title } from '@trussworks/react-uswds'; 2 | 3 | export default function App() { 4 | return ( 5 | <> 6 |
7 |
8 |
9 |
10 | 11 | 12 | My App 13 | 14 | 15 |
16 |
17 |
18 |
19 |
20 | 21 | 22 | 23 | Hello World 24 |

25 | Welcome to your React USWDS-powered application! 26 |

27 |
28 |
29 |
30 |
31 | 32 | ); 33 | } 34 | -------------------------------------------------------------------------------- /templates/component-library/uswds/main.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import { createRoot } from 'react-dom/client'; 3 | import '@trussworks/react-uswds/lib/uswds.css'; 4 | import '@trussworks/react-uswds/lib/index.css'; 5 | import App from './app'; 6 | 7 | // Root component. 8 | function Root() { 9 | useEffect(() => { 10 | dispatchEvent(new Event('app-ready')); 11 | }, []); 12 | 13 | return ; 14 | } 15 | 16 | const rootNode = document.querySelector('#app-container')!; 17 | const root = createRoot(rootNode); 18 | root.render(); 19 | -------------------------------------------------------------------------------- /templates/component-library/uswds/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "@trussworks/react-uswds": "^10.0.2", 4 | "@uswds/uswds": "^3.7.1" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /templates/map/mapbox-gl/app.tsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | import Map, { Marker, NavigationControl } from 'react-map-gl/mapbox'; 3 | import 'mapbox-gl/dist/mapbox-gl.css'; 4 | 5 | const MAPBOX_TOKEN = import.meta.env.VITE_MAPBOX_ACCESS_TOKEN; 6 | 7 | export default function MapComponent() { 8 | const [viewState, setViewState] = useState({ 9 | latitude: 0, 10 | longitude: 0, 11 | zoom: 1 12 | }); 13 | 14 | const sampleData = [ 15 | { id: 1, latitude: 0, longitude: 0, title: 'Null Island' } 16 | ]; 17 | 18 | if (!MAPBOX_TOKEN) { 19 | return ( 20 |
32 |
33 |

Please set VITE_MAPBOX_ACCESS_TOKEN in your .env file

34 |

35 | Get your token at{' '} 36 | 41 | Mapbox 42 | 43 |

44 |
45 |
46 | ); 47 | } 48 | 49 | return ( 50 |
51 | setViewState(event.viewState)} 54 | mapStyle='mapbox://styles/mapbox/streets-v9' 55 | mapboxAccessToken={MAPBOX_TOKEN} 56 | style={{ width: '100%', height: '100%' }} 57 | > 58 | 59 | 60 | {sampleData.map((point) => ( 61 | 66 |
74 | 75 | ))} 76 | 77 |
78 | ); 79 | } 80 | -------------------------------------------------------------------------------- /templates/map/mapbox-gl/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "react-map-gl": "^8.0.4", 4 | "mapbox-gl": "^3.13.0", 5 | "@types/mapbox-gl": "^3.4.1" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /templates/map/maplibre-gl/app.tsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | import Map, { Marker, NavigationControl } from 'react-map-gl/maplibre'; 3 | import 'maplibre-gl/dist/maplibre-gl.css'; 4 | 5 | export default function MapComponent() { 6 | const [viewState, setViewState] = useState({ 7 | latitude: 0, 8 | longitude: 0, 9 | zoom: 1 10 | }); 11 | 12 | const sampleData = [ 13 | { id: 1, latitude: 0, longitude: 0, title: 'Null Island' } 14 | ]; 15 | 16 | return ( 17 |
18 | setViewState(event.viewState)} 21 | mapStyle='https://demotiles.maplibre.org/style.json' 22 | style={{ width: '100%', height: '100%' }} 23 | > 24 | 25 | 26 | {sampleData.map((point) => ( 27 | 32 |
40 | 41 | ))} 42 | 43 |
44 | ); 45 | } 46 | -------------------------------------------------------------------------------- /templates/map/maplibre-gl/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "react-map-gl": "^8.0.4", 4 | "maplibre-gl": "^5.6.1" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "module": "ESNext", 5 | "moduleResolution": "bundler", 6 | "allowImportingTsExtensions": true, 7 | "resolveJsonModule": true, 8 | "isolatedModules": true, 9 | "noEmit": true, 10 | "jsx": "react-jsx", 11 | "strict": true, 12 | "noUnusedLocals": true, 13 | "noUnusedParameters": true, 14 | "noFallthroughCasesInSwitch": true, 15 | "skipLibCheck": true, 16 | "esModuleInterop": true, 17 | "allowSyntheticDefaultImports": true, 18 | "forceConsistentCasingInFileNames": true 19 | }, 20 | "include": ["src/**/*"], 21 | "exclude": ["node_modules", "dist"] 22 | } 23 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'tsup'; 2 | 3 | export default defineConfig({ 4 | entry: ['src/index.ts'], 5 | format: ['esm'], 6 | platform: 'node', 7 | target: 'node18', 8 | outDir: 'dist', 9 | clean: true, 10 | outExtension() { 11 | return { 12 | js: '.js' 13 | }; 14 | }, 15 | external: ['inquirer'] 16 | }); 17 | --------------------------------------------------------------------------------