create-rolldown 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,12 +1,20 @@
1
- # create-rolldown
2
-
3
- [![npm version](https://img.shields.io/npm/v/create-rolldown.svg)](https://www.npmjs.com/package/create-rolldown)
4
- [![license](https://img.shields.io/npm/l/create-rolldown.svg)](https://github.com/rolldown/create-rolldown/blob/main/LICENSE)
1
+ <h1 align='center'>
2
+ <samp>create-rolldown 🔧</samp>
3
+ </h1>
4
+
5
+ <p align='center'>
6
+ <samp>⚡️ Scaffolding tool for Rolldown library projects - a fast JavaScript bundler written in Rust, with TypeScript support and multiple framework templates</samp>
7
+ <br>
8
+ <br>
9
+ </p>
10
+
11
+ [![npm version][npm-version-src]][npm-version-href]
12
+ [![npm downloads][npm-downloads-src]][npm-downloads-href]
13
+ [![bundle][bundle-src]][bundle-href]
14
+ [![License][license-src]][license-href]
5
15
  [![test](https://img.shields.io/badge/tests-77%20passed-brightgreen.svg)](https://github.com/sunny-117/create-rolldown)
6
16
  [![coverage](https://img.shields.io/badge/coverage-60.87%25-yellow.svg)](https://github.com/sunny-117/create-rolldown)
7
17
 
8
- Scaffolding tool for [Rolldown](https://rolldown.rs) library projects - a fast JavaScript bundler written in Rust.
9
-
10
18
  ## Features
11
19
 
12
20
  - 🚀 **Fast Setup** - Create a new Rolldown project in seconds
@@ -17,35 +25,35 @@ Scaffolding tool for [Rolldown](https://rolldown.rs) library projects - a fast J
17
25
  - 📦 **Smart Package Manager Detection** - Automatically detects and uses your preferred package manager (npm, pnpm, yarn, bun)
18
26
  - ⚡ **Immediate Start** - Optional flag to install dependencies and start playground immediately
19
27
 
20
- ## Usage
21
-
22
- ### Interactive Mode (Recommended)
23
-
24
- Simply run one of the following commands and follow the prompts:
28
+ ## Installation
25
29
 
26
30
  ```bash
27
- # npm
28
31
  npm create rolldown@latest
29
-
30
- # pnpm
32
+ # or
31
33
  pnpm create rolldown
32
-
33
- # yarn
34
+ # or
34
35
  yarn create rolldown
35
-
36
- # bun
36
+ # or
37
37
  bun create rolldown
38
38
  ```
39
39
 
40
+ ## Quick Start
41
+
42
+ ### Method 1: Interactive Mode (Recommended)
43
+
44
+ Simply run the command and follow the prompts:
45
+
46
+ ```bash
47
+ npm create rolldown@latest
48
+ ```
49
+
40
50
  You'll be prompted to:
41
51
 
42
52
  1. Enter a project name
43
53
  2. Choose a framework (Vanilla, React, Vue, Solid, or Svelte)
44
54
  3. Optionally install dependencies and start the playground immediately
45
55
 
46
- > **Note**: All templates use TypeScript and are designed for library development (utility libraries, component libraries, tools, etc.).
47
-
48
- ### Non-Interactive Mode
56
+ ### Method 2: Non-Interactive Mode
49
57
 
50
58
  For automated workflows or CI/CD pipelines:
51
59
 
@@ -60,27 +68,6 @@ npm create rolldown@latest my-lib -- --template vue --immediate --no-interactive
60
68
  npm create rolldown@latest my-lib -- --template solid --overwrite --no-interactive
61
69
  ```
62
70
 
63
- ## Command Line Options
64
-
65
- ```
66
- Usage: create-rolldown [project-name] [options]
67
-
68
- Options:
69
- -t, --template <template> Specify a template (vanilla, react, vue, solid, svelte)
70
- --overwrite Overwrite existing files in target directory
71
- -i, --immediate Install dependencies and start playground immediately
72
- --interactive Force interactive mode (default in TTY)
73
- --no-interactive Force non-interactive mode (default in non-TTY)
74
- -h, --help Display this help message
75
-
76
- Available templates:
77
- vanilla Vanilla TypeScript library
78
- react React component library
79
- vue Vue component library
80
- solid SolidJS component library
81
- svelte Svelte component library
82
- ```
83
-
84
71
  ## Supported Templates
85
72
 
86
73
  | Template | Description | Use Cases | Playground |
@@ -91,66 +78,19 @@ Available templates:
91
78
  | `solid` | SolidJS library with TypeScript | Solid components, primitives | ✅ Vite |
92
79
  | `svelte` | Svelte 5 library with TypeScript | Svelte components, actions | ✅ Vite |
93
80
 
94
- ## Development
95
-
96
- ### Prerequisites
97
-
98
- - Node.js 20.19.0+ or 22.12.0+
99
- - pnpm (recommended)
100
-
101
- ### Setup
102
-
103
- ```bash
104
- # Clone the repository
105
- git clone https://github.com/Sunny-117/create-rolldown.git
106
- cd create-rolldown
107
-
108
- # Install dependencies
109
- pnpm install
110
-
111
- # Run in development mode (watch mode)
112
- pnpm dev
113
-
114
- # Build for production
115
- pnpm build
116
-
117
- # Run tests
118
- pnpm test
119
-
120
- # Run tests in watch mode
121
- pnpm test:watch
122
-
123
- # Generate test coverage report
124
- pnpm test:coverage
125
-
126
- # Type checking
127
- pnpm typecheck
128
-
129
- # Linting
130
- pnpm lint
131
-
132
- # Format code
133
- pnpm format
81
+ ## Command Line Options
134
82
 
135
- # Check formatting
136
- pnpm format:check
137
83
  ```
84
+ Usage: create-rolldown [project-name] [options]
138
85
 
139
- ### Adding a New Template
140
-
141
- 1. Create a new directory: `template-{framework}` (e.g., `template-preact`)
142
- 2. Add all necessary project files following the library structure:
143
- - `src/` - Library source code
144
- - `playground/` - Vite playground (optional, for framework templates)
145
- - `rolldown.config.js` - Rolldown configuration
146
- - `vite.config.ts` - Vite configuration (if playground exists)
147
- - `package.json` - With proper exports and scripts
148
- - `tsconfig.json` - TypeScript configuration
149
- - `.gitignore` - Git ignore rules
150
- - `README.md` - Template documentation
151
- 3. Use `.gitignore` (not `_gitignore`) - it will be preserved during scaffolding
152
- 4. Update `FRAMEWORKS` array in `src/utils/constants.ts`
153
- 5. Test the new template with both interactive and non-interactive modes
86
+ Options:
87
+ -t, --template <template> Specify a template (vanilla, react, vue, solid, svelte)
88
+ --overwrite Overwrite existing files in target directory
89
+ -i, --immediate Install dependencies and start playground immediately
90
+ --interactive Force interactive mode (default in TTY)
91
+ --no-interactive Force non-interactive mode (default in non-TTY)
92
+ -h, --help Display this help message
93
+ ```
154
94
 
155
95
  ## How It Works
156
96
 
@@ -168,10 +108,21 @@ Contributions are welcome! Please feel free to submit a Pull Request.
168
108
 
169
109
  ## License
170
110
 
171
- MIT - see [LICENSE](./LICENSE) file for details
111
+ 💛 [MIT](./LICENSE) License © [Sunny-117](https://github.com/Sunny-117)
172
112
 
173
113
  ## Related Projects
174
114
 
175
115
  - [Rolldown](https://rolldown.rs) - Fast JavaScript bundler written in Rust
176
116
  - [tsdown](https://tsdown.dev) - TypeScript bundler built on Rolldown
177
117
  - [create-vite](https://github.com/vitejs/vite/tree/main/packages/create-vite) - Inspiration for this project
118
+
119
+ <!-- Badges -->
120
+
121
+ [npm-version-src]: https://img.shields.io/npm/v/create-rolldown?style=flat&colorA=080f12&colorB=1fa669
122
+ [npm-version-href]: https://npmjs.com/package/create-rolldown
123
+ [npm-downloads-src]: https://img.shields.io/npm/dm/create-rolldown?style=flat&colorA=080f12&colorB=1fa669
124
+ [npm-downloads-href]: https://npmjs.com/package/create-rolldown
125
+ [bundle-src]: https://img.shields.io/bundlephobia/minzip/create-rolldown?style=flat&colorA=080f12&colorB=1fa669&label=minzip
126
+ [bundle-href]: https://bundlephobia.com/result?p=create-rolldown
127
+ [license-src]: https://img.shields.io/github/license/Sunny-117/create-rolldown.svg?style=flat&colorA=080f12&colorB=1fa669
128
+ [license-href]: https://github.com/Sunny-117/create-rolldown/blob/main/LICENSE
package/dist/cli.js CHANGED
@@ -47,6 +47,16 @@ const TEMPLATES = FRAMEWORKS.map((f) => f.name);
47
47
  * File rename mappings for special files
48
48
  */
49
49
  const renameFiles = { _gitignore: ".gitignore" };
50
+ /**
51
+ * Banner text for create-rolldown
52
+ * Displayed at the start of the CLI
53
+ */
54
+ const defaultBanner = "Rolldown - Blazing Fast Rust-based bundler for JavaScript";
55
+ /**
56
+ * Gradient banner with Rolldown brand colors (orange gradient)
57
+ * Uses ANSI escape codes for RGB colors
58
+ */
59
+ const gradientBanner = "\x1B[38;2;255;107;0mR\x1B[39m\x1B[38;2;255;105;4mo\x1B[39m\x1B[38;2;255;103;8ml\x1B[39m\x1B[38;2;255;101;12ml\x1B[39m\x1B[38;2;255;99;16md\x1B[39m\x1B[38;2;255;97;20mo\x1B[39m\x1B[38;2;255;95;24mw\x1B[39m\x1B[38;2;255;93;28mn\x1B[39m \x1B[38;2;255;91;32m-\x1B[39m \x1B[38;2;255;89;36mB\x1B[39m\x1B[38;2;255;87;40ml\x1B[39m\x1B[38;2;255;85;44ma\x1B[39m\x1B[38;2;255;83;48mz\x1B[39m\x1B[38;2;255;81;52mi\x1B[39m\x1B[38;2;255;79;56mn\x1B[39m\x1B[38;2;255;77;60mg\x1B[39m \x1B[38;2;255;75;64mF\x1B[39m\x1B[38;2;255;73;68ma\x1B[39m\x1B[38;2;255;71;72ms\x1B[39m\x1B[38;2;255;69;76mt\x1B[39m \x1B[38;2;255;67;80mR\x1B[39m\x1B[38;2;255;65;84mu\x1B[39m\x1B[38;2;255;63;88ms\x1B[39m\x1B[38;2;255;61;92mt\x1B[39m\x1B[38;2;255;59;96m-\x1B[39m\x1B[38;2;255;57;100mb\x1B[39m\x1B[38;2;255;55;104ma\x1B[39m\x1B[38;2;255;53;108ms\x1B[39m\x1B[38;2;255;51;112me\x1B[39m\x1B[38;2;255;49;116md\x1B[39m \x1B[38;2;255;47;120mb\x1B[39m\x1B[38;2;255;45;124mu\x1B[39m\x1B[38;2;255;43;128mn\x1B[39m\x1B[38;2;255;41;132md\x1B[39m\x1B[38;2;255;39;136ml\x1B[39m\x1B[38;2;255;37;140me\x1B[39m\x1B[38;2;255;35;144mr\x1B[39m \x1B[38;2;255;33;148mf\x1B[39m\x1B[38;2;255;31;152mo\x1B[39m\x1B[38;2;255;29;156mr\x1B[39m \x1B[38;2;255;27;160mJ\x1B[39m\x1B[38;2;255;25;164ma\x1B[39m\x1B[38;2;255;23;168mv\x1B[39m\x1B[38;2;255;21;172ma\x1B[39m\x1B[38;2;255;19;176mS\x1B[39m\x1B[38;2;255;17;180mc\x1B[39m\x1B[38;2;255;15;184mr\x1B[39m\x1B[38;2;255;13;188mi\x1B[39m\x1B[38;2;255;11;192mp\x1B[39m\x1B[38;2;255;9;196mt\x1B[39m";
50
60
 
51
61
  //#endregion
52
62
  //#region src/utils/file.ts
@@ -535,6 +545,10 @@ function exitProcess(code) {
535
545
  */
536
546
  async function init() {
537
547
  try {
548
+ console.log();
549
+ const supportsColor = process.stdout.isTTY && process.env.TERM !== "dumb";
550
+ console.log(supportsColor ? gradientBanner : defaultBanner);
551
+ console.log();
538
552
  const args = parseArguments();
539
553
  if (args.help) {
540
554
  displayHelp();
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","names":["FRAMEWORKS: Framework[]","TEMPLATES: string[]","renameFiles: Record<string, string | undefined>","path: string","path","dir: string","src: string","dest: string","srcDir: string","destDir: string","file: string","callback: (content: string) => string","templateDir: string","root: string","projectName: string","packageName: string","targetDir: string | undefined","projectName: string","userAgent: string | undefined","agent: string","script: string","exitProcess","code: number","defaultValue: string","targetDir: string","frameworks: Framework[]","pkgManager: string","command: string[]","options?: SpawnOptions","root: string","agent: string","argv: string[]","args: CLIArguments","code: number","projectName: string"],"sources":["../src/utils/constants.ts","../src/utils/file.ts","../src/utils/validation.ts","../src/utils/package-manager.ts","../src/utils/prompts.ts","../src/utils/command.ts","../src/utils/args.ts","../src/cli.ts"],"sourcesContent":["/**\n * Constants for create-rolldown\n */\nimport pc from 'picocolors';\nimport type { Framework } from './types';\n\n/**\n * Supported frameworks with their variants\n * All templates use TypeScript and are designed for library development\n * (utility libraries, component libraries, tools, hooks, composables, etc.)\n */\nexport const FRAMEWORKS: Framework[] = [\n {\n name: 'vanilla',\n display: 'Vanilla',\n color: pc.yellow,\n },\n {\n name: 'react',\n display: 'React',\n color: pc.cyan,\n },\n {\n name: 'vue',\n display: 'Vue',\n color: pc.green,\n },\n {\n name: 'solid',\n display: 'Solid',\n color: pc.blue,\n },\n {\n name: 'svelte',\n display: 'Svelte',\n color: pc.red,\n },\n];\n\n/**\n * All available template names (flat list)\n */\nexport const TEMPLATES: string[] = FRAMEWORKS.map((f) => f.name);\n\n/**\n * File rename mappings for special files\n */\nexport const renameFiles: Record<string, string | undefined> = {\n _gitignore: '.gitignore',\n};\n","/**\n * File system utilities\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { renameFiles } from './constants';\n\n/**\n * Check if a directory is empty (ignoring .git)\n * @param path - The directory path to check\n * @returns true if empty or only contains .git, false otherwise\n */\nexport function isEmpty(path: string): boolean {\n const files = fs.readdirSync(path);\n return files.length === 0 || (files.length === 1 && files[0] === '.git');\n}\n\n/**\n * Empty a directory but preserve .git folder\n * @param dir - The directory to empty\n * @throws Error if directory emptying fails\n */\nexport function emptyDir(dir: string): void {\n if (!fs.existsSync(dir)) {\n return;\n }\n try {\n for (const file of fs.readdirSync(dir)) {\n if (file === '.git') {\n continue;\n }\n fs.rmSync(path.resolve(dir, file), { recursive: true, force: true });\n }\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to empty directory ${dir}: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Copy a file or directory\n * @param src - Source path\n * @param dest - Destination path\n * @throws Error if copy operation fails\n */\nexport function copy(src: string, dest: string): void {\n try {\n const stat = fs.statSync(src);\n if (stat.isDirectory()) {\n copyDir(src, dest);\n } else {\n fs.copyFileSync(src, dest);\n }\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to copy from ${src} to ${dest}: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Recursively copy a directory\n * @param srcDir - Source directory\n * @param destDir - Destination directory\n * @throws Error if directory copy fails\n */\nexport function copyDir(srcDir: string, destDir: string): void {\n try {\n fs.mkdirSync(destDir, { recursive: true });\n for (const file of fs.readdirSync(srcDir)) {\n const srcFile = path.resolve(srcDir, file);\n const destFile = path.resolve(destDir, file);\n copy(srcFile, destFile);\n }\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to copy directory from ${srcDir} to ${destDir}: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Write a file with optional content transformation\n * Handles special file renaming (e.g., _gitignore -> .gitignore)\n * @param file - File path to write\n * @param content - Optional content to write (if undefined, copies from template)\n */\nexport function write(file: string, content?: string): void {\n const targetPath = renameFiles[path.basename(file)] ?? file;\n if (content) {\n fs.writeFileSync(targetPath, content);\n } else {\n copy(file, targetPath);\n }\n}\n\n/**\n * Edit a file by applying a transformation function to its content\n * @param file - File path to edit\n * @param callback - Function that transforms the file content\n */\nexport function editFile(file: string, callback: (content: string) => string): void {\n const content = fs.readFileSync(file, 'utf-8');\n fs.writeFileSync(file, callback(content));\n}\n\n/**\n * Copy template files to target directory with transformations\n * @param templateDir - Source template directory\n * @param root - Target root directory\n * @param projectName - Project name for replacements\n * @param packageName - Package name for package.json\n * @throws Error if template copy fails or template directory doesn't exist\n */\nexport function copyTemplate(\n templateDir: string,\n root: string,\n projectName: string,\n packageName: string\n): void {\n // Validate template directory exists\n if (!fs.existsSync(templateDir)) {\n throw new Error(`Template directory not found: ${templateDir}`);\n }\n\n try {\n // Create target directory if it doesn't exist\n if (!fs.existsSync(root)) {\n fs.mkdirSync(root, { recursive: true });\n }\n\n const files = fs.readdirSync(templateDir);\n\n for (const file of files) {\n const srcFile = path.join(templateDir, file);\n const stat = fs.statSync(srcFile);\n\n if (stat.isDirectory()) {\n // Recursively copy directories\n const destDir = path.join(root, file);\n copyDir(srcFile, destDir);\n } else {\n // Handle file renaming for special files\n const destFileName = renameFiles[file] ?? file;\n const destFile = path.join(root, destFileName);\n\n // Copy the file\n fs.copyFileSync(srcFile, destFile);\n }\n }\n\n // Update package.json with the correct package name\n const pkgJsonPath = path.join(root, 'package.json');\n if (fs.existsSync(pkgJsonPath)) {\n editFile(pkgJsonPath, (content) => {\n const pkg = JSON.parse(content);\n pkg.name = packageName;\n return JSON.stringify(pkg, null, 2) + '\\n';\n });\n }\n\n // Update index.html with the correct project name (check both root and playground)\n const indexHtmlPath = path.join(root, 'index.html');\n const playgroundIndexHtmlPath = path.join(root, 'playground', 'index.html');\n\n if (fs.existsSync(indexHtmlPath)) {\n editFile(indexHtmlPath, (content) => {\n // Use a replacement function to avoid issues with special regex characters\n return content.replace(/<title>.*?<\\/title>/, () => `<title>${projectName}</title>`);\n });\n }\n\n if (fs.existsSync(playgroundIndexHtmlPath)) {\n editFile(playgroundIndexHtmlPath, (content) => {\n // Use a replacement function to avoid issues with special regex characters\n return content.replace(/<title>.*?<\\/title>/, () => `<title>${projectName}</title>`);\n });\n }\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to copy template: ${error.message}`);\n }\n throw error;\n }\n}\n","/**\n * Validation utilities\n */\n\n/**\n * Format target directory by removing trailing slashes and whitespace\n * @param targetDir - The directory path to format\n * @returns Formatted directory path\n */\nexport function formatTargetDir(targetDir: string | undefined): string {\n return targetDir?.trim().replace(/\\/+$/g, '') ?? '';\n}\n\n/**\n * Validate if a string is a valid npm package name\n * @param projectName - The project name to validate\n * @returns true if valid, false otherwise\n */\nexport function isValidPackageName(projectName: string): boolean {\n return /^(?:@[a-z0-9-*~][a-z0-9-*._~]*\\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(projectName);\n}\n\n/**\n * Convert a string to a valid npm package name\n * @param projectName - The project name to convert\n * @returns Valid npm package name\n */\nexport function toValidPackageName(projectName: string): string {\n const converted = projectName\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/^[._]/, '')\n .replace(/[^a-z0-9-~]+/g, '-');\n\n // If the result is empty or invalid, return a default valid name\n return converted || 'package';\n}\n","/**\n * Package manager utilities\n */\nimport type { PkgInfo } from './types';\n\n/**\n * Parse package manager information from user agent string\n * @param userAgent - The user agent string (typically from npm_config_user_agent)\n * @returns Package manager info or undefined if not found\n */\nexport function pkgFromUserAgent(userAgent: string | undefined): PkgInfo | undefined {\n if (!userAgent) return undefined;\n\n const pkgSpec = userAgent.split(' ')[0];\n const pkgSpecArr = pkgSpec.split('/');\n\n if (pkgSpecArr.length !== 2) return undefined;\n\n return {\n name: pkgSpecArr[0],\n version: pkgSpecArr[1],\n };\n}\n\n/**\n * Get install command for a package manager\n * @param agent - Package manager name (npm, pnpm, yarn, bun, deno)\n * @returns Array of command parts\n */\nexport function getInstallCommand(agent: string): string[] {\n switch (agent) {\n case 'npm':\n return ['npm', 'install'];\n case 'pnpm':\n return ['pnpm', 'install'];\n case 'yarn':\n return ['yarn'];\n case 'bun':\n return ['bun', 'install'];\n case 'deno':\n return ['deno', 'install'];\n default:\n return ['npm', 'install'];\n }\n}\n\n/**\n * Get run command for a package manager\n * @param agent - Package manager name (npm, pnpm, yarn, bun, deno)\n * @param script - Script name to run\n * @returns Array of command parts\n */\nexport function getRunCommand(agent: string, script: string): string[] {\n switch (agent) {\n case 'npm':\n return ['npm', 'run', script];\n case 'pnpm':\n return ['pnpm', script];\n case 'yarn':\n return ['yarn', script];\n case 'bun':\n return ['bun', 'run', script];\n case 'deno':\n return ['deno', 'task', script];\n default:\n return ['npm', 'run', script];\n }\n}\n","/**\n * User prompt utilities\n */\nimport * as prompts from '@clack/prompts';\nimport type { Framework, FrameworkVariant } from './types';\nimport { isValidPackageName } from './validation';\n\n/**\n * Exit the process (skipped in test mode)\n * @param code - Exit code\n */\nfunction exitProcess(code: number): void {\n if (!process.env._ROLLDOWN_TEST_CLI) {\n process.exit(code);\n }\n}\n\n/**\n * Prompt user for project name\n * @param defaultValue - Default project name\n * @returns Project name entered by user\n */\nexport async function promptProjectName(defaultValue: string): Promise<string> {\n const result = await prompts.text({\n message: 'Project name:',\n placeholder: defaultValue,\n defaultValue,\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Project name cannot be empty';\n }\n },\n });\n\n if (prompts.isCancel(result)) {\n prompts.cancel('Operation cancelled');\n exitProcess(0);\n }\n\n return result as string;\n}\n\n/**\n * Prompt user for how to handle existing directory\n * @param targetDir - The target directory path\n * @returns User's choice: 'yes' (overwrite), 'no' (cancel), or 'ignore' (merge)\n */\nexport async function promptOverwrite(targetDir: string): Promise<'yes' | 'no' | 'ignore'> {\n const displayDir = targetDir === '.' ? 'Current directory' : `Target directory \"${targetDir}\"`;\n const message = `${displayDir} is not empty. Please choose how to proceed:`;\n\n const result = await prompts.select({\n message,\n options: [\n {\n value: 'yes',\n label: 'Remove existing files and continue',\n },\n {\n value: 'no',\n label: 'Cancel operation',\n },\n {\n value: 'ignore',\n label: 'Ignore files and continue',\n },\n ],\n });\n\n if (prompts.isCancel(result)) {\n prompts.cancel('Operation cancelled');\n exitProcess(0);\n }\n\n return result as 'yes' | 'no' | 'ignore';\n}\n\n/**\n * Prompt user for package name\n * @param defaultValue - Default package name\n * @returns Valid package name entered by user\n */\nexport async function promptPackageName(defaultValue: string): Promise<string> {\n const result = await prompts.text({\n message: 'Package name:',\n placeholder: defaultValue,\n defaultValue,\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Package name cannot be empty';\n }\n if (!isValidPackageName(value)) {\n return 'Invalid package name (must follow npm naming conventions)';\n }\n },\n });\n\n if (prompts.isCancel(result)) {\n prompts.cancel('Operation cancelled');\n exitProcess(0);\n }\n\n return result as string;\n}\n\n/**\n * Prompt user to select a framework\n * @param frameworks - Array of available frameworks\n * @returns Selected framework\n */\nexport async function promptFramework(frameworks: Framework[]): Promise<Framework> {\n const result = await prompts.select({\n message: 'Select a framework:',\n options: frameworks.map((framework) => ({\n value: framework,\n label: framework.color(framework.display),\n })),\n });\n\n if (prompts.isCancel(result)) {\n prompts.cancel('Operation cancelled');\n exitProcess(0);\n }\n\n return result as Framework;\n}\n\n/**\n * Prompt user to select a framework variant\n * @param variants - Array of available variants\n * @returns Selected variant name (template name)\n */\nexport async function promptVariant(variants: FrameworkVariant[]): Promise<string> {\n const result = await prompts.select({\n message: 'Select a variant:',\n options: variants.map((variant) => ({\n value: variant.name,\n label: variant.color(variant.display),\n })),\n });\n\n if (prompts.isCancel(result)) {\n prompts.cancel('Operation cancelled');\n exitProcess(0);\n }\n\n return result as string;\n}\n\n/**\n * Prompt user to confirm immediate installation and start\n * @param pkgManager - Package manager name\n * @returns true if user wants to install and start immediately\n */\nexport async function promptImmediate(pkgManager: string): Promise<boolean> {\n const result = await prompts.confirm({\n message: `Install dependencies and start dev server with ${pkgManager}?`,\n initialValue: false,\n });\n\n if (prompts.isCancel(result)) {\n prompts.cancel('Operation cancelled');\n exitProcess(0);\n }\n\n return result as boolean;\n}\n","/**\n * Command execution utilities\n */\nimport { SpawnOptions } from 'node:child_process';\nimport spawn from 'cross-spawn';\nimport pc from 'picocolors';\nimport { getInstallCommand, getRunCommand } from './package-manager';\n\n/**\n * Execute a command using cross-spawn\n * @param command - Command array [command, ...args]\n * @param options - Spawn options\n * @throws Error if command execution fails\n */\nexport function run(command: string[], options?: SpawnOptions): void {\n // Skip actual command execution in test environment\n if (process.env._ROLLDOWN_TEST_CLI) {\n return;\n }\n\n const [cmd, ...args] = command;\n\n try {\n const result = spawn.sync(cmd, args, {\n stdio: 'inherit',\n ...options,\n });\n\n if (result.error) {\n throw new Error(\n `Failed to execute command: ${cmd} ${args.join(' ')}\\n${result.error.message}`\n );\n }\n\n if (result.status !== 0) {\n throw new Error(`Command failed with exit code ${result.status}: ${cmd} ${args.join(' ')}`);\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(pc.red(`\\n✗ Command execution failed: ${error.message}`));\n } else {\n console.error(pc.red(`\\n✗ Command execution failed: ${String(error)}`));\n }\n throw error;\n }\n}\n\n/**\n * Install dependencies in the project directory\n * @param root - Project root directory\n * @param agent - Package manager name\n * @throws Error if installation fails\n */\nexport function install(root: string, agent: string): void {\n const installCmd = getInstallCommand(agent);\n console.log(pc.cyan(`\\nInstalling dependencies with ${agent}...`));\n\n // Skip actual installation in test environment\n if (process.env._ROLLDOWN_TEST_CLI) {\n return;\n }\n\n try {\n run(installCmd, { cwd: root });\n } catch (error) {\n console.error(pc.red(`\\n✗ Failed to install dependencies with ${agent}`));\n if (error instanceof Error) {\n console.error(pc.red(`Error: ${error.message}`));\n }\n throw error;\n }\n}\n\n/**\n * Start the development server\n * @param root - Project root directory\n * @param agent - Package manager name\n * @throws Error if server start fails\n */\nexport function start(root: string, agent: string): void {\n const runCmd = getRunCommand(agent, 'dev');\n console.log(pc.cyan(`\\nStarting dev server...`));\n\n // Skip actual server start in test environment\n if (process.env._ROLLDOWN_TEST_CLI) {\n return;\n }\n\n try {\n run(runCmd, { cwd: root });\n } catch (error) {\n console.error(pc.red(`\\n✗ Failed to start dev server with ${agent}`));\n if (error instanceof Error) {\n console.error(pc.red(`Error: ${error.message}`));\n }\n throw error;\n }\n}\n","/**\n * Command line argument parsing utilities\n */\nimport mri from 'mri';\nimport type { CLIArguments } from './types';\n\n/**\n * Parse command line arguments\n * @param argv - Command line arguments (defaults to process.argv.slice(2))\n * @returns Parsed CLI arguments\n */\nexport function parseArguments(argv: string[] = process.argv.slice(2)): CLIArguments {\n const args = mri(argv, {\n alias: {\n h: 'help',\n t: 'template',\n i: 'immediate',\n },\n boolean: ['help', 'overwrite', 'immediate', 'interactive'],\n string: ['template'],\n default: {\n immediate: undefined,\n interactive: undefined,\n },\n });\n\n return {\n _: args._,\n template: args.template,\n help: args.help,\n overwrite: args.overwrite,\n immediate: args.immediate,\n interactive: args.interactive,\n };\n}\n\n/**\n * Display help information\n */\nexport function displayHelp(): void {\n console.log(`\nUsage: create-rolldown [project-name] [options]\n\nOptions:\n -t, --template <name> Use a specific template\n -h, --help Display this help message\n --overwrite Overwrite existing files in target directory\n -i, --immediate Install dependencies and start dev server immediately\n --no-immediate Skip dependency installation\n --interactive Force interactive mode\n --no-interactive Force non-interactive mode\n\nAvailable templates:\n vanilla Vanilla TypeScript library (default)\n react React library with TypeScript\n vue Vue library with TypeScript\n solid SolidJS library with TypeScript\n svelte Svelte library with TypeScript\n\nExamples:\n $ npm create rolldown\n $ npm create rolldown my-lib\n $ npm create rolldown my-lib --template react\n $ npm create rolldown my-lib -t vue --immediate\n $ npm create rolldown my-lib --no-interactive --template solid\n`);\n}\n\n/**\n * Detect if CLI should run in interactive mode\n * @param args - Parsed CLI arguments\n * @returns true if interactive mode should be used\n */\nexport function shouldUseInteractiveMode(args: CLIArguments): boolean {\n // If explicitly set via --interactive or --no-interactive, use that\n if (args.interactive !== undefined) {\n return args.interactive;\n }\n\n // Check if running in a TTY environment\n const isTTY = process.stdout.isTTY && process.stdin.isTTY;\n\n // Check for AI agent environment (common CI/CD or agent indicators)\n const isAIAgent =\n process.env.CI === 'true' || process.env.CONTINUOUS_INTEGRATION === 'true' || !isTTY;\n\n return !isAIAgent;\n}\n","#!/usr/bin/env node\n\n/**\n * create-rolldown - Scaffolding tool for Rolldown projects\n * CLI entry point\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport {\n parseArguments,\n displayHelp,\n shouldUseInteractiveMode,\n formatTargetDir,\n isEmpty,\n emptyDir,\n toValidPackageName,\n isValidPackageName,\n copyTemplate,\n pkgFromUserAgent,\n getInstallCommand,\n getRunCommand,\n install,\n start,\n promptProjectName,\n promptOverwrite,\n promptPackageName,\n promptFramework,\n promptImmediate,\n FRAMEWORKS,\n TEMPLATES,\n} from './utils';\n\n/**\n * Exit the process (skipped in test mode)\n * @param code - Exit code\n */\nfunction exitProcess(code: number): void {\n if (!process.env._ROLLDOWN_TEST_CLI) {\n process.exit(code);\n }\n}\n\n/**\n * Main initialization function\n * Orchestrates the entire project creation workflow\n */\nasync function init(): Promise<void> {\n try {\n const args = parseArguments();\n\n // Display help if requested\n if (args.help) {\n displayHelp();\n return;\n }\n\n // Detect interactive mode\n const interactive = shouldUseInteractiveMode(args);\n\n // Detect AI agent environment and provide guidance\n if (!interactive && !process.stdout.isTTY) {\n console.log(pc.yellow('\\nDetected non-interactive environment (AI agent or CI/CD).'));\n console.log(\n pc.yellow(\n 'For best results, use: create-rolldown <project-name> --template <template> --no-interactive\\n'\n )\n );\n }\n\n // Get target directory from arguments or use default\n const defaultProjectName = 'rolldown-project';\n let targetDir = formatTargetDir(args._[0]);\n\n // Get project name (interactive or from args)\n let projectName: string;\n if (interactive && !targetDir) {\n projectName = await promptProjectName(defaultProjectName);\n targetDir = formatTargetDir(projectName);\n } else {\n projectName = targetDir || defaultProjectName;\n targetDir = projectName;\n }\n\n // Resolve to absolute path\n const root = path.resolve(process.cwd(), targetDir);\n\n // Handle directory conflicts\n if (fs.existsSync(root) && !isEmpty(root)) {\n if (interactive) {\n const overwrite = await promptOverwrite(targetDir);\n\n if (overwrite === 'no') {\n console.log(pc.red('\\nOperation cancelled'));\n exitProcess(0);\n } else if (overwrite === 'yes') {\n console.log(pc.cyan(`\\nRemoving existing files in ${targetDir}...`));\n try {\n emptyDir(root);\n } catch (error) {\n console.error(pc.red(`\\n✗ Failed to remove existing files`));\n if (error instanceof Error) {\n console.error(pc.red(`Error: ${error.message}`));\n }\n exitProcess(1);\n }\n }\n // If 'ignore', continue without clearing\n } else {\n // Non-interactive mode\n if (args.overwrite) {\n console.log(pc.cyan(`\\nRemoving existing files in ${targetDir}...`));\n try {\n emptyDir(root);\n } catch (error) {\n console.error(pc.red(`\\n✗ Failed to remove existing files`));\n if (error instanceof Error) {\n console.error(pc.red(`Error: ${error.message}`));\n }\n exitProcess(1);\n }\n } else {\n console.log(pc.red(`\\nTarget directory \"${targetDir}\" is not empty.`));\n console.log(\n pc.red(\n 'Use --overwrite flag to overwrite existing files, or choose a different directory.'\n )\n );\n exitProcess(1);\n }\n }\n }\n\n // Get package name\n let packageName = toValidPackageName(projectName);\n if (interactive && !isValidPackageName(projectName)) {\n packageName = await promptPackageName(packageName);\n }\n\n // Get template\n let template = args.template;\n\n if (interactive && !template) {\n // Prompt for framework (directly get template name)\n const framework = await promptFramework(FRAMEWORKS);\n template = framework.name; // Use framework name directly as template\n } else if (!template) {\n // Non-interactive mode without template - use default\n template = 'vanilla';\n }\n\n // Validate template\n if (!TEMPLATES.includes(template)) {\n if (interactive) {\n console.log(\n pc.yellow(`\\n\"${template}\" isn't a valid template. Please choose from below:\\n`)\n );\n const framework = await promptFramework(FRAMEWORKS);\n template = framework.name; // Use framework name directly as template\n } else {\n console.log(\n pc.yellow(`\\nTemplate \"${template}\" not found. Using default template \"vanilla\".\\n`)\n );\n template = 'vanilla';\n }\n }\n\n // Detect package manager\n const pkgInfo = pkgFromUserAgent(process.env.npm_config_user_agent);\n const pkgManager = pkgInfo?.name || 'npm';\n\n // Ask about immediate installation (interactive only)\n let shouldInstall = false;\n if (args.immediate === true) {\n shouldInstall = true;\n } else if (args.immediate === false) {\n shouldInstall = false;\n } else if (interactive) {\n shouldInstall = await promptImmediate(pkgManager);\n }\n\n // Start scaffolding\n console.log(pc.cyan(`\\nScaffolding project in ${root}...`));\n\n // Get template directory\n const templateDir = path.resolve(\n path.dirname(new URL(import.meta.url).pathname),\n '..',\n `template-${template}`\n );\n\n // Create target directory if it doesn't exist\n try {\n if (!fs.existsSync(root)) {\n fs.mkdirSync(root, { recursive: true });\n }\n } catch (error) {\n console.error(pc.red(`\\n✗ Failed to create project directory`));\n if (error instanceof Error) {\n console.error(pc.red(`Error: ${error.message}`));\n }\n exitProcess(1);\n }\n\n // Copy template files\n try {\n copyTemplate(templateDir, root, projectName, packageName);\n } catch (error) {\n console.error(pc.red(`\\n✗ Failed to copy template files`));\n if (error instanceof Error) {\n console.error(pc.red(`Error: ${error.message}`));\n }\n exitProcess(1);\n }\n\n console.log(pc.green('\\n✓ Project created successfully!'));\n\n // Install dependencies and start server if requested\n if (shouldInstall) {\n try {\n install(root, pkgManager);\n console.log(pc.green('\\n✓ Dependencies installed successfully!'));\n\n start(root, pkgManager);\n } catch (error) {\n console.error(pc.red('\\n✗ Failed to install dependencies or start server'));\n if (error instanceof Error) {\n console.error(pc.red(`Error: ${error.message}`));\n }\n exitProcess(1);\n }\n } else {\n // Display next steps\n console.log(pc.cyan('\\nDone. Now run:\\n'));\n\n const cdCommand = path.relative(process.cwd(), root);\n if (cdCommand) {\n console.log(pc.cyan(` cd ${cdCommand}`));\n }\n\n const installCmd = getInstallCommand(pkgManager).join(' ');\n console.log(pc.cyan(` ${installCmd}`));\n\n const runCmd = getRunCommand(pkgManager, 'dev').join(' ');\n console.log(pc.cyan(` ${runCmd}`));\n\n console.log();\n }\n } catch (error) {\n // Handle any unexpected errors\n if (error instanceof Error) {\n console.error(pc.red(`\\n✗ An unexpected error occurred: ${error.message}`));\n } else {\n console.error(pc.red(`\\n✗ An unexpected error occurred: ${String(error)}`));\n }\n exitProcess(1);\n }\n}\n\n// Run init function\ninit().catch((error) => {\n // Error handling is already done in init(), but catch any unhandled errors\n if (error instanceof Error && error.message !== 'process.exit called with code 0') {\n console.error(pc.red(`\\n✗ Fatal error: ${error.message}`));\n }\n if (!process.env._ROLLDOWN_TEST_CLI && !process.env.VITEST) {\n exitProcess(1);\n }\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","names":["FRAMEWORKS: Framework[]","TEMPLATES: string[]","renameFiles: Record<string, string | undefined>","path: string","path","dir: string","src: string","dest: string","srcDir: string","destDir: string","file: string","callback: (content: string) => string","templateDir: string","root: string","projectName: string","packageName: string","targetDir: string | undefined","projectName: string","userAgent: string | undefined","agent: string","script: string","exitProcess","code: number","defaultValue: string","targetDir: string","frameworks: Framework[]","pkgManager: string","command: string[]","options?: SpawnOptions","root: string","agent: string","argv: string[]","args: CLIArguments","code: number","projectName: string"],"sources":["../src/utils/constants.ts","../src/utils/file.ts","../src/utils/validation.ts","../src/utils/package-manager.ts","../src/utils/prompts.ts","../src/utils/command.ts","../src/utils/args.ts","../src/cli.ts"],"sourcesContent":["/**\n * Constants for create-rolldown\n */\nimport pc from 'picocolors';\nimport type { Framework } from './types';\n\n/**\n * Supported frameworks with their variants\n * All templates use TypeScript and are designed for library development\n * (utility libraries, component libraries, tools, hooks, composables, etc.)\n */\nexport const FRAMEWORKS: Framework[] = [\n {\n name: 'vanilla',\n display: 'Vanilla',\n color: pc.yellow,\n },\n {\n name: 'react',\n display: 'React',\n color: pc.cyan,\n },\n {\n name: 'vue',\n display: 'Vue',\n color: pc.green,\n },\n {\n name: 'solid',\n display: 'Solid',\n color: pc.blue,\n },\n {\n name: 'svelte',\n display: 'Svelte',\n color: pc.red,\n },\n];\n\n/**\n * All available template names (flat list)\n */\nexport const TEMPLATES: string[] = FRAMEWORKS.map((f) => f.name);\n\n/**\n * File rename mappings for special files\n */\nexport const renameFiles: Record<string, string | undefined> = {\n _gitignore: '.gitignore',\n};\n\n/**\n * Banner text for create-rolldown\n * Displayed at the start of the CLI\n */\nexport const defaultBanner = 'Rolldown - Blazing Fast Rust-based bundler for JavaScript';\n\n/**\n * Gradient banner with Rolldown brand colors (orange gradient)\n * Uses ANSI escape codes for RGB colors\n */\nexport const gradientBanner =\n '\\x1B[38;2;255;107;0mR\\x1B[39m\\x1B[38;2;255;105;4mo\\x1B[39m\\x1B[38;2;255;103;8ml\\x1B[39m\\x1B[38;2;255;101;12ml\\x1B[39m\\x1B[38;2;255;99;16md\\x1B[39m\\x1B[38;2;255;97;20mo\\x1B[39m\\x1B[38;2;255;95;24mw\\x1B[39m\\x1B[38;2;255;93;28mn\\x1B[39m \\x1B[38;2;255;91;32m-\\x1B[39m \\x1B[38;2;255;89;36mB\\x1B[39m\\x1B[38;2;255;87;40ml\\x1B[39m\\x1B[38;2;255;85;44ma\\x1B[39m\\x1B[38;2;255;83;48mz\\x1B[39m\\x1B[38;2;255;81;52mi\\x1B[39m\\x1B[38;2;255;79;56mn\\x1B[39m\\x1B[38;2;255;77;60mg\\x1B[39m \\x1B[38;2;255;75;64mF\\x1B[39m\\x1B[38;2;255;73;68ma\\x1B[39m\\x1B[38;2;255;71;72ms\\x1B[39m\\x1B[38;2;255;69;76mt\\x1B[39m \\x1B[38;2;255;67;80mR\\x1B[39m\\x1B[38;2;255;65;84mu\\x1B[39m\\x1B[38;2;255;63;88ms\\x1B[39m\\x1B[38;2;255;61;92mt\\x1B[39m\\x1B[38;2;255;59;96m-\\x1B[39m\\x1B[38;2;255;57;100mb\\x1B[39m\\x1B[38;2;255;55;104ma\\x1B[39m\\x1B[38;2;255;53;108ms\\x1B[39m\\x1B[38;2;255;51;112me\\x1B[39m\\x1B[38;2;255;49;116md\\x1B[39m \\x1B[38;2;255;47;120mb\\x1B[39m\\x1B[38;2;255;45;124mu\\x1B[39m\\x1B[38;2;255;43;128mn\\x1B[39m\\x1B[38;2;255;41;132md\\x1B[39m\\x1B[38;2;255;39;136ml\\x1B[39m\\x1B[38;2;255;37;140me\\x1B[39m\\x1B[38;2;255;35;144mr\\x1B[39m \\x1B[38;2;255;33;148mf\\x1B[39m\\x1B[38;2;255;31;152mo\\x1B[39m\\x1B[38;2;255;29;156mr\\x1B[39m \\x1B[38;2;255;27;160mJ\\x1B[39m\\x1B[38;2;255;25;164ma\\x1B[39m\\x1B[38;2;255;23;168mv\\x1B[39m\\x1B[38;2;255;21;172ma\\x1B[39m\\x1B[38;2;255;19;176mS\\x1B[39m\\x1B[38;2;255;17;180mc\\x1B[39m\\x1B[38;2;255;15;184mr\\x1B[39m\\x1B[38;2;255;13;188mi\\x1B[39m\\x1B[38;2;255;11;192mp\\x1B[39m\\x1B[38;2;255;9;196mt\\x1B[39m';\n","/**\n * File system utilities\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { renameFiles } from './constants';\n\n/**\n * Check if a directory is empty (ignoring .git)\n * @param path - The directory path to check\n * @returns true if empty or only contains .git, false otherwise\n */\nexport function isEmpty(path: string): boolean {\n const files = fs.readdirSync(path);\n return files.length === 0 || (files.length === 1 && files[0] === '.git');\n}\n\n/**\n * Empty a directory but preserve .git folder\n * @param dir - The directory to empty\n * @throws Error if directory emptying fails\n */\nexport function emptyDir(dir: string): void {\n if (!fs.existsSync(dir)) {\n return;\n }\n try {\n for (const file of fs.readdirSync(dir)) {\n if (file === '.git') {\n continue;\n }\n fs.rmSync(path.resolve(dir, file), { recursive: true, force: true });\n }\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to empty directory ${dir}: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Copy a file or directory\n * @param src - Source path\n * @param dest - Destination path\n * @throws Error if copy operation fails\n */\nexport function copy(src: string, dest: string): void {\n try {\n const stat = fs.statSync(src);\n if (stat.isDirectory()) {\n copyDir(src, dest);\n } else {\n fs.copyFileSync(src, dest);\n }\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to copy from ${src} to ${dest}: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Recursively copy a directory\n * @param srcDir - Source directory\n * @param destDir - Destination directory\n * @throws Error if directory copy fails\n */\nexport function copyDir(srcDir: string, destDir: string): void {\n try {\n fs.mkdirSync(destDir, { recursive: true });\n for (const file of fs.readdirSync(srcDir)) {\n const srcFile = path.resolve(srcDir, file);\n const destFile = path.resolve(destDir, file);\n copy(srcFile, destFile);\n }\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to copy directory from ${srcDir} to ${destDir}: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Write a file with optional content transformation\n * Handles special file renaming (e.g., _gitignore -> .gitignore)\n * @param file - File path to write\n * @param content - Optional content to write (if undefined, copies from template)\n */\nexport function write(file: string, content?: string): void {\n const targetPath = renameFiles[path.basename(file)] ?? file;\n if (content) {\n fs.writeFileSync(targetPath, content);\n } else {\n copy(file, targetPath);\n }\n}\n\n/**\n * Edit a file by applying a transformation function to its content\n * @param file - File path to edit\n * @param callback - Function that transforms the file content\n */\nexport function editFile(file: string, callback: (content: string) => string): void {\n const content = fs.readFileSync(file, 'utf-8');\n fs.writeFileSync(file, callback(content));\n}\n\n/**\n * Copy template files to target directory with transformations\n * @param templateDir - Source template directory\n * @param root - Target root directory\n * @param projectName - Project name for replacements\n * @param packageName - Package name for package.json\n * @throws Error if template copy fails or template directory doesn't exist\n */\nexport function copyTemplate(\n templateDir: string,\n root: string,\n projectName: string,\n packageName: string\n): void {\n // Validate template directory exists\n if (!fs.existsSync(templateDir)) {\n throw new Error(`Template directory not found: ${templateDir}`);\n }\n\n try {\n // Create target directory if it doesn't exist\n if (!fs.existsSync(root)) {\n fs.mkdirSync(root, { recursive: true });\n }\n\n const files = fs.readdirSync(templateDir);\n\n for (const file of files) {\n const srcFile = path.join(templateDir, file);\n const stat = fs.statSync(srcFile);\n\n if (stat.isDirectory()) {\n // Recursively copy directories\n const destDir = path.join(root, file);\n copyDir(srcFile, destDir);\n } else {\n // Handle file renaming for special files\n const destFileName = renameFiles[file] ?? file;\n const destFile = path.join(root, destFileName);\n\n // Copy the file\n fs.copyFileSync(srcFile, destFile);\n }\n }\n\n // Update package.json with the correct package name\n const pkgJsonPath = path.join(root, 'package.json');\n if (fs.existsSync(pkgJsonPath)) {\n editFile(pkgJsonPath, (content) => {\n const pkg = JSON.parse(content);\n pkg.name = packageName;\n return JSON.stringify(pkg, null, 2) + '\\n';\n });\n }\n\n // Update index.html with the correct project name (check both root and playground)\n const indexHtmlPath = path.join(root, 'index.html');\n const playgroundIndexHtmlPath = path.join(root, 'playground', 'index.html');\n\n if (fs.existsSync(indexHtmlPath)) {\n editFile(indexHtmlPath, (content) => {\n // Use a replacement function to avoid issues with special regex characters\n return content.replace(/<title>.*?<\\/title>/, () => `<title>${projectName}</title>`);\n });\n }\n\n if (fs.existsSync(playgroundIndexHtmlPath)) {\n editFile(playgroundIndexHtmlPath, (content) => {\n // Use a replacement function to avoid issues with special regex characters\n return content.replace(/<title>.*?<\\/title>/, () => `<title>${projectName}</title>`);\n });\n }\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to copy template: ${error.message}`);\n }\n throw error;\n }\n}\n","/**\n * Validation utilities\n */\n\n/**\n * Format target directory by removing trailing slashes and whitespace\n * @param targetDir - The directory path to format\n * @returns Formatted directory path\n */\nexport function formatTargetDir(targetDir: string | undefined): string {\n return targetDir?.trim().replace(/\\/+$/g, '') ?? '';\n}\n\n/**\n * Validate if a string is a valid npm package name\n * @param projectName - The project name to validate\n * @returns true if valid, false otherwise\n */\nexport function isValidPackageName(projectName: string): boolean {\n return /^(?:@[a-z0-9-*~][a-z0-9-*._~]*\\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(projectName);\n}\n\n/**\n * Convert a string to a valid npm package name\n * @param projectName - The project name to convert\n * @returns Valid npm package name\n */\nexport function toValidPackageName(projectName: string): string {\n const converted = projectName\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/^[._]/, '')\n .replace(/[^a-z0-9-~]+/g, '-');\n\n // If the result is empty or invalid, return a default valid name\n return converted || 'package';\n}\n","/**\n * Package manager utilities\n */\nimport type { PkgInfo } from './types';\n\n/**\n * Parse package manager information from user agent string\n * @param userAgent - The user agent string (typically from npm_config_user_agent)\n * @returns Package manager info or undefined if not found\n */\nexport function pkgFromUserAgent(userAgent: string | undefined): PkgInfo | undefined {\n if (!userAgent) return undefined;\n\n const pkgSpec = userAgent.split(' ')[0];\n const pkgSpecArr = pkgSpec.split('/');\n\n if (pkgSpecArr.length !== 2) return undefined;\n\n return {\n name: pkgSpecArr[0],\n version: pkgSpecArr[1],\n };\n}\n\n/**\n * Get install command for a package manager\n * @param agent - Package manager name (npm, pnpm, yarn, bun, deno)\n * @returns Array of command parts\n */\nexport function getInstallCommand(agent: string): string[] {\n switch (agent) {\n case 'npm':\n return ['npm', 'install'];\n case 'pnpm':\n return ['pnpm', 'install'];\n case 'yarn':\n return ['yarn'];\n case 'bun':\n return ['bun', 'install'];\n case 'deno':\n return ['deno', 'install'];\n default:\n return ['npm', 'install'];\n }\n}\n\n/**\n * Get run command for a package manager\n * @param agent - Package manager name (npm, pnpm, yarn, bun, deno)\n * @param script - Script name to run\n * @returns Array of command parts\n */\nexport function getRunCommand(agent: string, script: string): string[] {\n switch (agent) {\n case 'npm':\n return ['npm', 'run', script];\n case 'pnpm':\n return ['pnpm', script];\n case 'yarn':\n return ['yarn', script];\n case 'bun':\n return ['bun', 'run', script];\n case 'deno':\n return ['deno', 'task', script];\n default:\n return ['npm', 'run', script];\n }\n}\n","/**\n * User prompt utilities\n */\nimport * as prompts from '@clack/prompts';\nimport type { Framework, FrameworkVariant } from './types';\nimport { isValidPackageName } from './validation';\n\n/**\n * Exit the process (skipped in test mode)\n * @param code - Exit code\n */\nfunction exitProcess(code: number): void {\n if (!process.env._ROLLDOWN_TEST_CLI) {\n process.exit(code);\n }\n}\n\n/**\n * Prompt user for project name\n * @param defaultValue - Default project name\n * @returns Project name entered by user\n */\nexport async function promptProjectName(defaultValue: string): Promise<string> {\n const result = await prompts.text({\n message: 'Project name:',\n placeholder: defaultValue,\n defaultValue,\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Project name cannot be empty';\n }\n },\n });\n\n if (prompts.isCancel(result)) {\n prompts.cancel('Operation cancelled');\n exitProcess(0);\n }\n\n return result as string;\n}\n\n/**\n * Prompt user for how to handle existing directory\n * @param targetDir - The target directory path\n * @returns User's choice: 'yes' (overwrite), 'no' (cancel), or 'ignore' (merge)\n */\nexport async function promptOverwrite(targetDir: string): Promise<'yes' | 'no' | 'ignore'> {\n const displayDir = targetDir === '.' ? 'Current directory' : `Target directory \"${targetDir}\"`;\n const message = `${displayDir} is not empty. Please choose how to proceed:`;\n\n const result = await prompts.select({\n message,\n options: [\n {\n value: 'yes',\n label: 'Remove existing files and continue',\n },\n {\n value: 'no',\n label: 'Cancel operation',\n },\n {\n value: 'ignore',\n label: 'Ignore files and continue',\n },\n ],\n });\n\n if (prompts.isCancel(result)) {\n prompts.cancel('Operation cancelled');\n exitProcess(0);\n }\n\n return result as 'yes' | 'no' | 'ignore';\n}\n\n/**\n * Prompt user for package name\n * @param defaultValue - Default package name\n * @returns Valid package name entered by user\n */\nexport async function promptPackageName(defaultValue: string): Promise<string> {\n const result = await prompts.text({\n message: 'Package name:',\n placeholder: defaultValue,\n defaultValue,\n validate: (value) => {\n if (!value || value.trim().length === 0) {\n return 'Package name cannot be empty';\n }\n if (!isValidPackageName(value)) {\n return 'Invalid package name (must follow npm naming conventions)';\n }\n },\n });\n\n if (prompts.isCancel(result)) {\n prompts.cancel('Operation cancelled');\n exitProcess(0);\n }\n\n return result as string;\n}\n\n/**\n * Prompt user to select a framework\n * @param frameworks - Array of available frameworks\n * @returns Selected framework\n */\nexport async function promptFramework(frameworks: Framework[]): Promise<Framework> {\n const result = await prompts.select({\n message: 'Select a framework:',\n options: frameworks.map((framework) => ({\n value: framework,\n label: framework.color(framework.display),\n })),\n });\n\n if (prompts.isCancel(result)) {\n prompts.cancel('Operation cancelled');\n exitProcess(0);\n }\n\n return result as Framework;\n}\n\n/**\n * Prompt user to select a framework variant\n * @param variants - Array of available variants\n * @returns Selected variant name (template name)\n */\nexport async function promptVariant(variants: FrameworkVariant[]): Promise<string> {\n const result = await prompts.select({\n message: 'Select a variant:',\n options: variants.map((variant) => ({\n value: variant.name,\n label: variant.color(variant.display),\n })),\n });\n\n if (prompts.isCancel(result)) {\n prompts.cancel('Operation cancelled');\n exitProcess(0);\n }\n\n return result as string;\n}\n\n/**\n * Prompt user to confirm immediate installation and start\n * @param pkgManager - Package manager name\n * @returns true if user wants to install and start immediately\n */\nexport async function promptImmediate(pkgManager: string): Promise<boolean> {\n const result = await prompts.confirm({\n message: `Install dependencies and start dev server with ${pkgManager}?`,\n initialValue: false,\n });\n\n if (prompts.isCancel(result)) {\n prompts.cancel('Operation cancelled');\n exitProcess(0);\n }\n\n return result as boolean;\n}\n","/**\n * Command execution utilities\n */\nimport { SpawnOptions } from 'node:child_process';\nimport spawn from 'cross-spawn';\nimport pc from 'picocolors';\nimport { getInstallCommand, getRunCommand } from './package-manager';\n\n/**\n * Execute a command using cross-spawn\n * @param command - Command array [command, ...args]\n * @param options - Spawn options\n * @throws Error if command execution fails\n */\nexport function run(command: string[], options?: SpawnOptions): void {\n // Skip actual command execution in test environment\n if (process.env._ROLLDOWN_TEST_CLI) {\n return;\n }\n\n const [cmd, ...args] = command;\n\n try {\n const result = spawn.sync(cmd, args, {\n stdio: 'inherit',\n ...options,\n });\n\n if (result.error) {\n throw new Error(\n `Failed to execute command: ${cmd} ${args.join(' ')}\\n${result.error.message}`\n );\n }\n\n if (result.status !== 0) {\n throw new Error(`Command failed with exit code ${result.status}: ${cmd} ${args.join(' ')}`);\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(pc.red(`\\n✗ Command execution failed: ${error.message}`));\n } else {\n console.error(pc.red(`\\n✗ Command execution failed: ${String(error)}`));\n }\n throw error;\n }\n}\n\n/**\n * Install dependencies in the project directory\n * @param root - Project root directory\n * @param agent - Package manager name\n * @throws Error if installation fails\n */\nexport function install(root: string, agent: string): void {\n const installCmd = getInstallCommand(agent);\n console.log(pc.cyan(`\\nInstalling dependencies with ${agent}...`));\n\n // Skip actual installation in test environment\n if (process.env._ROLLDOWN_TEST_CLI) {\n return;\n }\n\n try {\n run(installCmd, { cwd: root });\n } catch (error) {\n console.error(pc.red(`\\n✗ Failed to install dependencies with ${agent}`));\n if (error instanceof Error) {\n console.error(pc.red(`Error: ${error.message}`));\n }\n throw error;\n }\n}\n\n/**\n * Start the development server\n * @param root - Project root directory\n * @param agent - Package manager name\n * @throws Error if server start fails\n */\nexport function start(root: string, agent: string): void {\n const runCmd = getRunCommand(agent, 'dev');\n console.log(pc.cyan(`\\nStarting dev server...`));\n\n // Skip actual server start in test environment\n if (process.env._ROLLDOWN_TEST_CLI) {\n return;\n }\n\n try {\n run(runCmd, { cwd: root });\n } catch (error) {\n console.error(pc.red(`\\n✗ Failed to start dev server with ${agent}`));\n if (error instanceof Error) {\n console.error(pc.red(`Error: ${error.message}`));\n }\n throw error;\n }\n}\n","/**\n * Command line argument parsing utilities\n */\nimport mri from 'mri';\nimport type { CLIArguments } from './types';\n\n/**\n * Parse command line arguments\n * @param argv - Command line arguments (defaults to process.argv.slice(2))\n * @returns Parsed CLI arguments\n */\nexport function parseArguments(argv: string[] = process.argv.slice(2)): CLIArguments {\n const args = mri(argv, {\n alias: {\n h: 'help',\n t: 'template',\n i: 'immediate',\n },\n boolean: ['help', 'overwrite', 'immediate', 'interactive'],\n string: ['template'],\n default: {\n immediate: undefined,\n interactive: undefined,\n },\n });\n\n return {\n _: args._,\n template: args.template,\n help: args.help,\n overwrite: args.overwrite,\n immediate: args.immediate,\n interactive: args.interactive,\n };\n}\n\n/**\n * Display help information\n */\nexport function displayHelp(): void {\n console.log(`\nUsage: create-rolldown [project-name] [options]\n\nOptions:\n -t, --template <name> Use a specific template\n -h, --help Display this help message\n --overwrite Overwrite existing files in target directory\n -i, --immediate Install dependencies and start dev server immediately\n --no-immediate Skip dependency installation\n --interactive Force interactive mode\n --no-interactive Force non-interactive mode\n\nAvailable templates:\n vanilla Vanilla TypeScript library (default)\n react React library with TypeScript\n vue Vue library with TypeScript\n solid SolidJS library with TypeScript\n svelte Svelte library with TypeScript\n\nExamples:\n $ npm create rolldown\n $ npm create rolldown my-lib\n $ npm create rolldown my-lib --template react\n $ npm create rolldown my-lib -t vue --immediate\n $ npm create rolldown my-lib --no-interactive --template solid\n`);\n}\n\n/**\n * Detect if CLI should run in interactive mode\n * @param args - Parsed CLI arguments\n * @returns true if interactive mode should be used\n */\nexport function shouldUseInteractiveMode(args: CLIArguments): boolean {\n // If explicitly set via --interactive or --no-interactive, use that\n if (args.interactive !== undefined) {\n return args.interactive;\n }\n\n // Check if running in a TTY environment\n const isTTY = process.stdout.isTTY && process.stdin.isTTY;\n\n // Check for AI agent environment (common CI/CD or agent indicators)\n const isAIAgent =\n process.env.CI === 'true' || process.env.CONTINUOUS_INTEGRATION === 'true' || !isTTY;\n\n return !isAIAgent;\n}\n","#!/usr/bin/env node\n\n/**\n * create-rolldown - Scaffolding tool for Rolldown projects\n * CLI entry point\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport {\n parseArguments,\n displayHelp,\n shouldUseInteractiveMode,\n formatTargetDir,\n isEmpty,\n emptyDir,\n toValidPackageName,\n isValidPackageName,\n copyTemplate,\n pkgFromUserAgent,\n getInstallCommand,\n getRunCommand,\n install,\n start,\n promptProjectName,\n promptOverwrite,\n promptPackageName,\n promptFramework,\n promptImmediate,\n FRAMEWORKS,\n TEMPLATES,\n gradientBanner,\n defaultBanner,\n} from './utils';\n\n/**\n * Exit the process (skipped in test mode)\n * @param code - Exit code\n */\nfunction exitProcess(code: number): void {\n if (!process.env._ROLLDOWN_TEST_CLI) {\n process.exit(code);\n }\n}\n\n/**\n * Main initialization function\n * Orchestrates the entire project creation workflow\n */\nasync function init(): Promise<void> {\n try {\n // Display banner\n console.log();\n const supportsColor = process.stdout.isTTY && process.env.TERM !== 'dumb';\n console.log(supportsColor ? gradientBanner : defaultBanner);\n console.log();\n\n const args = parseArguments();\n\n // Display help if requested\n if (args.help) {\n displayHelp();\n return;\n }\n\n // Detect interactive mode\n const interactive = shouldUseInteractiveMode(args);\n\n // Detect AI agent environment and provide guidance\n if (!interactive && !process.stdout.isTTY) {\n console.log(pc.yellow('\\nDetected non-interactive environment (AI agent or CI/CD).'));\n console.log(\n pc.yellow(\n 'For best results, use: create-rolldown <project-name> --template <template> --no-interactive\\n'\n )\n );\n }\n\n // Get target directory from arguments or use default\n const defaultProjectName = 'rolldown-project';\n let targetDir = formatTargetDir(args._[0]);\n\n // Get project name (interactive or from args)\n let projectName: string;\n if (interactive && !targetDir) {\n projectName = await promptProjectName(defaultProjectName);\n targetDir = formatTargetDir(projectName);\n } else {\n projectName = targetDir || defaultProjectName;\n targetDir = projectName;\n }\n\n // Resolve to absolute path\n const root = path.resolve(process.cwd(), targetDir);\n\n // Handle directory conflicts\n if (fs.existsSync(root) && !isEmpty(root)) {\n if (interactive) {\n const overwrite = await promptOverwrite(targetDir);\n\n if (overwrite === 'no') {\n console.log(pc.red('\\nOperation cancelled'));\n exitProcess(0);\n } else if (overwrite === 'yes') {\n console.log(pc.cyan(`\\nRemoving existing files in ${targetDir}...`));\n try {\n emptyDir(root);\n } catch (error) {\n console.error(pc.red(`\\n✗ Failed to remove existing files`));\n if (error instanceof Error) {\n console.error(pc.red(`Error: ${error.message}`));\n }\n exitProcess(1);\n }\n }\n // If 'ignore', continue without clearing\n } else {\n // Non-interactive mode\n if (args.overwrite) {\n console.log(pc.cyan(`\\nRemoving existing files in ${targetDir}...`));\n try {\n emptyDir(root);\n } catch (error) {\n console.error(pc.red(`\\n✗ Failed to remove existing files`));\n if (error instanceof Error) {\n console.error(pc.red(`Error: ${error.message}`));\n }\n exitProcess(1);\n }\n } else {\n console.log(pc.red(`\\nTarget directory \"${targetDir}\" is not empty.`));\n console.log(\n pc.red(\n 'Use --overwrite flag to overwrite existing files, or choose a different directory.'\n )\n );\n exitProcess(1);\n }\n }\n }\n\n // Get package name\n let packageName = toValidPackageName(projectName);\n if (interactive && !isValidPackageName(projectName)) {\n packageName = await promptPackageName(packageName);\n }\n\n // Get template\n let template = args.template;\n\n if (interactive && !template) {\n // Prompt for framework (directly get template name)\n const framework = await promptFramework(FRAMEWORKS);\n template = framework.name; // Use framework name directly as template\n } else if (!template) {\n // Non-interactive mode without template - use default\n template = 'vanilla';\n }\n\n // Validate template\n if (!TEMPLATES.includes(template)) {\n if (interactive) {\n console.log(\n pc.yellow(`\\n\"${template}\" isn't a valid template. Please choose from below:\\n`)\n );\n const framework = await promptFramework(FRAMEWORKS);\n template = framework.name; // Use framework name directly as template\n } else {\n console.log(\n pc.yellow(`\\nTemplate \"${template}\" not found. Using default template \"vanilla\".\\n`)\n );\n template = 'vanilla';\n }\n }\n\n // Detect package manager\n const pkgInfo = pkgFromUserAgent(process.env.npm_config_user_agent);\n const pkgManager = pkgInfo?.name || 'npm';\n\n // Ask about immediate installation (interactive only)\n let shouldInstall = false;\n if (args.immediate === true) {\n shouldInstall = true;\n } else if (args.immediate === false) {\n shouldInstall = false;\n } else if (interactive) {\n shouldInstall = await promptImmediate(pkgManager);\n }\n\n // Start scaffolding\n console.log(pc.cyan(`\\nScaffolding project in ${root}...`));\n\n // Get template directory\n const templateDir = path.resolve(\n path.dirname(new URL(import.meta.url).pathname),\n '..',\n `template-${template}`\n );\n\n // Create target directory if it doesn't exist\n try {\n if (!fs.existsSync(root)) {\n fs.mkdirSync(root, { recursive: true });\n }\n } catch (error) {\n console.error(pc.red(`\\n✗ Failed to create project directory`));\n if (error instanceof Error) {\n console.error(pc.red(`Error: ${error.message}`));\n }\n exitProcess(1);\n }\n\n // Copy template files\n try {\n copyTemplate(templateDir, root, projectName, packageName);\n } catch (error) {\n console.error(pc.red(`\\n✗ Failed to copy template files`));\n if (error instanceof Error) {\n console.error(pc.red(`Error: ${error.message}`));\n }\n exitProcess(1);\n }\n\n console.log(pc.green('\\n✓ Project created successfully!'));\n\n // Install dependencies and start server if requested\n if (shouldInstall) {\n try {\n install(root, pkgManager);\n console.log(pc.green('\\n✓ Dependencies installed successfully!'));\n\n start(root, pkgManager);\n } catch (error) {\n console.error(pc.red('\\n✗ Failed to install dependencies or start server'));\n if (error instanceof Error) {\n console.error(pc.red(`Error: ${error.message}`));\n }\n exitProcess(1);\n }\n } else {\n // Display next steps\n console.log(pc.cyan('\\nDone. Now run:\\n'));\n\n const cdCommand = path.relative(process.cwd(), root);\n if (cdCommand) {\n console.log(pc.cyan(` cd ${cdCommand}`));\n }\n\n const installCmd = getInstallCommand(pkgManager).join(' ');\n console.log(pc.cyan(` ${installCmd}`));\n\n const runCmd = getRunCommand(pkgManager, 'dev').join(' ');\n console.log(pc.cyan(` ${runCmd}`));\n\n console.log();\n }\n } catch (error) {\n // Handle any unexpected errors\n if (error instanceof Error) {\n console.error(pc.red(`\\n✗ An unexpected error occurred: ${error.message}`));\n } else {\n console.error(pc.red(`\\n✗ An unexpected error occurred: ${String(error)}`));\n }\n exitProcess(1);\n }\n}\n\n// Run init function\ninit().catch((error) => {\n // Error handling is already done in init(), but catch any unhandled errors\n if (error instanceof Error && error.message !== 'process.exit called with code 0') {\n console.error(pc.red(`\\n✗ Fatal error: ${error.message}`));\n }\n if (!process.env._ROLLDOWN_TEST_CLI && !process.env.VITEST) {\n exitProcess(1);\n }\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-rolldown",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
4
4
  "description": "Scaffolding tool for Rolldown projects",
5
5
  "keywords": [
6
6
  "bundler",
@@ -68,7 +68,7 @@
68
68
  "vitest": "^1.2.0"
69
69
  },
70
70
  "simple-git-hooks": {
71
- "pre-commit": "pnpm format && pnpm lint"
71
+ "pre-commit": "pnpm format && pnpm lint && git add -u"
72
72
  },
73
73
  "engines": {
74
74
  "node": "^20.19.0 || >=22.12.0"
@@ -35,8 +35,8 @@
35
35
  "access": "public"
36
36
  },
37
37
  "scripts": {
38
- "build": "rolldown -c rolldown.config.js",
39
- "dev": "rolldown -c rolldown.config.js --watch",
38
+ "build": "rolldown -c rolldown.config.ts",
39
+ "dev": "rolldown -c rolldown.config.ts --watch",
40
40
  "play": "vite",
41
41
  "typecheck": "tsc --noEmit",
42
42
  "prepublishOnly": "pnpm run build"
@@ -40,8 +40,8 @@
40
40
  "access": "public"
41
41
  },
42
42
  "scripts": {
43
- "build": "rolldown -c rolldown.config.js",
44
- "dev": "rolldown -c rolldown.config.js --watch",
43
+ "build": "rolldown -c rolldown.config.ts",
44
+ "dev": "rolldown -c rolldown.config.ts --watch",
45
45
  "play": "vite",
46
46
  "typecheck": "tsc --noEmit",
47
47
  "prepublishOnly": "pnpm run build"
@@ -36,8 +36,8 @@
36
36
  "access": "public"
37
37
  },
38
38
  "scripts": {
39
- "build": "rolldown -c rolldown.config.js",
40
- "dev": "rolldown -c rolldown.config.js --watch",
39
+ "build": "rolldown -c rolldown.config.ts",
40
+ "dev": "rolldown -c rolldown.config.ts --watch",
41
41
  "play": "vite",
42
42
  "typecheck": "svelte-check --tsconfig ./tsconfig.json",
43
43
  "prepublishOnly": "pnpm run build"
@@ -34,8 +34,8 @@
34
34
  "access": "public"
35
35
  },
36
36
  "scripts": {
37
- "build": "rolldown -c rolldown.config.js",
38
- "dev": "rolldown -c rolldown.config.js --watch",
37
+ "build": "rolldown -c rolldown.config.ts",
38
+ "dev": "rolldown -c rolldown.config.ts --watch",
39
39
  "typecheck": "tsc --noEmit",
40
40
  "prepublishOnly": "pnpm run build"
41
41
  },
@@ -36,8 +36,8 @@
36
36
  "access": "public"
37
37
  },
38
38
  "scripts": {
39
- "build": "rolldown -c rolldown.config.js",
40
- "dev": "rolldown -c rolldown.config.js --watch",
39
+ "build": "rolldown -c rolldown.config.ts",
40
+ "dev": "rolldown -c rolldown.config.ts --watch",
41
41
  "play": "vite",
42
42
  "typecheck": "vue-tsc --noEmit",
43
43
  "prepublishOnly": "pnpm run build"