diff --git a/package.json b/package.json index e55d23dd..0b61b4ec 100644 --- a/package.json +++ b/package.json @@ -17,9 +17,9 @@ "oxlint": "^1.36.0", "vite": "catalog:", "vitest": "catalog:", - "zx": "^8.8.5" + "zx": "catalog:" }, - "packageManager": "pnpm@10.26.2+sha512.0e308ff2005fc7410366f154f625f6631ab2b16b1d2e70238444dd6ae9d630a8482d92a451144debc492416896ed16f7b114a86ec68b8404b2443869e68ffda6", + "packageManager": "pnpm@10.27.0+sha512.72d699da16b1179c14ba9e64dc71c9a40988cbdc65c264cb0e489db7de917f20dcf4d64d8723625f2969ba52d4b7e2a1170682d9ac2a5dcaeaab732b7e16f04a", "pnpm": { "peerDependencyRules": { "ignoreMissing": [ diff --git a/packages/create-vite-app/.gitignore b/packages/create-vite-app/.gitignore new file mode 100644 index 00000000..9b79d39f --- /dev/null +++ b/packages/create-vite-app/.gitignore @@ -0,0 +1,3 @@ +# Generated at build time +src/versions.json +templates/ diff --git a/packages/create-vite-app/PLAN.md b/packages/create-vite-app/PLAN.md new file mode 100644 index 00000000..7ed2497e --- /dev/null +++ b/packages/create-vite-app/PLAN.md @@ -0,0 +1,110 @@ +# Implementation Plan: @fastify/create-vite-app CLI + +## Overview + +Build a CLI scaffolding tool that copies the `examples/react-vanilla-spa/` template and resolves pnpm catalog versions at build time. + +## Requirements Summary + +- **Template source**: `examples/react-vanilla-spa/` (bundled at build time) +- **Prompts**: Project name only (using @clack/prompts) +- **Versions**: Baked in at build time from `pnpm-workspace.yaml` +- **Post-scaffold**: Auto-detect package manager and install dependencies +- **Skip**: test files, node_modules, dist folders + +--- + +## Implementation (Completed) + +### Step 1: Add dependencies + +**File**: `packages/create-vite-app/package.json` + +Added: + +- `@clack/prompts` ^0.11.0 - interactive CLI prompts +- `yaml` ^2.8.2 (devDependency) - parse pnpm-workspace.yaml at build time + +### Step 2: Create build script + +**File**: `packages/create-vite-app/scripts/generate-versions.ts` + +This script: + +1. Reads `pnpm-workspace.yaml` for catalog versions +2. Reads `packages/fastify-vite/package.json` for @fastify/vite version +3. Writes `src/versions.json` with resolved versions +4. Copies template files from `examples/react-vanilla-spa` to `templates/react-spa` + +### Step 3: Update build script in package.json + +**File**: `packages/create-vite-app/package.json` + +```json +"build": "node scripts/generate-versions.ts && tsc" +``` + +(Uses Node 22.18+ native TypeScript support - no tsx needed) + +### Step 4: Rewrite src/index.ts + +**File**: `packages/create-vite-app/src/index.ts` + +Features: + +- Interactive project name prompt using @clack/prompts +- Copies template files from bundled `templates/react-spa` +- Transforms package.json (resolves versions, updates name) +- Auto-detects package manager and installs dependencies +- Shows spinner during operations + +### Step 5: Create .gitignore + +**File**: `packages/create-vite-app/.gitignore` + +Ignores build-time generated files: + +- `src/versions.json` +- `templates/` + +--- + +## Files Modified/Created + +| File | Action | +| ------------------------------------------------------- | ------------------------------------------- | +| `packages/create-vite-app/package.json` | Modified - added deps, updated build script | +| `packages/create-vite-app/scripts/generate-versions.ts` | Created | +| `packages/create-vite-app/src/versions.json` | Generated (gitignored) | +| `packages/create-vite-app/src/index.ts` | Rewritten | +| `packages/create-vite-app/.gitignore` | Created | +| `packages/create-vite-app/templates/` | Generated (gitignored) | + +--- + +## Generated Project Structure + +``` +project-name/ +├── client/ +│ ├── base.css +│ ├── base.jsx +│ ├── index.html +│ └── mount.js +├── package.json (transformed with resolved versions) +├── server.js +└── vite.config.js +``` + +--- + +## Version Mapping + +| Source Reference | Package | Resolved | +| ---------------- | -------------------- | -------- | +| `workspace:^` | @fastify/vite | ^8.2.3 | +| `catalog:` | fastify | ^5.6.2 | +| `catalog:` | vite | ^7.3.0 | +| `catalog:react` | react | ^19.2.3 | +| `catalog:react` | react-dom | ^19.2.3 | +| `catalog:react` | @vitejs/plugin-react | ^5.1.2 | diff --git a/packages/create-vite-app/README.md b/packages/create-vite-app/README.md new file mode 100644 index 00000000..d225d9e3 --- /dev/null +++ b/packages/create-vite-app/README.md @@ -0,0 +1,67 @@ +# @fastify/create-vite-app + +The official scaffolding tool for **Fastify + Vite** applications. + +## Quick Start + +You do not need to install this package globally. You can run it directly using your package manager of choice. + +### npm + +```bash +npm create @fastify/vite-app@latest +# or with a specific project name +npm create @fastify/vite-app@latest my-app +``` + +### pnpm + +```bash +pnpm create @fastify/vite-app@latest +``` + +### yarn + +```bash +yarn create @fastify/vite-app +``` + +If you don't provide a project name, the CLI will use `fastify-vite-app` by default. + +```bash +# Creates a folder named "my-new-project" +npm create @fastify/vite-app my-new-project +``` + +Once created: + +```bash +cd my-new-project +npm install +npm run dev +``` + +## Contributing + +This package is part of the `fastify-vite` monorepo. + +### Local Development + +1. Navigate to the package directory: + +```bash +cd packages/create-vite-app +``` + +2. Build the project (requires TypeScript): + +```bash +npm run build +``` + +3. Test it locally without publishing: + +```bash +# Run the built output directly +node dist/index.js my-test-app +``` diff --git a/packages/create-vite-app/package.json b/packages/create-vite-app/package.json new file mode 100644 index 00000000..702a2b10 --- /dev/null +++ b/packages/create-vite-app/package.json @@ -0,0 +1,50 @@ +{ + "name": "@fastify/create-vite-app", + "version": "0.0.0", + "description": "Scaffolding tool for Fastify + Vite applications", + "keywords": [ + "cli", + "create-fastify-app", + "fastify", + "scaffold", + "vite" + ], + "license": "MIT", + "author": "Fastify Team", + "repository": { + "type": "git", + "url": "git+https://github.com/fastify/fastify-vite.git", + "directory": "packages/create-vite-app" + }, + "bin": { + "create-vite-app": "./dist/index.js", + "fastify-create-vite-app": "./dist/index.js" + }, + "files": [ + "dist", + "templates" + ], + "type": "module", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "pnpm generate-versions && pnpm copy-examples && tsc", + "copy-examples": "node scripts/copy-examples.ts", + "generate-versions": "node scripts/generate-versions.ts", + "prepublishOnly": "pnpm build", + "test": "node --test" + }, + "dependencies": { + "@clack/prompts": "^0.11.0", + "zx": "catalog:" + }, + "devDependencies": { + "@types/fs-extra": "^11.0.4", + "@types/node": "catalog:", + "typescript": "catalog:" + }, + "engines": { + "node": ">=22.18.0" + } +} diff --git a/packages/create-vite-app/scripts/copy-examples.ts b/packages/create-vite-app/scripts/copy-examples.ts new file mode 100644 index 00000000..5fb72a0d --- /dev/null +++ b/packages/create-vite-app/scripts/copy-examples.ts @@ -0,0 +1,14 @@ +import { join } from 'node:path' +import { fs } from 'zx' + +const rootDir = join(import.meta.dirname, '..', '..', '..') +const pkgDir = join(import.meta.dirname, '..') + +const templateSrc = join(rootDir, 'examples', 'react-vanilla-spa') +const templateDest = join(pkgDir, 'templates', 'react-spa') + +fs.removeSync(join(pkgDir, 'templates')) +fs.copySync(templateSrc, templateDest, { + filter: (src) => !src.includes('node_modules') && !src.includes('.test.'), +}) +console.log('Copied template files to templates/react-spa') diff --git a/packages/create-vite-app/scripts/generate-versions.ts b/packages/create-vite-app/scripts/generate-versions.ts new file mode 100644 index 00000000..255813b8 --- /dev/null +++ b/packages/create-vite-app/scripts/generate-versions.ts @@ -0,0 +1,26 @@ +import { join } from 'node:path' +import { fs, YAML } from 'zx' + +const rootDir = join(import.meta.dirname, '..', '..', '..') +const pkgDir = join(import.meta.dirname, '..') + +const workspaceYaml = fs.readFileSync(join(rootDir, 'pnpm-workspace.yaml'), 'utf-8') +const workspace = YAML.parse(workspaceYaml) as { + catalog: Record + catalogs: Record> +} + +const fastifyVitePkg = fs.readJsonSync(join(rootDir, 'packages', 'fastify-vite', 'package.json')) + +const versions: Record = { + '@fastify/vite': `^${fastifyVitePkg.version}`, + fastify: workspace.catalog.fastify, + vite: workspace.catalog.vite, + react: workspace.catalogs.react.react, + 'react-dom': workspace.catalogs.react['react-dom'], + '@vitejs/plugin-react': workspace.catalogs.react['@vitejs/plugin-react'], +} + +const versionsPath = join(pkgDir, 'src', 'versions.json') +fs.writeJsonSync(versionsPath, versions, { spaces: 2 }) +console.log('Generated src/versions.json with versions:', versions) diff --git a/packages/create-vite-app/src/index.ts b/packages/create-vite-app/src/index.ts new file mode 100644 index 00000000..a5472a16 --- /dev/null +++ b/packages/create-vite-app/src/index.ts @@ -0,0 +1,113 @@ +#!/usr/bin/env node + +import { join } from 'node:path' +import * as p from '@clack/prompts' +import { $, fs } from 'zx' +import versions from './versions.json' with { type: 'json' } + +const TEMPLATE_DIR = join(import.meta.dirname, '..', 'templates', 'react-spa') + +function transformPackageJson(projectName: string, destDir: string): void { + const pkgPath = join(destDir, 'package.json') + const pkg = fs.readJsonSync(pkgPath) + + pkg.name = projectName + + for (const depType of ['dependencies', 'devDependencies'] as const) { + if (!pkg[depType]) continue + for (const [name, version] of Object.entries(pkg[depType])) { + if ( + typeof version === 'string' && + (version.startsWith('workspace:') || version.startsWith('catalog:')) + ) { + const resolved = versions[name as keyof typeof versions] + if (resolved) { + pkg[depType][name] = resolved + } + } + } + } + + delete pkg.private + + fs.writeJsonSync(pkgPath, pkg, { spaces: 2 }) +} + +function detectPackageManager(): 'pnpm' | 'yarn' | 'bun' | 'npm' { + const userAgent = process.env.npm_config_user_agent + if (userAgent) { + if (userAgent.includes('pnpm')) return 'pnpm' + if (userAgent.includes('yarn')) return 'yarn' + if (userAgent.includes('bun')) return 'bun' + } + return 'npm' +} + +async function main(): Promise { + p.intro('Create Fastify + Vite App') + + let projectName = process.argv[2] + + if (!projectName) { + const result = await p.text({ + message: 'Project name:', + placeholder: 'my-fastify-app', + defaultValue: 'my-fastify-app', + validate: (value) => { + if (!value) return 'Project name is required' + if (fs.existsSync(value)) return `Directory "${value}" already exists` + }, + }) + + if (p.isCancel(result)) { + p.cancel('Operation cancelled') + process.exit(0) + } + + projectName = result + } + + const destDir = join(process.cwd(), projectName) + + if (fs.existsSync(destDir)) { + p.cancel(`Directory "${projectName}" already exists`) + process.exit(1) + } + + const copySpinner = p.spinner() + copySpinner.start('Copying template files...') + + try { + await fs.copy(TEMPLATE_DIR, destDir, { + filter: (src) => !src.includes('node_modules') && !src.includes('.test.'), + }) + transformPackageJson(projectName, destDir) + copySpinner.stop('Template files copied') + } catch (error) { + copySpinner.stop('Failed to copy template') + throw error + } + + const pm = detectPackageManager() + const installSpinner = p.spinner() + installSpinner.start(`Installing dependencies with ${pm}...`) + + try { + $.cwd = destDir + $.quiet = true + await $`${pm} install` + installSpinner.stop('Dependencies installed') + } catch { + installSpinner.stop(`Failed to install dependencies. Run "${pm} install" manually.`) + } + + p.outro(`Done! To get started: + + cd ${projectName} + ${pm} run dev`) +} + +main().catch((error) => { + console.error(error) + process.exit(1) +}) diff --git a/packages/create-vite-app/tsconfig.json b/packages/create-vite-app/tsconfig.json new file mode 100644 index 00000000..012f673d --- /dev/null +++ b/packages/create-vite-app/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "module": "NodeNext", + "moduleResolution": "NodeNext", + "outDir": "./dist", + "rewriteRelativeImportExtensions": true, + "rootDir": "./src", + "allowImportingTsExtensions": true, + "noEmit": false + }, + "include": ["src/**/*"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 48127095..11730117 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,9 @@ settings: catalogs: default: + '@types/node': + specifier: ^24.10.4 + version: 24.10.4 devalue: specifier: ^5.6.1 version: 5.6.1 @@ -27,6 +30,9 @@ catalogs: vitest: specifier: ^4.0.16 version: 4.0.16 + zx: + specifier: ^8.8.5 + version: 8.8.5 eslint: '@eslint/js': specifier: ^9.39.2 @@ -76,7 +82,7 @@ importers: devDependencies: '@changesets/cli': specifier: ^2.29.8 - version: 2.29.8(@types/node@22.19.3) + version: 2.29.8(@types/node@24.10.4) oxfmt: specifier: ^0.21.0 version: 0.21.0 @@ -85,12 +91,12 @@ importers: version: 1.36.0 vite: specifier: 'catalog:' - version: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + version: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) vitest: specifier: 'catalog:' - version: 4.0.16(@types/node@22.19.3)(@vitest/ui@4.0.16)(jiti@2.4.2)(jsdom@23.2.0)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + version: 4.0.16(@types/node@24.10.4)(@vitest/ui@4.0.16)(jiti@2.4.2)(jsdom@23.2.0)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) zx: - specifier: ^8.8.5 + specifier: 'catalog:' version: 8.8.5 docs: @@ -115,10 +121,10 @@ importers: version: 11.12.2 vitepress: specifier: 1.6.4 - version: 1.6.4(@algolia/client-search@5.46.2)(@types/node@22.19.3)(lightningcss@1.29.3)(markdown-it-mathjax3@4.3.2)(postcss@8.5.6)(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3) + version: 1.6.4(@algolia/client-search@5.46.2)(@types/node@24.10.4)(lightningcss@1.29.3)(markdown-it-mathjax3@4.3.2)(postcss@8.5.6)(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3) vitepress-plugin-mermaid: specifier: ^2.0.17 - version: 2.0.17(mermaid@11.12.2)(vitepress@1.6.4(@algolia/client-search@5.46.2)(@types/node@22.19.3)(lightningcss@1.29.3)(markdown-it-mathjax3@4.3.2)(postcss@8.5.6)(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3)) + version: 2.0.17(mermaid@11.12.2)(vitepress@1.6.4(@algolia/client-search@5.46.2)(@types/node@24.10.4)(lightningcss@1.29.3)(markdown-it-mathjax3@4.3.2)(postcss@8.5.6)(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3)) examples/react-hydration: dependencies: @@ -146,10 +152,10 @@ importers: devDependencies: '@vitejs/plugin-react': specifier: catalog:react - version: 5.1.2(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) + version: 5.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) vite: specifier: 'catalog:' - version: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + version: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) examples/react-next-mini: dependencies: @@ -186,10 +192,10 @@ importers: devDependencies: '@vitejs/plugin-react': specifier: catalog:react - version: 5.1.2(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) + version: 5.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) vite: specifier: 'catalog:' - version: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + version: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) examples/react-streaming: dependencies: @@ -217,10 +223,10 @@ importers: devDependencies: '@vitejs/plugin-react': specifier: catalog:react - version: 5.1.2(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) + version: 5.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) vite: specifier: 'catalog:' - version: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + version: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) examples/react-vanilla: dependencies: @@ -239,10 +245,10 @@ importers: devDependencies: '@vitejs/plugin-react': specifier: catalog:react - version: 5.1.2(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) + version: 5.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) vite: specifier: 'catalog:' - version: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + version: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) examples/react-vanilla-spa: dependencies: @@ -261,10 +267,10 @@ importers: devDependencies: '@vitejs/plugin-react': specifier: catalog:react - version: 5.1.2(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) + version: 5.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) vite: specifier: 'catalog:' - version: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + version: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) examples/react-vanilla-spa-ts: dependencies: @@ -366,7 +372,7 @@ importers: version: 9.39.2 '@vitejs/plugin-vue': specifier: catalog:vue - version: 5.2.4(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.26(typescript@5.9.3)) + version: 5.2.4(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.26(typescript@5.9.3)) eslint: specifier: catalog:eslint version: 9.39.2(jiti@2.4.2) @@ -378,7 +384,7 @@ importers: version: 16.5.0 vite: specifier: 'catalog:' - version: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + version: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) examples/vue-next-mini: dependencies: @@ -412,7 +418,7 @@ importers: version: 9.39.2 '@vitejs/plugin-vue': specifier: catalog:vue - version: 5.2.4(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.26(typescript@5.9.3)) + version: 5.2.4(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.26(typescript@5.9.3)) eslint: specifier: catalog:eslint version: 9.39.2(jiti@2.4.2) @@ -424,7 +430,7 @@ importers: version: 16.5.0 vite: specifier: 'catalog:' - version: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + version: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) examples/vue-streaming: dependencies: @@ -449,7 +455,7 @@ importers: version: 9.39.2 '@vitejs/plugin-vue': specifier: catalog:vue - version: 5.2.4(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.26(typescript@5.9.3)) + version: 5.2.4(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.26(typescript@5.9.3)) eslint: specifier: catalog:eslint version: 9.39.2(jiti@2.4.2) @@ -461,7 +467,7 @@ importers: version: 16.5.0 vite: specifier: 'catalog:' - version: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + version: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) examples/vue-vanilla: dependencies: @@ -480,7 +486,7 @@ importers: version: 9.39.2 '@vitejs/plugin-vue': specifier: catalog:vue - version: 5.2.4(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.26(typescript@5.9.3)) + version: 5.2.4(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.26(typescript@5.9.3)) eslint: specifier: catalog:eslint version: 9.39.2(jiti@2.4.2) @@ -492,7 +498,7 @@ importers: version: 16.5.0 vite: specifier: 'catalog:' - version: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + version: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) examples/vue-vanilla-spa: dependencies: @@ -511,7 +517,7 @@ importers: version: 9.39.2 '@vitejs/plugin-vue': specifier: catalog:vue - version: 5.2.4(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.26(typescript@5.9.3)) + version: 5.2.4(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.26(typescript@5.9.3)) eslint: specifier: catalog:eslint version: 9.39.2(jiti@2.4.2) @@ -523,7 +529,7 @@ importers: version: 16.5.0 vite: specifier: 'catalog:' - version: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + version: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) examples/vue-vanilla-ts: dependencies: @@ -571,6 +577,25 @@ importers: specifier: ^2.2.8 version: 2.2.10(typescript@5.9.3) + packages/create-vite-app: + dependencies: + '@clack/prompts': + specifier: ^0.11.0 + version: 0.11.0 + zx: + specifier: 'catalog:' + version: 8.8.5 + devDependencies: + '@types/fs-extra': + specifier: ^11.0.4 + version: 11.0.4 + '@types/node': + specifier: 'catalog:' + version: 24.10.4 + typescript: + specifier: 'catalog:' + version: 5.9.3 + packages/create-vite-app/templates/react-spa: dependencies: '@fastify/vite': @@ -588,10 +613,10 @@ importers: devDependencies: '@vitejs/plugin-react': specifier: catalog:react - version: 5.1.2(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) + version: 5.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) vite: specifier: 'catalog:' - version: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + version: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) packages/fastify-htmx: dependencies: @@ -749,11 +774,11 @@ importers: devDependencies: '@vitejs/plugin-vue': specifier: catalog:vue - version: 5.2.4(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.26(typescript@5.9.3)) + version: 5.2.4(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.26(typescript@5.9.3)) optionalDependencies: vite: specifier: 'catalog:' - version: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + version: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) starters/react-base: dependencies: @@ -762,10 +787,10 @@ importers: version: 2.0.2 '@fastify/react': specifier: ^1.1.2 - version: 1.1.2(@types/react@19.1.2)(fastify@5.6.2)(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) + version: 1.1.2(@types/react@19.1.2)(fastify@5.6.2)(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) '@fastify/vite': specifier: ^8.2.2 - version: 8.2.2(fastify@5.6.2)(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) + version: 8.2.2(fastify@5.6.2)(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) '@unhead/react': specifier: ^2.0.8 version: 2.0.8(react@19.2.3) @@ -796,7 +821,7 @@ importers: version: 4.1.2 '@vitejs/plugin-react': specifier: ^5.1.2 - version: 5.1.2(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) + version: 5.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) postcss: specifier: ^8.5.3 version: 8.5.3 @@ -808,7 +833,7 @@ importers: version: 4.1.2 vite: specifier: ^7.3.0 - version: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + version: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) starters/react-kitchensink: dependencies: @@ -820,10 +845,10 @@ importers: version: 2.0.2 '@fastify/react': specifier: ^1.1.2 - version: 1.1.2(@types/react@19.1.2)(fastify@5.6.2)(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) + version: 1.1.2(@types/react@19.1.2)(fastify@5.6.2)(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) '@fastify/vite': specifier: ^8.2.2 - version: 8.2.2(fastify@5.6.2)(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) + version: 8.2.2(fastify@5.6.2)(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) '@unhead/react': specifier: ^2.0.8 version: 2.0.8(react@19.2.3) @@ -854,7 +879,7 @@ importers: version: 4.1.2 '@vitejs/plugin-react': specifier: ^5.1.2 - version: 5.1.2(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) + version: 5.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) postcss: specifier: ^8.5.3 version: 8.5.3 @@ -866,7 +891,7 @@ importers: version: 4.1.2 vite: specifier: ^7.3.0 - version: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + version: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) starters/react-typescript: dependencies: @@ -948,10 +973,10 @@ importers: version: 2.0.2 '@fastify/vite': specifier: ^8.2.2 - version: 8.2.2(fastify@5.6.2)(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) + version: 8.2.2(fastify@5.6.2)(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) '@fastify/vue': specifier: ^1.1.3 - version: 1.1.3(@types/node@22.19.3)(fastify@5.6.2)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.7.1) + version: 1.1.3(@types/node@24.10.4)(fastify@5.6.2)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.7.1) '@unhead/vue': specifier: ^2.0.5 version: 2.0.8(vue@3.5.13(typescript@5.9.3)) @@ -970,10 +995,10 @@ importers: version: 4.1.2 '@tailwindcss/vite': specifier: ^4.1.1 - version: 4.1.2(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) + version: 4.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.3(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.9.3)) + version: 5.2.3(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.9.3)) postcss: specifier: ^8.5.3 version: 8.5.3 @@ -985,7 +1010,7 @@ importers: version: 4.1.2 vite: specifier: ^7.3.0 - version: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + version: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) starters/vue-kitchensink: dependencies: @@ -997,10 +1022,10 @@ importers: version: 2.0.2 '@fastify/vite': specifier: ^8.2.2 - version: 8.2.2(fastify@5.6.2)(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) + version: 8.2.2(fastify@5.6.2)(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) '@fastify/vue': specifier: ^1.1.3 - version: 1.1.3(@types/node@22.19.3)(fastify@5.6.2)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.7.1) + version: 1.1.3(@types/node@24.10.4)(fastify@5.6.2)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.7.1) '@unhead/vue': specifier: ^2.0.5 version: 2.0.8(vue@3.5.13(typescript@5.9.3)) @@ -1019,7 +1044,7 @@ importers: version: 4.1.2 '@vitejs/plugin-vue': specifier: ^5.2.3 - version: 5.2.3(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.9.3)) + version: 5.2.3(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.9.3)) postcss: specifier: ^8.5.3 version: 8.5.3 @@ -1031,7 +1056,7 @@ importers: version: 4.1.2 vite: specifier: ^7.3.0 - version: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + version: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) starters/vue-typescript: dependencies: @@ -1359,6 +1384,12 @@ packages: '@chevrotain/utils@11.0.3': resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + '@clack/core@0.5.0': + resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==} + + '@clack/prompts@0.11.0': + resolution: {integrity: sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==} + '@csstools/cascade-layer-name-parser@2.0.4': resolution: {integrity: sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==} engines: {node: '>=18'} @@ -2736,6 +2767,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + '@types/geojson@7946.0.16': resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} @@ -2745,6 +2779,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} @@ -2766,6 +2803,9 @@ packages: '@types/node@22.19.3': resolution: {integrity: sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==} + '@types/node@24.10.4': + resolution: {integrity: sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==} + '@types/react-dom@19.1.2': resolution: {integrity: sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==} peerDependencies: @@ -5082,6 +5122,9 @@ packages: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -5284,6 +5327,9 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici@7.7.0: resolution: {integrity: sha512-tZ6+5NBq4KH35rr46XJ2JPFKxfcBlYNaqLF/wyWIO9RMHqqU/gx/CLB1Y2qMcgB8lWw/bKHa7qzspqCN7mUHvA==} engines: {node: '>=20.18.1'} @@ -5956,7 +6002,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.8(@types/node@22.19.3)': + '@changesets/cli@2.29.8(@types/node@24.10.4)': dependencies: '@changesets/apply-release-plan': 7.0.14 '@changesets/assemble-release-plan': 6.0.9 @@ -5972,7 +6018,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.3(@types/node@22.19.3) + '@inquirer/external-editor': 1.0.3(@types/node@24.10.4) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -6088,6 +6134,17 @@ snapshots: '@chevrotain/utils@11.0.3': {} + '@clack/core@0.5.0': + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@clack/prompts@0.11.0': + dependencies: + '@clack/core': 0.5.0 + picocolors: 1.1.1 + sisteransi: 1.0.5 + '@csstools/cascade-layer-name-parser@2.0.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': dependencies: '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) @@ -6726,9 +6783,9 @@ snapshots: - fastify - vite - '@fastify/react@1.1.2(@types/react@19.1.2)(fastify@5.6.2)(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))': + '@fastify/react@1.1.2(@types/react@19.1.2)(fastify@5.6.2)(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))': dependencies: - '@fastify/vite': 8.2.2(fastify@5.6.2)(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) + '@fastify/vite': 8.2.2(fastify@5.6.2)(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) '@unhead/react': 2.0.8(react@19.2.3) acorn: 8.15.0 acorn-strip-function: 1.2.0 @@ -6778,7 +6835,7 @@ snapshots: package-directory: 8.1.0 vite: 7.3.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.20.3)(yaml@2.7.1) - '@fastify/vite@8.2.2(fastify@5.6.2)(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))': + '@fastify/vite@8.2.2(fastify@5.6.2)(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))': dependencies: '@fastify/deepmerge': 3.1.0 '@fastify/middie': 9.0.3 @@ -6789,7 +6846,7 @@ snapshots: html-rewriter-wasm: 0.4.1 klaw: 4.1.0 package-directory: 8.1.0 - vite: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) '@fastify/vue@1.1.3(@types/node@22.14.0)(fastify@5.6.2)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.20.3)(typescript@5.9.3)(yaml@2.7.1)': dependencies: @@ -6820,9 +6877,9 @@ snapshots: - typescript - yaml - '@fastify/vue@1.1.3(@types/node@22.19.3)(fastify@5.6.2)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.7.1)': + '@fastify/vue@1.1.3(@types/node@24.10.4)(fastify@5.6.2)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.7.1)': dependencies: - '@fastify/vite': 8.2.2(fastify@5.6.2)(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) + '@fastify/vite': 8.2.2(fastify@5.6.2)(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) '@unhead/vue': 2.0.8(vue@3.5.26(typescript@5.9.3)) acorn: 8.15.0 acorn-walk: 8.3.4 @@ -6833,7 +6890,7 @@ snapshots: vue-router: 4.6.4(vue@3.5.26(typescript@5.9.3)) youch: 3.3.4 optionalDependencies: - vite: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) transitivePeerDependencies: - '@types/node' - fastify @@ -6872,12 +6929,12 @@ snapshots: '@iconify/types': 2.0.0 mlly: 1.8.0 - '@inquirer/external-editor@1.0.3(@types/node@22.19.3)': + '@inquirer/external-editor@1.0.3(@types/node@24.10.4)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.1 optionalDependencies: - '@types/node': 22.19.3 + '@types/node': 24.10.4 '@isaacs/balanced-match@4.0.1': {} @@ -7195,12 +7252,12 @@ snapshots: postcss: 8.5.3 tailwindcss: 4.1.2 - '@tailwindcss/vite@4.1.2(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))': + '@tailwindcss/vite@4.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))': dependencies: '@tailwindcss/node': 4.1.2 '@tailwindcss/oxide': 4.1.2 tailwindcss: 4.1.2 - vite: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) '@types/babel__core@7.20.5': dependencies: @@ -7350,6 +7407,11 @@ snapshots: '@types/estree@1.0.8': {} + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 22.19.3 + '@types/geojson@7946.0.16': {} '@types/hast@3.0.4': @@ -7358,6 +7420,10 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 22.19.3 + '@types/linkify-it@5.0.0': {} '@types/markdown-it@14.1.2': @@ -7381,6 +7447,10 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/node@24.10.4': + dependencies: + undici-types: 7.16.0 + '@types/react-dom@19.1.2(@types/react@19.1.2)': dependencies: '@types/react': 19.1.2 @@ -7530,7 +7600,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@5.1.2(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))': + '@vitejs/plugin-react@5.1.2(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -7538,7 +7608,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.53 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) transitivePeerDependencies: - supports-color @@ -7547,14 +7617,14 @@ snapshots: vite: 7.3.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.20.3)(yaml@2.7.1) vue: 3.5.13(typescript@5.9.3) - '@vitejs/plugin-vue@5.2.3(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.9.3))': + '@vitejs/plugin-vue@5.2.3(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.13(typescript@5.9.3))': dependencies: - vite: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) vue: 3.5.13(typescript@5.9.3) - '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@22.19.3)(lightningcss@1.29.3))(vue@3.5.26(typescript@5.9.3))': + '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@24.10.4)(lightningcss@1.29.3))(vue@3.5.26(typescript@5.9.3))': dependencies: - vite: 5.4.21(@types/node@22.19.3)(lightningcss@1.29.3) + vite: 5.4.21(@types/node@24.10.4)(lightningcss@1.29.3) vue: 3.5.26(typescript@5.9.3) '@vitejs/plugin-vue@5.2.4(vite@7.3.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.26(typescript@5.9.3))': @@ -7562,9 +7632,9 @@ snapshots: vite: 7.3.0(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) vue: 3.5.26(typescript@5.9.3) - '@vitejs/plugin-vue@5.2.4(vite@7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.26(typescript@5.9.3))': + '@vitejs/plugin-vue@5.2.4(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))(vue@3.5.26(typescript@5.9.3))': dependencies: - vite: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) vue: 3.5.26(typescript@5.9.3) '@vitest/expect@4.0.16': @@ -7584,6 +7654,14 @@ snapshots: optionalDependencies: vite: 7.3.0(@types/node@22.19.3)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + '@vitest/mocker@4.0.16(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1))': + dependencies: + '@vitest/spy': 4.0.16 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + '@vitest/pretty-format@4.0.16': dependencies: tinyrainbow: 3.0.3 @@ -7610,7 +7688,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.16(@types/node@22.19.3)(@vitest/ui@4.0.16)(jiti@2.4.2)(jsdom@23.2.0)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + vitest: 4.0.16(@types/node@24.10.4)(@vitest/ui@4.0.16)(jiti@2.4.2)(jsdom@23.2.0)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) '@vitest/utils@4.0.16': dependencies: @@ -10061,6 +10139,8 @@ snapshots: mrmime: 2.0.1 totalist: 3.0.1 + sisteransi@1.0.5: {} + slash@3.0.0: {} slick@1.12.2: @@ -10234,6 +10314,8 @@ snapshots: undici-types@6.21.0: {} + undici-types@7.16.0: {} + undici@7.7.0: {} unhead@2.0.8: @@ -10317,13 +10399,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@5.4.21(@types/node@22.19.3)(lightningcss@1.29.3): + vite@5.4.21(@types/node@24.10.4)(lightningcss@1.29.3): dependencies: esbuild: 0.21.5 postcss: 8.5.6 rollup: 4.54.0 optionalDependencies: - '@types/node': 22.19.3 + '@types/node': 24.10.4 fsevents: 2.3.3 lightningcss: 1.29.3 @@ -10375,14 +10457,30 @@ snapshots: tsx: 4.21.0 yaml: 2.7.1 - vitepress-plugin-mermaid@2.0.17(mermaid@11.12.2)(vitepress@1.6.4(@algolia/client-search@5.46.2)(@types/node@22.19.3)(lightningcss@1.29.3)(markdown-it-mathjax3@4.3.2)(postcss@8.5.6)(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3)): + vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1): + dependencies: + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.54.0 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.10.4 + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.29.3 + tsx: 4.21.0 + yaml: 2.7.1 + + vitepress-plugin-mermaid@2.0.17(mermaid@11.12.2)(vitepress@1.6.4(@algolia/client-search@5.46.2)(@types/node@24.10.4)(lightningcss@1.29.3)(markdown-it-mathjax3@4.3.2)(postcss@8.5.6)(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3)): dependencies: mermaid: 11.12.2 - vitepress: 1.6.4(@algolia/client-search@5.46.2)(@types/node@22.19.3)(lightningcss@1.29.3)(markdown-it-mathjax3@4.3.2)(postcss@8.5.6)(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3) + vitepress: 1.6.4(@algolia/client-search@5.46.2)(@types/node@24.10.4)(lightningcss@1.29.3)(markdown-it-mathjax3@4.3.2)(postcss@8.5.6)(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3) optionalDependencies: '@mermaid-js/mermaid-mindmap': 9.3.0 - vitepress@1.6.4(@algolia/client-search@5.46.2)(@types/node@22.19.3)(lightningcss@1.29.3)(markdown-it-mathjax3@4.3.2)(postcss@8.5.6)(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3): + vitepress@1.6.4(@algolia/client-search@5.46.2)(@types/node@24.10.4)(lightningcss@1.29.3)(markdown-it-mathjax3@4.3.2)(postcss@8.5.6)(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3): dependencies: '@docsearch/css': 3.8.2 '@docsearch/js': 3.8.2(@algolia/client-search@5.46.2)(react@18.3.1)(search-insights@2.17.3) @@ -10391,7 +10489,7 @@ snapshots: '@shikijs/transformers': 2.5.0 '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@22.19.3)(lightningcss@1.29.3))(vue@3.5.26(typescript@5.9.3)) + '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@24.10.4)(lightningcss@1.29.3))(vue@3.5.26(typescript@5.9.3)) '@vue/devtools-api': 7.7.9 '@vue/shared': 3.5.26 '@vueuse/core': 12.8.2(typescript@5.9.3) @@ -10400,7 +10498,7 @@ snapshots: mark.js: 8.11.1 minisearch: 7.2.0 shiki: 2.5.0 - vite: 5.4.21(@types/node@22.19.3)(lightningcss@1.29.3) + vite: 5.4.21(@types/node@24.10.4)(lightningcss@1.29.3) vue: 3.5.26(typescript@5.9.3) optionalDependencies: markdown-it-mathjax3: 4.3.2 @@ -10471,6 +10569,45 @@ snapshots: - tsx - yaml + vitest@4.0.16(@types/node@24.10.4)(@vitest/ui@4.0.16)(jiti@2.4.2)(jsdom@23.2.0)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1): + dependencies: + '@vitest/expect': 4.0.16 + '@vitest/mocker': 4.0.16(vite@7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1)) + '@vitest/pretty-format': 4.0.16 + '@vitest/runner': 4.0.16 + '@vitest/snapshot': 4.0.16 + '@vitest/spy': 4.0.16 + '@vitest/utils': 4.0.16 + es-module-lexer: 1.7.0 + expect-type: 1.2.2 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.3.0(@types/node@24.10.4)(jiti@2.4.2)(lightningcss@1.29.3)(tsx@4.21.0)(yaml@2.7.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 24.10.4 + '@vitest/ui': 4.0.16(vitest@4.0.16) + jsdom: 23.2.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + vscode-jsonrpc@8.2.0: {} vscode-languageserver-protocol@3.17.5: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 648cdf64..4ecc09d3 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,6 +5,7 @@ packages: - starters/* catalog: + '@types/node': ^24.10.4 devalue: ^5.6.1 fastify: ^5.6.2 html-rewriter-wasm: ^0.4.1 @@ -12,6 +13,7 @@ catalog: typescript: ^5.9.3 vite: ^7.3.0 vitest: ^4.0.16 + zx: ^8.8.5 catalogs: eslint: