diff --git a/.github/labeler.yml b/.github/labeler.yml index 650e4e34d13..16ac3b06ef6 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,9 +1,5 @@ 'package: arktype-adapter': - 'packages/arktype-adapter/**/*' -'package: create-router': - - 'packages/create-router/**/*' -'package: create-start': - - 'packages/create-start/**/*' 'package: directive-functions-plugin': - 'packages/directive-functions-plugin/**/*' 'package: eslint-plugin-router': diff --git a/packages/create-router/build.config.ts b/packages/create-router/build.config.ts deleted file mode 100644 index e61c91fb608..00000000000 --- a/packages/create-router/build.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineBuildConfig } from 'unbuild' - -export default defineBuildConfig({ - entries: ['src/index'], - clean: true, - rollup: { - inlineDependencies: true, - esbuild: { - target: 'node18', - minify: true, - }, - }, -}) diff --git a/packages/create-router/eslint.config.js b/packages/create-router/eslint.config.js deleted file mode 100644 index 8ce6ad05fcd..00000000000 --- a/packages/create-router/eslint.config.js +++ /dev/null @@ -1,5 +0,0 @@ -// @ts-check - -import rootConfig from '../../eslint.config.js' - -export default [...rootConfig] diff --git a/packages/create-router/index.js b/packages/create-router/index.js deleted file mode 100755 index f5e8e064a68..00000000000 --- a/packages/create-router/index.js +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env node - -import './dist/index.mjs' diff --git a/packages/create-router/package.json b/packages/create-router/package.json deleted file mode 100644 index 166ae563be0..00000000000 --- a/packages/create-router/package.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "name": "@tanstack/create-router", - "version": "1.117.2", - "description": "Modern and scalable routing for React applications", - "author": "Tanner Linsley", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/TanStack/router.git", - "directory": "packages/create-router" - }, - "homepage": "https://tanstack.com/router", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "bin": { - "create-router": "index.js" - }, - "scripts": { - "dev": "unbuild --stub", - "clean": "rimraf ./dist && rimraf ./coverage", - "test:eslint": "eslint ./src", - "build": "unbuild" - }, - "type": "module", - "files": [ - "index.js", - "templates", - "dist" - ], - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "dependencies": { - "which": "^5.0.0", - "@inquirer/prompts": "^5.5.0", - "commander": "^12.1.0", - "cross-spawn": "^7.0.6", - "tinyglobby": "^0.2.10", - "picocolors": "^1.1.1", - "validate-npm-package-name": "^6.0.0", - "yocto-spinner": "^0.2.0" - }, - "devDependencies": { - "@types/cross-spawn": "^6.0.6", - "@types/validate-npm-package-name": "^4.0.2", - "@types/which": "^3.0.4", - "unbuild": "^3.3.1" - }, - "peerDependencies": { - "@rsbuild/core": "^1.0.2", - "@rsbuild/plugin-react": "^1.0.1", - "@swc/core": "^1.7.25", - "@tanstack/react-router": "workspace:^", - "@tanstack/router-devtools": "workspace:^", - "@tanstack/router-plugin": "workspace:^", - "@types/react": "^19.0.8", - "@types/react-dom": "^19.0.3", - "@vitejs/plugin-react": "^4.3.2", - "html-webpack-plugin": "^5.6.0", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "swc-loader": "^0.2.6", - "typescript": "^5.7.2", - "vite": "^6.0.3", - "webpack": "^5.94.0", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.1.0" - }, - "peerDependenciesMeta": { - "@tanstack/react-router": { - "optional": true - }, - "@tanstack/router-devtools": { - "optional": true - }, - "@tanstack/router-plugin": { - "optional": true - }, - "@vitejs/plugin-react": { - "optional": true - }, - "vite": { - "optional": true - }, - "@swc/core": { - "optional": true - }, - "html-webpack-plugin": { - "optional": true - }, - "swc-loader": { - "optional": true - }, - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - }, - "@rsbuild/core": { - "optional": true - }, - "@rsbuild/plugin-react": { - "optional": true - }, - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - }, - "typescript": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } -} diff --git a/packages/create-router/src/bundler/index.ts b/packages/create-router/src/bundler/index.ts deleted file mode 100644 index 78a0946fb4b..00000000000 --- a/packages/create-router/src/bundler/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { apply as applyVite } from './vite' -import { apply as applyRspack } from './rspack' -import { apply as applyWebpack } from './webpack' -import type { Bundler } from '../constants' -import type { ApplyParams } from '../types' - -export function apply(bundler: Bundler, params: ApplyParams) { - switch (bundler) { - case 'vite': - return applyVite(params) - case 'rspack': - return applyRspack(params) - case 'webpack': - return applyWebpack(params) - } -} diff --git a/packages/create-router/src/bundler/rspack.ts b/packages/create-router/src/bundler/rspack.ts deleted file mode 100644 index d596b9cf85b..00000000000 --- a/packages/create-router/src/bundler/rspack.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { copyTemplateFiles } from '../utils/copyTemplateFiles' -import type { ApplyParams, BundlerResult, PeerDependency } from '../types' - -export const scripts = { - dev: 'rsbuild dev --port 3001', - build: 'rsbuild build', - preview: 'rsbuild preview', -} as const - -export const devDependencies = [ - '@rsbuild/core', - '@rsbuild/plugin-react', -] as const satisfies Array - -export async function apply({ - targetFolder, -}: ApplyParams): Promise { - await copyTemplateFiles({ - file: '**/*', - sourceFolder: 'bundler/rspack', - targetFolder, - }) - return { - scripts, - devDependencies, - } -} diff --git a/packages/create-router/src/bundler/vite.ts b/packages/create-router/src/bundler/vite.ts deleted file mode 100644 index b0c4d042daa..00000000000 --- a/packages/create-router/src/bundler/vite.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { copyTemplateFiles } from '../utils/copyTemplateFiles' -import type { ApplyParams, BundlerResult, PeerDependency } from '../types' - -export const scripts = { - dev: 'vite --port=3001', - build: 'vite build', - serve: 'vite preview', - start: 'vite', -} as const - -export const devDependencies = [ - '@vitejs/plugin-react', - 'vite', -] as const satisfies Array - -export async function apply({ - targetFolder, -}: ApplyParams): Promise { - await copyTemplateFiles({ - file: '**/*', - sourceFolder: 'bundler/vite', - targetFolder, - }) - return { - scripts, - devDependencies, - } -} diff --git a/packages/create-router/src/bundler/webpack.ts b/packages/create-router/src/bundler/webpack.ts deleted file mode 100644 index 2e6d198e257..00000000000 --- a/packages/create-router/src/bundler/webpack.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { copyTemplateFiles } from '../utils/copyTemplateFiles' -import type { ApplyParams, BundlerResult, PeerDependency } from '../types' - -export const scripts = { - dev: 'webpack serve --port 3001 --no-open', - build: 'webpack build', -} as const - -export const devDependencies = [ - '@swc/core', - 'html-webpack-plugin', - 'swc-loader', - 'webpack', - 'webpack-cli', - 'webpack-dev-server', -] as const satisfies Array - -export async function apply({ - targetFolder, -}: ApplyParams): Promise { - await copyTemplateFiles({ - file: '**/*', - sourceFolder: 'bundler/webpack', - targetFolder, - }) - return { - scripts, - devDependencies, - } -} diff --git a/packages/create-router/src/cli.ts b/packages/create-router/src/cli.ts deleted file mode 100644 index 03c9be227f3..00000000000 --- a/packages/create-router/src/cli.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { basename, resolve } from 'node:path' -import { Command, InvalidArgumentError } from 'commander' -import { - NAME, - SUPPORTED_BUNDLERS, - SUPPORTED_IDES, - SUPPORTED_PACKAGE_MANAGERS, -} from './constants' -import { validateProjectName } from './utils/validateProjectName' -import { getPackageManager } from './utils/getPackageManager' -import { packageJson } from './utils/packageJson' -import type { Bundler, Ide, PackageManager } from './constants' - -let directory: string | undefined - -export const command = new Command(NAME) - .version( - packageJson.version, - '-v, --version', - `Output the current version of ${NAME}.`, - ) - .argument('[directory]') - .usage('[directory] [options]') - .helpOption('-h, --help', 'Display this help message.') - .option( - `--package-manager <${SUPPORTED_PACKAGE_MANAGERS.join('|')}>`, - `Explicitly tell the CLI to use this package manager`, - (value) => { - if (!SUPPORTED_PACKAGE_MANAGERS.includes(value as PackageManager)) { - throw new InvalidArgumentError( - `Invalid package manager: ${value}. Only the following are allowed: ${SUPPORTED_PACKAGE_MANAGERS.join(', ')}`, - ) - } - return value as PackageManager - }, - getPackageManager(), - ) - .option( - `--bundler <${SUPPORTED_BUNDLERS.join('|')}>`, - `use this bundler (${SUPPORTED_BUNDLERS.join(', ')})`, - (value) => { - if (!SUPPORTED_BUNDLERS.includes(value as Bundler)) { - throw new InvalidArgumentError( - `Invalid bundler: ${value}. Only the following are allowed: ${SUPPORTED_BUNDLERS.join(', ')}`, - ) - } - return value as Bundler - }, - ) - .option( - `--ide <${SUPPORTED_IDES.join('|')}>`, - `use this IDE (${SUPPORTED_IDES.join(', ')})`, - (value) => { - if (!SUPPORTED_IDES.includes(value as Ide)) { - throw new InvalidArgumentError( - `Invalid IDE: ${value}. Only the following are allowed: ${SUPPORTED_IDES.join(', ')}`, - ) - } - return value as Ide - }, - ) - .option( - '--open-project', - 'Open the generated project in the IDE after creation. This requires option --ide to be set.', - false, - ) - .option( - '--skip-install', - 'Explicitly tell the CLI to skip installing packages.', - false, - ) - .option( - '--skip-build', - 'Explicitly tell the CLI to skip building the newly generated project.', - false, - ) - .action((name) => { - if (typeof name === 'string') { - name = name.trim() - } - if (name) { - const validation = validateProjectName(basename(resolve(name))) - if (!validation.valid) { - throw new InvalidArgumentError( - `Invalid project name: ${validation.problems[0]}`, - ) - } - directory = name - } - }) - .parse() - -const options = command.opts<{ - packageManager: PackageManager | undefined - bundler: Bundler | undefined - ide: Ide | undefined - skipInstall: boolean - skipBuild: boolean - openProject: boolean -}>() - -export const cli = { options, args: command.args, directory } diff --git a/packages/create-router/src/constants.ts b/packages/create-router/src/constants.ts deleted file mode 100644 index 5691d33bdb5..00000000000 --- a/packages/create-router/src/constants.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { fileURLToPath } from 'node:url' -import { resolve } from 'node:path' - -export const TEMPLATES_FOLDER = resolve( - fileURLToPath(import.meta.url), - '../../templates', -) -export const NAME = 'create-router' - -export const SUPPORTED_PACKAGE_MANAGERS = [ - 'npm', - 'yarn', - 'pnpm', - 'bun', -] as const -export type PackageManager = (typeof SUPPORTED_PACKAGE_MANAGERS)[number] -export const DEFAULT_PACKAGE_MANAGER: PackageManager = 'npm' - -export const SUPPORTED_BUNDLERS = ['vite', 'webpack', 'rspack'] as const -export type Bundler = (typeof SUPPORTED_BUNDLERS)[number] -export const DEFAULT_BUNDLER: Bundler = 'vite' - -export const SUPPORTED_IDES = ['vscode', 'cursor', 'other'] as const -export type Ide = (typeof SUPPORTED_IDES)[number] -export const DEFAULT_IDE: Ide = 'vscode' diff --git a/packages/create-router/src/core.ts b/packages/create-router/src/core.ts deleted file mode 100644 index 2ac98d9c0f4..00000000000 --- a/packages/create-router/src/core.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { copyTemplateFiles } from './utils/copyTemplateFiles' -import type { ApplyParams, PeerDependency } from './types' - -export const dependencies = [ - '@tanstack/react-router', - '@tanstack/router-devtools', - 'react', - 'react-dom', -] as const satisfies Array -export const devDependencies = [ - '@types/react', - '@types/react-dom', - '@tanstack/router-plugin', -] as const satisfies Array - -export const scripts = { - typecheck: 'tsc --noEmit', -} - -export async function apply({ targetFolder }: ApplyParams) { - await copyTemplateFiles({ file: '**/*', sourceFolder: 'core', targetFolder }) - return { - dependencies, - devDependencies, - scripts, - } -} diff --git a/packages/create-router/src/create.ts b/packages/create-router/src/create.ts deleted file mode 100644 index f7b99f00eda..00000000000 --- a/packages/create-router/src/create.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { mkdir } from 'node:fs/promises' -import yoctoSpinner from 'yocto-spinner' -import colors from 'picocolors' -import { apply as applyCore } from './core' -import { apply as applyBundler } from './bundler' -import { apply as applyIde } from './ide' -import { openProject as openProjectImpl } from './ide/openProject' -import { getDependenciesWithVersion } from './utils/getPeerDependencyVersion' -import { writeTemplateFile } from './utils/writeTemplateFile' -import { build, install } from './utils/runPackageManagerCommand' -import type { Bundler, Ide, PackageManager } from './constants' -import type { PeerDependency } from './types' - -interface GeneratePackageJsonParams { - name: string - scripts: Record - devDependencies: Array - dependencies: Array - overrides?: Partial< - Record>> - > -} -function generatePackageJson({ - name, - scripts, - dependencies, - devDependencies, - overrides, -}: GeneratePackageJsonParams) { - return { - name, - version: '0.0.0', - private: true, - type: 'module', - scripts, - devDependencies: getDependenciesWithVersion(devDependencies), - dependencies: getDependenciesWithVersion(dependencies), - overrides, - } -} - -export interface CreateParams { - targetFolder: string - projectName: string - skipInstall: boolean - skipBuild: boolean - bundler: Bundler - packageManager: PackageManager - ide: Ide - openProject: boolean -} -export async function create({ - targetFolder, - projectName, - skipInstall, - skipBuild, - bundler, - packageManager, - ide, - openProject, -}: CreateParams) { - const originalCwd = process.cwd() - await mkdir(targetFolder, { recursive: true }) - process.chdir(targetFolder) - - const coreResult = await applyCore({ targetFolder }) - const bundlerResult = await applyBundler(bundler, { targetFolder }) - await applyIde(ide, { targetFolder }) - - const packageJson = generatePackageJson({ - name: projectName, - scripts: { ...coreResult.scripts, ...bundlerResult.scripts }, - dependencies: coreResult.dependencies, - devDependencies: [ - ...coreResult.devDependencies, - ...bundlerResult.devDependencies, - ], - overrides: bundlerResult.overrides, - }) - - await writeTemplateFile('package.json', targetFolder, packageJson) - - if (!skipInstall) { - const installSpinner = yoctoSpinner({ - text: 'installing dependencies', - }).start() - try { - await install(packageManager) - installSpinner.success('dependencies installed') - } catch (e) { - console.error(e) - installSpinner.error('failed to install dependencies') - process.exit(1) - } - } - - if (!skipInstall && !skipBuild) { - const buildSpinner = yoctoSpinner({ text: 'building project' }).start() - try { - await build(packageManager) - buildSpinner.success('project built') - console.log( - `${colors.green('Success')} Created ${projectName} at ${targetFolder}`, - ) - } catch (e) { - console.error(e) - buildSpinner.error('failed to build project') - process.exit(1) - } - } - - console.log() - if (openProject) { - console.log(`opening ${projectName} in ${ide}`) - console.log() - console.log(`start the development server in a terminal in ${ide} via:`) - console.log(colors.cyan(` ${packageManager} run dev`)) - console.log() - await openProjectImpl({ projectPath: targetFolder, ide }) - } else { - const needsCd = originalCwd !== targetFolder - if (needsCd) { - console.log('now go to your project using:') - console.log(colors.cyan(` cd ${targetFolder}`)) - console.log() - } - console.log(`${needsCd ? 'then ' : ''}start the development server via:`) - console.log(colors.cyan(` ${packageManager} run dev`)) - console.log() - } -} diff --git a/packages/create-router/src/ide/getIdeCommand.ts b/packages/create-router/src/ide/getIdeCommand.ts deleted file mode 100644 index bba018c6251..00000000000 --- a/packages/create-router/src/ide/getIdeCommand.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { Ide } from '../constants' - -export function getIdeCommand(ide: Ide) { - switch (ide) { - case 'vscode': - return 'code' - case 'cursor': - return 'cursor' - case 'other': - return - } -} diff --git a/packages/create-router/src/ide/index.ts b/packages/create-router/src/ide/index.ts deleted file mode 100644 index 01cde1f507a..00000000000 --- a/packages/create-router/src/ide/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { apply as applyVsCode } from './vscode' -import type { Ide } from '../constants' -import type { ApplyParams } from '../types' - -export function apply(ide: Ide, params: ApplyParams) { - switch (ide) { - case 'vscode': - case 'cursor': - return applyVsCode(params) - case 'other': - return - } -} - -export function openProject(ide: Ide, params: ApplyParams) { - switch (ide) { - case 'vscode': - case 'cursor': // since cursor is a fork of vscode, we can use the same implementation - return applyVsCode(params) - case 'other': - return - } -} diff --git a/packages/create-router/src/ide/openProject.ts b/packages/create-router/src/ide/openProject.ts deleted file mode 100644 index 6df64c185cb..00000000000 --- a/packages/create-router/src/ide/openProject.ts +++ /dev/null @@ -1,23 +0,0 @@ -import which from 'which' -import spawn from 'cross-spawn' -import { getIdeCommand } from './getIdeCommand' -import type { Ide } from '../constants' - -export interface OpenProjectParams { - projectPath: string - ide: Ide -} -export async function openProject({ ide, projectPath }: OpenProjectParams) { - const command = getIdeCommand(ide) - if (command === undefined) { - return - } - try { - const resolved = await which(command) - spawn(resolved, [projectPath], { detached: true }) - } catch (error) { - console.error( - `Could not open project using ${ide}, since ${command} was not in your PATH`, - ) - } -} diff --git a/packages/create-router/src/ide/vscode.ts b/packages/create-router/src/ide/vscode.ts deleted file mode 100644 index cf16b003c42..00000000000 --- a/packages/create-router/src/ide/vscode.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { copyTemplateFiles } from '../utils/copyTemplateFiles' -import type { ApplyParams } from '../types' - -export async function apply({ targetFolder }: ApplyParams): Promise { - await copyTemplateFiles({ - file: '**/*', - sourceFolder: 'ide/vscode', - targetFolder, - }) -} diff --git a/packages/create-router/src/index.ts b/packages/create-router/src/index.ts deleted file mode 100644 index 2df759e44ff..00000000000 --- a/packages/create-router/src/index.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { basename, resolve } from 'node:path' -import { existsSync } from 'node:fs' - -import { confirm, input, select } from '@inquirer/prompts' -import { cli } from './cli' -import { - DEFAULT_BUNDLER, - DEFAULT_IDE, - DEFAULT_PACKAGE_MANAGER, - SUPPORTED_BUNDLERS, - SUPPORTED_IDES, - SUPPORTED_PACKAGE_MANAGERS, -} from './constants' -import { validateProjectName } from './utils/validateProjectName' -import { create } from './create' -import { isEmptyDirectory } from './utils/isEmptyDirectory' - -async function main() { - // project cannot be built if packages are not installed - if (cli.options.skipInstall === true) { - cli.options.skipInstall = true - } - - if (!cli.options.packageManager) { - cli.options.packageManager = await select({ - message: 'Select a package manager', - choices: SUPPORTED_PACKAGE_MANAGERS.map((pm) => ({ value: pm })), - default: DEFAULT_PACKAGE_MANAGER, - }) - } - - if (!cli.directory) { - cli.directory = await input({ - message: 'Enter the project name', - default: 'my-router-app', - validate: (name) => { - const validation = validateProjectName(basename(resolve(name))) - if (validation.valid) { - return true - } - return 'Invalid project name: ' + validation.problems[0] - }, - }) - } - - do { - if (!cli.options.bundler) { - cli.options.bundler = await select({ - message: 'Select a bundler', - choices: SUPPORTED_BUNDLERS.map((bundler) => ({ value: bundler })), - default: DEFAULT_BUNDLER, - }) - } - - if (cli.options.bundler !== 'vite') { - const bundlerConfirmed = await confirm({ - message: - 'Are you sure you want to use this bundler? If you ever choose to adopt full-stack features with Start, Vite is currently required. Proceed anyway?', - }) - if (!bundlerConfirmed) { - cli.options.bundler = undefined - } - } - } while (cli.options.bundler === undefined) - - if (!cli.options.ide) { - cli.options.ide = await select({ - message: 'Select an IDE', - choices: SUPPORTED_IDES.map((ide) => ({ value: ide })), - default: DEFAULT_IDE, - }) - } - - if (cli.options.ide === 'other') { - cli.options.openProject = false - } else { - cli.options.openProject = await confirm({ - message: `Open the generated project using ${cli.options.ide} after creation?`, - default: true, - }) - } - const targetFolder = resolve(cli.directory) - const projectName = basename(targetFolder) - - if (existsSync(targetFolder) && !(await isEmptyDirectory(targetFolder))) { - const dir = - cli.directory === '.' - ? 'Current directory' - : `Target directory "${targetFolder}"` - const message = `${dir} is not empty. Please choose how to proceed:` - const action = await select({ - message, - choices: [ - { name: 'Cancel', value: 'cancel' }, - { name: 'Ignore files and continue', value: 'ignore' }, - ], - }) - if (action === 'cancel') { - process.exit(1) - } - } - - await create({ - targetFolder, - projectName, - skipInstall: cli.options.skipInstall, - skipBuild: cli.options.skipBuild, - packageManager: cli.options.packageManager, - bundler: cli.options.bundler, - ide: cli.options.ide, - openProject: cli.options.openProject, - }) -} - -main().catch(console.error) diff --git a/packages/create-router/src/types.ts b/packages/create-router/src/types.ts deleted file mode 100644 index 5cc66170c85..00000000000 --- a/packages/create-router/src/types.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type packageJson from '../package.json' - -export interface ApplyParams { - targetFolder: string -} - -export type PeerDependency = keyof typeof packageJson.peerDependencies - -export interface BundlerResult { - scripts: Record - devDependencies: Array - dependencies?: Array - overrides?: Partial>>> -} diff --git a/packages/create-router/src/utils/copyTemplateFiles.ts b/packages/create-router/src/utils/copyTemplateFiles.ts deleted file mode 100644 index b557a034033..00000000000 --- a/packages/create-router/src/utils/copyTemplateFiles.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { copyFile, mkdir, readdir, stat } from 'node:fs/promises' -import { resolve } from 'node:path' -import { glob } from 'tinyglobby' -import { TEMPLATES_FOLDER } from '../constants' - -/** - * all files prefixed with `_dot_` will be copied over to the created project with a `.` instead of the `_dot_` - */ -const DOT_PREFIX = '_dot_' - -interface CopyTemplateFilesParams { - file: string - sourceFolder: string - targetFolder: string -} -export async function copyTemplateFiles({ - file, - sourceFolder, - targetFolder, -}: CopyTemplateFilesParams) { - const files = await glob(file, { - cwd: resolve(TEMPLATES_FOLDER, sourceFolder), - onlyFiles: false, - }) - - for (const file of files) { - await copy( - resolve(TEMPLATES_FOLDER, sourceFolder, file), - resolve(targetFolder, file), - ) - } -} - -async function copyDir(srcDir: string, destDir: string) { - await mkdir(destDir, { recursive: true }) - const files = await readdir(srcDir) - for (const file of files) { - const srcFile = resolve(srcDir, file) - const destFile = resolve(destDir, file) - await copy(srcFile, destFile) - } -} - -async function copy(src: string, dest: string) { - const statResult = await stat(src) - const replacedDest = dest.replace(DOT_PREFIX, '.') - if (statResult.isDirectory()) { - await copyDir(src, replacedDest) - } else { - await copyFile(src, replacedDest) - } -} diff --git a/packages/create-router/src/utils/getPackageManager.ts b/packages/create-router/src/utils/getPackageManager.ts deleted file mode 100644 index 4bcb7b8032c..00000000000 --- a/packages/create-router/src/utils/getPackageManager.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { SUPPORTED_PACKAGE_MANAGERS } from '../constants' -import type { PackageManager } from '../constants' - -export function getPackageManager(): PackageManager | undefined { - const userAgent = process.env.npm_config_user_agent - - if (userAgent === undefined) { - return undefined - } - - const packageManager = SUPPORTED_PACKAGE_MANAGERS.find((manager) => - userAgent.startsWith(manager), - ) - - return packageManager -} diff --git a/packages/create-router/src/utils/getPeerDependencyVersion.ts b/packages/create-router/src/utils/getPeerDependencyVersion.ts deleted file mode 100644 index b215cdb4b90..00000000000 --- a/packages/create-router/src/utils/getPeerDependencyVersion.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { packageJson } from './packageJson' -import type { PeerDependency } from '../types' - -export function getDependenciesWithVersion(deps: Array) { - return deps.reduce( - (acc, dep) => { - acc[dep] = packageJson.peerDependencies[dep] - return acc - }, - {} as Record, - ) -} diff --git a/packages/create-router/src/utils/isEmptyDirectory.ts b/packages/create-router/src/utils/isEmptyDirectory.ts deleted file mode 100644 index b317f645b71..00000000000 --- a/packages/create-router/src/utils/isEmptyDirectory.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { readdir } from 'node:fs/promises' - -export async function isEmptyDirectory(path: string) { - const files = await readdir(path) - return files.length === 0 || (files.length === 1 && files[0] === '.git') -} diff --git a/packages/create-router/src/utils/packageJson.ts b/packages/create-router/src/utils/packageJson.ts deleted file mode 100644 index 4522a1edae8..00000000000 --- a/packages/create-router/src/utils/packageJson.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { readFile } from 'node:fs/promises' -import { resolve } from 'node:path' -import { fileURLToPath } from 'node:url' - -async function readPackageJson() { - const PACKAGE_JSON_FILE = resolve( - fileURLToPath(import.meta.url), - '../../package.json', - ) - const packageJson = await readFile(PACKAGE_JSON_FILE, 'utf-8') - return JSON.parse(packageJson) -} - -export const packageJson = await readPackageJson() diff --git a/packages/create-router/src/utils/runPackageManagerCommand.ts b/packages/create-router/src/utils/runPackageManagerCommand.ts deleted file mode 100644 index 89382fe99f7..00000000000 --- a/packages/create-router/src/utils/runPackageManagerCommand.ts +++ /dev/null @@ -1,48 +0,0 @@ -import spawn from 'cross-spawn' -import type { PackageManager } from '../constants' - -export async function runPackageManagerCommand( - packageManager: PackageManager, - args: Array, - env: NodeJS.ProcessEnv = {}, -) { - return new Promise((resolve, reject) => { - const child = spawn(packageManager, args, { - env: { - ...process.env, - ...env, - }, - stdio: ['pipe', 'pipe', 'pipe'], - }) - let stderrBuffer = '' - let stdoutBuffer = '' - - child.stderr?.on('data', (data) => { - stderrBuffer += data - }) - - child.stdout?.on('data', (data) => { - stdoutBuffer += data - }) - - child.on('close', (code) => { - if (code !== 0) { - reject( - `"${packageManager} ${args.join(' ')}" failed ${stdoutBuffer} ${stderrBuffer}`, - ) - return - } - resolve() - }) - }) -} - -export async function install(packageManager: PackageManager) { - return runPackageManagerCommand(packageManager, ['install'], { - NODE_ENV: 'development', - }) -} - -export async function build(packageManager: PackageManager) { - return runPackageManagerCommand(packageManager, ['run', 'build']) -} diff --git a/packages/create-router/src/utils/validateProjectName.ts b/packages/create-router/src/utils/validateProjectName.ts deleted file mode 100644 index dc1366ab4ac..00000000000 --- a/packages/create-router/src/utils/validateProjectName.ts +++ /dev/null @@ -1,25 +0,0 @@ -import validate from 'validate-npm-package-name' - -type ValidatationResult = - | { - valid: true - } - | { - valid: false - problems: Array - } - -export function validateProjectName(name: string): ValidatationResult { - const nameValidation = validate(name) - if (nameValidation.validForNewPackages) { - return { valid: true } - } - - return { - valid: false, - problems: [ - ...(nameValidation.errors || []), - ...(nameValidation.warnings || []), - ], - } -} diff --git a/packages/create-router/src/utils/writeTemplateFile.ts b/packages/create-router/src/utils/writeTemplateFile.ts deleted file mode 100644 index 44ab7840a31..00000000000 --- a/packages/create-router/src/utils/writeTemplateFile.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { resolve } from 'node:path' -import { writeFile } from 'node:fs/promises' - -export async function writeTemplateFile( - file: string, - targetFolder: string, - content: unknown, -) { - const targetPath = resolve(targetFolder, file) - let contentToWrite: string - if (typeof content === 'string') { - contentToWrite = content - } else { - contentToWrite = JSON.stringify(content, null, 2) - } - await writeFile(targetPath, contentToWrite) -} diff --git a/packages/create-router/templates/bundler/rspack/index.html b/packages/create-router/templates/bundler/rspack/index.html deleted file mode 100644 index f855293b649..00000000000 --- a/packages/create-router/templates/bundler/rspack/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - TanStack Router - - - - -
- - diff --git a/packages/create-router/templates/bundler/rspack/rsbuild.config.ts b/packages/create-router/templates/bundler/rspack/rsbuild.config.ts deleted file mode 100644 index 101af08a4ae..00000000000 --- a/packages/create-router/templates/bundler/rspack/rsbuild.config.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { defineConfig } from '@rsbuild/core' -import { pluginReact } from '@rsbuild/plugin-react' -import { TanStackRouterRspack } from '@tanstack/router-plugin/rspack' - -export default defineConfig({ - plugins: [pluginReact()], - source: { - entry: { index: './src/main.tsx' }, - }, - html: { - template: './index.html', - }, - tools: { - rspack: { - plugins: [ - TanStackRouterRspack({ - target: 'react', - autoCodeSplitting: true, - }), - ], - }, - }, -}) diff --git a/packages/create-router/templates/bundler/vite/index.html b/packages/create-router/templates/bundler/vite/index.html deleted file mode 100644 index 9367b8892a7..00000000000 --- a/packages/create-router/templates/bundler/vite/index.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - TanStack Router - - - - - -
- - - diff --git a/packages/create-router/templates/bundler/vite/vite.config.ts b/packages/create-router/templates/bundler/vite/vite.config.ts deleted file mode 100644 index f22a7fa76f3..00000000000 --- a/packages/create-router/templates/bundler/vite/vite.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' -import { TanStackRouterVite } from '@tanstack/router-plugin/vite' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [ - TanStackRouterVite({ - target: 'react', - autoCodeSplitting: true, - }), - react(), - ], -}) diff --git a/packages/create-router/templates/bundler/webpack/_dot_swcrc b/packages/create-router/templates/bundler/webpack/_dot_swcrc deleted file mode 100644 index 16ef25594c7..00000000000 --- a/packages/create-router/templates/bundler/webpack/_dot_swcrc +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://swc.rs/schema.json", - "jsc": { - "target": "es2015", - "parser": { - "syntax": "typescript", - "tsx": true - }, - "transform": { - "react": { - "runtime": "automatic" - } - } - } -} diff --git a/packages/create-router/templates/bundler/webpack/index.html b/packages/create-router/templates/bundler/webpack/index.html deleted file mode 100644 index f855293b649..00000000000 --- a/packages/create-router/templates/bundler/webpack/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - TanStack Router - - - - -
- - diff --git a/packages/create-router/templates/bundler/webpack/webpack.config.js b/packages/create-router/templates/bundler/webpack/webpack.config.js deleted file mode 100644 index 70f873b0cd5..00000000000 --- a/packages/create-router/templates/bundler/webpack/webpack.config.js +++ /dev/null @@ -1,48 +0,0 @@ -import path from 'path' -import { fileURLToPath } from 'url' -import HtmlWebpackPlugin from 'html-webpack-plugin' -import { TanStackRouterWebpack } from '@tanstack/router-plugin/webpack' - -const __dirname = fileURLToPath(new URL('.', import.meta.url)) - -/** @type import('webpack').Configuration */ -export default ({ WEBPACK_SERVE }) => ({ - target: 'web', - mode: WEBPACK_SERVE ? 'development' : 'production', - entry: path.resolve(__dirname, './src/main.tsx'), - output: { - path: path.resolve(__dirname, './dist'), - filename: '[name].bundle.js', - publicPath: '/', - }, - resolve: { - extensions: ['.ts', '.tsx', '.js', '.jsx'], - }, - plugins: [ - new HtmlWebpackPlugin({ - template: path.resolve(__dirname, './index.html'), - filename: 'index.html', - }), - TanStackRouterWebpack({ - target: 'react', - autoCodeSplitting: true, - }), - ], - module: { - rules: [ - { - test: /\.tsx?$/, - exclude: /(node_modules)/, - use: { loader: 'swc-loader' }, - }, - ], - }, - devServer: { - open: true, - hot: true, - historyApiFallback: { - rewrites: [{ from: /./, to: '/index.html' }], - }, - static: ['public'], - }, -}) diff --git a/packages/create-router/templates/core/_dot_gitignore b/packages/create-router/templates/core/_dot_gitignore deleted file mode 100644 index ed335a7bdc1..00000000000 --- a/packages/create-router/templates/core/_dot_gitignore +++ /dev/null @@ -1,18 +0,0 @@ -# Local -.DS_Store -*.local -*.log* - -# Dist -node_modules -dist/ -.vinxi -.output -.vercel -.netlify -.wrangler - -# IDE -.vscode/* -!.vscode/extensions.json -.idea diff --git a/packages/create-router/templates/core/src/main.tsx b/packages/create-router/templates/core/src/main.tsx deleted file mode 100644 index 489ebafacf4..00000000000 --- a/packages/create-router/templates/core/src/main.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import { RouterProvider, createRouter } from '@tanstack/react-router' -import { routeTree } from './routeTree.gen' - -// Set up a Router instance -const router = createRouter({ - routeTree, - defaultPreload: 'intent', -}) - -// Register things for typesafety -declare module '@tanstack/react-router' { - interface Register { - router: typeof router - } -} - -const rootElement = document.getElementById('app')! - -if (!rootElement.innerHTML) { - const root = ReactDOM.createRoot(rootElement) - root.render() -} diff --git a/packages/create-router/templates/core/src/routes/__root.tsx b/packages/create-router/templates/core/src/routes/__root.tsx deleted file mode 100644 index 8896176e24e..00000000000 --- a/packages/create-router/templates/core/src/routes/__root.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import * as React from 'react' -import { Link, Outlet, createRootRoute } from '@tanstack/react-router' -import { TanStackRouterDevtools } from '@tanstack/router-devtools' - -export const Route = createRootRoute({ - component: RootComponent, -}) - -function RootComponent() { - return ( - <> -
- - Home - {' '} - - About - -
-
- - - - ) -} diff --git a/packages/create-router/templates/core/src/routes/about.tsx b/packages/create-router/templates/core/src/routes/about.tsx deleted file mode 100644 index 492e6b85c25..00000000000 --- a/packages/create-router/templates/core/src/routes/about.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import * as React from 'react' -import { createFileRoute } from '@tanstack/react-router' - -export const Route = createFileRoute('/about')({ - component: AboutComponent, -}) - -function AboutComponent() { - return ( -
-

About

-
- ) -} diff --git a/packages/create-router/templates/core/src/routes/index.tsx b/packages/create-router/templates/core/src/routes/index.tsx deleted file mode 100644 index c4588fb2c9c..00000000000 --- a/packages/create-router/templates/core/src/routes/index.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import * as React from 'react' -import { createFileRoute } from '@tanstack/react-router' - -export const Route = createFileRoute('/')({ - component: HomeComponent, -}) - -function HomeComponent() { - return ( -
-

Welcome Home!

-
- ) -} diff --git a/packages/create-router/templates/core/tsconfig.json b/packages/create-router/templates/core/tsconfig.json deleted file mode 100644 index 2bb4932999a..00000000000 --- a/packages/create-router/templates/core/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "esModuleInterop": true, - "jsx": "react-jsx", - "target": "ESNext", - "module": "ESNext", - "moduleResolution": "Bundler", - "skipLibCheck": true - } -} diff --git a/packages/create-router/templates/ide/vscode/_dot_vscode/settings.json b/packages/create-router/templates/ide/vscode/_dot_vscode/settings.json deleted file mode 100644 index 00b5278e580..00000000000 --- a/packages/create-router/templates/ide/vscode/_dot_vscode/settings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "files.watcherExclude": { - "**/routeTree.gen.ts": true - }, - "search.exclude": { - "**/routeTree.gen.ts": true - }, - "files.readonlyInclude": { - "**/routeTree.gen.ts": true - } -} diff --git a/packages/create-router/tsconfig.json b/packages/create-router/tsconfig.json deleted file mode 100644 index aa15ad99251..00000000000 --- a/packages/create-router/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "jsx": "react-jsx", - "target": "ESNext", - "module": "ESNext" - }, - "moduleResolution": "Bundler", - "include": ["src", "tests", "build.config.ts"] -} diff --git a/packages/create-start/.gitignore b/packages/create-start/.gitignore deleted file mode 100644 index cab449e0176..00000000000 --- a/packages/create-start/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -test-results -dist -node_modules \ No newline at end of file diff --git a/packages/create-start/README.md b/packages/create-start/README.md deleted file mode 100644 index 8bf853f57fd..00000000000 --- a/packages/create-start/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# @tanstack/create-start - -CLI tool for creating and modifying TanStack Start projects. - -``` -pnpm create @tanstack/start -``` - -Run - -``` -pnpm create @tanstack/start --help -``` - -to see all options. - -Until peer dependency issues are worked out, `npm create @tanstack/start` doesn't work. - -Use pnpm or maybe a bundled version could be published instead. - -# Contributing - -## Modules - -Modules represent templates and functionality that can be added later to a TanStack Start project. A module is created using a chain of methods specifying callbacks which receives arguments from the previous step. - -- `createModule(schema)`: Set the schema of values that will be passed in from command line options. - -- `.init((configFromSchema) => { ... })`: Crawl the filesystem to infer configuration, for example detecting the current package manager - -- `.prompt((configFromInit) => { ... })`: Prompt the user for configuration, skipping config that has already been specified. - -- `.validateAndApply({ validate, apply })` - - - `validate({ cfg, targetPath })`: check if preconditions met (is there a package.json? is a library already installed?) and return an array of strings that are issues to address - - - `apply({ cfg, targetPath })`: modify the filesystem: install libraries, modify files diff --git a/packages/create-start/build.config.ts b/packages/create-start/build.config.ts deleted file mode 100644 index 1cf3d4a9594..00000000000 --- a/packages/create-start/build.config.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { defineBuildConfig } from 'unbuild' - -// Separeate config required for dev because mkdist + cli-entry doesn't work -// with stub. It will create a .d.ts and .mjs file in the src folder -const dev = defineBuildConfig({ - entries: ['src/cli-entry'], - outDir: 'dist', - clean: true, - declaration: true, - rollup: { - inlineDependencies: true, - esbuild: { - target: 'node18', - minify: false, - }, - }, -}) - -const prod = defineBuildConfig({ - entries: [ - { - builder: 'mkdist', - cleanDist: true, - input: './src/', - pattern: ['**/*.{ts,tsx}', '!**/template/**'], - }, - ], - outDir: 'dist', - clean: true, - declaration: true, - rollup: { - inlineDependencies: true, - esbuild: { - target: 'node18', - minify: false, - }, - }, -}) - -const config = process.env.BUILD_ENV === 'production' ? prod : dev -export default config diff --git a/packages/create-start/copyTemplates.mjs b/packages/create-start/copyTemplates.mjs deleted file mode 100644 index 1eb3915fade..00000000000 --- a/packages/create-start/copyTemplates.mjs +++ /dev/null @@ -1,24 +0,0 @@ -import fs from 'node:fs/promises' -import path from 'node:path' -import fg from 'fast-glob' -import url from 'node:url' - -const __filename = url.fileURLToPath(import.meta.url) -const __dirname = path.dirname(__filename) - -async function copyTemplates() { - const templates = await fg('**/template/**', { - cwd: path.join(__dirname, 'src'), - onlyFiles: false, - }) - - for (const template of templates) { - const src = path.join(__dirname, 'src', template) - const dest = path.join(__dirname, 'dist', template) - - await fs.mkdir(path.dirname(dest), { recursive: true }) - await fs.cp(src, dest, { recursive: true }) - } -} - -copyTemplates().catch(console.error) diff --git a/packages/create-start/eslint.config.js b/packages/create-start/eslint.config.js deleted file mode 100644 index c12a3bebe03..00000000000 --- a/packages/create-start/eslint.config.js +++ /dev/null @@ -1,18 +0,0 @@ -import rootConfig from '../../eslint.config.js' - -export default [ - ...rootConfig, - { - files: ['src/templates/**/template/**/*', 'src/modules/**/template/**/*'], - rules: { - '@typescript-eslint/ban-ts-comment': [ - 'error', - { - 'ts-nocheck': false, - }, - ], - '@typescript-eslint/array-type': 'off', - '@typescript-eslint/require-await': 'off', - }, - }, -] diff --git a/packages/create-start/index.js b/packages/create-start/index.js deleted file mode 100755 index 9dd6223fc96..00000000000 --- a/packages/create-start/index.js +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env node - -import './dist/cli-entry.mjs' diff --git a/packages/create-start/package.json b/packages/create-start/package.json deleted file mode 100644 index 164021c6d0b..00000000000 --- a/packages/create-start/package.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "name": "@tanstack/create-start", - "version": "1.117.2", - "description": "Modern and scalable routing for React applications", - "author": "Tim O'Connell", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/TanStack/router.git", - "directory": "packages/create-router" - }, - "homepage": "https://tanstack.com/router", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "bin": { - "create-start": "index.js" - }, - "scripts": { - "dev": "BUILD_ENV=development unbuild --stub --watch", - "clean": "rimraf ./dist && rimraf ./coverage", - "test:eslint": "eslint ./src", - "generate-templates": "node ./dist/generate-templates/index.mjs", - "build": "BUILD_ENV=production unbuild && node ./copyTemplates.mjs", - "test": "vitest run", - "test:watch": "vitest watch", - "test:coverage": "vitest run --coverage" - }, - "type": "module", - "files": [ - "index.js", - "templates", - "dist" - ], - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "exports": { - ".": { - "import": "./src/index.ts" - } - }, - "dependencies": { - "gradient-string": "^3.0.0", - "@commander-js/extra-typings": "^12.1.0", - "commander": "^12.1.0", - "@inquirer/prompts": "^5.5.0", - "cross-spawn": "^7.0.6", - "fast-glob": "^3.3.3", - "picocolors": "^1.1.1", - "rollup-plugin-copy": "^3.5.0", - "tempy": "^3.1.0", - "tiny-invariant": "^1.3.3", - "validate-npm-package-name": "^6.0.0", - "yocto-spinner": "^0.2.0", - "zod": "^3.24.2" - }, - "devDependencies": { - "@inquirer/type": "^3.0.4", - "@types/cross-spawn": "^6.0.6", - "@types/validate-npm-package-name": "^4.0.2", - "unbuild": "^3.3.1" - }, - "peerDependencies": { - "@tanstack/react-router": "workspace:^", - "@tanstack/router-devtools": "workspace:^", - "@tanstack/react-start": "workspace:^", - "@types/react": "^19.0.8", - "@types/react-dom": "^19.0.3", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "vinxi": "0.5.1", - "vite": "^6.0.3" - }, - "peerDependenciesMeta": { - "@tanstack/react-router": { - "optional": true - }, - "@tanstack/router-devtools": { - "optional": true - }, - "@tanstack/react-start": { - "optional": true - }, - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - }, - "typescript": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "vinxi": { - "optional": true - }, - "vite": { - "optional": true - } - } -} diff --git a/packages/create-start/src/cli-entry.ts b/packages/create-start/src/cli-entry.ts deleted file mode 100644 index 12e38723ebd..00000000000 --- a/packages/create-start/src/cli-entry.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { runCli } from './cli' - -runCli(process.argv).catch((error) => { - console.error(error) - process.exit(1) -}) diff --git a/packages/create-start/src/cli.ts b/packages/create-start/src/cli.ts deleted file mode 100644 index 000322ef2c7..00000000000 --- a/packages/create-start/src/cli.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { Command, createOption } from '@commander-js/extra-typings' -import { packageManagerOption } from './modules/packageManager' -import { logo } from './logo' -import { - scaffoldTemplate, - templateCliOption, - templatePrompt, -} from './templates' -import { createDebugger, debugCliOption, initDebug } from './utils/debug' -import { getAbsolutePath, newProjectDirectoryPrompt } from './directory' -import { packageNameCliOption } from './modules/packageJson' -import { ideCliOption } from './modules/ide' -import type { TEMPLATE_NAME } from './templates' - -const logger = createDebugger('cli') - -const options = { - template: templateCliOption, - packageNameCliOption: packageNameCliOption, - packageManager: packageManagerOption, - directory: createOption('--directory ', 'The directory to use'), - installDeps: createOption( - '--install-deps', - 'Install dependencies after scaffolding', - ), - noInstallDeps: createOption( - '--no-install-deps', - 'Skip installing dependencies after scaffolding', - ), - initGit: createOption('--init-git', 'Initialise git'), - noInitGit: createOption('--no-init-git', 'Skip initialising git'), - hideLogo: createOption('--hide-logo', 'Hide the Tanstack Start logo'), - ide: ideCliOption, - debug: debugCliOption, -} - -const addNewProjectOptions = (command: Command) => { - return command - .addOption(options.template) - .addOption(options.packageNameCliOption) - .addOption(options.packageManager) - .addOption(options.directory) - .addOption(options.installDeps) - .addOption(options.noInstallDeps) - .addOption(options.initGit) - .addOption(options.noInitGit) - .addOption(options.hideLogo) - .addOption(options.ide) - .addOption(options.debug) -} - -// const addQueryCommand = addBaseOptions( -// new Command() -// .name('tanstack-query') -// .description('Add the Tanstack Query module'), -// ).action((options) => {}) - -// const addCommand = new Command() -// .name('add') -// .description('Add a module to your Tanstack Start project') - -const program = addNewProjectOptions( - new Command('create-start') - .name('create-start') - .description('Scaffold a Tanstack Start appliaction') - .command('default', { - isDefault: true, - hidden: true, - }), -) - // .addCommand(addCommand) - .action(async (options) => { - logger.info('Starting CLI action', { options }) - initDebug(options.debug) - - const templateId: TEMPLATE_NAME = - options.template ?? (await templatePrompt()) - logger.verbose('Template selected', { templateId }) - - const directory = options.directory ?? (await newProjectDirectoryPrompt()) - const targetPath = getAbsolutePath(directory) - logger.verbose('Target directory resolved', { directory, targetPath }) - - logger.info('Starting scaffold process', { - templateId, - targetPath, - packageManager: options.packageManager, - installDeps: options.installDeps, - packageName: options.packageName, - initGit: options.initGit, - ide: options.ide, - }) - - await scaffoldTemplate({ - cfg: { - packageManager: { - packageManager: options.packageManager, - installDeps: options.installDeps, - }, - packageJson: { - type: 'new', - name: options.packageName, - }, - git: { - setupGit: options.initGit, - }, - ide: { - ide: options.ide, - }, - }, - targetPath, - templateId, - }) - logger.info('Scaffold process complete') - }) - -export async function runCli(argv: Array) { - logger.info('CLI starting', { argv }) - if (!argv.includes('--hide-logo')) { - logo() - } - - return new Promise((resolve, reject) => { - logger.verbose('Parsing CLI arguments') - program - .parseAsync(argv) - .then(resolve) - .catch((error) => { - logger.error('CLI execution failed', error) - reject(error) - }) - }) -} diff --git a/packages/create-start/src/constants.ts b/packages/create-start/src/constants.ts deleted file mode 100644 index ef640a4203d..00000000000 --- a/packages/create-start/src/constants.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const NAME = 'create-start' -export const SUPPORTED_PACKAGE_MANAGERS = [ - 'bun', - 'pnpm', - 'npm', - 'yarn', -] as const -export type PackageManager = (typeof SUPPORTED_PACKAGE_MANAGERS)[number] diff --git a/packages/create-start/src/directory.ts b/packages/create-start/src/directory.ts deleted file mode 100644 index 297b29358ef..00000000000 --- a/packages/create-start/src/directory.ts +++ /dev/null @@ -1,73 +0,0 @@ -import path from 'node:path' -import fs from 'node:fs/promises' -import { InvalidArgumentError, createOption } from '@commander-js/extra-typings' -import { input } from '@inquirer/prompts' - -export const getAbsolutePath = (relativePath: string) => { - return path.resolve(process.cwd(), relativePath) -} - -const doesPathExist = async (absolutePath: string) => { - try { - await fs.access(absolutePath) - return true - } catch { - return false - } -} - -const isFolderEmpty = async (absolutePath: string) => { - try { - const files = await fs.readdir(absolutePath) - return files.length === 0 - } catch { - return false - } -} - -const DEFAULT_NAME = 'my-tanstack-start-app' - -const generateDefaultName = async () => { - // Generate a unique default name e.g. my-tanstack-start-app, - // my-tanstack-start-app-1, my-tanstack-start-app-2 etc - - let folderName = DEFAULT_NAME - let absolutePath = getAbsolutePath(folderName) - let pathExists = await doesPathExist(absolutePath) - let counter = 1 - while (pathExists) { - folderName = `${DEFAULT_NAME}-${counter}` - absolutePath = getAbsolutePath(folderName) - pathExists = await doesPathExist(absolutePath) - counter++ - } - return `./${folderName}` -} - -const validateDirectory = async (directory: string) => { - const absolutePath = getAbsolutePath(directory) - const pathExists = await doesPathExist(absolutePath) - if (!pathExists) return true - const folderEmpty = await isFolderEmpty(absolutePath) - if (folderEmpty) return true - return 'The directory is not empty. New projects can only be scaffolded in empty directories' -} - -export const newProjectDirectoryCliOption = createOption( - '--directory ', - 'The directory to scaffold your app in', -).argParser(async (directory) => { - const validationResult = await validateDirectory(directory) - if (validationResult === true) return directory - throw new InvalidArgumentError(validationResult) -}) - -export const newProjectDirectoryPrompt = async () => { - return await input({ - message: 'Where should the project be created?', - default: await generateDefaultName(), - validate: async (path) => { - return await validateDirectory(path) - }, - }) -} diff --git a/packages/create-start/src/index.ts b/packages/create-start/src/index.ts deleted file mode 100644 index a73827cc6c5..00000000000 --- a/packages/create-start/src/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { createModule } from './module' -import { ideModule as unstable_ideModule } from './modules/ide' -import { gitModule as unstable_gitModule } from './modules/git' -import { coreModule as unstable_coreModule } from './modules/core' -import { packageJsonModule as unstable_packageJsonModule } from './modules/packageJson' -import { packageManagerModule as unstable_packageManagerModule } from './modules/packageManager' - -export { createModule as unstable_createModule } -export { scaffoldTemplate as unstable_scaffoldTemplate } from './templates' - -export const modules = { - unstable_ideModule, - unstable_gitModule, - unstable_coreModule, - unstable_packageJsonModule, - unstable_packageManagerModule, -} diff --git a/packages/create-start/src/logo.ts b/packages/create-start/src/logo.ts deleted file mode 100644 index 9de211427d1..00000000000 --- a/packages/create-start/src/logo.ts +++ /dev/null @@ -1,44 +0,0 @@ -import gradient from 'gradient-string' - -const LEFT_PADDING = 5 - -export const logo = () => { - const logoText = `|▗▄▄▄▖▗▄▖ ▗▖ ▗▖ ▗▄▄▖▗▄▄▄▖▗▄▖ ▗▄▄▖▗▖ ▗▖ - | █ ▐▌ ▐▌▐▛▚▖▐▌▐▌ █ ▐▌ ▐▌▐▌ ▐▌▗▞▘ - | █ ▐▛▀▜▌▐▌ ▝▜▌ ▝▀▚▖ █ ▐▛▀▜▌▐▌ ▐▛▚▖ - | █ ▐▌ ▐▌▐▌ ▐▌▗▄▄▞▘ █ ▐▌ ▐▌▝▚▄▄▖▐▌ ▐▌ - ` - - const startText = `| ▗▄▄▖▗▄▄▄▖▗▄▖ ▗▄▄▖▗▄▄▄▖ - | ▐▌ █ ▐▌ ▐▌▐▌ ▐▌ █ - | ▝▀▚▖ █ ▐▛▀▜▌▐▛▀▚▖ █ - | ▗▄▄▞▘ █ ▐▌ ▐▌▐▌ ▐▌ █ - ` - - const removeLeadngChars = (str: string) => { - return str - .split('\n') - .map((line) => line.replace(/^\s*\|/, '')) - .join('\n') - } - - const padLeft = (str: string) => { - return str - .split('\n') - .map((line) => ' '.repeat(LEFT_PADDING) + line) - .join('\n') - } - - // Create the gradients first - const logoGradient = gradient(['#00bba6', '#8a5eec']) - const startGradient = gradient(['#00bba6', '#00bba6']) - - // Then apply them to the processed text - const logo = logoGradient.multiline(padLeft(removeLeadngChars(logoText))) - const start = startGradient.multiline(padLeft(removeLeadngChars(startText))) - - console.log() - console.log(logo) - console.log(start) - console.log() -} diff --git a/packages/create-start/src/module.ts b/packages/create-start/src/module.ts deleted file mode 100644 index b6caf4154eb..00000000000 --- a/packages/create-start/src/module.ts +++ /dev/null @@ -1,286 +0,0 @@ -import yoctoSpinner from 'yocto-spinner' -import { checkFolderExists, checkFolderIsEmpty } from './utils/helpers' -import { createDebugger } from './utils/debug' -import type { - ParseReturnType, - SafeParseReturnType, - ZodType, - input, - output, - z, -} from 'zod' -import type { Spinner } from 'yocto-spinner' - -const debug = createDebugger('module') - -type Schema = ZodType - -class ModuleBase { - private _baseSchema: TSchema - - constructor(baseSchema: TSchema) { - this._baseSchema = baseSchema - debug.info('Creating new module') - } - - init( - fn: (baseSchema: TSchema) => TInitSchema, - ): InitModule { - debug.verbose('Initializing module with schema transformer') - const schema = fn(this._baseSchema) - return new InitModule(this._baseSchema, schema) - } -} - -class InitModule { - private _baseSchema: TSchema - private _initSchema: TInitSchema - - constructor(baseSchema: TSchema, initSchema: TInitSchema) { - this._baseSchema = baseSchema - this._initSchema = initSchema - debug.verbose('Created init module') - } - - prompt( - fn: (initSchema: TInitSchema) => TPromptSchema, - ): PromptModule { - debug.verbose('Creating prompt module with schema transformer') - const schema = fn(this._initSchema) - return new PromptModule( - this._baseSchema, - this._initSchema, - schema, - ) - } -} - -class PromptModule< - TSchema extends Schema, - TInitSchema extends Schema, - TPromptSchema extends Schema, -> { - private _baseSchema: TSchema - private _initSchema: TInitSchema - private _promptSchema: TPromptSchema - - constructor( - baseSchema: TSchema, - initSchema: TInitSchema, - promptSchema: TPromptSchema, - ) { - this._baseSchema = baseSchema - this._initSchema = initSchema - this._promptSchema = promptSchema - debug.verbose('Created prompt module') - } - - validateAndApply< - TApplyFn extends ApplyFn, - TValidateFn extends ValidateFn, - >({ - validate, - apply, - spinnerConfigFn, - }: { - validate?: TValidateFn - apply: TApplyFn - spinnerConfigFn?: SpinnerConfigFn - }): FinalModule { - debug.verbose('Creating final module with validate and apply functions') - return new FinalModule< - TSchema, - TInitSchema, - TPromptSchema, - TValidateFn, - TApplyFn - >( - this._baseSchema, - this._initSchema, - this._promptSchema, - apply, - validate, - spinnerConfigFn, - ) - } -} - -type ApplyFn = (opts: { - targetPath: string - cfg: z.output -}) => void | Promise - -type ValidateFn = (opts: { - targetPath: string - cfg: z.output -}) => Promise> | Array - -type SpinnerOptions = { - success: string - error: string - inProgress: string -} - -type SpinnerConfigFn = ( - cfg: z.infer, -) => SpinnerOptions | undefined - -class FinalModule< - TSchema extends Schema, - TInitSchema extends Schema, - TPromptSchema extends Schema, - TValidateFn extends ValidateFn, - TApplyFn extends ApplyFn, -> { - public _baseSchema: TSchema - public _initSchema: TInitSchema - public _promptSchema: TPromptSchema - public _applyFn: TApplyFn - public _validateFn: TValidateFn | undefined - public _spinnerConfigFn: SpinnerConfigFn | undefined - - constructor( - baseSchema: TSchema, - initSchema: TInitSchema, - promptSchema: TPromptSchema, - applyFn: TApplyFn, - validateFn?: TValidateFn, - spinnerConfigFn?: SpinnerConfigFn, - ) { - this._baseSchema = baseSchema - this._initSchema = initSchema - this._promptSchema = promptSchema - this._applyFn = applyFn - this._validateFn = validateFn - if (spinnerConfigFn) this._spinnerConfigFn = spinnerConfigFn - debug.verbose('Created final module') - } - - async init(cfg: input): Promise> { - debug.verbose('Running init', { cfg }) - return await this._initSchema.parseAsync(cfg) - } - - public async initSafe( - cfg: input, - ): Promise, output>> { - debug.verbose('Running safe init', { cfg }) - return await this._initSchema.safeParseAsync(cfg) - } - - public async prompt( - cfg: input, - ): Promise, output>> { - debug.verbose('Running prompt', { cfg }) - return await this._promptSchema.parseAsync(cfg) - } - - public async validate( - cfg: input, - ): Promise, output>> { - debug.verbose('Running validate', { cfg }) - return await this._promptSchema.safeParseAsync(cfg) - } - - public async apply({ - cfg, - targetPath, - }: { - cfg: output - targetPath: string - }) { - debug.verbose('Running apply', { cfg, targetPath }) - const spinnerOptions = this._spinnerConfigFn?.(cfg) - await runWithSpinner({ - fn: async () => { - return await this._applyFn({ cfg, targetPath }) - }, - spinnerOptions, - }) - } - - public async execute({ - cfg, - targetPath, - type, - applyingMessage, - }: { - cfg: input - targetPath: string - type: 'new-project' | 'update' - applyingMessage?: string - }) { - debug.info('Executing module', { type, targetPath }) - - const targetExists = await checkFolderExists(targetPath) - const targetIsEmpty = await checkFolderIsEmpty(targetPath) - - debug.verbose('Target directory status', { targetExists, targetIsEmpty }) - - if (type === 'new-project') { - if (targetExists && !targetIsEmpty) { - debug.error('Target directory is not empty for new project') - console.error("The target folder isn't empty") - process.exit(0) - } - } - - if (type === 'update') { - if (!targetExists) { - debug.error('Target directory does not exist for update') - console.error("The target folder doesn't exist") - process.exit(0) - } - } - - debug.verbose('Parsing init state') - const initState = await this._initSchema.parseAsync(cfg) - - debug.verbose('Parsing prompt state') - const promptState = await this._promptSchema.parseAsync(initState) - - if (applyingMessage) { - console.log() - console.log(applyingMessage) - } - - debug.verbose('Applying module') - await this.apply({ cfg: promptState, targetPath }) - debug.info('Module execution complete') - } -} - -export function createModule( - baseSchema: TSchema, -): ModuleBase { - return new ModuleBase(baseSchema) -} - -export const runWithSpinner = async ({ - spinnerOptions, - fn, -}: { - spinnerOptions: SpinnerOptions | undefined - fn: () => Promise -}) => { - let spinner: Spinner - - if (spinnerOptions != undefined) { - spinner = yoctoSpinner({ - text: spinnerOptions.inProgress, - }).start() - } - - try { - await fn() - if (spinnerOptions) { - spinner!.success(spinnerOptions.success) - } - } catch (e) { - if (spinnerOptions) { - spinner!.error(spinnerOptions.error) - } - debug.error('Error in spinner operation', e) - throw e - } -} diff --git a/packages/create-start/src/modules/core/index.ts b/packages/create-start/src/modules/core/index.ts deleted file mode 100644 index 79aaf2e8b1c..00000000000 --- a/packages/create-start/src/modules/core/index.ts +++ /dev/null @@ -1,279 +0,0 @@ -import { dirname, resolve } from 'node:path' -import { fileURLToPath } from 'node:url' -import { readFileSync } from 'node:fs' -import { z } from 'zod' -import { packageJsonModule } from '../packageJson' -import { createModule, runWithSpinner } from '../../module' -import { ideModule } from '../ide' -import { packageManagerModule } from '../packageManager' -import { initHelpers } from '../../utils/helpers' -import { gitModule } from '../git' -import { createDebugger } from '../../utils/debug' - -const __filename = fileURLToPath(import.meta.url) -const __dirname = dirname(__filename) - -const createStartPackageJson = JSON.parse( - readFileSync( - resolve(dirname(fileURLToPath(import.meta.url)), '../../../package.json'), - 'utf8', - ), -) - -const debug = createDebugger('core-module') - -export const coreModule = createModule( - z.object({ - packageJson: packageJsonModule._initSchema.optional(), - ide: ideModule._initSchema.optional(), - packageManager: packageManagerModule._initSchema.optional(), - git: gitModule._initSchema.optional(), - }), -) - .init((schema) => - schema.transform(async (vals, ctx) => { - debug.verbose('Initializing core module schema', { vals }) - - const gitignore: z.infer['gitIgnore'] = [ - { - sectionName: 'Dependencies', - lines: ['node_modules/'], - }, - { - sectionName: 'Env', - lines: [ - '.env', - '.env.local', - '.env.development', - '.env.test', - '.env.production', - '.env.staging', - ], - }, - { - sectionName: 'System Files', - lines: ['.DS_Store', 'Thumbs.db'], - }, - ] - - vals.git = { - ...vals.git, - gitIgnore: [...(vals.git?.gitIgnore ?? []), ...gitignore], - } - - const packageJson: z.infer = { - type: 'new', - dependencies: await deps([ - '@tanstack/react-router', - '@tanstack/react-start', - 'react', - 'react-dom', - 'vinxi', - ]), - devDependencies: await deps(['@types/react', '@types/react']), - scripts: [ - { - name: 'dev', - script: 'vinxi dev', - }, - { - name: 'build', - script: 'vinxi build', - }, - { - name: 'start', - script: 'vinxi start', - }, - ], - ...vals.packageJson, - } - - debug.verbose('Parsing package manager schema') - const packageManager = - await packageManagerModule._initSchema.safeParseAsync( - vals.packageManager, - { - path: ['packageManager'], - }, - ) - - debug.verbose('Parsing IDE schema') - const ide = await ideModule._initSchema.safeParseAsync(vals.ide, { - path: ['ide'], - }) - - debug.verbose('Parsing git schema') - const git = await gitModule._initSchema.safeParseAsync(vals.git, { - path: ['git'], - }) - - if (!ide.success || !packageManager.success || !git.success) { - debug.error('Schema validation failed', null, { - ide: ide.success, - packageManager: packageManager.success, - git: git.success, - }) - ide.error?.issues.forEach((i) => ctx.addIssue(i)) - packageManager.error?.issues.forEach((i) => ctx.addIssue(i)) - git.error?.issues.forEach((i) => ctx.addIssue(i)) - throw Error('Failed validation') - } - - debug.verbose('Schema transformation complete') - return { - ...vals, - packageManager: packageManager.data, - ide: ide.data, - git: git.data, - packageJson, - } - }), - ) - .prompt((schema) => - schema.transform(async (vals, ctx) => { - debug.verbose('Running prompt transformations', { vals }) - - debug.verbose('Parsing IDE prompt schema') - const ide = await ideModule._promptSchema.safeParseAsync(vals.ide, { - path: ['ide'], - }) - - debug.verbose('Parsing package manager prompt schema') - const packageManager = - await packageManagerModule._promptSchema.safeParseAsync( - vals.packageManager, - { path: ['packageManager'] }, - ) - - debug.verbose('Parsing git prompt schema') - const git = await gitModule._promptSchema.safeParseAsync(vals.git, { - path: ['git'], - }) - - debug.verbose('Parsing package.json prompt schema') - const packageJson = await packageJsonModule._promptSchema.safeParseAsync( - vals.packageJson, - { - path: ['packageJson'], - }, - ) - - if ( - !ide.success || - !packageManager.success || - !git.success || - !packageJson.success - ) { - debug.error('Prompt validation failed', null, { - ide: ide.success, - packageManager: packageManager.success, - git: git.success, - packageJson: packageJson.success, - }) - ide.error?.issues.forEach((i) => ctx.addIssue(i)) - packageManager.error?.issues.forEach((i) => ctx.addIssue(i)) - git.error?.issues.forEach((i) => ctx.addIssue(i)) - throw Error('Failed validation') - } - - debug.verbose('Prompt transformations complete') - return { - packageJson: packageJson.data, - ide: ide.data, - packageManager: packageManager.data, - git: git.data, - } - }), - ) - .validateAndApply({ - validate: async ({ cfg, targetPath }) => { - debug.verbose('Validating core module', { targetPath }) - const _ = initHelpers(__dirname, targetPath) - - const issues = await _.getTemplateFilesThatWouldBeOverwritten({ - file: '**/*', - templateFolder: './template', - targetFolder: targetPath, - overwrite: false, - }) - - if (ideModule._validateFn) { - debug.verbose('Running IDE validation') - const ideIssues = await ideModule._validateFn({ - cfg: cfg.ide, - targetPath, - }) - issues.push(...ideIssues) - } - - debug.info('Validation complete', { issueCount: issues.length }) - return issues - }, - apply: async ({ cfg, targetPath }) => { - debug.info('Applying core module', { targetPath }) - const _ = initHelpers(__dirname, targetPath) - - debug.verbose('Copying core template files') - await runWithSpinner({ - spinnerOptions: { - inProgress: 'Copying core template files', - error: 'Failed to copy core template files', - success: 'Copied core template files', - }, - fn: async () => - await _.copyTemplateFiles({ - file: '**/*', - templateFolder: './template', - targetFolder: '.', - overwrite: false, - }), - }) - - debug.verbose('Applying package.json module') - await packageJsonModule.apply({ cfg: cfg.packageJson, targetPath }) - - debug.verbose('Applying IDE module') - await ideModule.apply({ cfg: cfg.ide, targetPath }) - - debug.verbose('Applying git module') - await gitModule._applyFn({ cfg: cfg.git, targetPath }) - - debug.verbose('Applying package manager module') - await packageManagerModule.apply({ - cfg: cfg.packageManager, - targetPath, - }) - - debug.info('Core module application complete') - }, - }) - -type DepNames< - T extends - (typeof createStartPackageJson)['peerDependencies'] = (typeof createStartPackageJson)['peerDependencies'], -> = keyof T - -const deps = async ( - depsArray: Array, -): Promise< - Exclude< - z.infer['dependencies'], - undefined - > -> => { - debug.verbose('Resolving dependencies', { deps: depsArray }) - const result = await Promise.all( - depsArray.map((d) => { - const version = - createStartPackageJson['peerDependencies'][d] === 'workspace:^' - ? 'latest' // Use latest in development - : createStartPackageJson['peerDependencies'][d] - return { - name: d, - version: version, - } - }), - ) - - return result -} diff --git a/packages/create-start/src/modules/core/template/app.config.ts b/packages/create-start/src/modules/core/template/app.config.ts deleted file mode 100644 index b2c04b10631..00000000000 --- a/packages/create-start/src/modules/core/template/app.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -// @ts-nocheck - -import { defineConfig } from '@tanstack/react-start/config' - -export default defineConfig({}) diff --git a/packages/create-start/src/modules/core/template/app/client.tsx b/packages/create-start/src/modules/core/template/app/client.tsx deleted file mode 100644 index 64f18c113f9..00000000000 --- a/packages/create-start/src/modules/core/template/app/client.tsx +++ /dev/null @@ -1,10 +0,0 @@ -// @ts-nocheck - -/// -import { hydrateRoot } from 'react-dom/client' -import { StartClient } from '@tanstack/react-start' -import { createRouter } from './router' - -const router = createRouter() - -hydrateRoot(document, ) diff --git a/packages/create-start/src/modules/core/template/app/router.tsx b/packages/create-start/src/modules/core/template/app/router.tsx deleted file mode 100644 index 79fe23eab9a..00000000000 --- a/packages/create-start/src/modules/core/template/app/router.tsx +++ /dev/null @@ -1,19 +0,0 @@ -// @ts-nocheck - -import { createRouter as createTanStackRouter } from '@tanstack/react-router' -import { routeTree } from './routeTree.gen' - -export function createRouter() { - const router = createTanStackRouter({ - routeTree, - scrollRestoration: true, - }) - - return router -} - -declare module '@tanstack/react-router' { - interface Register { - router: ReturnType - } -} diff --git a/packages/create-start/src/modules/core/template/app/routes/__root.tsx b/packages/create-start/src/modules/core/template/app/routes/__root.tsx deleted file mode 100644 index 046200b2323..00000000000 --- a/packages/create-start/src/modules/core/template/app/routes/__root.tsx +++ /dev/null @@ -1,49 +0,0 @@ -// @ts-nocheck - -import { - HeadContent, - Outlet, - Scripts, - createRootRoute, -} from '@tanstack/react-router' -import type { ReactNode } from 'react' - -export const Route = createRootRoute({ - head: () => ({ - meta: [ - { - charSet: 'utf-8', - }, - { - name: 'viewport', - content: 'width=device-width, initial-scale=1', - }, - { - title: 'TanStack Start Starter', - }, - ], - }), - component: RootComponent, -}) - -function RootComponent() { - return ( - - - - ) -} - -function RootDocument({ children }: Readonly<{ children: ReactNode }>) { - return ( - - - - - - {children} - - - - ) -} diff --git a/packages/create-start/src/modules/core/template/app/ssr.tsx b/packages/create-start/src/modules/core/template/app/ssr.tsx deleted file mode 100644 index 4ab0e48d6f8..00000000000 --- a/packages/create-start/src/modules/core/template/app/ssr.tsx +++ /dev/null @@ -1,15 +0,0 @@ -// @ts-nocheck - -/// -import { - createStartHandler, - defaultStreamHandler, -} from '@tanstack/react-start/server' -import { getRouterManifest } from '@tanstack/react-start/router-manifest' - -import { createRouter } from './router' - -export default createStartHandler({ - createRouter, - getRouterManifest, -})(defaultStreamHandler) diff --git a/packages/create-start/src/modules/core/template/tsconfig.json b/packages/create-start/src/modules/core/template/tsconfig.json deleted file mode 100644 index edfdf0e8337..00000000000 --- a/packages/create-start/src/modules/core/template/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "jsx": "react-jsx", - "moduleResolution": "Bundler", - "module": "ESNext", - "target": "ES2022", - "skipLibCheck": true, - "strictNullChecks": true - } -} diff --git a/packages/create-start/src/modules/git.ts b/packages/create-start/src/modules/git.ts deleted file mode 100644 index cbf62f00a2e..00000000000 --- a/packages/create-start/src/modules/git.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { readFile, writeFile } from 'node:fs/promises' -import { fileURLToPath } from 'node:url' -import { dirname, resolve } from 'node:path' -import { z } from 'zod' -import { select } from '@inquirer/prompts' -import { createModule } from '../module' -import { runCmd } from '../utils/runCmd' -import { createDebugger } from '../utils/debug' -import { checkFileExists, initHelpers } from '../utils/helpers' - -const __filename = fileURLToPath(import.meta.url) -const __dirname = dirname(__filename) - -const debug = createDebugger('git-module') - -async function appendToGitignore( - targetPath: string, - newEntries: Array, - sectionName: string, -) { - const gitignorePath = resolve(targetPath, '.gitignore') - debug.verbose('Handling gitignore', { gitignorePath }) - - let existingContent = '' - const exists = await checkFileExists(gitignorePath) - - if (exists) { - existingContent = await readFile(gitignorePath, 'utf-8') - const lines = existingContent.split('\n') - - // Find existing section - const sectionStart = lines.findIndex( - (line) => line.trim() === `# ${sectionName}`, - ) - - if (sectionStart !== -1) { - // Section exists, find end (next comment or EOF) - let sectionEnd = lines.findIndex( - (line, i) => i > sectionStart && line.trim().startsWith('#'), - ) - if (sectionEnd === -1) sectionEnd = lines.length - - // Get existing entries in section - const sectionEntries = lines - .slice(sectionStart + 1, sectionEnd) - .map((line) => line.trim()) - .filter((line) => line !== '') - - // Filter out duplicates - newEntries = newEntries.filter( - (entry) => - !sectionEntries.some( - (existing) => existing.toLowerCase() === entry.trim().toLowerCase(), - ), - ) - - if (newEntries.length > 0) { - // Insert new entries at end of section - lines.splice(sectionEnd, 0, ...newEntries) - await writeFile(gitignorePath, lines.join('\n')) - debug.info('Updated existing section in gitignore file') - } - } else { - // Add new section at end - const newContent = `${existingContent}\n\n# ${sectionName}\n${newEntries.join('\n')}` - await writeFile(gitignorePath, newContent) - debug.info('Added new section to gitignore file') - } - } else { - // Create new file with section - const content = `# ${sectionName}\n${newEntries.join('\n')}` - await writeFile(gitignorePath, content) - debug.info('Created new gitignore file') - } -} - -export const gitModule = createModule( - z.object({ - setupGit: z.boolean().optional(), - gitIgnore: z - .object({ - sectionName: z.string(), - lines: z.string().array(), - }) - .array() - .optional(), - }), -) - .init((schema) => schema) // No init required - .prompt((schema) => - schema.transform(async (vals) => { - debug.verbose('Transforming git prompt schema', { vals }) - const setupGit = - vals.setupGit != undefined - ? vals.setupGit - : await select({ - message: 'Initialize git', - choices: [ - { name: 'yes', value: true }, - { name: 'no', value: false }, - ], - default: 'yes', - }) - debug.info('Git initialization choice made', { setupGit }) - return { - setupGit, - gitIgnore: vals.gitIgnore, - } - }), - ) - .validateAndApply({ - apply: async ({ cfg, targetPath }) => { - const _ = initHelpers(__dirname, targetPath) - debug.verbose('Applying git module', { cfg, targetPath }) - - if (cfg.gitIgnore && cfg.gitIgnore.length > 0) { - for (const gitIgnore of cfg.gitIgnore) { - await appendToGitignore( - _.getFullTargetPath(''), - gitIgnore.lines, - gitIgnore.sectionName, - ) - } - debug.info('Created / updated .gitignore') - } - - if (cfg.setupGit) { - debug.info('Initializing git repository') - try { - await runCmd('git', ['init'], {}, targetPath) - debug.info('Git repository initialized successfully') - } catch (error) { - debug.error('Failed to initialize git repository', error) - throw error - } - } else { - debug.info('Skipping git initialization') - } - }, - spinnerConfigFn: () => { - return { - success: 'Git initalized', - error: 'Failed to initialize git', - inProgress: 'Initializing git', - } - }, - }) diff --git a/packages/create-start/src/modules/ide.ts b/packages/create-start/src/modules/ide.ts deleted file mode 100644 index 4294e5d6ed0..00000000000 --- a/packages/create-start/src/modules/ide.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { InvalidArgumentError, createOption } from '@commander-js/extra-typings' -import { z } from 'zod' -import { select } from '@inquirer/prompts' -import { createModule } from '../module' -import { createDebugger } from '../utils/debug' -import { vsCodeModule } from './vscode' - -const debug = createDebugger('ide-module') - -const ide = z.enum(['vscode', 'cursor', 'other']) - -const schema = z.object({ - ide: ide.optional(), -}) - -const SUPPORTED_IDES = ide.options -type SupportedIDE = z.infer -const DEFAULT_IDE = 'vscode' - -export const ideCliOption = createOption( - `--ide <${SUPPORTED_IDES.join('|')}>`, - `use this IDE (${SUPPORTED_IDES.join(', ')})`, -).argParser((value) => { - debug.verbose('Parsing IDE CLI option', { value }) - if (!SUPPORTED_IDES.includes(value as SupportedIDE)) { - debug.error('Invalid IDE option provided', null, { value }) - throw new InvalidArgumentError( - `Invalid IDE: ${value}. Only the following are allowed: ${SUPPORTED_IDES.join(', ')}`, - ) - } - return value as SupportedIDE -}) - -export const ideModule = createModule(schema) - .init((schema) => schema) - .prompt((schema) => - schema.transform(async (vals) => { - debug.verbose('Prompting for IDE selection', { currentValue: vals.ide }) - const ide = vals.ide - ? vals.ide - : await select({ - message: 'Select an IDE', - choices: SUPPORTED_IDES.map((i) => ({ value: i })), - default: DEFAULT_IDE, - }) - - debug.info('IDE selected', { ide }) - return { - ide, - } - }), - ) - .validateAndApply({ - validate: async ({ cfg, targetPath }) => { - debug.verbose('Validating IDE configuration', { - ide: cfg.ide, - targetPath, - }) - const issues: Array = [] - - if (cfg.ide === 'vscode') { - debug.verbose('Validating VSCode configuration') - const issuesVsCode = - (await vsCodeModule._validateFn?.({ cfg, targetPath })) ?? [] - issues.push(...issuesVsCode) - } - - if (issues.length > 0) { - debug.warn('IDE validation issues found', { issues }) - } - return issues - }, - apply: async ({ cfg, targetPath }) => { - debug.info('Applying IDE configuration', { ide: cfg.ide, targetPath }) - await vsCodeModule._applyFn({ cfg, targetPath }) - debug.info('IDE configuration applied successfully') - }, - spinnerConfigFn: (cfg) => { - debug.verbose('Configuring spinner for IDE setup', { ide: cfg.ide }) - return ['vscode'].includes(cfg.ide) - ? { - error: `Failed to set up ${cfg.ide}`, - inProgress: `Setting up ${cfg.ide}`, - success: `${cfg.ide} set up`, - } - : undefined - }, - }) diff --git a/packages/create-start/src/modules/packageJson.ts b/packages/create-start/src/modules/packageJson.ts deleted file mode 100644 index 03642b3a326..00000000000 --- a/packages/create-start/src/modules/packageJson.ts +++ /dev/null @@ -1,183 +0,0 @@ -import { dirname } from 'node:path' -import { fileURLToPath } from 'node:url' -import { z } from 'zod' -import { input } from '@inquirer/prompts' -import { InvalidArgumentError, createOption } from '@commander-js/extra-typings' -import { initHelpers } from '../utils/helpers' -import { createModule } from '../module' -import { validateProjectName } from '../utils/validateProjectName' -import { createDebugger } from '../utils/debug' - -const debug = createDebugger('package-json') - -const __filename = fileURLToPath(import.meta.url) -const __dirname = dirname(__filename) - -export const packageNameCliOption = createOption( - '--package-name ', - 'The name to use in the package.json', -).argParser((name) => { - const validation = validateProjectName(name) - if (!validation.valid) { - debug.error('Invalid package name', { name, validation }) - throw new InvalidArgumentError(`The project name ${name} is invalid`) - } - debug.verbose('Validated package name', { name }) - return name -}) - -const dependencies = z.array( - z.object({ - name: z.string(), - version: z.string(), - }), -) - -const script = z.object({ - name: z.string(), - script: z.string(), -}) - -const schema = z.object({ - type: z.enum(['new', 'update']), - name: z.string().optional(), - dependencies: dependencies.optional(), - devDependencies: dependencies.optional(), - scripts: z.array(script).optional(), -}) - -export const packageJsonModule = createModule(schema) - .init((schema) => schema) - .prompt((schema) => { - return schema.transform(async (vals) => { - debug.verbose('Transforming prompt schema', vals) - if (vals.type === 'new') { - const name = vals.name - ? vals.name - : await input({ - message: 'Enter the project name', - default: 'tanstack-start', - validate: (name) => { - const validation = validateProjectName(name) - if (validation.valid) { - debug.verbose('Valid project name entered', { name }) - return true - } - debug.warn('Invalid project name entered', { - name, - problems: validation.problems, - }) - return 'Invalid project name: ' + validation.problems[0] - }, - }) - - return { - ...vals, - name, - } - } else { - return vals - } - }) - }) - .validateAndApply({ - validate: async ({ cfg, targetPath }) => { - debug.verbose('Validating package.json', { cfg, targetPath }) - const issues: Array = [] - const _ = initHelpers(__dirname, targetPath) - - const packageJsonExists = await _.targetFileExists('./package.json') - debug.verbose('Package.json exists check', { exists: packageJsonExists }) - - if (cfg.type === 'new') { - if (packageJsonExists) { - debug.warn('Package.json already exists for new project') - issues.push('Package.json already exists') - } - } else { - if (!packageJsonExists) { - debug.warn('Package.json missing for update') - issues.push("Package.json doesn't exist to update") - } - } - - return issues - }, - apply: async ({ cfg, targetPath }) => { - debug.verbose('Applying package.json changes', { cfg, targetPath }) - const _ = initHelpers(__dirname, targetPath) - if (cfg.type === 'new') { - const packageJson = { - name: cfg.name, - version: '0.0.0', - private: true, - type: 'module', - } - - debug.verbose('Creating new package.json', packageJson) - await _.writeTargetfile( - './package.json', - JSON.stringify(packageJson, null, 2), - false, - ) - } - - let packageJson = JSON.parse(await _.readTargetFile('./package.json')) - debug.verbose('Current package.json contents', packageJson) - - const dependenciesRecord = createDepsRecord(cfg.dependencies ?? []) - const devDependenciesRecord = createDepsRecord(cfg.devDependencies ?? []) - const scriptsRecord = createScriptsRecord(cfg.scripts ?? []) - - packageJson = { - ...packageJson, - scripts: { - ...packageJson.scripts, - ...scriptsRecord, - }, - dependencies: { - ...packageJson.dependencies, - ...dependenciesRecord, - }, - devDependencies: { - ...packageJson.devDependencies, - ...devDependenciesRecord, - }, - } - - debug.verbose('Updated package.json contents', packageJson) - await _.writeTargetfile( - './package.json', - JSON.stringify(packageJson, null, 2), - true, - ) - }, - spinnerConfigFn: (cfg) => ({ - success: `${cfg.type === 'new' ? 'Created' : 'Updated'} package.json`, - error: `Failed to ${cfg.type === 'new' ? 'create' : 'update'} package.json`, - inProgress: `${cfg.type === 'new' ? 'Creating' : 'Updating'} package.json`, - }), - }) - -const createDepsRecord = (deps: Array<{ name: string; version: string }>) => - deps.reduce( - (acc: Record, dep: { name: string; version: string }) => ({ - ...acc, - [dep.name]: dep.version, - }), - {}, - ) - -const createScriptsRecord = ( - scripts: Array<{ name: string; script: string }>, -) => - scripts.reduce( - ( - acc: Record, - script: { name: string; script: string }, - ) => ({ - ...acc, - [script.name]: script.script, - }), - {}, - ) diff --git a/packages/create-start/src/modules/packageManager.ts b/packages/create-start/src/modules/packageManager.ts deleted file mode 100644 index 2a0c2a52e40..00000000000 --- a/packages/create-start/src/modules/packageManager.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { z } from 'zod' -import { InvalidArgumentError, createOption } from '@commander-js/extra-typings' -import { select } from '@inquirer/prompts' -import { createModule } from '../module' -import { SUPPORTED_PACKAGE_MANAGERS } from '../constants' -import { getPackageManager } from '../utils/getPackageManager' -import { install } from '../utils/runPackageManagerCommand' -import { createDebugger } from '../utils/debug' - -const debug = createDebugger('packageManager') - -const schema = z.object({ - packageManager: z.enum(SUPPORTED_PACKAGE_MANAGERS), - installDeps: z.boolean(), -}) - -const DEFAULT_PACKAGE_MANAGER = 'npm' -const options = schema.shape.packageManager.options -type PackageManager = z.infer['packageManager'] - -export const packageManagerOption = createOption( - `--package-manager <${options.join('|')}>`, - `use this Package Manager (${options.join(', ')})`, -).argParser((value) => { - if (!options.includes(value as PackageManager)) { - debug.error('Invalid package manager provided', { value, allowed: options }) - throw new InvalidArgumentError( - `Invalid Package Manager: ${value}. Only the following are allowed: ${options.join(', ')}`, - ) - } - return value as PackageManager -}) - -export const packageManagerModule = createModule( - z.object({ - packageManager: z.enum(SUPPORTED_PACKAGE_MANAGERS).optional(), - installDeps: z.boolean().optional(), - }), -) - .init((schema) => - schema.transform((vals) => { - debug.verbose('Initializing package manager', vals) - const detectedPM = getPackageManager() - debug.verbose('Detected package manager', { detectedPM }) - return { - packageManager: vals.packageManager ?? detectedPM, - installDeps: vals.installDeps, - } - }), - ) - .prompt((schema) => - schema.transform(async (vals) => { - debug.verbose('Prompting for package manager options', vals) - const packageManager = - vals.packageManager != undefined - ? vals.packageManager - : await select({ - message: 'Select a package manager', - choices: options.map((pm) => ({ value: pm })), - default: getPackageManager() ?? DEFAULT_PACKAGE_MANAGER, - }) - - const installDeps = - vals.installDeps != undefined - ? vals.installDeps - : await select({ - message: 'Install dependencies', - choices: [ - { name: 'yes', value: true }, - { name: 'no', value: false }, - ], - default: 'yes', - }) - - debug.verbose('Package manager options selected', { - packageManager, - installDeps, - }) - return { - installDeps, - packageManager, - } - }), - ) - .validateAndApply({ - spinnerConfigFn: (cfg) => { - debug.verbose('Configuring spinner', cfg) - return cfg.installDeps - ? { - error: `Failed to install dependencies with ${cfg.packageManager}`, - inProgress: `Installing dependencies with ${cfg.packageManager}`, - success: `Installed dependencies with ${cfg.packageManager}`, - } - : undefined - }, - apply: async ({ cfg, targetPath }) => { - if (cfg.installDeps) { - debug.info('Installing dependencies', { - packageManager: cfg.packageManager, - targetPath, - }) - - await install(cfg.packageManager, targetPath) - debug.info('Dependencies installed successfully') - } else { - debug.info('Skipping dependency installation') - } - }, - }) diff --git a/packages/create-start/src/modules/vscode/index.ts b/packages/create-start/src/modules/vscode/index.ts deleted file mode 100644 index 52c448c3c24..00000000000 --- a/packages/create-start/src/modules/vscode/index.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { dirname } from 'node:path' -import { fileURLToPath } from 'node:url' -import { z } from 'zod' -import { initHelpers } from '../../utils/helpers' -import { createModule } from '../../module' -import { createDebugger } from '../../utils/debug' - -const __filename = fileURLToPath(import.meta.url) -const __dirname = dirname(__filename) - -const debug = createDebugger('vscode') - -export const vsCodeModule = createModule(z.object({})) - .init((schema) => schema) - .prompt((schema) => schema) - .validateAndApply({ - validate: async ({ targetPath }) => { - debug.verbose('Validating vscode module', { targetPath }) - const _ = initHelpers(__dirname, targetPath) - - const issues = await _.getTemplateFilesThatWouldBeOverwritten({ - file: '**/*', - templateFolder: './template', - targetFolder: targetPath, - overwrite: false, - }) - - debug.verbose('Validation complete', { issueCount: issues.length }) - return issues - }, - apply: async ({ targetPath }) => { - debug.info('Applying vscode module', { targetPath }) - // Copy the vscode template folders into the project - const _ = initHelpers(__dirname, targetPath) - - // TODO: Handle when the settings file already exists and merge settings - debug.verbose('Copying template files') - await _.copyTemplateFiles({ - file: '**/*', - templateFolder: './template', - targetFolder: '.', - overwrite: false, - }) - debug.info('VSCode module applied successfully') - }, - }) diff --git a/packages/create-start/src/modules/vscode/template/_dot_vscode/settings.json b/packages/create-start/src/modules/vscode/template/_dot_vscode/settings.json deleted file mode 100644 index 00b5278e580..00000000000 --- a/packages/create-start/src/modules/vscode/template/_dot_vscode/settings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "files.watcherExclude": { - "**/routeTree.gen.ts": true - }, - "search.exclude": { - "**/routeTree.gen.ts": true - }, - "files.readonlyInclude": { - "**/routeTree.gen.ts": true - } -} diff --git a/packages/create-start/src/templates/barebones/index.ts b/packages/create-start/src/templates/barebones/index.ts deleted file mode 100644 index 03dcb95fa51..00000000000 --- a/packages/create-start/src/templates/barebones/index.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { fileURLToPath } from 'node:url' -import { dirname } from 'node:path' -import { createModule, runWithSpinner } from '../../module' -import { coreModule } from '../../modules/core' -import { initHelpers } from '../../utils/helpers' -import { createDebugger } from '../../utils/debug' - -const __filename = fileURLToPath(import.meta.url) -const __dirname = dirname(__filename) - -const debug = createDebugger('barebones-template') -const schema = coreModule._initSchema - -export const barebonesTemplate = createModule(schema) - .init((schema) => schema) - .prompt((schema) => - schema.transform(async (vals) => { - debug.verbose('Transforming prompt schema', { vals }) - const core = await coreModule._promptSchema.parseAsync(vals) - debug.verbose('Core module prompt complete') - - return { - ...core, - } - }), - ) - .validateAndApply({ - validate: async ({ cfg, targetPath }) => { - debug.verbose('Validating barebones template', { targetPath }) - const _ = initHelpers(__dirname, targetPath) - - const issues = await _.getTemplateFilesThatWouldBeOverwritten({ - file: '**/*', - templateFolder: './template', - targetFolder: targetPath, - overwrite: false, - }) - - debug.verbose('Template file conflicts found', { issues }) - - const coreIssues = - (await coreModule._validateFn?.({ cfg, targetPath })) ?? [] - debug.verbose('Core module validation issues', { coreIssues }) - - issues.push(...coreIssues) - - return issues - }, - apply: async ({ cfg, targetPath }) => { - debug.info('Applying barebones template', { targetPath }) - const _ = initHelpers(__dirname, targetPath) - - await runWithSpinner({ - spinnerOptions: { - inProgress: 'Copying barebones template files', - error: 'Failed to copy barebones template files', - success: 'Copied barebones template files', - }, - fn: async () => { - debug.verbose('Copying template files') - await _.copyTemplateFiles({ - file: '**/*', - templateFolder: './template', - targetFolder: '.', - overwrite: false, - }) - debug.verbose('Template files copied successfully') - }, - }) - - debug.verbose('Applying core module') - await coreModule._applyFn({ cfg, targetPath }) - debug.info('Barebones template applied successfully') - }, - }) diff --git a/packages/create-start/src/templates/barebones/template/app/routes/index.tsx b/packages/create-start/src/templates/barebones/template/app/routes/index.tsx deleted file mode 100644 index bf75abe4995..00000000000 --- a/packages/create-start/src/templates/barebones/template/app/routes/index.tsx +++ /dev/null @@ -1,11 +0,0 @@ -// @ts-nocheck - -import { createFileRoute } from '@tanstack/react-router' - -export const Route = createFileRoute('/')({ - component: RouteComponent, -}) - -function RouteComponent() { - return
Hello "/"!
-} diff --git a/packages/create-start/src/templates/index.ts b/packages/create-start/src/templates/index.ts deleted file mode 100644 index 3fcbb7b5eca..00000000000 --- a/packages/create-start/src/templates/index.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { select } from '@inquirer/prompts' -import { InvalidArgumentError, createOption } from '@commander-js/extra-typings' -import invariant from 'tiny-invariant' -import { createDebugger } from '../utils/debug' -import { barebonesTemplate } from './barebones' -import type { coreModule } from '../modules/core' -import type { z } from 'zod' - -const debug = createDebugger('templates') - -const templates = [ - { - id: 'barebones', - name: 'Barebones', - module: barebonesTemplate, - description: 'The bare minimum', - }, -] as const - -const templateIds = templates.map((t) => t.id) -export type TEMPLATE_NAME = (typeof templateIds)[number] -export const DEFAULT_TEMPLATE: TEMPLATE_NAME = 'barebones' - -export const templateCliOption = createOption( - '--template ', - 'Choose the template to use', -).argParser((value) => { - if (!templateIds.includes(value as TEMPLATE_NAME)) { - debug.error(`Invalid template specified: ${value}`) - throw new InvalidArgumentError( - `Invalid Template: ${value}. Only the following are allowed: ${templateIds.join(', ')}`, - ) - } - debug.verbose('Template validated from CLI', { template: value }) - return value as TEMPLATE_NAME -}) - -export const templatePrompt = async () => { - debug.info('Prompting for template selection') - const selection = await select({ - message: 'Which template would you like to use?', - choices: templates.map((t) => ({ - name: t.name, - value: t.id, - description: t.description, - })), - default: DEFAULT_TEMPLATE, - }) - debug.verbose('Template selected', { template: selection }) - return selection -} - -export const scaffoldTemplate = async ({ - templateId, - cfg, - targetPath, -}: { - templateId: TEMPLATE_NAME - cfg: z.input - targetPath: string -}) => { - debug.info('Starting template scaffolding', { templateId, targetPath }) - // const template = templates.find((f) => f.id === templateId) - const template = templates[0] // Remove this when we add more templates - invariant(template, `The template with ${templateId} is not valid`) - - debug.verbose('Executing template module', { template: template.id }) - await template.module.execute({ - cfg, - targetPath, - type: 'new-project', - applyingMessage: `Scaffolding the ${template.name} template`, - }) - debug.info('Template scaffolding complete') -} diff --git a/packages/create-start/src/types.ts b/packages/create-start/src/types.ts deleted file mode 100644 index b66c077f64b..00000000000 --- a/packages/create-start/src/types.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type packageJson from '../package.json' - -export type PeerDependency = keyof typeof packageJson.peerDependencies diff --git a/packages/create-start/src/utils/debug.ts b/packages/create-start/src/utils/debug.ts deleted file mode 100644 index 81d7bfe1590..00000000000 --- a/packages/create-start/src/utils/debug.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { InvalidArgumentError, createOption } from '@commander-js/extra-typings' - -type Context = string -type LogLevel = 'info' | 'warn' | 'error' - -interface LogOptions { - context: Context - data?: Record -} - -let isDebugMode = false -let debugLevel = 0 // 1 = basic, 2 = verbose, 3 = trace - -const DEBUG_LEVELS = ['debug', 'trace', 'verbose'] as const -type DebugLevels = (typeof DEBUG_LEVELS)[number] - -export const debugCliOption = createOption( - `--debug <${DEBUG_LEVELS.join('|')}>`, - `Set a debug level (${DEBUG_LEVELS.join(', ')})`, -).argParser((value) => { - if (!DEBUG_LEVELS.includes(value as DebugLevels)) { - throw new InvalidArgumentError( - `Invalid debug level: ${value}. Only the following are allowed: ${DEBUG_LEVELS.join(', ')}`, - ) - } - return value as DebugLevels -}) - -export const initDebug = (level: undefined | 'debug' | 'trace' | 'verbose') => { - if (level === undefined) return - isDebugMode = true - if (level === 'debug') debugLevel = 1 - if (level === 'trace') debugLevel = 2 - if (level === 'verbose') debugLevel = 3 -} - -const formatData = (data?: Record): string => { - if (!data) return '' - return Object.entries(data) - .map(([key, value]) => `${key}=${JSON.stringify(value)}`) - .join(' ') -} - -const log = (level: LogLevel, message: string, options: LogOptions) => { - if (!isDebugMode) return - - const timestamp = new Date().toISOString() - const dataStr = formatData(options.data) - const logMessage = `[${timestamp}] [${level}] [${options.context}] ${message} ${dataStr}` - - switch (level) { - case 'error': - console.error(logMessage) - break - case 'warn': - console.warn(logMessage) - break - case 'info': - console.log(logMessage) - break - } -} - -export const createDebugger = (context: Context) => ({ - info: (message: string, data?: Record) => { - if (debugLevel < 1) return - log('info', message, { context, data }) - }, - warn: (message: string, data?: Record) => { - if (debugLevel < 2) return - log('warn', message, { context, data }) - }, - error: ( - message: string, - error?: Error | unknown, - data?: Record, - ) => { - if (debugLevel < 1) return - log('error', message, { - context, - data: { - ...data, - error: error instanceof Error ? error.message : error, - }, - }) - }, - verbose: (message: string, data?: Record) => { - if (debugLevel < 2) return - log('info', message, { context, data }) - }, - trace: (message: string, data?: Record) => { - if (debugLevel < 3) return - log('info', message, { context, data }) - }, -}) diff --git a/packages/create-start/src/utils/getPackageManager.ts b/packages/create-start/src/utils/getPackageManager.ts deleted file mode 100644 index 4bcb7b8032c..00000000000 --- a/packages/create-start/src/utils/getPackageManager.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { SUPPORTED_PACKAGE_MANAGERS } from '../constants' -import type { PackageManager } from '../constants' - -export function getPackageManager(): PackageManager | undefined { - const userAgent = process.env.npm_config_user_agent - - if (userAgent === undefined) { - return undefined - } - - const packageManager = SUPPORTED_PACKAGE_MANAGERS.find((manager) => - userAgent.startsWith(manager), - ) - - return packageManager -} diff --git a/packages/create-start/src/utils/helpers/helperFactory.ts b/packages/create-start/src/utils/helpers/helperFactory.ts deleted file mode 100644 index 1f0fa6afb89..00000000000 --- a/packages/create-start/src/utils/helpers/helperFactory.ts +++ /dev/null @@ -1,20 +0,0 @@ -export type Ctx = { - getFullModulePath: (relativePath: string) => string - getFullTargetPath: (relativePath: string) => string - targetFileExists: (relativePath: string) => Promise - moduleFileExists: (relativePath: string) => Promise - absoluteTargetFolder: string - absoluteModuleFolder: string -} - -type HelperFn any> = (args: { - modulePath: string - targetPath: string - ctx: Ctx -}) => T - -export const helperFactory = any>( - fn: HelperFn, -) => { - return fn -} diff --git a/packages/create-start/src/utils/helpers/index.ts b/packages/create-start/src/utils/helpers/index.ts deleted file mode 100644 index 051bdf7a2cf..00000000000 --- a/packages/create-start/src/utils/helpers/index.ts +++ /dev/null @@ -1,284 +0,0 @@ -import path, { resolve } from 'node:path' -import fs, { - access, - copyFile, - mkdir, - readFile, - readdir, - stat, - writeFile, -} from 'node:fs/promises' -import invariant from 'tiny-invariant' -import fastGlob from 'fast-glob' -import { createDebugger } from '../debug' - -import { helperFactory } from './helperFactory' -import type { Ctx } from './helperFactory' - -const debug = createDebugger('helpers') - -export const initHelpers = (modulePath: string, targetPath: string) => { - debug.info('Initializing helpers', { modulePath, targetPath }) - - const getFullModulePath = (relativePath: string) => { - const fullPath = path.join(modulePath, relativePath) - debug.trace('Getting full module path', { relativePath, fullPath }) - return fullPath - } - - const getFullTargetPath = (relativePath: string) => { - const fullPath = path.join(targetPath, relativePath) - debug.trace('Getting full target path', { relativePath, fullPath }) - return fullPath - } - - const targetFileExists = async (relativePath: string) => { - const path = resolve(targetPath, relativePath) - debug.trace('Checking if target file exists', { path }) - return await checkFileExists(path) - } - - const moduleFileExists = async (relativePath: string) => { - const path = resolve(modulePath, relativePath) - debug.trace('Checking if module file exists', { path }) - return await checkFileExists(path) - } - - const ctx: Ctx = { - targetFileExists, - moduleFileExists, - absoluteModuleFolder: getFullModulePath(modulePath), - absoluteTargetFolder: getFullTargetPath(targetPath), - getFullModulePath, - getFullTargetPath, - } - - debug.verbose('Created helper context', ctx) - - return { - ...ctx, - readTargetFile: createReadTargetFile({ - ctx, - modulePath, - targetPath, - }), - writeTargetfile: createWriteTargetFile({ - ctx, - modulePath, - targetPath, - }), - copyTemplateFiles: createCopyTemplateFiles({ - ctx, - modulePath, - targetPath, - }), - getTemplateFilesThatWouldBeOverwritten: - createGetTemplateFilesThatWouldBeOverwritten({ - ctx, - modulePath, - targetPath, - }), - } -} - -export const checkFileExists = async (path: string): Promise => { - debug.trace('Checking if file exists', { path }) - try { - await access(path, fs.constants.F_OK) - return true - } catch { - return false - } -} - -export const checkFolderExists = async (path: string): Promise => { - debug.trace('Checking if folder exists', { path }) - try { - await access(path, fs.constants.R_OK) - return true - } catch { - return false - } -} - -export const checkFolderIsEmpty = async (path: string): Promise => { - debug.trace('Checking if folder is empty', { path }) - try { - const files = await readdir(path) - return files.length === 0 - } catch { - return false - } -} - -const createReadTargetFile = helperFactory( - ({ ctx, targetPath }) => - async (relativePath: string) => { - debug.trace('Reading target file', { relativePath, targetPath }) - invariant( - await ctx.targetFileExists(relativePath), - `The file ${relativePath} doesn't exist`, - ) - const path = resolve(targetPath, relativePath) - return await readFile(path, 'utf-8') - }, -) - -export const createWriteTargetFile = helperFactory( - ({ targetPath }) => - async ( - relativePath: string, - content: string, - overwrite: boolean = false, - ) => { - debug.trace('Writing target file', { - relativePath, - targetPath, - overwrite, - }) - const path = resolve(targetPath, relativePath) - invariant( - !(!overwrite && (await checkFileExists(path))), - `File ${relativePath} already exists and overwrite is false`, - ) - await writeFile(path, content) - }, -) - -const DOT_PREFIX = '_dot_' - -const removeTsNoCheckHeader = async (filePath: string) => { - debug.trace('Removing ts-nocheck header', { filePath }) - // Template files will sometimes include // @ts-nocheck in the header of the file - // This is to avoid type checking in the template folders - // This function removes that header - - const content = await readFile(filePath, 'utf-8') - const lines = content.split('\n') - - let newContent = content - - if (lines[0]?.trim() === '// @ts-nocheck') { - newContent = lines.slice(1).join('\n').trimStart() - } - - await writeFile(filePath, newContent) -} - -async function copyDir(srcDir: string, destDir: string) { - debug.trace('Copying directory', { srcDir, destDir }) - await mkdir(destDir, { recursive: true }) - const files = await readdir(srcDir) - for (const file of files) { - const srcFile = resolve(srcDir, file) - const destFile = resolve(destDir, file) - await copy(srcFile, destFile) - } -} - -async function copy(src: string, dest: string) { - debug.trace('Copying file', { src, dest }) - const statResult = await stat(src) - const replacedDest = dest.replaceAll(DOT_PREFIX, '.') - if (statResult.isDirectory()) { - await copyDir(src, replacedDest) - } else { - await copyFile(src, replacedDest) - await removeTsNoCheckHeader(replacedDest) - } -} - -export const createGetTemplateFilesThatWouldBeOverwritten = helperFactory( - ({ ctx }) => - async ({ - file, - templateFolder, - targetFolder, - overwrite, - }: { - file: string - templateFolder: string - targetFolder: string - overwrite: boolean - }) => { - debug.verbose('Checking for files that would be overwritten', { - file, - templateFolder, - targetFolder, - overwrite, - }) - const overwrittenFiles: Array = [] - - if (overwrite) [] - - const absoluteTemplateFolder = ctx.getFullModulePath(templateFolder) - const absoluteTargetFolder = ctx.getFullTargetPath(targetFolder) - - const files = await fastGlob.glob(file, { - cwd: absoluteTemplateFolder, - onlyFiles: false, - }) - - for (const file of files) { - const exists = await checkFileExists( - resolve(absoluteTargetFolder, file), - ) - if (exists) { - debug.verbose('Found file that would be overwritten', { file }) - overwrittenFiles.push(file) - } - } - - return overwrittenFiles - }, -) - -export const createCopyTemplateFiles = helperFactory( - ({ ctx }) => - async ({ - file, - templateFolder, - targetFolder, - overwrite, - }: { - file: string - templateFolder: string - targetFolder: string - overwrite: boolean - }) => { - debug.verbose('Copying template files', { - file, - templateFolder, - targetFolder, - overwrite, - }) - const absoluteTemplateFolder = ctx.getFullModulePath(templateFolder) - const absoluteTargetFolder = ctx.getFullTargetPath(targetFolder) - - const templateFolderExists = checkFolderExists(absoluteTemplateFolder) - invariant( - templateFolderExists, - `The template folder ${templateFolder} doesn't exist`, - ) - - const files = await fastGlob.glob(file, { - cwd: absoluteTemplateFolder, - onlyFiles: false, - }) - - for (const file of files) { - if (overwrite) { - invariant( - await checkFileExists(resolve(absoluteTargetFolder, file)), - `The file ${file} couldn't be created because it would overwrite an existing file`, - ) - } - - debug.trace('Copying template file', { file }) - await copy( - resolve(absoluteTemplateFolder, file), - resolve(absoluteTargetFolder, file), - ) - } - }, -) diff --git a/packages/create-start/src/utils/runCmd.ts b/packages/create-start/src/utils/runCmd.ts deleted file mode 100644 index 0b3634a2945..00000000000 --- a/packages/create-start/src/utils/runCmd.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { spawnCommand } from './spawnCmd' - -export async function runCmd( - command: string, - args: Array, - env: NodeJS.ProcessEnv = {}, - cwd?: string, -) { - return spawnCommand(command, args, env, cwd) -} diff --git a/packages/create-start/src/utils/runPackageManagerCommand.ts b/packages/create-start/src/utils/runPackageManagerCommand.ts deleted file mode 100644 index 9e7d054f200..00000000000 --- a/packages/create-start/src/utils/runPackageManagerCommand.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { spawnCommand } from './spawnCmd' -import type { PackageManager } from '../constants' - -export async function runPackageManagerCommand( - packageManager: PackageManager, - args: Array, - env: NodeJS.ProcessEnv = {}, - cwd?: string, -) { - return spawnCommand(packageManager, args, env, cwd) -} - -export async function install(packageManager: PackageManager, cwd?: string) { - return runPackageManagerCommand( - packageManager, - ['install'], - { - NODE_ENV: 'development', - }, - cwd, - ) -} - -export async function build(packageManager: PackageManager, cwd?: string) { - return runPackageManagerCommand(packageManager, ['run', 'build'], {}, cwd) -} diff --git a/packages/create-start/src/utils/spawnCmd.ts b/packages/create-start/src/utils/spawnCmd.ts deleted file mode 100644 index 0525e2ae7b4..00000000000 --- a/packages/create-start/src/utils/spawnCmd.ts +++ /dev/null @@ -1,39 +0,0 @@ -import spawn from 'cross-spawn' - -export async function spawnCommand( - command: string, - args: Array, - env: NodeJS.ProcessEnv = {}, - cwd?: string, -) { - return new Promise((resolve, reject) => { - const child = spawn(command, args, { - env: { - ...process.env, - ...env, - }, - stdio: ['pipe', 'pipe', 'pipe'], - cwd, - }) - let stderrBuffer = '' - let stdoutBuffer = '' - - child.stderr?.on('data', (data) => { - stderrBuffer += data - }) - - child.stdout?.on('data', (data) => { - stdoutBuffer += data - }) - - child.on('close', (code) => { - if (code !== 0) { - reject( - `"${command} ${args.join(' ')}" failed ${stdoutBuffer} ${stderrBuffer}`, - ) - return - } - resolve() - }) - }) -} diff --git a/packages/create-start/src/utils/validateProjectName.ts b/packages/create-start/src/utils/validateProjectName.ts deleted file mode 100644 index dc1366ab4ac..00000000000 --- a/packages/create-start/src/utils/validateProjectName.ts +++ /dev/null @@ -1,25 +0,0 @@ -import validate from 'validate-npm-package-name' - -type ValidatationResult = - | { - valid: true - } - | { - valid: false - problems: Array - } - -export function validateProjectName(name: string): ValidatationResult { - const nameValidation = validate(name) - if (nameValidation.validForNewPackages) { - return { valid: true } - } - - return { - valid: false, - problems: [ - ...(nameValidation.errors || []), - ...(nameValidation.warnings || []), - ], - } -} diff --git a/packages/create-start/tests/e2e/cli.test.ts b/packages/create-start/tests/e2e/cli.test.ts deleted file mode 100644 index c03a4fc767b..00000000000 --- a/packages/create-start/tests/e2e/cli.test.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { readFile } from 'node:fs/promises' -import { join } from 'node:path' -import { describe, expect, it } from 'vitest' -import { temporaryDirectoryTask } from 'tempy' -import { runCli } from '../../src/cli' - -const constructCliArgs = ({ - template, - directory, - packageName, - packageManager, - installDeps, - initGit, - hideLogo, - ide, -}: { - template?: string - directory?: string - packageName?: string - packageManager?: string - installDeps?: boolean - initGit?: boolean - hideLogo?: boolean - ide?: string -}) => { - return [ - 'node', - 'cli.js', - '--template', - template ?? 'barebones', - '--directory', - directory ?? '', - '--package-name', - packageName ?? '', - '--package-manager', - packageManager ?? 'npm', - ...(installDeps === false ? ['--no-install-deps'] : []), - ...(initGit === false ? ['--no-init-git'] : []), - ...(hideLogo ? ['--hide-logo'] : []), - ...(ide ? ['--ide', ide] : []), - ] -} - -describe('cli e2e', () => { - it('should create a basic project structure using CLI', async () => { - await temporaryDirectoryTask(async (tempDir) => { - const args = constructCliArgs({ - template: 'barebones', - directory: tempDir, - packageName: 'test-package', - packageManager: 'npm', - installDeps: false, - hideLogo: true, - ide: 'vscode', - initGit: false, - }) - - await runCli(args) - - // Check core files exist - const expectedFiles = [ - '.gitignore', - 'package.json', - 'tsconfig.json', - 'app.config.ts', - 'app/client.tsx', - 'app/router.tsx', - 'app/routes/__root.tsx', - 'app/routes/index.tsx', - '.vscode/settings.json', - ] - - for (const file of expectedFiles) { - const filePath = join(tempDir, file) - const exists = await readFile(filePath) - expect(exists).toBeDefined() - } - }) - }) - - it('should create project in current directory when using "." as directory', async () => { - await temporaryDirectoryTask(async (tempDir) => { - const args = constructCliArgs({ - template: 'barebones', - directory: '.', - packageName: 'test-package', - packageManager: 'npm', - installDeps: false, - hideLogo: true, - ide: 'vscode', - initGit: false, - }) - - // Run CLI from the temporary directory - process.chdir(tempDir) - await runCli(args) - - // Check core files exist in current directory - const expectedFiles = [ - 'package.json', - 'tsconfig.json', - 'app.config.ts', - 'app/client.tsx', - 'app/router.tsx', - 'app/routes/__root.tsx', - 'app/routes/index.tsx', - '.vscode/settings.json', - ] - - for (const file of expectedFiles) { - const filePath = join(tempDir, file) - const exists = await readFile(filePath) - expect(exists).toBeDefined() - } - - // Reset working directory - process.chdir('..') - }) - }) - - it('should fail when using an incorrect directory name', async () => { - const args = constructCliArgs({ - template: 'barebones', - directory: '/invalid/directory/path', - packageName: 'test-package', - packageManager: 'npm', - installDeps: false, - hideLogo: true, - ide: 'vscode', - initGit: false, - }) - - await expect(runCli(args)).rejects.toThrow() - }) -}) diff --git a/packages/create-start/tests/e2e/templates/barebones.test.ts b/packages/create-start/tests/e2e/templates/barebones.test.ts deleted file mode 100644 index f509937d329..00000000000 --- a/packages/create-start/tests/e2e/templates/barebones.test.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { join } from 'node:path' -import { readFile } from 'node:fs/promises' -import { describe, expect, it } from 'vitest' -import { temporaryDirectoryTask } from 'tempy' -import { barebonesTemplate } from '../../../src/templates/barebones' - -const base = (tmpDir: string) => ({ - cfg: { - packageManager: { - installDeps: false, - packageManager: 'npm' as const, - }, - git: { - setupGit: false, - }, - packageJson: { - type: 'new' as const, - name: 'test', - }, - ide: { - ide: 'vscode' as const, - }, - }, - targetPath: tmpDir, - type: 'new-project' as const, -}) - -describe('barebones template e2e', () => { - it('should create a basic project structure', async () => { - await temporaryDirectoryTask(async (tempDir) => { - await barebonesTemplate.execute(base(tempDir)) - - // Check core files exist - const expectedFiles = [ - 'package.json', - 'tsconfig.json', - 'app.config.ts', - 'app/client.tsx', - 'app/router.tsx', - 'app/routes/__root.tsx', - 'app/routes/index.tsx', - '.vscode/settings.json', - ] - - for (const file of expectedFiles) { - const filePath = join(tempDir, file) - const exists = await readFile(filePath) - expect(exists).toBeDefined() - } - }) - }) - - it('should have valid package.json contents', async () => { - await temporaryDirectoryTask(async (tempDir) => { - await barebonesTemplate.execute(base(tempDir)) - - const pkgJsonPath = join(tempDir, 'package.json') - const pkgJson = JSON.parse(await readFile(pkgJsonPath, 'utf-8')) - - expect(pkgJson.name).toBe('test') - expect(pkgJson.private).toBe(true) - expect(pkgJson.type).toBe('module') - expect(pkgJson.dependencies).toBeDefined() - expect(pkgJson.dependencies['@tanstack/react-router']).toBeDefined() - expect(pkgJson.dependencies['@tanstack/react-start']).toBeDefined() - expect(pkgJson.dependencies['react']).toBeDefined() - expect(pkgJson.dependencies['react-dom']).toBeDefined() - expect(pkgJson.dependencies['vinxi']).toBeDefined() - - expect(pkgJson.devDependencies).toBeDefined() - expect(pkgJson.devDependencies['@types/react']).toBeDefined() - - expect(pkgJson.scripts).toBeDefined() - expect(pkgJson.scripts.dev).toBe('vinxi dev') - expect(pkgJson.scripts.build).toBe('vinxi build') - expect(pkgJson.scripts.start).toBe('vinxi start') - }) - }) -}) diff --git a/packages/create-start/tsconfig.json b/packages/create-start/tsconfig.json deleted file mode 100644 index 747f8933df2..00000000000 --- a/packages/create-start/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "target": "ESNext", - "module": "ESNext" - }, - "moduleResolution": "Bundler", - "include": ["src", "tests", "build.config.ts"] -} diff --git a/packages/create-start/vitest.config.ts b/packages/create-start/vitest.config.ts deleted file mode 100644 index f5b965c618d..00000000000 --- a/packages/create-start/vitest.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { defineConfig } from 'vitest/config' -import packageJson from './package.json' - -const config = defineConfig({ - test: { - name: packageJson.name, - dir: './tests', - watch: false, - environment: 'node', - typecheck: { enabled: true }, - }, -}) - -export default config diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6daee70b06a..5f8f282d919 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5682,182 +5682,6 @@ importers: specifier: ^19.0.0 version: 19.0.0(react@19.0.0) - packages/create-router: - dependencies: - '@inquirer/prompts': - specifier: ^5.5.0 - version: 5.5.0 - '@rsbuild/core': - specifier: ^1.0.2 - version: 1.2.4 - '@rsbuild/plugin-react': - specifier: ^1.0.1 - version: 1.1.0(@rsbuild/core@1.2.4) - '@swc/core': - specifier: ^1.7.25 - version: 1.10.15(@swc/helpers@0.5.15) - '@tanstack/react-router': - specifier: workspace:* - version: link:../react-router - '@tanstack/router-devtools': - specifier: workspace:* - version: link:../router-devtools - '@tanstack/router-plugin': - specifier: workspace:* - version: link:../router-plugin - '@types/react': - specifier: ^19.0.8 - version: 19.0.8 - '@types/react-dom': - specifier: ^19.0.3 - version: 19.0.3(@types/react@19.0.8) - '@vitejs/plugin-react': - specifier: ^4.3.2 - version: 4.3.4(vite@6.1.4(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) - commander: - specifier: ^12.1.0 - version: 12.1.0 - cross-spawn: - specifier: ^7.0.6 - version: 7.0.6 - html-webpack-plugin: - specifier: ^5.6.0 - version: 5.6.3(@rspack/core@1.2.2(@swc/helpers@0.5.15))(webpack@5.97.1) - picocolors: - specifier: ^1.1.1 - version: 1.1.1 - react: - specifier: ^19.0.0 - version: 19.0.0 - react-dom: - specifier: ^19.0.0 - version: 19.0.0(react@19.0.0) - swc-loader: - specifier: ^0.2.6 - version: 0.2.6(@swc/core@1.10.15(@swc/helpers@0.5.15))(webpack@5.97.1) - tinyglobby: - specifier: ^0.2.10 - version: 0.2.12 - typescript: - specifier: ^5.7.2 - version: 5.8.2 - validate-npm-package-name: - specifier: ^6.0.0 - version: 6.0.0 - vite: - specifier: 6.1.4 - version: 6.1.4(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) - webpack: - specifier: ^5.94.0 - version: 5.97.1(@swc/core@1.10.15(@swc/helpers@0.5.15))(esbuild@0.25.0)(webpack-cli@5.1.4) - webpack-cli: - specifier: ^5.1.4 - version: 5.1.4(webpack-dev-server@5.2.0)(webpack@5.97.1) - webpack-dev-server: - specifier: ^5.1.0 - version: 5.2.0(webpack-cli@5.1.4)(webpack@5.97.1) - which: - specifier: ^5.0.0 - version: 5.0.0 - yocto-spinner: - specifier: ^0.2.0 - version: 0.2.0 - devDependencies: - '@types/cross-spawn': - specifier: ^6.0.6 - version: 6.0.6 - '@types/validate-npm-package-name': - specifier: ^4.0.2 - version: 4.0.2 - '@types/which': - specifier: ^3.0.4 - version: 3.0.4 - unbuild: - specifier: ^3.3.1 - version: 3.3.1(typescript@5.8.2)(vue-tsc@2.0.29(typescript@5.8.2)) - - packages/create-start: - dependencies: - '@commander-js/extra-typings': - specifier: ^12.1.0 - version: 12.1.0(commander@12.1.0) - '@inquirer/prompts': - specifier: ^5.5.0 - version: 5.5.0 - '@tanstack/react-router': - specifier: workspace:* - version: link:../react-router - '@tanstack/react-start': - specifier: workspace:* - version: link:../react-start - '@tanstack/router-devtools': - specifier: workspace:* - version: link:../router-devtools - '@types/react': - specifier: ^19.0.8 - version: 19.0.8 - '@types/react-dom': - specifier: ^19.0.3 - version: 19.0.3(@types/react@19.0.8) - commander: - specifier: ^12.1.0 - version: 12.1.0 - cross-spawn: - specifier: ^7.0.6 - version: 7.0.6 - fast-glob: - specifier: ^3.3.3 - version: 3.3.3 - gradient-string: - specifier: ^3.0.0 - version: 3.0.0 - picocolors: - specifier: ^1.1.1 - version: 1.1.1 - react: - specifier: ^19.0.0 - version: 19.0.0 - react-dom: - specifier: ^19.0.0 - version: 19.0.0(react@19.0.0) - rollup-plugin-copy: - specifier: ^3.5.0 - version: 3.5.0 - tempy: - specifier: ^3.1.0 - version: 3.1.0 - tiny-invariant: - specifier: ^1.3.3 - version: 1.3.3 - validate-npm-package-name: - specifier: ^6.0.0 - version: 6.0.0 - vinxi: - specifier: 0.5.1 - version: 0.5.1(@types/node@22.13.4)(db0@0.2.3)(ioredis@5.4.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.37.0)(tsx@4.19.2)(typescript@5.8.2)(yaml@2.7.0) - vite: - specifier: 6.1.4 - version: 6.1.4(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) - yocto-spinner: - specifier: ^0.2.0 - version: 0.2.0 - zod: - specifier: ^3.24.2 - version: 3.24.2 - devDependencies: - '@inquirer/type': - specifier: ^3.0.4 - version: 3.0.4(@types/node@22.13.4) - '@types/cross-spawn': - specifier: ^6.0.6 - version: 6.0.6 - '@types/validate-npm-package-name': - specifier: ^4.0.2 - version: 4.0.2 - unbuild: - specifier: ^3.3.1 - version: 3.3.1(typescript@5.8.2)(vue-tsc@2.0.29(typescript@5.8.2)) - packages/directive-functions-plugin: dependencies: '@babel/code-frame': @@ -7356,11 +7180,6 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - '@commander-js/extra-typings@12.1.0': - resolution: {integrity: sha512-wf/lwQvWAA0goIghcb91dQYpkLBcyhOhQNqG/VgWhnKzgt+UOMvra7EX/2fv70arm5RW+PUHoQHHDa6/p77Eqg==} - peerDependencies: - commander: ~12.1.0 - '@commitlint/parse@19.5.0': resolution: {integrity: sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==} engines: {node: '>=v18'} @@ -8534,14 +8353,6 @@ packages: resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} - '@inquirer/checkbox@2.5.0': - resolution: {integrity: sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==} - engines: {node: '>=18'} - - '@inquirer/confirm@3.2.0': - resolution: {integrity: sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==} - engines: {node: '>=18'} - '@inquirer/confirm@5.1.4': resolution: {integrity: sha512-EsiT7K4beM5fN5Mz6j866EFA9+v9d5o9VUra3hrg8zY4GHmCS8b616FErbdo5eyKoVotBQkHzMIeeKYsKDStDw==} engines: {node: '>=18'} @@ -8552,58 +8363,10 @@ packages: resolution: {integrity: sha512-/vyCWhET0ktav/mUeBqJRYTwmjFPIKPRYb3COAw7qORULgipGSUO2vL32lQKki3UxDKJ8BvuEbokaoyCA6YlWw==} engines: {node: '>=18'} - '@inquirer/core@9.2.1': - resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} - engines: {node: '>=18'} - - '@inquirer/editor@2.2.0': - resolution: {integrity: sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw==} - engines: {node: '>=18'} - - '@inquirer/expand@2.3.0': - resolution: {integrity: sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==} - engines: {node: '>=18'} - '@inquirer/figures@1.0.10': resolution: {integrity: sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==} engines: {node: '>=18'} - '@inquirer/input@2.3.0': - resolution: {integrity: sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==} - engines: {node: '>=18'} - - '@inquirer/number@1.1.0': - resolution: {integrity: sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA==} - engines: {node: '>=18'} - - '@inquirer/password@2.2.0': - resolution: {integrity: sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg==} - engines: {node: '>=18'} - - '@inquirer/prompts@5.5.0': - resolution: {integrity: sha512-BHDeL0catgHdcHbSFFUddNzvx/imzJMft+tWDPwTm3hfu8/tApk1HrooNngB2Mb4qY+KaRWF+iZqoVUPeslEog==} - engines: {node: '>=18'} - - '@inquirer/rawlist@2.3.0': - resolution: {integrity: sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ==} - engines: {node: '>=18'} - - '@inquirer/search@1.1.0': - resolution: {integrity: sha512-h+/5LSj51dx7hp5xOn4QFnUaKeARwUCLs6mIhtkJ0JYPBLmEYjdHSYh7I6GrLg9LwpJ3xeX0FZgAG1q0QdCpVQ==} - engines: {node: '>=18'} - - '@inquirer/select@2.5.0': - resolution: {integrity: sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==} - engines: {node: '>=18'} - - '@inquirer/type@1.5.5': - resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} - engines: {node: '>=18'} - - '@inquirer/type@2.0.0': - resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} - engines: {node: '>=18'} - '@inquirer/type@3.0.4': resolution: {integrity: sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==} engines: {node: '>=18'} @@ -9969,15 +9732,6 @@ packages: rollup: optional: true - '@rollup/plugin-node-resolve@16.0.0': - resolution: {integrity: sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/plugin-replace@6.0.2': resolution: {integrity: sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==} engines: {node: '>=14.0.0'} @@ -10772,10 +10526,6 @@ packages: react-dom: ^19.0.0 typescript: '>=5.7.2' - '@trysound/sax@0.2.0': - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} - '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} @@ -10833,9 +10583,6 @@ packages: '@types/cookies@0.9.0': resolution: {integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==} - '@types/cross-spawn@6.0.6': - resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} - '@types/diff@6.0.0': resolution: {integrity: sha512-dhVCYGv3ZSbzmQaBSagrv1WJ6rXCdkyTcDyoNu1MD8JohI7pR7k8wdZEm+mvdxRKXyHVwckFzWU1vJc+Z29MlA==} @@ -10860,15 +10607,9 @@ packages: '@types/express@4.17.21': resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} - '@types/fs-extra@8.1.5': - resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==} - '@types/gensync@1.0.4': resolution: {integrity: sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==} - '@types/glob@7.2.0': - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -10908,12 +10649,6 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/minimatch@5.1.2': - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - - '@types/mute-stream@0.0.4': - resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} - '@types/node-forge@1.3.11': resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} @@ -10972,24 +10707,12 @@ packages: '@types/statuses@2.0.5': resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} - '@types/tinycolor2@1.4.6': - resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} - '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@types/validate-npm-package-name@4.0.2': - resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} - - '@types/which@3.0.4': - resolution: {integrity: sha512-liyfuo/106JdlgSchJzXEQCVArk0CvevqPote8F8HgWgJ3dRCcTHgJIsLDuee0kxk/mhbInzIZk3QWSZJ8R+2w==} - - '@types/wrap-ansi@3.0.0': - resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} - '@types/ws@8.5.14': resolution: {integrity: sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==} @@ -11460,10 +11183,6 @@ packages: resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} engines: {node: '>=0.10.0'} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - asn1js@3.0.6: resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} engines: {node: '>=12.0.0'} @@ -11621,9 +11340,6 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - caniuse-api@3.0.0: - resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001696: resolution: {integrity: sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==} @@ -11650,9 +11366,6 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -11749,9 +11462,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - colord@2.9.3: - resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} - colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} @@ -11769,10 +11479,6 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - commander@13.1.0: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} @@ -11784,10 +11490,6 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} @@ -11936,30 +11638,9 @@ packages: crossws@0.3.3: resolution: {integrity: sha512-/71DJT3xJlqSnBr83uGJesmVHSzZEvgxHt/fIKxBAAngqMHmnBWQNxCphVxxJ2XL3xleu5+hJD6IQ3TglBedcw==} - crypto-random-string@4.0.0: - resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} - engines: {node: '>=12'} - - css-declaration-sorter@7.2.0: - resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.0.9 - css-select@4.3.0: resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} - css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} - - css-tree@2.2.1: - resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - - css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} @@ -11972,28 +11653,6 @@ packages: engines: {node: '>=4'} hasBin: true - cssnano-preset-default@7.0.6: - resolution: {integrity: sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - cssnano-utils@5.0.0: - resolution: {integrity: sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - cssnano@7.0.6: - resolution: {integrity: sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - csso@5.0.5: - resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - cssstyle@4.2.1: resolution: {integrity: sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==} engines: {node: '>=18'} @@ -12168,10 +11827,6 @@ packages: resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} engines: {node: '>=0.3.1'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -12198,9 +11853,6 @@ packages: dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} @@ -12208,16 +11860,9 @@ packages: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -12588,10 +12233,6 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -12761,10 +12402,6 @@ packages: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -12871,10 +12508,6 @@ packages: resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} engines: {node: '>=18'} - globby@10.0.1: - resolution: {integrity: sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==} - engines: {node: '>=8'} - globby@14.0.2: resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} engines: {node: '>=18'} @@ -12894,10 +12527,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - gradient-string@3.0.0: - resolution: {integrity: sha512-frdKI4Qi8Ihp4C6wZNB565de/THpIaw3DjP5ku87M+N9rNSGmPTjfkq61SdRXB7eCaL8O1hkKDvf6CDMtOzIAg==} - engines: {node: '>=14'} - graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -13225,10 +12854,6 @@ packages: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} - is-plain-object@3.0.1: - resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} - engines: {node: '>=0.10.0'} - is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} @@ -13569,15 +13194,9 @@ packages: lodash.isarguments@3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -13656,12 +13275,6 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mdn-data@2.0.28: - resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} - - mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} - mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -13804,24 +13417,6 @@ packages: engines: {node: '>=10'} hasBin: true - mkdist@2.2.0: - resolution: {integrity: sha512-GfKwu4A2grXfhj2TZm4ydfzP515NaALqKaPq4WqaZ6NhEnD47BiIQPySoCTTvVqHxYcuqVkNdCXjYf9Bz1Y04Q==} - hasBin: true - peerDependencies: - sass: ^1.83.0 - typescript: '>=5.7.2' - vue: ^3.5.13 - vue-tsc: ^1.8.27 || ^2.0.21 - peerDependenciesMeta: - sass: - optional: true - typescript: - optional: true - vue: - optional: true - vue-tsc: - optional: true - mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} @@ -13862,10 +13457,6 @@ packages: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true - mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - mute-stream@2.0.0: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} @@ -14060,10 +13651,6 @@ packages: resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} engines: {node: '>=10'} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} @@ -14244,48 +13831,6 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - postcss-calc@10.1.1: - resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==} - engines: {node: ^18.12 || ^20.9 || >=22.0} - peerDependencies: - postcss: ^8.4.38 - - postcss-colormin@7.0.2: - resolution: {integrity: sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-convert-values@7.0.4: - resolution: {integrity: sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-discard-comments@7.0.3: - resolution: {integrity: sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-discard-duplicates@7.0.1: - resolution: {integrity: sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-discard-empty@7.0.0: - resolution: {integrity: sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-discard-overridden@7.0.0: - resolution: {integrity: sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - postcss-import@15.1.0: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -14310,166 +13855,36 @@ packages: ts-node: optional: true - postcss-merge-longhand@7.0.4: - resolution: {integrity: sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-merge-rules@7.0.4: - resolution: {integrity: sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-minify-font-values@7.0.0: - resolution: {integrity: sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-minify-gradients@7.0.0: - resolution: {integrity: sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-minify-params@7.0.2: - resolution: {integrity: sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-minify-selectors@7.0.4: - resolution: {integrity: sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - postcss-nested@6.2.0: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 - postcss-nested@7.0.2: - resolution: {integrity: sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==} - engines: {node: '>=18.0'} - peerDependencies: - postcss: ^8.2.14 + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} - postcss-normalize-charset@7.0.0: - resolution: {integrity: sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss-normalize-display-values@7.0.0: - resolution: {integrity: sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} - postcss-normalize-positions@7.0.0: - resolution: {integrity: sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} - postcss-normalize-repeat-style@7.0.0: - resolution: {integrity: sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + engines: {node: '>=14'} + hasBin: true - postcss-normalize-string@7.0.0: - resolution: {integrity: sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-timing-functions@7.0.0: - resolution: {integrity: sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-unicode@7.0.2: - resolution: {integrity: sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-url@7.0.0: - resolution: {integrity: sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-whitespace@7.0.0: - resolution: {integrity: sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-ordered-values@7.0.1: - resolution: {integrity: sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-reduce-initial@7.0.2: - resolution: {integrity: sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-reduce-transforms@7.0.0: - resolution: {integrity: sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} - engines: {node: '>=4'} - - postcss-selector-parser@7.0.0: - resolution: {integrity: sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==} - engines: {node: '>=4'} - - postcss-svgo@7.0.1: - resolution: {integrity: sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==} - engines: {node: ^18.12.0 || ^20.9.0 || >= 18} - peerDependencies: - postcss: ^8.4.31 - - postcss-unique-selectors@7.0.3: - resolution: {integrity: sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} - engines: {node: ^10 || ^12 || >=14} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} - engines: {node: '>=14'} - hasBin: true - - prettier@3.5.0: - resolution: {integrity: sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==} - engines: {node: '>=14'} - hasBin: true + prettier@3.5.0: + resolution: {integrity: sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==} + engines: {node: '>=14'} + hasBin: true pretty-bytes@6.1.1: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} @@ -14768,17 +14183,6 @@ packages: engines: {node: 20 || >=22} hasBin: true - rollup-plugin-copy@3.5.0: - resolution: {integrity: sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==} - engines: {node: '>=8.3'} - - rollup-plugin-dts@6.1.1: - resolution: {integrity: sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==} - engines: {node: '>=16'} - peerDependencies: - rollup: ^3.29.4 || ^4 - typescript: ^4.5 || ^5.0 - rollup-plugin-preserve-directives@0.4.0: resolution: {integrity: sha512-gx4nBxYm5BysmEQS+e2tAMrtFxrGvk+Pe5ppafRibQi0zlW7VYAbEGk6IKDw9sJGPdFWgVTE0o4BU4cdG0Fylg==} peerDependencies: @@ -14961,10 +14365,6 @@ packages: resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} engines: {node: '>=8'} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - slash@5.1.0: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} @@ -15106,12 +14506,6 @@ packages: style-to-object@1.0.8: resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} - stylehacks@7.0.4: - resolution: {integrity: sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==} - engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} - peerDependencies: - postcss: ^8.4.31 - stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} @@ -15144,11 +14538,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svgo@3.3.2: - resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} - engines: {node: '>=14.0.0'} - hasBin: true - swc-loader@0.2.6: resolution: {integrity: sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==} peerDependencies: @@ -15197,14 +14586,6 @@ packages: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} - temp-dir@3.0.0: - resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} - engines: {node: '>=14.16'} - - tempy@3.1.0: - resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} - engines: {node: '>=14.16'} - terser-webpack-plugin@5.3.11: resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==} engines: {node: '>= 10.13.0'} @@ -15261,9 +14642,6 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinycolor2@1.6.0: - resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} @@ -15271,9 +14649,6 @@ packages: resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} - tinygradient@1.1.5: - resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} - tinypool@1.0.2: resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -15293,10 +14668,6 @@ packages: resolution: {integrity: sha512-6U2ti64/nppsDxQs9hw8ephA3nO6nSQvVVfxwRw8wLQPFtLI1cFI1a1eP22g+LUP+1TA2pKKjUTwWB+K2coqmQ==} hasBin: true - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - tmp@0.2.3: resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} engines: {node: '>=14.14'} @@ -15385,10 +14756,6 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} @@ -15477,15 +14844,6 @@ packages: ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} - unbuild@3.3.1: - resolution: {integrity: sha512-/5OeeHmW1JlWEyQw3SPkB9BV16lzr6C5i8D+O17NLx6ETgvCZ3ZlyXfWkVVfG2YCsv8xAVQCqJNJtbEAGwHg7A==} - hasBin: true - peerDependencies: - typescript: ^5.7.3 - peerDependenciesMeta: - typescript: - optional: true - unc-path-regex@0.1.2: resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} engines: {node: '>=0.10.0'} @@ -15516,10 +14874,6 @@ packages: unimport@3.14.6: resolution: {integrity: sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==} - unique-string@3.0.0: - resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} - engines: {node: '>=12'} - universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -15700,10 +15054,6 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - validate-npm-package-name@6.0.0: - resolution: {integrity: sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==} - engines: {node: ^18.17.0 || >=20.5.0} - vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -15985,11 +15335,6 @@ packages: engines: {node: ^16.13.0 || >=18.0.0} hasBin: true - which@5.0.0: - resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} - engines: {node: ^18.17.0 || >=20.5.0} - hasBin: true - why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -16086,18 +15431,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-spinner@0.2.0: - resolution: {integrity: sha512-Qu6WAqNLGleB687CCGcmgHIo8l+J19MX/32UrSMfbf/4L8gLoxjpOYoiHT1asiWyqvjRZbgvOhLlvne6E5Tbdw==} - engines: {node: '>=18.19'} - yoctocolors-cjs@2.1.2: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} - yoctocolors@2.1.1: - resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} - engines: {node: '>=18'} - zip-stream@6.0.1: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} @@ -16446,10 +15783,6 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@commander-js/extra-typings@12.1.0(commander@12.1.0)': - dependencies: - commander: 12.1.0 - '@commitlint/parse@19.5.0': dependencies: '@commitlint/types': 19.5.0 @@ -17459,19 +16792,6 @@ snapshots: '@humanwhocodes/retry@0.4.2': {} - '@inquirer/checkbox@2.5.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/figures': 1.0.10 - '@inquirer/type': 1.5.5 - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.2 - - '@inquirer/confirm@3.2.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - '@inquirer/confirm@5.1.4(@types/node@22.13.4)': dependencies: '@inquirer/core': 10.1.5(@types/node@22.13.4) @@ -17491,93 +16811,8 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@inquirer/core@9.2.1': - dependencies: - '@inquirer/figures': 1.0.10 - '@inquirer/type': 2.0.0 - '@types/mute-stream': 0.0.4 - '@types/node': 22.13.4 - '@types/wrap-ansi': 3.0.0 - ansi-escapes: 4.3.2 - cli-width: 4.1.0 - mute-stream: 1.0.0 - signal-exit: 4.1.0 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.2 - - '@inquirer/editor@2.2.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - external-editor: 3.1.0 - - '@inquirer/expand@2.3.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - yoctocolors-cjs: 2.1.2 - '@inquirer/figures@1.0.10': {} - '@inquirer/input@2.3.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - - '@inquirer/number@1.1.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - - '@inquirer/password@2.2.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - ansi-escapes: 4.3.2 - - '@inquirer/prompts@5.5.0': - dependencies: - '@inquirer/checkbox': 2.5.0 - '@inquirer/confirm': 3.2.0 - '@inquirer/editor': 2.2.0 - '@inquirer/expand': 2.3.0 - '@inquirer/input': 2.3.0 - '@inquirer/number': 1.1.0 - '@inquirer/password': 2.2.0 - '@inquirer/rawlist': 2.3.0 - '@inquirer/search': 1.1.0 - '@inquirer/select': 2.5.0 - - '@inquirer/rawlist@2.3.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - yoctocolors-cjs: 2.1.2 - - '@inquirer/search@1.1.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/figures': 1.0.10 - '@inquirer/type': 1.5.5 - yoctocolors-cjs: 2.1.2 - - '@inquirer/select@2.5.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/figures': 1.0.10 - '@inquirer/type': 1.5.5 - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.2 - - '@inquirer/type@1.5.5': - dependencies: - mute-stream: 1.0.0 - - '@inquirer/type@2.0.0': - dependencies: - mute-stream: 1.0.0 - '@inquirer/type@3.0.4(@types/node@22.13.4)': optionalDependencies: '@types/node': 22.13.4 @@ -18967,16 +18202,6 @@ snapshots: optionalDependencies: rollup: 4.39.0 - '@rollup/plugin-node-resolve@16.0.0(rollup@4.39.0)': - dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.39.0) - '@types/resolve': 1.20.2 - deepmerge: 4.3.1 - is-module: 1.0.0 - resolve: 1.22.10 - optionalDependencies: - rollup: 4.39.0 - '@rollup/plugin-replace@6.0.2(rollup@4.39.0)': dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.39.0) @@ -19799,8 +19024,6 @@ snapshots: react-dom: 19.0.0(react@19.0.0) typescript: 5.8.2 - '@trysound/sax@0.2.0': {} - '@tybys/wasm-util@0.9.0': dependencies: tslib: 2.8.1 @@ -19873,10 +19096,6 @@ snapshots: '@types/keygrip': 1.0.6 '@types/node': 22.13.4 - '@types/cross-spawn@6.0.6': - dependencies: - '@types/node': 22.13.4 - '@types/diff@6.0.0': {} '@types/doctrine@0.0.9': {} @@ -19914,17 +19133,8 @@ snapshots: '@types/qs': 6.9.18 '@types/serve-static': 1.15.7 - '@types/fs-extra@8.1.5': - dependencies: - '@types/node': 22.13.4 - '@types/gensync@1.0.4': {} - '@types/glob@7.2.0': - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 22.13.4 - '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -19968,12 +19178,6 @@ snapshots: '@types/mime@1.3.5': {} - '@types/minimatch@5.1.2': {} - - '@types/mute-stream@0.0.4': - dependencies: - '@types/node': 22.13.4 - '@types/node-forge@1.3.11': dependencies: '@types/node': 22.13.4 @@ -20031,18 +19235,10 @@ snapshots: '@types/statuses@2.0.5': {} - '@types/tinycolor2@1.4.6': {} - '@types/tough-cookie@4.0.5': {} '@types/unist@3.0.3': {} - '@types/validate-npm-package-name@4.0.2': {} - - '@types/which@3.0.4': {} - - '@types/wrap-ansi@3.0.0': {} - '@types/ws@8.5.14': dependencies: '@types/node': 22.13.4 @@ -20664,8 +19860,6 @@ snapshots: array-slice@1.1.0: {} - array-union@2.1.0: {} - asn1js@3.0.6: dependencies: pvtsutils: 1.3.6 @@ -20868,13 +20062,6 @@ snapshots: camelcase@7.0.1: {} - caniuse-api@3.0.0: - dependencies: - browserslist: 4.24.4 - caniuse-lite: 1.0.30001696 - lodash.memoize: 4.1.2 - lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001696: {} chai@5.2.0: @@ -20901,8 +20088,6 @@ snapshots: char-regex@1.0.2: {} - chardet@0.7.0: {} - check-error@2.1.1: {} chokidar@3.6.0: @@ -21000,8 +20185,6 @@ snapshots: color-name@1.1.4: {} - colord@2.9.3: {} - colorette@1.4.0: {} colorette@2.0.20: {} @@ -21014,16 +20197,12 @@ snapshots: commander@10.0.1: {} - commander@12.1.0: {} - commander@13.1.0: {} commander@2.20.3: {} commander@4.1.1: {} - commander@7.2.0: {} - commander@8.3.0: {} commondir@1.0.1: {} @@ -21161,14 +20340,6 @@ snapshots: dependencies: uncrypto: 0.1.3 - crypto-random-string@4.0.0: - dependencies: - type-fest: 1.4.0 - - css-declaration-sorter@7.2.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - css-select@4.3.0: dependencies: boolbase: 1.0.0 @@ -21177,78 +20348,12 @@ snapshots: domutils: 2.8.0 nth-check: 2.1.1 - css-select@5.1.0: - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 5.0.3 - domutils: 3.2.2 - nth-check: 2.1.1 - - css-tree@2.2.1: - dependencies: - mdn-data: 2.0.28 - source-map-js: 1.2.1 - - css-tree@2.3.1: - dependencies: - mdn-data: 2.0.30 - source-map-js: 1.2.1 - css-what@6.1.0: {} css.escape@1.5.1: {} cssesc@3.0.0: {} - cssnano-preset-default@7.0.6(postcss@8.5.3): - dependencies: - browserslist: 4.24.4 - css-declaration-sorter: 7.2.0(postcss@8.5.3) - cssnano-utils: 5.0.0(postcss@8.5.3) - postcss: 8.5.3 - postcss-calc: 10.1.1(postcss@8.5.3) - postcss-colormin: 7.0.2(postcss@8.5.3) - postcss-convert-values: 7.0.4(postcss@8.5.3) - postcss-discard-comments: 7.0.3(postcss@8.5.3) - postcss-discard-duplicates: 7.0.1(postcss@8.5.3) - postcss-discard-empty: 7.0.0(postcss@8.5.3) - postcss-discard-overridden: 7.0.0(postcss@8.5.3) - postcss-merge-longhand: 7.0.4(postcss@8.5.3) - postcss-merge-rules: 7.0.4(postcss@8.5.3) - postcss-minify-font-values: 7.0.0(postcss@8.5.3) - postcss-minify-gradients: 7.0.0(postcss@8.5.3) - postcss-minify-params: 7.0.2(postcss@8.5.3) - postcss-minify-selectors: 7.0.4(postcss@8.5.3) - postcss-normalize-charset: 7.0.0(postcss@8.5.3) - postcss-normalize-display-values: 7.0.0(postcss@8.5.3) - postcss-normalize-positions: 7.0.0(postcss@8.5.3) - postcss-normalize-repeat-style: 7.0.0(postcss@8.5.3) - postcss-normalize-string: 7.0.0(postcss@8.5.3) - postcss-normalize-timing-functions: 7.0.0(postcss@8.5.3) - postcss-normalize-unicode: 7.0.2(postcss@8.5.3) - postcss-normalize-url: 7.0.0(postcss@8.5.3) - postcss-normalize-whitespace: 7.0.0(postcss@8.5.3) - postcss-ordered-values: 7.0.1(postcss@8.5.3) - postcss-reduce-initial: 7.0.2(postcss@8.5.3) - postcss-reduce-transforms: 7.0.0(postcss@8.5.3) - postcss-svgo: 7.0.1(postcss@8.5.3) - postcss-unique-selectors: 7.0.3(postcss@8.5.3) - - cssnano-utils@5.0.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - - cssnano@7.0.6(postcss@8.5.3): - dependencies: - cssnano-preset-default: 7.0.6(postcss@8.5.3) - lilconfig: 3.1.3 - postcss: 8.5.3 - - csso@5.0.5: - dependencies: - css-tree: 2.2.1 - cssstyle@4.2.1: dependencies: '@asamuzakjp/css-color': 2.8.3 @@ -21349,10 +20454,6 @@ snapshots: diff@7.0.0: {} - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - dlv@1.1.3: {} dns-packet@5.6.1: @@ -21382,34 +20483,18 @@ snapshots: domhandler: 4.3.1 entities: 2.2.0 - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - domelementtype@2.3.0: {} domhandler@4.3.1: dependencies: domelementtype: 2.3.0 - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 - domutils@2.8.0: dependencies: dom-serializer: 1.4.1 domelementtype: 2.3.0 domhandler: 4.3.1 - domutils@3.2.2: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dot-case@3.0.4: dependencies: no-case: 3.0.4 @@ -22010,12 +21095,6 @@ snapshots: extend@3.0.2: {} - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} @@ -22209,12 +21288,6 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 - fs-extra@8.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - fs-minipass@2.1.0: dependencies: minipass: 3.3.6 @@ -22338,17 +21411,6 @@ snapshots: globals@15.14.0: {} - globby@10.0.1: - dependencies: - '@types/glob': 7.2.0 - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - glob: 7.2.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - globby@14.0.2: dependencies: '@sindresorhus/merge-streams': 2.3.0 @@ -22368,11 +21430,6 @@ snapshots: graceful-fs@4.2.11: {} - gradient-string@3.0.0: - dependencies: - chalk: 5.4.1 - tinygradient: 1.1.5 - graphemer@1.4.0: {} graphql@16.10.0: {} @@ -22689,8 +21746,6 @@ snapshots: dependencies: isobject: 3.0.1 - is-plain-object@3.0.1: {} - is-plain-object@5.0.0: {} is-potential-custom-element-name@1.0.1: {} @@ -23001,12 +22056,8 @@ snapshots: lodash.isarguments@3.1.0: {} - lodash.memoize@4.1.2: {} - lodash.merge@4.6.2: {} - lodash.uniq@4.5.0: {} - lodash@4.17.21: {} log-symbols@4.1.0: @@ -23084,10 +22135,6 @@ snapshots: math-intrinsics@1.1.0: {} - mdn-data@2.0.28: {} - - mdn-data@2.0.30: {} - mdurl@2.0.0: {} media-typer@0.3.0: {} @@ -23194,25 +22241,6 @@ snapshots: mkdirp@3.0.1: {} - mkdist@2.2.0(typescript@5.8.2)(vue-tsc@2.0.29(typescript@5.8.2)): - dependencies: - autoprefixer: 10.4.20(postcss@8.5.3) - citty: 0.1.6 - cssnano: 7.0.6(postcss@8.5.3) - defu: 6.1.4 - esbuild: 0.24.2 - jiti: 1.21.7 - mlly: 1.7.4 - pathe: 1.1.2 - pkg-types: 1.3.1 - postcss: 8.5.3 - postcss-nested: 7.0.2(postcss@8.5.3) - semver: 7.7.0 - tinyglobby: 0.2.12 - optionalDependencies: - typescript: 5.8.2 - vue-tsc: 2.0.29(typescript@5.8.2) - mlly@1.7.4: dependencies: acorn: 8.14.0 @@ -23266,8 +22294,6 @@ snapshots: dns-packet: 5.6.1 thunky: 1.1.0 - mute-stream@1.0.0: {} - mute-stream@2.0.0: {} mz@2.7.0: @@ -23590,8 +22616,6 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 - os-tmpdir@1.0.2: {} - outvariant@1.4.3: {} p-limit@2.3.0: @@ -23745,43 +22769,6 @@ snapshots: pluralize@8.0.0: {} - postcss-calc@10.1.1(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-selector-parser: 7.0.0 - postcss-value-parser: 4.2.0 - - postcss-colormin@7.0.2(postcss@8.5.3): - dependencies: - browserslist: 4.24.4 - caniuse-api: 3.0.0 - colord: 2.9.3 - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - - postcss-convert-values@7.0.4(postcss@8.5.3): - dependencies: - browserslist: 4.24.4 - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - - postcss-discard-comments@7.0.3(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-selector-parser: 6.1.2 - - postcss-discard-duplicates@7.0.1(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - - postcss-discard-empty@7.0.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - - postcss-discard-overridden@7.0.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-import@15.1.0(postcss@8.5.3): dependencies: postcss: 8.5.3 @@ -23801,138 +22788,16 @@ snapshots: optionalDependencies: postcss: 8.5.3 - postcss-merge-longhand@7.0.4(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - stylehacks: 7.0.4(postcss@8.5.3) - - postcss-merge-rules@7.0.4(postcss@8.5.3): - dependencies: - browserslist: 4.24.4 - caniuse-api: 3.0.0 - cssnano-utils: 5.0.0(postcss@8.5.3) - postcss: 8.5.3 - postcss-selector-parser: 6.1.2 - - postcss-minify-font-values@7.0.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - - postcss-minify-gradients@7.0.0(postcss@8.5.3): - dependencies: - colord: 2.9.3 - cssnano-utils: 5.0.0(postcss@8.5.3) - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - - postcss-minify-params@7.0.2(postcss@8.5.3): - dependencies: - browserslist: 4.24.4 - cssnano-utils: 5.0.0(postcss@8.5.3) - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - - postcss-minify-selectors@7.0.4(postcss@8.5.3): - dependencies: - cssesc: 3.0.0 - postcss: 8.5.3 - postcss-selector-parser: 6.1.2 - postcss-nested@6.2.0(postcss@8.5.3): dependencies: postcss: 8.5.3 postcss-selector-parser: 6.1.2 - postcss-nested@7.0.2(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-selector-parser: 7.0.0 - - postcss-normalize-charset@7.0.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - - postcss-normalize-display-values@7.0.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - - postcss-normalize-positions@7.0.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - - postcss-normalize-repeat-style@7.0.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - - postcss-normalize-string@7.0.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - - postcss-normalize-timing-functions@7.0.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - - postcss-normalize-unicode@7.0.2(postcss@8.5.3): - dependencies: - browserslist: 4.24.4 - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - - postcss-normalize-url@7.0.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - - postcss-normalize-whitespace@7.0.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - - postcss-ordered-values@7.0.1(postcss@8.5.3): - dependencies: - cssnano-utils: 5.0.0(postcss@8.5.3) - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - - postcss-reduce-initial@7.0.2(postcss@8.5.3): - dependencies: - browserslist: 4.24.4 - caniuse-api: 3.0.0 - postcss: 8.5.3 - - postcss-reduce-transforms@7.0.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-selector-parser@7.0.0: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-svgo@7.0.1(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - svgo: 3.3.2 - - postcss-unique-selectors@7.0.3(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-selector-parser: 6.1.2 - postcss-value-parser@4.2.0: {} postcss@8.5.3: @@ -24291,22 +23156,6 @@ snapshots: glob: 11.0.1 package-json-from-dist: 1.0.1 - rollup-plugin-copy@3.5.0: - dependencies: - '@types/fs-extra': 8.1.5 - colorette: 1.4.0 - fs-extra: 8.1.0 - globby: 10.0.1 - is-plain-object: 3.0.1 - - rollup-plugin-dts@6.1.1(rollup@4.39.0)(typescript@5.8.2): - dependencies: - magic-string: 0.30.17 - rollup: 4.39.0 - typescript: 5.8.2 - optionalDependencies: - '@babel/code-frame': 7.26.2 - rollup-plugin-preserve-directives@0.4.0(rollup@4.39.0): dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.39.0) @@ -24531,8 +23380,6 @@ snapshots: dependencies: unicode-emoji-modifier-base: 1.0.0 - slash@3.0.0: {} - slash@5.1.0: {} smob@1.5.0: {} @@ -24682,12 +23529,6 @@ snapshots: dependencies: inline-style-parser: 0.2.4 - stylehacks@7.0.4(postcss@8.5.3): - dependencies: - browserslist: 4.24.4 - postcss: 8.5.3 - postcss-selector-parser: 6.1.2 - stylis@4.2.0: {} sucrase@3.35.0: @@ -24721,16 +23562,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svgo@3.3.2: - dependencies: - '@trysound/sax': 0.2.0 - commander: 7.2.0 - css-select: 5.1.0 - css-tree: 2.3.1 - css-what: 6.1.0 - csso: 5.0.5 - picocolors: 1.1.1 - swc-loader@0.2.6(@swc/core@1.10.15(@swc/helpers@0.5.15))(webpack@5.97.1): dependencies: '@swc/core': 1.10.15(@swc/helpers@0.5.15) @@ -24812,15 +23643,6 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 - temp-dir@3.0.0: {} - - tempy@3.1.0: - dependencies: - is-stream: 3.0.0 - temp-dir: 3.0.0 - type-fest: 2.19.0 - unique-string: 3.0.0 - terser-webpack-plugin@5.3.11(@swc/core@1.10.15(@swc/helpers@0.5.15))(esbuild@0.25.0)(webpack@5.97.1(@swc/core@1.10.15(@swc/helpers@0.5.15))(esbuild@0.25.0)): dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -24880,8 +23702,6 @@ snapshots: tinybench@2.9.0: {} - tinycolor2@1.6.0: {} - tinyexec@0.3.2: {} tinyglobby@0.2.12: @@ -24889,11 +23709,6 @@ snapshots: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 - tinygradient@1.1.5: - dependencies: - '@types/tinycolor2': 1.4.6 - tinycolor2: 1.6.0 - tinypool@1.0.2: {} tinyrainbow@2.0.0: {} @@ -24906,10 +23721,6 @@ snapshots: dependencies: tldts-core: 6.1.76 - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 - tmp@0.2.3: {} to-regex-range@5.0.1: @@ -24981,8 +23792,6 @@ snapshots: type-fest@0.21.3: {} - type-fest@1.4.0: {} - type-fest@2.19.0: {} type-fest@4.33.0: {} @@ -25042,39 +23851,6 @@ snapshots: ufo@1.5.4: {} - unbuild@3.3.1(typescript@5.8.2)(vue-tsc@2.0.29(typescript@5.8.2)): - dependencies: - '@rollup/plugin-alias': 5.1.1(rollup@4.39.0) - '@rollup/plugin-commonjs': 28.0.2(rollup@4.39.0) - '@rollup/plugin-json': 6.1.0(rollup@4.39.0) - '@rollup/plugin-node-resolve': 16.0.0(rollup@4.39.0) - '@rollup/plugin-replace': 6.0.2(rollup@4.39.0) - '@rollup/pluginutils': 5.1.4(rollup@4.39.0) - citty: 0.1.6 - consola: 3.4.0 - defu: 6.1.4 - esbuild: 0.24.2 - hookable: 5.5.3 - jiti: 2.4.2 - magic-string: 0.30.17 - mkdist: 2.2.0(typescript@5.8.2)(vue-tsc@2.0.29(typescript@5.8.2)) - mlly: 1.7.4 - pathe: 2.0.3 - pkg-types: 1.3.1 - pretty-bytes: 6.1.1 - rollup: 4.39.0 - rollup-plugin-dts: 6.1.1(rollup@4.39.0)(typescript@5.8.2) - scule: 1.3.0 - tinyglobby: 0.2.12 - untyped: 1.5.2 - optionalDependencies: - typescript: 5.8.2 - transitivePeerDependencies: - - sass - - supports-color - - vue - - vue-tsc - unc-path-regex@0.1.2: {} uncrypto@0.1.3: {} @@ -25121,10 +23897,6 @@ snapshots: transitivePeerDependencies: - rollup - unique-string@3.0.0: - dependencies: - crypto-random-string: 4.0.0 - universalify@0.1.2: {} universalify@0.2.0: {} @@ -25252,8 +24024,6 @@ snapshots: validate-npm-package-name@5.0.1: {} - validate-npm-package-name@6.0.0: {} - vary@1.1.2: {} vinxi@0.5.1(@types/node@22.13.4)(db0@0.2.3)(ioredis@5.4.2)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.37.0)(tsx@4.19.2)(typescript@5.8.2)(yaml@2.7.0): @@ -25796,10 +24566,6 @@ snapshots: dependencies: isexe: 3.1.1 - which@5.0.0: - dependencies: - isexe: 3.1.1 - why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 @@ -25879,14 +24645,8 @@ snapshots: yocto-queue@0.1.0: {} - yocto-spinner@0.2.0: - dependencies: - yoctocolors: 2.1.1 - yoctocolors-cjs@2.1.2: {} - yoctocolors@2.1.1: {} - zip-stream@6.0.1: dependencies: archiver-utils: 5.0.2 diff --git a/scripts/publish.js b/scripts/publish.js index 1d55ca6ddcd..430c3a3c41b 100644 --- a/scripts/publish.js +++ b/scripts/publish.js @@ -84,18 +84,10 @@ await publish({ name: '@tanstack/server-functions-plugin', packageDir: 'packages/server-functions-plugin', }, - { - name: '@tanstack/create-router', - packageDir: 'packages/create-router', - }, { name: '@tanstack/eslint-plugin-router', packageDir: 'packages/eslint-plugin-router', }, - { - name: '@tanstack/create-start', - packageDir: 'packages/create-start', - }, { name: '@tanstack/solid-start', packageDir: 'packages/solid-start',