create-crack
Advanced tools
| #!/usr/bin/env node |
+498
-397
@@ -5,75 +5,45 @@ #!/usr/bin/env node | ||
| import { resolveApp } from '@verve-kit/utils'; | ||
| import { existsSync, rmSync, readFileSync, writeFileSync, mkdirSync, readdirSync, statSync, copyFileSync } from 'node:fs'; | ||
| import { execSync, exec } from 'node:child_process'; | ||
| import { select, confirm, intro } from '@clack/prompts'; | ||
| import fs from 'fs-extra'; | ||
| import { dirname, join } from 'node:path'; | ||
| import { fileURLToPath as fileURLToPath$1 } from 'node:url'; | ||
| import { intro, confirm, select } from '@clack/prompts'; | ||
| import { createSpinner } from 'nanospinner'; | ||
| import 'tar'; | ||
| import os from 'node:os'; | ||
| import { readFileSync } from 'node:fs'; | ||
| import { fileURLToPath } from 'url'; | ||
| import { execa } from 'execa'; | ||
| import { execSync } from 'node:child_process'; | ||
| import boxen from 'boxen'; | ||
| import { fileURLToPath } from 'url'; | ||
| import os from 'node:os'; | ||
| const template = [ | ||
| /** | ||
| * 支持的项目模板类型 | ||
| */ const SUPPORTED_TEMPLATES = [ | ||
| 'react-web-js', | ||
| 'react-web-ts' | ||
| ]; | ||
| const packageVersion = '1.0.1'; | ||
| const getProjectLink = (templates)=>new Map(templates.map((template)=>[ | ||
| template, | ||
| `https://registry.npmjs.org/@laconic/template-${template}/-/template-${template}-${packageVersion}.tgz` | ||
| ])); | ||
| getProjectLink(template); | ||
| /** | ||
| * 删除指定目录 | ||
| * | ||
| * @param directoryPath - 要删除的目录路径(默认 "node_modules") | ||
| * @param verbose - 是否显示终端提示信息 | ||
| */ async function removeDirectory(directoryPath = 'node_modules', verbose = true) { | ||
| const fullPath = resolveApp(directoryPath); | ||
| if (verbose) { | ||
| const spinner = createSpinner(kleur.bold().cyan('File being deleted...')).start(); | ||
| try { | ||
| if (existsSync(fullPath)) { | ||
| rmSync(fullPath, { | ||
| recursive: true, | ||
| force: true | ||
| }); | ||
| } | ||
| spinner.success({ | ||
| text: kleur.bold().green('Deleted successfully') | ||
| }); | ||
| } catch (error) { | ||
| spinner.error({ | ||
| text: kleur.bold().red('Deletion failed') | ||
| }); | ||
| console.error(error); | ||
| } | ||
| } else { | ||
| if (existsSync(fullPath)) { | ||
| rmSync(fullPath, { | ||
| recursive: true, | ||
| force: true | ||
| }); | ||
| } | ||
| * 支持的包管理器 | ||
| */ const SUPPORTED_PACKAGE_MANAGERS = [ | ||
| 'npm', | ||
| 'yarn', | ||
| 'pnpm', | ||
| 'cnpm' | ||
| ]; | ||
| /** | ||
| * 项目类型选择项配置 | ||
| */ const PROJECT_TYPE_OPTIONS = [ | ||
| { | ||
| value: 'react-web-js', | ||
| label: 'react-web-js', | ||
| hint: 'React + JavaScript Web应用程序 🚀' | ||
| }, | ||
| { | ||
| value: 'react-web-ts', | ||
| label: 'react-web-ts', | ||
| hint: 'React + TypeScript Web应用程序 🚀' | ||
| } | ||
| } | ||
| function createSelectType(value, hint) { | ||
| const result = { | ||
| value, | ||
| label: value | ||
| }; | ||
| if (hint !== undefined) { | ||
| result.hint = hint; | ||
| } | ||
| return result; | ||
| } | ||
| // 优化后只保留两个可用的模板库 | ||
| const ProjectTypes = [ | ||
| createSelectType('react-web-js', 'React + JavaScript Web应用程序 🚀'), | ||
| createSelectType('react-web-ts', 'React + TypeScript Web应用程序 🚀') | ||
| ]; | ||
| const PackageManagers = [ | ||
| /** | ||
| * 包管理器选择项配置 | ||
| */ const PACKAGE_MANAGER_OPTIONS = [ | ||
| { | ||
@@ -96,48 +66,163 @@ value: 'npm', | ||
| ]; | ||
| /** | ||
| * 用户界面文本常量 | ||
| */ const UI_MESSAGES = { | ||
| INTRO: ' 🚧 Create Your App - 项目脚手架工具 ', | ||
| SELECT_PROJECT_TYPE: '🎯 选择项目类型:', | ||
| SELECT_PACKAGE_MANAGER: '📦 选择包管理器:', | ||
| ENABLE_ESLINT: '🔍 是否启用 ESLint 代码检查?', | ||
| ENABLE_COMMIT_LINT: '📝 是否启用 Commit Lint 配置?', | ||
| OVERWRITE_CONFIRM: 'Target directory already exists. Overwrite?', | ||
| CONFIG_SELECTION: '\n📋 请选择项目配置:\n', | ||
| CREATING_PROJECT: '\n🔧 正在创建项目...', | ||
| CTRL_C_EXIT: '⌨️ Ctrl+C pressed - Exiting the program' | ||
| }; | ||
| /** | ||
| * 错误信息常量 | ||
| */ const ERROR_MESSAGES = { | ||
| INVALID_TEMPLATE: (template)=>`❌ 无效的模板类型: ${template}`, | ||
| INVALID_PACKAGE_MANAGER: (manager)=>`❌ 无效的包管理器: ${manager}`, | ||
| AVAILABLE_TEMPLATES: '可用的模板: react-web-js, react-web-ts', | ||
| AVAILABLE_PACKAGE_MANAGERS: '可用的包管理器: npm, yarn, pnpm, cnpm' | ||
| }; | ||
| /** | ||
| * 成功信息常量 | ||
| */ const SUCCESS_MESSAGES = { | ||
| PROJECT_CREATED: '🎉 项目创建成功!\n', | ||
| FEATURES_INSTALLED: '📦 已安装的功能:', | ||
| ESLINT_CREATED: '✅ ESLint 配置文件已创建', | ||
| ESLINT_WARNING: '⚠️ ESLint 配置模板文件未找到', | ||
| TEMPLATE_COPY_SUCCESS: '✅ 项目模板复制成功', | ||
| DEPENDENCY_INSTALL_SUCCESS: '✅ Project initialization complete' | ||
| }; | ||
| /** | ||
| * 检查当前系统是否已安装 Git。 | ||
| * | ||
| * @returns `true` 表示 Git 已安装,`false` 表示未安装。 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * if (checkGitInstallation()) { | ||
| * console.log('Git is available.'); | ||
| * } else { | ||
| * console.log('Please install Git.'); | ||
| * } | ||
| * ``` | ||
| */ function checkGitInstallation() { | ||
| try { | ||
| // 尝试静默执行 git --version,如果命令执行失败将抛出异常 | ||
| execSync('git --version', { | ||
| stdio: 'ignore' | ||
| }); | ||
| return true; | ||
| } catch { | ||
| return false; | ||
| * 验证项目模板类型是否有效 | ||
| */ function validateTemplate(template) { | ||
| return SUPPORTED_TEMPLATES.includes(template); | ||
| } | ||
| /** | ||
| * 验证包管理器是否有效 | ||
| */ function validatePackageManager(manager) { | ||
| return SUPPORTED_PACKAGE_MANAGERS.includes(manager); | ||
| } | ||
| /** | ||
| * 验证并处理模板选项 | ||
| */ function validateTemplateOption(template) { | ||
| if (!template) return undefined; | ||
| if (!validateTemplate(template)) { | ||
| console.error(kleur.red(ERROR_MESSAGES.INVALID_TEMPLATE(template))); | ||
| console.error(kleur.yellow(ERROR_MESSAGES.AVAILABLE_TEMPLATES)); | ||
| process.exit(1); | ||
| } | ||
| return template; | ||
| } | ||
| /** | ||
| * 验证并处理包管理器选项 | ||
| */ function validatePackageManagerOption(manager) { | ||
| if (!manager) return undefined; | ||
| if (!validatePackageManager(manager)) { | ||
| console.error(kleur.red(ERROR_MESSAGES.INVALID_PACKAGE_MANAGER(manager))); | ||
| console.error(kleur.yellow(ERROR_MESSAGES.AVAILABLE_PACKAGE_MANAGERS)); | ||
| process.exit(1); | ||
| } | ||
| return manager; | ||
| } | ||
| /** | ||
| * 验证并规范化所有选项 | ||
| */ function validateOptions(options) { | ||
| const validated = { | ||
| force: Boolean(options.force) | ||
| }; | ||
| // 只有在明确提供了值时才设置属性 | ||
| const template = validateTemplateOption(options.template); | ||
| if (template) { | ||
| validated.template = template; | ||
| } | ||
| const packageManager = validatePackageManagerOption(options.packageManager); | ||
| if (packageManager) { | ||
| validated.packageManager = packageManager; | ||
| } | ||
| if (options.eslint !== undefined) { | ||
| validated.eslint = Boolean(options.eslint); | ||
| } | ||
| if (options.commitLint !== undefined) { | ||
| validated.commitLint = Boolean(options.commitLint); | ||
| } | ||
| return validated; | ||
| } | ||
| function createSuccessInfo(name, packageManage) { | ||
| const END_MSG = `${kleur.blue('🎉 created project ' + kleur.green(name) + ' Successfully')}\n\n 🙏 Thanks for using Create-Crack !`; | ||
| const BOXEN_CONFIG = { | ||
| padding: 1, | ||
| margin: { | ||
| top: 1, | ||
| bottom: 1 | ||
| }, | ||
| borderColor: 'cyan', | ||
| align: 'center', | ||
| borderStyle: 'double', | ||
| title: '🚀 Congratulations', | ||
| titleAlignment: 'center' | ||
| /** | ||
| * 收集用户的项目配置选择 | ||
| */ async function collectUserConfiguration(options) { | ||
| let projectType; | ||
| let packageManager; | ||
| let enableEslint; | ||
| let commitLint; | ||
| // 获取项目类型 | ||
| if (options.template) { | ||
| projectType = options.template; | ||
| } else { | ||
| projectType = await select({ | ||
| message: UI_MESSAGES.SELECT_PROJECT_TYPE, | ||
| options: PROJECT_TYPE_OPTIONS | ||
| }); | ||
| } | ||
| // 获取包管理器 | ||
| if (options.packageManager) { | ||
| packageManager = options.packageManager; | ||
| } else { | ||
| packageManager = await select({ | ||
| message: UI_MESSAGES.SELECT_PACKAGE_MANAGER, | ||
| options: PACKAGE_MANAGER_OPTIONS | ||
| }); | ||
| } | ||
| // 获取 ESLint 选项 | ||
| if (options.eslint !== undefined) { | ||
| enableEslint = options.eslint; | ||
| } else { | ||
| enableEslint = await confirm({ | ||
| message: UI_MESSAGES.ENABLE_ESLINT | ||
| }); | ||
| } | ||
| // 获取 Commit Lint 选项 | ||
| if (options.commitLint !== undefined) { | ||
| commitLint = options.commitLint; | ||
| } else { | ||
| commitLint = await confirm({ | ||
| message: UI_MESSAGES.ENABLE_COMMIT_LINT | ||
| }); | ||
| } | ||
| return { | ||
| projectType, | ||
| packageManager, | ||
| enableEslint, | ||
| commitLint | ||
| }; | ||
| process.stdout.write(boxen(END_MSG, BOXEN_CONFIG)); | ||
| console.log('👉 Get started with the following commands:'); | ||
| console.log(`\n\r\r cd ${kleur.cyan(name)}`); | ||
| console.log(`\r\r ${kleur.cyan(packageManage)} start \r\n`); | ||
| } | ||
| /** | ||
| * 检查是否为非交互模式 | ||
| */ function isNonInteractiveMode(options) { | ||
| return !!(options.template || options.packageManager || options.eslint !== undefined || options.commitLint !== undefined); | ||
| } | ||
| /** | ||
| * 创建项目根目录 | ||
| * 如果目录已存在且未强制覆盖,则询问用户是否覆盖 | ||
| */ async function createProjectDirectory(name, options) { | ||
| const root = resolveApp(name); | ||
| if (await fs.pathExists(root) && !options.force) { | ||
| const shouldOverwrite = await confirm({ | ||
| message: UI_MESSAGES.OVERWRITE_CONFIRM | ||
| }); | ||
| if (!shouldOverwrite) { | ||
| console.log(kleur.yellow('项目创建已取消')); | ||
| process.exit(1); | ||
| } | ||
| await fs.remove(root); | ||
| } | ||
| await fs.ensureDir(root); | ||
| return root; | ||
| } | ||
| const __filename$3 = fileURLToPath(import.meta.url); | ||
@@ -154,95 +239,11 @@ const __dirname$3 = dirname(__filename$3); | ||
| * ```ts | ||
| * const pkg = getPackageJsonInfo('../package.json', true); | ||
| * const pkg = await getPackageJsonInfo('../package.json', true); | ||
| * console.log(pkg.name); | ||
| * ``` | ||
| */ function getPackageJsonInfo(relativePath, isFromCurrentDir) { | ||
| */ async function getPackageJsonInfo(relativePath, isFromCurrentDir) { | ||
| const filePath = isFromCurrentDir ? join(__dirname$3, relativePath) : relativePath; | ||
| const content = readFileSync(filePath, 'utf-8'); | ||
| return JSON.parse(content); | ||
| return await fs.readJson(filePath); | ||
| } | ||
| const __filename$2 = fileURLToPath$1(import.meta.url); | ||
| const __dirname$2 = dirname(__filename$2); | ||
| /** | ||
| * 递归复制文件夹 | ||
| * | ||
| * @param sourceDir - 源文件夹路径 | ||
| * @param destinationDir - 目标文件夹路径 | ||
| */ const copyFolderRecursive$1 = (sourceDir, destinationDir)=>{ | ||
| try { | ||
| if (!existsSync(destinationDir)) { | ||
| mkdirSync(destinationDir, { | ||
| recursive: true | ||
| }); | ||
| } | ||
| const items = readdirSync(sourceDir); | ||
| for (const item of items){ | ||
| const src = join(sourceDir, item); | ||
| const dest = join(destinationDir, item); | ||
| const stat = statSync(src); | ||
| if (stat.isDirectory()) { | ||
| copyFolderRecursive$1(src, dest); | ||
| } else { | ||
| copyFileSync(src, dest); | ||
| } | ||
| } | ||
| } catch (error) { | ||
| console.error(kleur.red('❌ 复制 husky 模板文件时出错:'), error); | ||
| process.exit(1); | ||
| } | ||
| }; | ||
| /** | ||
| * 为指定项目集成 commitlint 和相关 husky 配置。 | ||
| * | ||
| * @param projectName - 项目目录名 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * createCommitlint('my-app'); | ||
| * ``` | ||
| */ function createCommitlint(projectName) { | ||
| try { | ||
| // 复制 husky 模板文件 | ||
| const huskyTemplateSource = join(__dirname$2, '../template/template-husky'); | ||
| if (existsSync(huskyTemplateSource)) { | ||
| copyFolderRecursive$1(huskyTemplateSource, projectName); | ||
| console.log('✅ Husky 模板文件已复制'); | ||
| } else { | ||
| console.warn('⚠️ Husky 模板目录未找到'); | ||
| return; | ||
| } | ||
| // 使用绝对路径 | ||
| const targetPackagePath = join(projectName, 'package.json'); | ||
| const huskyTemplatePath = join(__dirname$2, './package/husky.json'); | ||
| console.log(`读取 husky 模板: ${huskyTemplatePath}`); | ||
| console.log(`读取项目 package.json: ${targetPackagePath}`); | ||
| const huskyConfig = getPackageJsonInfo(huskyTemplatePath, false); | ||
| const projectPackageJson = getPackageJsonInfo(targetPackagePath, false); | ||
| // 合并 husky 配置到项目的 package.json 中 | ||
| for(const key in huskyConfig){ | ||
| const sourceValue = huskyConfig[key]; | ||
| const targetValue = projectPackageJson[key]; | ||
| if (typeof sourceValue === 'object' && !Array.isArray(sourceValue)) { | ||
| projectPackageJson[key] = { | ||
| ...targetValue, | ||
| ...sourceValue | ||
| }; | ||
| } else if (Array.isArray(sourceValue)) { | ||
| projectPackageJson[key] = [ | ||
| ...sourceValue, | ||
| ...targetValue ?? [] | ||
| ]; | ||
| } else { | ||
| projectPackageJson[key] = sourceValue; | ||
| } | ||
| } | ||
| writeFileSync(targetPackagePath, JSON.stringify(projectPackageJson, null, 2), 'utf-8'); | ||
| console.log('✅ Commit Lint 配置已成功合并到 package.json'); | ||
| } catch (error) { | ||
| console.error('❌ 创建 Commit Lint 配置时出错:', error); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| /** | ||
| * 包版本管理配置 | ||
@@ -254,6 +255,4 @@ */ // 需要动态更新版本的自有包列表 | ||
| const __filename$1 = fileURLToPath$1(import.meta.url); | ||
| const __dirname$1 = dirname(__filename$1); | ||
| // 添加调试信息 | ||
| console.log('create_file.ts __dirname:', __dirname$1); | ||
| const __filename$2 = fileURLToPath$1(import.meta.url); | ||
| const __dirname$2 = dirname(__filename$2); | ||
| /** | ||
@@ -325,6 +324,6 @@ * 获取 npm 包的最新版本 | ||
| * @returns 合并了 ESLint 配置的 package.json 对象 | ||
| */ function mergeEslintConfig(packageJson) { | ||
| */ async function mergeEslintConfig(packageJson) { | ||
| try { | ||
| const eslintConfigPath = join(__dirname$1, './package/eslint.json'); | ||
| const eslintConfig = getPackageJsonInfo(eslintConfigPath, false); | ||
| const eslintConfigPath = join(__dirname$2, './package/eslint.json'); | ||
| const eslintConfig = await getPackageJsonInfo(eslintConfigPath, false); | ||
| if (!eslintConfig) { | ||
@@ -375,5 +374,5 @@ console.warn('⚠️ ESLint 配置文件未找到,跳过 ESLint 配置合并'); | ||
| // 从 package 目录读取对应项目类型的 JSON 文件 | ||
| const templatePath = join(__dirname$1, `./package/${projectType}.json`); | ||
| const templatePath = join(__dirname$2, `./package/${projectType}.json`); | ||
| console.log(`尝试读取模板: ${templatePath}`); | ||
| const packageInfo = getPackageJsonInfo(templatePath, false); | ||
| const packageInfo = await getPackageJsonInfo(templatePath, false); | ||
| if (!packageInfo) throw new Error('Package info is undefined'); | ||
@@ -386,3 +385,3 @@ packageInfo.author = os.userInfo().username; | ||
| if (enableEslint) { | ||
| return mergeEslintConfig(updatedPackageInfo); | ||
| return await mergeEslintConfig(updatedPackageInfo); | ||
| } | ||
@@ -408,248 +407,348 @@ return updatedPackageInfo; | ||
| */ function createTemplateFile(fileName) { | ||
| const filePath = join(__dirname$1, `./package/${fileName}`); | ||
| const filePath = join(__dirname$2, `./package/${fileName}`); | ||
| return readFileSync(filePath, 'utf-8'); | ||
| } | ||
| // 获取当前文件的目录路径 | ||
| const __filename = fileURLToPath$1(import.meta.url); | ||
| const __dirname = dirname(__filename); | ||
| /** | ||
| * 设置 Ctrl+C 退出监听(仅限终端环境) | ||
| */ if (process.stdin.isTTY) { | ||
| process.stdin.setRawMode(true); | ||
| process.stdin.on('data', (key)=>{ | ||
| if (key[0] === 3) { | ||
| console.log('⌨️ Ctrl+C pressed - Exiting the program'); | ||
| process.exit(1); | ||
| const __filename$1 = fileURLToPath$1(import.meta.url); | ||
| const __dirname$1 = dirname(__filename$1); | ||
| // 获取模板目录路径 - 总是相对于包根目录 | ||
| const getTemplateDir$1 = async ()=>{ | ||
| // 向上查找到包含 package.json 的目录(包根目录) | ||
| let currentDir = __dirname$1; | ||
| while(!await fs.pathExists(join(currentDir, 'package.json'))){ | ||
| const parent = dirname(currentDir); | ||
| if (parent === currentDir) { | ||
| throw new Error('无法找到包根目录'); | ||
| } | ||
| }); | ||
| } | ||
| /** | ||
| * 创建项目根目录,如有同名文件则询问是否覆盖 | ||
| * | ||
| * @param name - 项目名 | ||
| * @param force - 是否强制覆盖 | ||
| */ const makeDirectory = async (name, { force })=>{ | ||
| const root = resolveApp(name); | ||
| if (existsSync(root) && !force) { | ||
| const shouldOverwrite = await confirm({ | ||
| message: 'Target directory already exists. Overwrite?' | ||
| }); | ||
| if (!shouldOverwrite) process.exit(1); | ||
| await removeDirectory(name, true); | ||
| currentDir = parent; | ||
| } | ||
| mkdirSync(root, { | ||
| recursive: true | ||
| }); | ||
| return join(currentDir, 'template'); | ||
| }; | ||
| // 移除自己实现的复制函数,使用 fs-extra 的 copy 方法 | ||
| /** | ||
| * 收集用户交互选择的信息 | ||
| */ const getTableInfo = async (options)=>{ | ||
| let projectType; | ||
| let packageManager; | ||
| let enableEslint; | ||
| let commitLint; | ||
| // 检查是否提供了模板参数 | ||
| if (options.template) { | ||
| if (![ | ||
| 'react-web-js', | ||
| 'react-web-ts' | ||
| ].includes(options.template)) { | ||
| console.error(kleur.red(`❌ 无效的模板类型: ${options.template}`)); | ||
| console.error(kleur.yellow('可用的模板: react-web-js, react-web-ts')); | ||
| process.exit(1); | ||
| * 为指定项目集成 commitlint 和相关 husky 配置。 | ||
| * | ||
| * @param projectName - 项目目录名 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * await createCommitlint('my-app'); | ||
| * ``` | ||
| */ async function createCommitlint(projectName) { | ||
| try { | ||
| // 复制 husky 模板文件 | ||
| const huskyTemplateSource = join(await getTemplateDir$1(), 'template-husky'); | ||
| if (await fs.pathExists(huskyTemplateSource)) { | ||
| await fs.copy(huskyTemplateSource, projectName); | ||
| console.log('✅ Husky 模板文件已复制'); | ||
| } else { | ||
| console.warn('⚠️ Husky 模板目录未找到'); | ||
| return; | ||
| } | ||
| projectType = options.template; | ||
| } else { | ||
| projectType = await select({ | ||
| message: '🎯 选择项目类型:', | ||
| options: ProjectTypes | ||
| // 使用绝对路径 | ||
| const targetPackagePath = join(projectName, 'package.json'); | ||
| const huskyTemplatePath = join(__dirname$1, './package/husky.json'); | ||
| console.log(`读取 husky 模板: ${huskyTemplatePath}`); | ||
| console.log(`读取项目 package.json: ${targetPackagePath}`); | ||
| const huskyConfig = await fs.readJson(huskyTemplatePath); | ||
| const projectPackageJson = await fs.readJson(targetPackagePath); | ||
| // 合并 husky 配置到项目的 package.json 中 | ||
| for(const key in huskyConfig){ | ||
| const sourceValue = huskyConfig[key]; | ||
| const targetValue = projectPackageJson[key]; | ||
| if (typeof sourceValue === 'object' && !Array.isArray(sourceValue)) { | ||
| projectPackageJson[key] = { | ||
| ...targetValue, | ||
| ...sourceValue | ||
| }; | ||
| } else if (Array.isArray(sourceValue)) { | ||
| projectPackageJson[key] = [ | ||
| ...sourceValue, | ||
| ...targetValue ?? [] | ||
| ]; | ||
| } else { | ||
| projectPackageJson[key] = sourceValue; | ||
| } | ||
| } | ||
| await fs.writeJson(targetPackagePath, projectPackageJson, { | ||
| spaces: 2 | ||
| }); | ||
| console.log('✅ Commit Lint 配置已成功合并到 package.json'); | ||
| } catch (error) { | ||
| console.error('❌ 创建 Commit Lint 配置时出错:', error); | ||
| process.exit(1); | ||
| } | ||
| // 检查是否提供了包管理器参数 | ||
| if (options.packageManager) { | ||
| if (![ | ||
| 'npm', | ||
| 'yarn', | ||
| 'pnpm', | ||
| 'cnpm' | ||
| ].includes(options.packageManager)) { | ||
| console.error(kleur.red(`❌ 无效的包管理器: ${options.packageManager}`)); | ||
| console.error(kleur.yellow('可用的包管理器: npm, yarn, pnpm, cnpm')); | ||
| process.exit(1); | ||
| } | ||
| // 获取当前文件的目录路径 | ||
| const __filename = fileURLToPath$1(import.meta.url); | ||
| const __dirname = dirname(__filename); | ||
| // 获取模板目录路径 - 总是相对于包根目录 | ||
| const getTemplateDir = async ()=>{ | ||
| // 向上查找到包含 package.json 的目录(包根目录) | ||
| let currentDir = __dirname; | ||
| while(!await fs.pathExists(join(currentDir, 'package.json'))){ | ||
| const parent = dirname(currentDir); | ||
| if (parent === currentDir) { | ||
| throw new Error('无法找到包根目录'); | ||
| } | ||
| packageManager = options.packageManager; | ||
| } else { | ||
| packageManager = await select({ | ||
| message: '📦 选择包管理器:', | ||
| options: PackageManagers | ||
| }); | ||
| currentDir = parent; | ||
| } | ||
| // 检查 ESLint 选项 | ||
| if (options.eslint !== undefined) { | ||
| enableEslint = options.eslint; | ||
| } else { | ||
| enableEslint = await confirm({ | ||
| message: '🔍 是否启用 ESLint 代码检查?' | ||
| return join(currentDir, 'template'); | ||
| }; | ||
| /** | ||
| * 复制项目模板到目标目录 | ||
| */ async function copyProjectTemplate(projectType, projectRoot) { | ||
| const spinner = createSpinner(kleur.bold().cyan('正在复制项目模板...')).start(); | ||
| try { | ||
| const templateSource = join(await getTemplateDir(), `template-${projectType}`); | ||
| if (!await fs.pathExists(templateSource)) { | ||
| throw new Error(`模板目录不存在: ${templateSource}`); | ||
| } | ||
| await fs.copy(templateSource, projectRoot); | ||
| spinner.success({ | ||
| text: kleur.bold().green(SUCCESS_MESSAGES.TEMPLATE_COPY_SUCCESS) | ||
| }); | ||
| } | ||
| // 检查 Commit Lint 选项 | ||
| if (options.commitLint !== undefined) { | ||
| commitLint = options.commitLint; | ||
| } else { | ||
| commitLint = await confirm({ | ||
| message: '📝 是否启用 Commit Lint 配置?' | ||
| } catch (error) { | ||
| spinner.error({ | ||
| text: kleur.bold().red('❌ 项目模板复制失败') | ||
| }); | ||
| console.error('Error:', error); | ||
| throw error; | ||
| } | ||
| return { | ||
| projectType, | ||
| packageManager, | ||
| enableEslint, | ||
| commitLint | ||
| }; | ||
| }; | ||
| } | ||
| /** | ||
| * 创建 ESLint 配置文件 | ||
| * | ||
| * @param root - 项目根目录路径 | ||
| */ const createEslintConfig = (root)=>{ | ||
| */ async function createEslintConfig(root) { | ||
| try { | ||
| const eslintConfigSource = join(__dirname, '../template/eslint/eslint.config.mjs'); | ||
| const eslintConfigSource = join(await getTemplateDir(), 'eslint/eslint.config.mjs'); | ||
| const eslintConfigDest = join(root, 'eslint.config.mjs'); | ||
| if (existsSync(eslintConfigSource)) { | ||
| copyFileSync(eslintConfigSource, eslintConfigDest); | ||
| console.log('✅ ESLint 配置文件已创建'); | ||
| if (await fs.pathExists(eslintConfigSource)) { | ||
| await fs.copy(eslintConfigSource, eslintConfigDest); | ||
| console.log(SUCCESS_MESSAGES.ESLINT_CREATED); | ||
| } else { | ||
| console.warn('⚠️ ESLint 配置模板文件未找到'); | ||
| console.warn(SUCCESS_MESSAGES.ESLINT_WARNING); | ||
| } | ||
| } catch (error) { | ||
| console.error('❌ 创建 ESLint 配置文件时出错:', error); | ||
| throw error; | ||
| } | ||
| }; | ||
| } | ||
| /** | ||
| * 递归复制文件夹 | ||
| * | ||
| * @param sourceDir - 源文件夹路径 | ||
| * @param destinationDir - 目标文件夹路径 | ||
| */ const copyFolderRecursive = (sourceDir, destinationDir)=>{ | ||
| * 创建项目的基础文件 | ||
| */ async function createProjectFiles(context) { | ||
| const { root, config, name } = context; | ||
| try { | ||
| if (!existsSync(destinationDir)) { | ||
| mkdirSync(destinationDir, { | ||
| recursive: true | ||
| }); | ||
| // 创建 package.json | ||
| const pkg = await createPackageJson(config.projectType, name, config.enableEslint); | ||
| await fs.writeJson(join(root, 'package.json'), pkg, { | ||
| spaces: 2 | ||
| }); | ||
| // 创建 .gitignore | ||
| await fs.writeFile(join(root, '.gitignore'), createTemplateFile('gitignore')); | ||
| // 复制项目模板 | ||
| await copyProjectTemplate(config.projectType, root); | ||
| // 创建 commit lint 配置 | ||
| if (config.commitLint) { | ||
| await createCommitlint(root); | ||
| } | ||
| const items = readdirSync(sourceDir); | ||
| for (const item of items){ | ||
| const src = join(sourceDir, item); | ||
| const dest = join(destinationDir, item); | ||
| const stat = statSync(src); | ||
| if (stat.isDirectory()) { | ||
| copyFolderRecursive(src, dest); | ||
| } else { | ||
| copyFileSync(src, dest); | ||
| } | ||
| // 创建 ESLint 配置 | ||
| if (config.enableEslint) { | ||
| await createEslintConfig(root); | ||
| } | ||
| } catch (error) { | ||
| console.error(kleur.red('❌ 复制模板文件时出错:'), error); | ||
| process.exit(1); | ||
| console.error(kleur.red('❌ 创建项目文件时出错:'), error); | ||
| throw error; | ||
| } | ||
| }; | ||
| } | ||
| /** | ||
| * 复制本地模板到项目目录 | ||
| * 检查当前系统是否已安装 Git。 | ||
| * | ||
| * @param projectType - 项目类型 | ||
| * @param projectRoot - 项目根目录 | ||
| */ const copyLocalTemplate = (projectType, projectRoot)=>{ | ||
| const spinner = createSpinner(kleur.bold().cyan('正在复制项目模板...')).start(); | ||
| * @returns `true` 表示 Git 已安装,`false` 表示未安装。 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * if (checkGitInstallation()) { | ||
| * console.log('Git is available.'); | ||
| * } else { | ||
| * console.log('Please install Git.'); | ||
| * } | ||
| * ``` | ||
| */ function checkGitInstallation() { | ||
| try { | ||
| const templateSource = join(__dirname, `../template/template-${projectType}`); | ||
| if (!existsSync(templateSource)) { | ||
| throw new Error(`模板目录不存在: ${templateSource}`); | ||
| } | ||
| copyFolderRecursive(templateSource, projectRoot); | ||
| // 尝试静默执行 git --version,如果命令执行失败将抛出异常 | ||
| execSync('git --version', { | ||
| stdio: 'ignore' | ||
| }); | ||
| return true; | ||
| } catch { | ||
| return false; | ||
| } | ||
| } | ||
| function createSuccessInfo(name, packageManage) { | ||
| const END_MSG = `${kleur.blue('🎉 created project ' + kleur.green(name) + ' Successfully')}\n\n 🙏 Thanks for using Create-Crack !`; | ||
| const BOXEN_CONFIG = { | ||
| padding: 1, | ||
| margin: { | ||
| top: 1, | ||
| bottom: 1 | ||
| }, | ||
| borderColor: 'cyan', | ||
| align: 'center', | ||
| borderStyle: 'double', | ||
| title: '🚀 Congratulations', | ||
| titleAlignment: 'center' | ||
| }; | ||
| process.stdout.write(boxen(END_MSG, BOXEN_CONFIG)); | ||
| console.log('👉 Get started with the following commands:'); | ||
| console.log(`\n\r\r cd ${kleur.cyan(name)}`); | ||
| console.log(`\r\r ${kleur.cyan(packageManage)} start \r\n`); | ||
| } | ||
| /** | ||
| * 安装项目依赖 | ||
| */ async function installDependencies(packageManager, projectRoot) { | ||
| const spinner = createSpinner(kleur.bold('Installing dependencies...')).start(); | ||
| try { | ||
| await execa(packageManager, [ | ||
| 'install' | ||
| ], { | ||
| cwd: projectRoot | ||
| }); | ||
| spinner.success({ | ||
| text: kleur.bold().green('✅ 项目模板复制成功') | ||
| text: kleur.green(SUCCESS_MESSAGES.DEPENDENCY_INSTALL_SUCCESS) | ||
| }); | ||
| } catch (error) { | ||
| spinner.error({ | ||
| text: kleur.bold().red('❌ 项目模板复制失败') | ||
| text: kleur.red('Failed to install dependencies') | ||
| }); | ||
| console.error('Error:', error); | ||
| process.exit(1); | ||
| console.error(error); | ||
| throw error; | ||
| } | ||
| }; | ||
| } | ||
| /** | ||
| * 创建项目主流程 | ||
| * | ||
| * @param name - 项目名 | ||
| * @param options - 控制参数 | ||
| */ async function createApp(name, options) { | ||
| intro(kleur.green(' 🚧 Create Your App - 项目脚手架工具 ')); | ||
| const root = resolveApp(name); | ||
| await makeDirectory(name, options); | ||
| // 检查是否使用了命令行参数(非交互模式) | ||
| const isNonInteractive = options.template || options.packageManager || options.eslint !== undefined || options.commitLint !== undefined; | ||
| if (!isNonInteractive) { | ||
| console.log(kleur.cyan('\n📋 请选择项目配置:\n')); | ||
| * 初始化 Git 仓库 | ||
| */ async function initializeGitRepository(projectRoot) { | ||
| try { | ||
| if (checkGitInstallation()) { | ||
| await execa('git', [ | ||
| 'init' | ||
| ], { | ||
| cwd: projectRoot, | ||
| stdio: 'ignore' | ||
| }); | ||
| console.log(kleur.green('✅ Git 仓库初始化成功')); | ||
| } else { | ||
| console.warn(kleur.yellow('⚠️ Git 未安装,跳过 Git 仓库初始化')); | ||
| } | ||
| } catch (error) { | ||
| console.warn(kleur.yellow('⚠️ Git 仓库初始化失败:'), error); | ||
| } | ||
| const { projectType, packageManager, enableEslint, commitLint } = await getTableInfo(options); | ||
| console.log(kleur.yellow('\n🔧 正在创建项目...')); | ||
| console.log(kleur.gray(`📁 项目名称: ${name}`)); | ||
| console.log(kleur.gray(`🎯 项目类型: ${projectType}`)); | ||
| console.log(kleur.gray(`📦 包管理器: ${packageManager}`)); | ||
| console.log(kleur.gray(`🔍 ESLint: ${enableEslint ? '启用' : '禁用'}`)); | ||
| console.log(kleur.gray(`📝 Commit Lint: ${commitLint ? '启用' : '禁用'}`)); | ||
| // 写入 package.json | ||
| const pkg = await createPackageJson(projectType, name, enableEslint); | ||
| writeFileSync(join(root, 'package.json'), JSON.stringify(pkg, null, 2)); | ||
| // 写入 .gitignore | ||
| writeFileSync(join(root, '.gitignore'), createTemplateFile('gitignore')); | ||
| // 复制本地模板文件 | ||
| copyLocalTemplate(projectType, root); | ||
| // 注入 lint 配置 | ||
| if (commitLint) { | ||
| createCommitlint(root); | ||
| } | ||
| /** | ||
| * 显示项目创建成功的信息 | ||
| */ function displaySuccessInfo(context) { | ||
| const { name, config } = context; | ||
| console.log(kleur.green(SUCCESS_MESSAGES.PROJECT_CREATED)); | ||
| console.log(kleur.cyan(SUCCESS_MESSAGES.FEATURES_INSTALLED)); | ||
| console.log(kleur.gray(` • ${config.projectType === 'react-web-ts' ? 'React + TypeScript' : 'React + JavaScript'} 项目模板`)); | ||
| if (config.enableEslint) { | ||
| console.log(kleur.gray(' • ESLint 代码检查工具')); | ||
| } | ||
| // 创建 ESLint 配置文件 | ||
| if (enableEslint) { | ||
| createEslintConfig(root); | ||
| if (config.commitLint) { | ||
| console.log(kleur.gray(' • Commit Lint 提交规范')); | ||
| } | ||
| // 安装依赖 | ||
| const spinner = createSpinner(kleur.bold('Installing dependencies...')).start(); | ||
| exec(`${packageManager} install`, { | ||
| cwd: root | ||
| }, (err)=>{ | ||
| if (err) { | ||
| spinner.error({ | ||
| text: kleur.red('Failed to install dependencies') | ||
| }); | ||
| console.error(err); | ||
| process.exit(1); | ||
| } else { | ||
| spinner.success({ | ||
| text: kleur.green('✅ Project initialization complete') | ||
| }); | ||
| // 显示项目创建成功的详细信息 | ||
| console.log(kleur.green('\n🎉 项目创建成功!\n')); | ||
| console.log(kleur.cyan('📦 已安装的功能:')); | ||
| console.log(kleur.gray(` • ${projectType === 'react-web-ts' ? 'React + TypeScript' : 'React + JavaScript'} 项目模板`)); | ||
| if (enableEslint) { | ||
| console.log(kleur.gray(' • ESLint 代码检查工具')); | ||
| createSuccessInfo(name, config.packageManager); | ||
| } | ||
| /** | ||
| * 执行后续设置:安装依赖、初始化Git、显示成功信息 | ||
| */ async function performPostSetup(context) { | ||
| try { | ||
| // 安装依赖 | ||
| await installDependencies(context.config.packageManager, context.root); | ||
| // 初始化 Git 仓库 | ||
| await initializeGitRepository(context.root); | ||
| // 显示成功信息 | ||
| displaySuccessInfo(context); | ||
| } catch (error) { | ||
| console.error(kleur.red('❌ 项目后续设置过程中发生错误:'), error); | ||
| throw error; | ||
| } | ||
| } | ||
| /** | ||
| * 设置 Ctrl+C 退出监听(仅限终端环境) | ||
| */ function setupExitHandler() { | ||
| if (process.stdin.isTTY) { | ||
| process.stdin.setRawMode(true); | ||
| process.stdin.on('data', (key)=>{ | ||
| if (key[0] === 3) { | ||
| console.log(UI_MESSAGES.CTRL_C_EXIT); | ||
| process.exit(1); | ||
| } | ||
| if (commitLint) { | ||
| console.log(kleur.gray(' • Commit Lint 提交规范')); | ||
| } | ||
| createSuccessInfo(name, packageManager); | ||
| } | ||
| }); | ||
| // 初始化 Git 仓库 | ||
| if (checkGitInstallation()) { | ||
| execSync('git init', { | ||
| cwd: root | ||
| }); | ||
| } | ||
| } | ||
| /** | ||
| * 显示配置信息 | ||
| */ function displayConfiguration(context) { | ||
| const { name, config } = context; | ||
| console.log(kleur.yellow(UI_MESSAGES.CREATING_PROJECT)); | ||
| console.log(kleur.gray(`📁 项目名称: ${name}`)); | ||
| console.log(kleur.gray(`🎯 项目类型: ${config.projectType}`)); | ||
| console.log(kleur.gray(`📦 包管理器: ${config.packageManager}`)); | ||
| console.log(kleur.gray(`🔍 ESLint: ${config.enableEslint ? '启用' : '禁用'}`)); | ||
| console.log(kleur.gray(`📝 Commit Lint: ${config.commitLint ? '启用' : '禁用'}`)); | ||
| } | ||
| /** | ||
| * 创建项目上下文 | ||
| */ async function createProjectContext(name, rawOptions) { | ||
| const options = validateOptions(rawOptions); | ||
| const root = resolveApp(name); | ||
| const config = await collectUserConfiguration(options); | ||
| return { | ||
| name, | ||
| root, | ||
| config, | ||
| options | ||
| }; | ||
| } | ||
| /** | ||
| * 创建项目主流程 | ||
| * | ||
| * @param name - 项目名 | ||
| * @param rawOptions - 控制参数 | ||
| */ async function createApp(name, rawOptions) { | ||
| try { | ||
| // 设置退出处理器 | ||
| setupExitHandler(); | ||
| // 显示欢迎信息 | ||
| intro(kleur.green(UI_MESSAGES.INTRO)); | ||
| // 创建项目上下文 | ||
| const context = await createProjectContext(name, rawOptions); | ||
| // 如果是交互模式,显示配置选择提示 | ||
| if (!isNonInteractiveMode(context.options)) { | ||
| console.log(kleur.cyan(UI_MESSAGES.CONFIG_SELECTION)); | ||
| } | ||
| // 显示配置信息 | ||
| displayConfiguration(context); | ||
| // 创建项目目录 | ||
| context.root = await createProjectDirectory(name, context.options); | ||
| // 创建项目文件 | ||
| await createProjectFiles(context); | ||
| // 执行后续设置(安装依赖、初始化Git、显示成功信息) | ||
| await performPostSetup(context); | ||
| } catch (error) { | ||
| console.error(kleur.red('❌ 项目创建过程中发生错误:'), error); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| const program = new Command(); | ||
| program.version(kleur.green(getPackageJsonInfo('../package.json', true).version || '1.0.0')).arguments('<project-name>').description(kleur.cyan('Create a directory for your project files')).option('-f, --force', 'Overwrite target directory if it exists').option('-t, --template <template>', 'Project template (react-web-js | react-web-ts)').option('-p, --package-manager <manager>', 'Package manager (npm | yarn | pnpm | cnpm)').option('-e, --eslint', 'Enable ESLint configuration').option('-c, --commit-lint', 'Enable Commit Lint configuration').option('--no-eslint', 'Disable ESLint configuration').option('--no-commit-lint', 'Disable Commit Lint configuration').addHelpText('after', ` | ||
| async function main() { | ||
| const program = new Command(); | ||
| // 异步获取版本号 | ||
| const packageInfo = await getPackageJsonInfo('../package.json', true); | ||
| program.version(kleur.green(packageInfo.version)).arguments('<project-name>').description(kleur.cyan('Create a directory for your project files')).option('-f, --force', 'Overwrite target directory if it exists').option('-t, --template <template>', 'Project template (react-web-js | react-web-ts)').option('-p, --package-manager <manager>', 'Package manager (npm | yarn | pnpm | cnpm)').option('-e, --eslint', 'Enable ESLint configuration').option('-c, --commit-lint', 'Enable Commit Lint configuration').option('--no-eslint', 'Disable ESLint configuration').option('--no-commit-lint', 'Disable Commit Lint configuration').addHelpText('after', ` | ||
@@ -679,4 +778,6 @@ ${kleur.yellow('Examples:')} | ||
| `).action((name, options)=>{ | ||
| createApp(name, options); | ||
| }).parse(process.argv); | ||
| createApp(name, options); | ||
| }).parse(process.argv); | ||
| } | ||
| main().catch(console.error); | ||
| //# sourceMappingURL=index.esm.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.esm.js","sources":["../src/core/constants.ts","../src/core/file_controller.ts","../src/core/question.ts","../src/core/check_git_installation.ts","../src/core/create_success_info.ts","../src/core/package_info.ts","../src/core/create_commit_lint.ts","../src/core/package-versions.ts","../src/core/create_file.ts","../src/core/create_app.ts","../src/index.ts"],"sourcesContent":["const template: string[] = ['react-web-js', 'react-web-ts'];\n\nexport const packageVersion = '1.0.1';\n\nconst getProjectLink = (templates: string[]): Map<string, string> =>\n new Map(\n templates.map((template) => [\n template,\n `https://registry.npmjs.org/@laconic/template-${template}/-/template-${template}-${packageVersion}.tgz`,\n ]),\n );\n\nexport const projectLink: Map<string, string> = getProjectLink(template);\n","import { resolveApp } from '@verve-kit/utils';\nimport kleur from 'kleur';\nimport { createSpinner } from 'nanospinner';\nimport {\n existsSync,\n rmSync,\n mkdirSync,\n copyFileSync,\n statSync,\n readdirSync,\n unlinkSync,\n writeFileSync,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport * as tar from 'tar';\n\nimport { packageVersion } from './constants';\n\n/**\n * 删除指定目录\n *\n * @param directoryPath - 要删除的目录路径(默认 \"node_modules\")\n * @param verbose - 是否显示终端提示信息\n */\nexport async function removeDirectory(directoryPath = 'node_modules', verbose = true) {\n const fullPath = resolveApp(directoryPath);\n\n if (verbose) {\n const spinner = createSpinner(kleur.bold().cyan('File being deleted...')).start();\n\n try {\n if (existsSync(fullPath)) {\n rmSync(fullPath, { recursive: true, force: true });\n }\n\n spinner.success({ text: kleur.bold().green('Deleted successfully') });\n } catch (error) {\n spinner.error({ text: kleur.bold().red('Deletion failed') });\n console.error(error);\n }\n } else {\n if (existsSync(fullPath)) {\n rmSync(fullPath, { recursive: true, force: true });\n }\n }\n}\n\n/**\n * 递归复制文件夹\n *\n * @param sourceDir - 源文件夹路径\n * @param destinationDir - 目标文件夹路径\n */\nasync function copyFolderRecursive(sourceDir: string, destinationDir: string) {\n try {\n if (!existsSync(destinationDir)) {\n mkdirSync(destinationDir, { recursive: true });\n }\n\n const items = readdirSync(sourceDir);\n\n for (const item of items) {\n const src = join(sourceDir, item);\n const dest = join(destinationDir, item);\n const stat = statSync(src);\n\n if (stat.isDirectory()) {\n await copyFolderRecursive(src, dest);\n } else {\n copyFileSync(src, dest);\n }\n }\n } catch (error) {\n console.error(\n kleur.red('\\n 😡😡😡 An error occurred during the template download, please try again'),\n error,\n );\n process.exit(1);\n }\n}\n\n/**\n * 下载并解压 NPM 包模板\n *\n * @param packageURL - 包的下载链接\n * @param packageName - 包名\n * @param projectName - 创建的项目目录名\n */\nexport async function getNpmPackage(\n packageURL: string,\n packageName: string,\n projectName: string,\n): Promise<void> {\n const spinner = createSpinner(kleur.bold().cyan('Creating a project...')).start();\n\n try {\n const response = await fetch(packageURL);\n\n if (!response.ok) {\n throw new Error(`Failed to download package: ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n\n const currentDir = resolveApp(projectName);\n const tgzPath = join(currentDir, `${packageName}-${packageVersion}.tgz`);\n writeFileSync(tgzPath, buffer);\n\n await tar.extract({\n file: tgzPath,\n cwd: currentDir,\n });\n\n unlinkSync(tgzPath);\n await copyFolderRecursive(join(projectName, 'package/template'), projectName);\n await removeDirectory(join(projectName, 'package'), false);\n\n spinner.success({ text: kleur.bold().green('Project creation successful') });\n } catch (error) {\n spinner.error({ text: kleur.bold().red('Project creation failed') });\n console.error('Error:', error);\n process.exit(1);\n }\n}\n","interface ISelectType {\n value: string;\n label: string;\n hint?: string;\n}\n\nfunction createSelectType(value: string, hint?: string): ISelectType {\n const result: ISelectType = { value, label: value };\n\n if (hint !== undefined) {\n result.hint = hint;\n }\n\n return result;\n}\n\n// 优化后只保留两个可用的模板库\nexport const ProjectTypes: ISelectType[] = [\n createSelectType('react-web-js', 'React + JavaScript Web应用程序 🚀'),\n createSelectType('react-web-ts', 'React + TypeScript Web应用程序 🚀'),\n];\n\nexport const PackageManagers: ISelectType[] = [\n { value: 'npm', label: 'npm' },\n { value: 'yarn', label: 'yarn' },\n { value: 'pnpm', label: 'pnpm' },\n { value: 'cnpm', label: 'cnpm' },\n];\n","import { execSync } from 'node:child_process';\n\n/**\n * 检查当前系统是否已安装 Git。\n *\n * @returns `true` 表示 Git 已安装,`false` 表示未安装。\n *\n * @example\n * ```ts\n * if (checkGitInstallation()) {\n * console.log('Git is available.');\n * } else {\n * console.log('Please install Git.');\n * }\n * ```\n */\nexport default function checkGitInstallation(): boolean {\n try {\n // 尝试静默执行 git --version,如果命令执行失败将抛出异常\n execSync('git --version', { stdio: 'ignore' });\n\n return true;\n } catch {\n return false;\n }\n}\n","import boxen from 'boxen';\nimport kleur from 'kleur';\n\nexport default function createSuccessInfo(name: string, packageManage: string) {\n const END_MSG = `${kleur.blue(\n '🎉 created project ' + kleur.green(name) + ' Successfully',\n )}\\n\\n 🙏 Thanks for using Create-Crack !`;\n\n const BOXEN_CONFIG = {\n padding: 1,\n margin: { top: 1, bottom: 1 },\n borderColor: 'cyan',\n align: 'center',\n borderStyle: 'double',\n title: '🚀 Congratulations',\n titleAlignment: 'center',\n };\n\n process.stdout.write(boxen(END_MSG, BOXEN_CONFIG as any));\n\n console.log('👉 Get started with the following commands:');\n console.log(`\\n\\r\\r cd ${kleur.cyan(name)}`);\n console.log(`\\r\\r ${kleur.cyan(packageManage)} start \\r\\n`);\n}\n","import { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'node:path';\n\nimport { PackageJsonType } from '../types';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * 获取并解析指定路径下的 package.json 文件。\n *\n * @param relativePath - 相对于当前模块目录的路径(当 `isFromCurrentDir` 为 `true` 时)\n * @param isFromCurrentDir - 如果为 `true`,则路径基于当前文件目录;否则视为绝对路径或调用方自定义路径\n * @returns 返回解析后的 package.json 内容对象\n *\n * @example\n * ```ts\n * const pkg = getPackageJsonInfo('../package.json', true);\n * console.log(pkg.name);\n * ```\n */\nfunction getPackageJsonInfo(relativePath: string, isFromCurrentDir: boolean): PackageJsonType {\n const filePath = isFromCurrentDir ? join(__dirname, relativePath) : relativePath;\n const content = readFileSync(filePath, 'utf-8');\n\n return JSON.parse(content) as PackageJsonType;\n}\n\nexport default getPackageJsonInfo;\n","import { join } from 'node:path';\nimport { writeFileSync, existsSync, copyFileSync, readdirSync, statSync, mkdirSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { dirname } from 'node:path';\nimport kleur from 'kleur';\n\nimport { PackageJsonType } from '../types';\nimport getPackageJsonInfo from './package_info.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * 递归复制文件夹\n *\n * @param sourceDir - 源文件夹路径\n * @param destinationDir - 目标文件夹路径\n */\nconst copyFolderRecursive = (sourceDir: string, destinationDir: string) => {\n try {\n if (!existsSync(destinationDir)) {\n mkdirSync(destinationDir, { recursive: true });\n }\n\n const items = readdirSync(sourceDir);\n\n for (const item of items) {\n const src = join(sourceDir, item);\n const dest = join(destinationDir, item);\n const stat = statSync(src);\n\n if (stat.isDirectory()) {\n copyFolderRecursive(src, dest);\n } else {\n copyFileSync(src, dest);\n }\n }\n } catch (error) {\n console.error(kleur.red('❌ 复制 husky 模板文件时出错:'), error);\n process.exit(1);\n }\n};\n\n/**\n * 为指定项目集成 commitlint 和相关 husky 配置。\n *\n * @param projectName - 项目目录名\n *\n * @example\n * ```ts\n * createCommitlint('my-app');\n * ```\n */\nexport default function createCommitlint(projectName: string): void {\n try {\n // 复制 husky 模板文件\n const huskyTemplateSource = join(__dirname, '../template/template-husky');\n\n if (existsSync(huskyTemplateSource)) {\n copyFolderRecursive(huskyTemplateSource, projectName);\n console.log('✅ Husky 模板文件已复制');\n } else {\n console.warn('⚠️ Husky 模板目录未找到');\n\n return;\n }\n\n // 使用绝对路径\n const targetPackagePath = join(projectName, 'package.json');\n const huskyTemplatePath = join(__dirname, './package/husky.json');\n\n console.log(`读取 husky 模板: ${huskyTemplatePath}`);\n console.log(`读取项目 package.json: ${targetPackagePath}`);\n\n const huskyConfig = getPackageJsonInfo(huskyTemplatePath, false);\n const projectPackageJson: PackageJsonType = getPackageJsonInfo(targetPackagePath, false);\n\n // 合并 husky 配置到项目的 package.json 中\n for (const key in huskyConfig) {\n const sourceValue = huskyConfig[key];\n const targetValue = projectPackageJson[key];\n\n if (typeof sourceValue === 'object' && !Array.isArray(sourceValue)) {\n projectPackageJson[key] = {\n ...targetValue,\n ...sourceValue,\n };\n } else if (Array.isArray(sourceValue)) {\n projectPackageJson[key] = [...sourceValue, ...(targetValue ?? [])];\n } else {\n projectPackageJson[key] = sourceValue;\n }\n }\n\n writeFileSync(targetPackagePath, JSON.stringify(projectPackageJson, null, 2), 'utf-8');\n console.log('✅ Commit Lint 配置已成功合并到 package.json');\n } catch (error) {\n console.error('❌ 创建 Commit Lint 配置时出错:', error);\n process.exit(1);\n }\n}\n","/**\n * 包版本管理配置\n */\n\n// 需要动态更新版本的自有包列表\nexport const PACKAGES_TO_UPDATE = [\n '@verve-kit/react-script',\n // 可以在这里添加更多需要动态更新的自有包\n];\n","import os from 'node:os';\nimport { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport kleur from 'kleur';\n\nimport getPackageJsonInfo from './package_info.js';\nimport type { PackageJsonType } from '../types';\nimport { PACKAGES_TO_UPDATE } from './package-versions';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// 添加调试信息\nconsole.log('create_file.ts __dirname:', __dirname);\n\n/**\n * 获取 npm 包的最新版本\n *\n * @param packageName - 包名\n * @returns Promise<string> - 最新版本号,如果获取失败则返回默认版本\n */\nasync function getLatestPackageVersion(packageName: string): Promise<string | null> {\n try {\n const response = await fetch(`https://registry.npmjs.org/${packageName}/latest`);\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data = await response.json();\n\n return `^${data.version}`;\n } catch (error) {\n console.warn(kleur.yellow(`⚠️ 无法获取 ${packageName} 的最新版本,跳过更新`));\n console.warn(kleur.gray(`错误信息: ${error}`));\n\n return null;\n }\n}\n\n/**\n * 更新包依赖的版本号为最新版本\n *\n * @param packageJson - package.json 对象\n * @returns Promise<PackageJsonType> - 更新后的 package.json 对象\n */\nasync function updatePackageVersions(packageJson: PackageJsonType): Promise<PackageJsonType> {\n console.log(kleur.cyan('🔄 正在获取最新包版本...'));\n\n const packagesToUpdate = PACKAGES_TO_UPDATE;\n\n // 并发获取所有包的最新版本\n const versionPromises = packagesToUpdate.map(async (packageName) => {\n const version = await getLatestPackageVersion(packageName);\n\n return { packageName, version };\n });\n\n try {\n const versionResults = await Promise.all(versionPromises);\n\n // 更新 dependencies\n if (packageJson.dependencies) {\n for (const { packageName, version } of versionResults) {\n if (version && packageJson.dependencies[packageName]) {\n packageJson.dependencies[packageName] = version;\n console.log(kleur.green(`✅ 更新 ${packageName}: ${version}`));\n }\n }\n }\n\n // 更新 devDependencies\n if (packageJson.devDependencies) {\n for (const { packageName, version } of versionResults) {\n if (version && packageJson.devDependencies[packageName]) {\n packageJson.devDependencies[packageName] = version;\n console.log(kleur.green(`✅ 更新 ${packageName}: ${version}`));\n }\n }\n }\n\n console.log(kleur.green('🎉 包版本更新完成'));\n } catch (error) {\n console.error(kleur.red('❌ 更新包版本时出错:'), error);\n }\n\n return packageJson;\n}\n\n/**\n * 合并 ESLint 配置到 package.json 中\n *\n * @param packageJson - 基础的 package.json 对象\n * @returns 合并了 ESLint 配置的 package.json 对象\n */\nfunction mergeEslintConfig(packageJson: PackageJsonType): PackageJsonType {\n try {\n const eslintConfigPath = join(__dirname, './package/eslint.json');\n const eslintConfig = getPackageJsonInfo(eslintConfigPath, false);\n\n if (!eslintConfig) {\n console.warn('⚠️ ESLint 配置文件未找到,跳过 ESLint 配置合并');\n\n return packageJson;\n }\n\n // 合并 scripts\n if (eslintConfig.scripts) {\n packageJson.scripts = {\n ...packageJson.scripts,\n ...eslintConfig.scripts,\n };\n }\n\n // 合并 devDependencies\n if (eslintConfig.devDependencies) {\n packageJson.devDependencies = {\n ...packageJson.devDependencies,\n ...eslintConfig.devDependencies,\n };\n }\n\n // 合并 lint-staged\n if (eslintConfig['lint-staged']) {\n packageJson['lint-staged'] = eslintConfig['lint-staged'];\n }\n\n console.log('✅ ESLint 配置已成功合并到 package.json');\n\n return packageJson;\n } catch (error) {\n console.error('❌ 合并 ESLint 配置时出错:', error);\n\n return packageJson;\n }\n}\n\n/**\n * 创建指定类型项目的 `package.json` 对象。\n *\n * @param projectType - 模板类型(如:react、vue、node 等)\n * @param projectName - 项目名称,会被写入到 `package.json.name`\n * @param enableEslint - 是否启用 ESLint 配置\n * @returns 返回已定制的 `package.json` 对象\n *\n * @example\n * ```ts\n * const pkg = createPackageJson('react-web-ts', 'my-app', true);\n * console.log(pkg.name); // 'my-app'\n * ```\n */\nasync function createPackageJson(\n projectType: string,\n projectName: string,\n enableEslint: boolean = false,\n): Promise<PackageJsonType> {\n try {\n // 从 package 目录读取对应项目类型的 JSON 文件\n const templatePath = join(__dirname, `./package/${projectType}.json`);\n console.log(`尝试读取模板: ${templatePath}`);\n\n const packageInfo = getPackageJsonInfo(templatePath, false);\n if (!packageInfo) throw new Error('Package info is undefined');\n\n packageInfo.author = os.userInfo().username;\n packageInfo.name = projectName;\n\n // 更新包版本为最新版本\n const updatedPackageInfo = await updatePackageVersions(packageInfo);\n\n // 如果启用了 ESLint,合并 ESLint 配置\n if (enableEslint) {\n return mergeEslintConfig(updatedPackageInfo);\n }\n\n return updatedPackageInfo;\n } catch (error) {\n console.error(`❌ Failed to create package.json for \"${projectType}\"`);\n console.error(error);\n process.exit(1);\n }\n}\n\n/**\n * 读取模板目录中的任意 JSON 文件为字符串内容。\n *\n * @param fileName - 模板文件名(例如:`config.json`)\n * @returns 返回文件内容的字符串\n *\n * @example\n * ```ts\n * const config = createTemplateFile('vite.config.json');\n * console.log(JSON.parse(config));\n * ```\n */\nfunction createTemplateFile(fileName: string): string {\n const filePath = join(__dirname, `./package/${fileName}`);\n\n return readFileSync(filePath, 'utf-8');\n}\n\nexport { createPackageJson, createTemplateFile };\n","import { resolveApp } from '@verve-kit/utils';\nimport { existsSync, writeFileSync, mkdirSync, copyFileSync, readdirSync, statSync } from 'node:fs';\nimport { execSync, exec } from 'node:child_process';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { confirm, intro, select } from '@clack/prompts';\nimport kleur from 'kleur';\nimport { createSpinner } from 'nanospinner';\n\nimport { removeDirectory } from './file_controller';\nimport { ProjectTypes, PackageManagers } from './question';\nimport isGitInstalled from './check_git_installation';\nimport createSuccessInfo from './create_success_info';\nimport createCommitlint from './create_commit_lint';\nimport { createPackageJson, createTemplateFile } from './create_file';\n\n// 获取当前文件的目录路径\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * 设置 Ctrl+C 退出监听(仅限终端环境)\n */\nif (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n process.stdin.on('data', (key) => {\n if (key[0] === 3) {\n console.log('⌨️ Ctrl+C pressed - Exiting the program');\n process.exit(1);\n }\n });\n}\n\n/**\n * 创建项目根目录,如有同名文件则询问是否覆盖\n *\n * @param name - 项目名\n * @param force - 是否强制覆盖\n */\nconst makeDirectory = async (name: string, { force }: { force: boolean }) => {\n const root = resolveApp(name);\n\n if (existsSync(root) && !force) {\n const shouldOverwrite = await confirm({\n message: 'Target directory already exists. Overwrite?',\n });\n if (!shouldOverwrite) process.exit(1);\n await removeDirectory(name, true);\n }\n\n mkdirSync(root, { recursive: true });\n};\n\n/**\n * 收集用户交互选择的信息\n */\nconst getTableInfo = async (options: any) => {\n let projectType: string;\n let packageManager: string;\n let enableEslint: boolean;\n let commitLint: boolean;\n\n // 检查是否提供了模板参数\n if (options.template) {\n if (!['react-web-js', 'react-web-ts'].includes(options.template)) {\n console.error(kleur.red(`❌ 无效的模板类型: ${options.template}`));\n console.error(kleur.yellow('可用的模板: react-web-js, react-web-ts'));\n process.exit(1);\n }\n\n projectType = options.template;\n } else {\n projectType = (await select({\n message: '🎯 选择项目类型:',\n options: ProjectTypes,\n })) as string;\n }\n\n // 检查是否提供了包管理器参数\n if (options.packageManager) {\n if (!['npm', 'yarn', 'pnpm', 'cnpm'].includes(options.packageManager)) {\n console.error(kleur.red(`❌ 无效的包管理器: ${options.packageManager}`));\n console.error(kleur.yellow('可用的包管理器: npm, yarn, pnpm, cnpm'));\n process.exit(1);\n }\n\n packageManager = options.packageManager;\n } else {\n packageManager = (await select({\n message: '📦 选择包管理器:',\n options: PackageManagers,\n })) as string;\n }\n\n // 检查 ESLint 选项\n if (options.eslint !== undefined) {\n enableEslint = options.eslint;\n } else {\n enableEslint = (await confirm({\n message: '🔍 是否启用 ESLint 代码检查?',\n })) as boolean;\n }\n\n // 检查 Commit Lint 选项\n if (options.commitLint !== undefined) {\n commitLint = options.commitLint;\n } else {\n commitLint = (await confirm({\n message: '📝 是否启用 Commit Lint 配置?',\n })) as boolean;\n }\n\n return { projectType, packageManager, enableEslint, commitLint };\n};\n\n/**\n * 创建 ESLint 配置文件\n *\n * @param root - 项目根目录路径\n */\nconst createEslintConfig = (root: string) => {\n try {\n const eslintConfigSource = join(__dirname, '../template/eslint/eslint.config.mjs');\n const eslintConfigDest = join(root, 'eslint.config.mjs');\n\n if (existsSync(eslintConfigSource)) {\n copyFileSync(eslintConfigSource, eslintConfigDest);\n console.log('✅ ESLint 配置文件已创建');\n } else {\n console.warn('⚠️ ESLint 配置模板文件未找到');\n }\n } catch (error) {\n console.error('❌ 创建 ESLint 配置文件时出错:', error);\n }\n};\n\n/**\n * 递归复制文件夹\n *\n * @param sourceDir - 源文件夹路径\n * @param destinationDir - 目标文件夹路径\n */\nconst copyFolderRecursive = (sourceDir: string, destinationDir: string) => {\n try {\n if (!existsSync(destinationDir)) {\n mkdirSync(destinationDir, { recursive: true });\n }\n\n const items = readdirSync(sourceDir);\n\n for (const item of items) {\n const src = join(sourceDir, item);\n const dest = join(destinationDir, item);\n const stat = statSync(src);\n\n if (stat.isDirectory()) {\n copyFolderRecursive(src, dest);\n } else {\n copyFileSync(src, dest);\n }\n }\n } catch (error) {\n console.error(kleur.red('❌ 复制模板文件时出错:'), error);\n process.exit(1);\n }\n};\n\n/**\n * 复制本地模板到项目目录\n *\n * @param projectType - 项目类型\n * @param projectRoot - 项目根目录\n */\nconst copyLocalTemplate = (projectType: string, projectRoot: string) => {\n const spinner = createSpinner(kleur.bold().cyan('正在复制项目模板...')).start();\n\n try {\n const templateSource = join(__dirname, `../template/template-${projectType}`);\n\n if (!existsSync(templateSource)) {\n throw new Error(`模板目录不存在: ${templateSource}`);\n }\n\n copyFolderRecursive(templateSource, projectRoot);\n spinner.success({ text: kleur.bold().green('✅ 项目模板复制成功') });\n } catch (error) {\n spinner.error({ text: kleur.bold().red('❌ 项目模板复制失败') });\n console.error('Error:', error);\n process.exit(1);\n }\n};\n\n/**\n * 创建项目主流程\n *\n * @param name - 项目名\n * @param options - 控制参数\n */\nexport default async function createApp(name: string, options: any) {\n intro(kleur.green(' 🚧 Create Your App - 项目脚手架工具 '));\n\n const root = resolveApp(name);\n await makeDirectory(name, options);\n\n // 检查是否使用了命令行参数(非交互模式)\n const isNonInteractive =\n options.template ||\n options.packageManager ||\n options.eslint !== undefined ||\n options.commitLint !== undefined;\n\n if (!isNonInteractive) {\n console.log(kleur.cyan('\\n📋 请选择项目配置:\\n'));\n }\n\n const { projectType, packageManager, enableEslint, commitLint } = await getTableInfo(options);\n\n console.log(kleur.yellow('\\n🔧 正在创建项目...'));\n console.log(kleur.gray(`📁 项目名称: ${name}`));\n console.log(kleur.gray(`🎯 项目类型: ${projectType}`));\n console.log(kleur.gray(`📦 包管理器: ${packageManager}`));\n console.log(kleur.gray(`🔍 ESLint: ${enableEslint ? '启用' : '禁用'}`));\n console.log(kleur.gray(`📝 Commit Lint: ${commitLint ? '启用' : '禁用'}`));\n\n // 写入 package.json\n const pkg = await createPackageJson(projectType, name, enableEslint);\n writeFileSync(join(root, 'package.json'), JSON.stringify(pkg, null, 2));\n\n // 写入 .gitignore\n writeFileSync(join(root, '.gitignore'), createTemplateFile('gitignore'));\n\n // 复制本地模板文件\n copyLocalTemplate(projectType, root);\n\n // 注入 lint 配置\n if (commitLint) {\n createCommitlint(root);\n }\n\n // 创建 ESLint 配置文件\n if (enableEslint) {\n createEslintConfig(root);\n }\n\n // 安装依赖\n const spinner = createSpinner(kleur.bold('Installing dependencies...')).start();\n exec(`${packageManager} install`, { cwd: root }, (err) => {\n if (err) {\n spinner.error({ text: kleur.red('Failed to install dependencies') });\n console.error(err);\n process.exit(1);\n } else {\n spinner.success({ text: kleur.green('✅ Project initialization complete') });\n\n // 显示项目创建成功的详细信息\n console.log(kleur.green('\\n🎉 项目创建成功!\\n'));\n console.log(kleur.cyan('📦 已安装的功能:'));\n console.log(\n kleur.gray(\n ` • ${projectType === 'react-web-ts' ? 'React + TypeScript' : 'React + JavaScript'} 项目模板`,\n ),\n );\n\n if (enableEslint) {\n console.log(kleur.gray(' • ESLint 代码检查工具'));\n }\n\n if (commitLint) {\n console.log(kleur.gray(' • Commit Lint 提交规范'));\n }\n\n createSuccessInfo(name, packageManager);\n }\n });\n\n // 初始化 Git 仓库\n if (isGitInstalled()) {\n execSync('git init', { cwd: root });\n }\n}\n","#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport kleur from 'kleur';\n\nimport createApp from './core/create_app.js';\nimport getPackageJsonInfo from './core/package_info.js';\n\nconst program = new Command();\n\nprogram\n .version(kleur.green(getPackageJsonInfo('../package.json', true).version || '1.0.0'))\n .arguments('<project-name>')\n .description(kleur.cyan('Create a directory for your project files'))\n .option('-f, --force', 'Overwrite target directory if it exists')\n .option('-t, --template <template>', 'Project template (react-web-js | react-web-ts)')\n .option('-p, --package-manager <manager>', 'Package manager (npm | yarn | pnpm | cnpm)')\n .option('-e, --eslint', 'Enable ESLint configuration')\n .option('-c, --commit-lint', 'Enable Commit Lint configuration')\n .option('--no-eslint', 'Disable ESLint configuration')\n .option('--no-commit-lint', 'Disable Commit Lint configuration')\n .addHelpText(\n 'after',\n `\n\n${kleur.yellow('Examples:')}\n ${kleur.gray('# Interactive mode (default)')}\n $ create-crack my-app\n\n ${kleur.gray('# Non-interactive mode with all options')}\n $ create-crack my-app -t react-web-ts -p pnpm -e -c\n\n ${kleur.gray('# Create React JS project with npm and ESLint')}\n $ create-crack my-app --template react-web-js --package-manager npm --eslint\n\n ${kleur.gray('# Create project without ESLint and Commit Lint')}\n $ create-crack my-app -t react-web-ts -p yarn --no-eslint --no-commit-lint\n\n${kleur.yellow('Available Templates:')}\n ${kleur.cyan('react-web-js')} - React + JavaScript Web应用程序\n ${kleur.cyan('react-web-ts')} - React + TypeScript Web应用程序\n\n${kleur.yellow('Available Package Managers:')}\n ${kleur.cyan('npm')} - Node Package Manager\n ${kleur.cyan('yarn')} - Yarn Package Manager \n ${kleur.cyan('pnpm')} - PNPM Package Manager\n ${kleur.cyan('cnpm')} - CNPM Package Manager\n`,\n )\n .action((name, options) => {\n createApp(name, options);\n })\n .parse(process.argv);\n"],"names":["template","packageVersion","getProjectLink","templates","Map","map","removeDirectory","directoryPath","verbose","fullPath","resolveApp","spinner","createSpinner","kleur","bold","cyan","start","existsSync","rmSync","recursive","force","success","text","green","error","red","console","createSelectType","value","hint","result","label","undefined","ProjectTypes","PackageManagers","checkGitInstallation","execSync","stdio","createSuccessInfo","name","packageManage","END_MSG","blue","BOXEN_CONFIG","padding","margin","top","bottom","borderColor","align","borderStyle","title","titleAlignment","process","stdout","write","boxen","log","__filename","fileURLToPath","url","__dirname","dirname","getPackageJsonInfo","relativePath","isFromCurrentDir","filePath","join","content","readFileSync","JSON","parse","copyFolderRecursive","sourceDir","destinationDir","mkdirSync","items","readdirSync","item","src","dest","stat","statSync","isDirectory","copyFileSync","exit","createCommitlint","projectName","huskyTemplateSource","warn","targetPackagePath","huskyTemplatePath","huskyConfig","projectPackageJson","key","sourceValue","targetValue","Array","isArray","writeFileSync","stringify","PACKAGES_TO_UPDATE","getLatestPackageVersion","packageName","response","fetch","ok","Error","status","data","json","version","yellow","gray","updatePackageVersions","packageJson","packagesToUpdate","versionPromises","versionResults","Promise","all","dependencies","devDependencies","mergeEslintConfig","eslintConfigPath","eslintConfig","scripts","createPackageJson","projectType","enableEslint","templatePath","packageInfo","author","os","userInfo","username","updatedPackageInfo","createTemplateFile","fileName","stdin","isTTY","setRawMode","on","makeDirectory","root","shouldOverwrite","confirm","message","getTableInfo","options","packageManager","commitLint","includes","select","eslint","createEslintConfig","eslintConfigSource","eslintConfigDest","copyLocalTemplate","projectRoot","templateSource","createApp","intro","isNonInteractive","pkg","exec","cwd","err","isGitInstalled","program","Command","arguments","description","option","addHelpText","action","argv"],"mappings":"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"} | ||
| {"version":3,"file":"index.esm.js","sources":["../src/core/constants.ts","../src/core/validators.ts","../src/core/user-interaction.ts","../src/core/directory-manager.ts","../src/core/package_info.ts","../src/core/package-versions.ts","../src/core/create_file.ts","../src/core/create_commit_lint.ts","../src/core/template-manager.ts","../src/core/check_git_installation.ts","../src/core/create_success_info.ts","../src/core/dependency-installer.ts","../src/core/create_app.ts","../src/index.ts"],"sourcesContent":["import type { ProjectTemplate, PackageManager, ISelectType } from '../types';\n\n/**\n * 支持的项目模板类型\n */\nexport const SUPPORTED_TEMPLATES: ProjectTemplate[] = ['react-web-js', 'react-web-ts'];\n\n/**\n * 支持的包管理器\n */\nexport const SUPPORTED_PACKAGE_MANAGERS: PackageManager[] = ['npm', 'yarn', 'pnpm', 'cnpm'];\n\n/**\n * 项目类型选择项配置\n */\nexport const PROJECT_TYPE_OPTIONS: ISelectType[] = [\n {\n value: 'react-web-js',\n label: 'react-web-js',\n hint: 'React + JavaScript Web应用程序 🚀',\n },\n {\n value: 'react-web-ts',\n label: 'react-web-ts',\n hint: 'React + TypeScript Web应用程序 🚀',\n },\n];\n\n/**\n * 包管理器选择项配置\n */\nexport const PACKAGE_MANAGER_OPTIONS: ISelectType[] = [\n { value: 'npm', label: 'npm' },\n { value: 'yarn', label: 'yarn' },\n { value: 'pnpm', label: 'pnpm' },\n { value: 'cnpm', label: 'cnpm' },\n];\n\n/**\n * 用户界面文本常量\n */\nexport const UI_MESSAGES = {\n INTRO: ' 🚧 Create Your App - 项目脚手架工具 ',\n SELECT_PROJECT_TYPE: '🎯 选择项目类型:',\n SELECT_PACKAGE_MANAGER: '📦 选择包管理器:',\n ENABLE_ESLINT: '🔍 是否启用 ESLint 代码检查?',\n ENABLE_COMMIT_LINT: '📝 是否启用 Commit Lint 配置?',\n OVERWRITE_CONFIRM: 'Target directory already exists. Overwrite?',\n CONFIG_SELECTION: '\\n📋 请选择项目配置:\\n',\n CREATING_PROJECT: '\\n🔧 正在创建项目...',\n CTRL_C_EXIT: '⌨️ Ctrl+C pressed - Exiting the program',\n} as const;\n\n/**\n * 错误信息常量\n */\nexport const ERROR_MESSAGES = {\n INVALID_TEMPLATE: (template: string) => `❌ 无效的模板类型: ${template}`,\n INVALID_PACKAGE_MANAGER: (manager: string) => `❌ 无效的包管理器: ${manager}`,\n AVAILABLE_TEMPLATES: '可用的模板: react-web-js, react-web-ts',\n AVAILABLE_PACKAGE_MANAGERS: '可用的包管理器: npm, yarn, pnpm, cnpm',\n} as const;\n\n/**\n * 成功信息常量\n */\nexport const SUCCESS_MESSAGES = {\n PROJECT_CREATED: '🎉 项目创建成功!\\n',\n FEATURES_INSTALLED: '📦 已安装的功能:',\n ESLINT_CREATED: '✅ ESLint 配置文件已创建',\n ESLINT_WARNING: '⚠️ ESLint 配置模板文件未找到',\n TEMPLATE_COPY_SUCCESS: '✅ 项目模板复制成功',\n DEPENDENCY_INSTALL_SUCCESS: '✅ Project initialization complete',\n} as const;\n","import kleur from 'kleur';\n\nimport type { ProjectTemplate, PackageManager, CreateAppOptions } from '../types';\nimport { SUPPORTED_TEMPLATES, SUPPORTED_PACKAGE_MANAGERS, ERROR_MESSAGES } from './constants';\n\n/**\n * 验证项目模板类型是否有效\n */\nexport function validateTemplate(template: string): template is ProjectTemplate {\n return SUPPORTED_TEMPLATES.includes(template as ProjectTemplate);\n}\n\n/**\n * 验证包管理器是否有效\n */\nexport function validatePackageManager(manager: string): manager is PackageManager {\n return SUPPORTED_PACKAGE_MANAGERS.includes(manager as PackageManager);\n}\n\n/**\n * 验证并处理模板选项\n */\nexport function validateTemplateOption(template?: string): ProjectTemplate | undefined {\n if (!template) return undefined;\n\n if (!validateTemplate(template)) {\n console.error(kleur.red(ERROR_MESSAGES.INVALID_TEMPLATE(template)));\n console.error(kleur.yellow(ERROR_MESSAGES.AVAILABLE_TEMPLATES));\n process.exit(1);\n }\n\n return template as ProjectTemplate;\n}\n\n/**\n * 验证并处理包管理器选项\n */\nexport function validatePackageManagerOption(manager?: string): PackageManager | undefined {\n if (!manager) return undefined;\n\n if (!validatePackageManager(manager)) {\n console.error(kleur.red(ERROR_MESSAGES.INVALID_PACKAGE_MANAGER(manager)));\n console.error(kleur.yellow(ERROR_MESSAGES.AVAILABLE_PACKAGE_MANAGERS));\n process.exit(1);\n }\n\n return manager as PackageManager;\n}\n\n/**\n * 验证并规范化所有选项\n */\nexport function validateOptions(options: any): CreateAppOptions {\n const validated: CreateAppOptions = {\n force: Boolean(options.force),\n };\n\n // 只有在明确提供了值时才设置属性\n const template = validateTemplateOption(options.template);\n\n if (template) {\n validated.template = template;\n }\n\n const packageManager = validatePackageManagerOption(options.packageManager);\n\n if (packageManager) {\n validated.packageManager = packageManager;\n }\n\n if (options.eslint !== undefined) {\n validated.eslint = Boolean(options.eslint);\n }\n\n if (options.commitLint !== undefined) {\n validated.commitLint = Boolean(options.commitLint);\n }\n\n return validated;\n}\n","import { confirm, select } from '@clack/prompts';\n\nimport type { ProjectConfig, CreateAppOptions, ProjectTemplate, PackageManager } from '../types';\nimport { PROJECT_TYPE_OPTIONS, PACKAGE_MANAGER_OPTIONS, UI_MESSAGES } from './constants';\n\n/**\n * 收集用户的项目配置选择\n */\nexport async function collectUserConfiguration(options: CreateAppOptions): Promise<ProjectConfig> {\n let projectType: ProjectTemplate;\n let packageManager: PackageManager;\n let enableEslint: boolean;\n let commitLint: boolean;\n\n // 获取项目类型\n if (options.template) {\n projectType = options.template;\n } else {\n projectType = (await select({\n message: UI_MESSAGES.SELECT_PROJECT_TYPE,\n options: PROJECT_TYPE_OPTIONS,\n })) as ProjectTemplate;\n }\n\n // 获取包管理器\n if (options.packageManager) {\n packageManager = options.packageManager;\n } else {\n packageManager = (await select({\n message: UI_MESSAGES.SELECT_PACKAGE_MANAGER,\n options: PACKAGE_MANAGER_OPTIONS,\n })) as PackageManager;\n }\n\n // 获取 ESLint 选项\n if (options.eslint !== undefined) {\n enableEslint = options.eslint;\n } else {\n enableEslint = (await confirm({\n message: UI_MESSAGES.ENABLE_ESLINT,\n })) as boolean;\n }\n\n // 获取 Commit Lint 选项\n if (options.commitLint !== undefined) {\n commitLint = options.commitLint;\n } else {\n commitLint = (await confirm({\n message: UI_MESSAGES.ENABLE_COMMIT_LINT,\n })) as boolean;\n }\n\n return {\n projectType,\n packageManager,\n enableEslint,\n commitLint,\n };\n}\n\n/**\n * 检查是否为非交互模式\n */\nexport function isNonInteractiveMode(options: CreateAppOptions): boolean {\n return !!(\n options.template ||\n options.packageManager ||\n options.eslint !== undefined ||\n options.commitLint !== undefined\n );\n}\n","import { resolveApp } from '@verve-kit/utils';\nimport fs from 'fs-extra';\nimport { confirm } from '@clack/prompts';\nimport kleur from 'kleur';\n\nimport { UI_MESSAGES } from './constants';\nimport type { CreateAppOptions } from '../types';\n\n/**\n * 创建项目根目录\n * 如果目录已存在且未强制覆盖,则询问用户是否覆盖\n */\nexport async function createProjectDirectory(\n name: string,\n options: CreateAppOptions,\n): Promise<string> {\n const root = resolveApp(name);\n\n if ((await fs.pathExists(root)) && !options.force) {\n const shouldOverwrite = await confirm({\n message: UI_MESSAGES.OVERWRITE_CONFIRM,\n });\n\n if (!shouldOverwrite) {\n console.log(kleur.yellow('项目创建已取消'));\n process.exit(1);\n }\n\n await fs.remove(root);\n }\n\n await fs.ensureDir(root);\n\n return root;\n}\n\n/**\n * 确保目录存在,如不存在则创建\n */\nexport async function ensureDirectoryExists(dirPath: string): Promise<void> {\n await fs.ensureDir(dirPath);\n}\n","import fs from 'fs-extra';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'node:path';\n\nimport { PackageJsonType } from '../types';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * 获取并解析指定路径下的 package.json 文件。\n *\n * @param relativePath - 相对于当前模块目录的路径(当 `isFromCurrentDir` 为 `true` 时)\n * @param isFromCurrentDir - 如果为 `true`,则路径基于当前文件目录;否则视为绝对路径或调用方自定义路径\n * @returns 返回解析后的 package.json 内容对象\n *\n * @example\n * ```ts\n * const pkg = await getPackageJsonInfo('../package.json', true);\n * console.log(pkg.name);\n * ```\n */\nasync function getPackageJsonInfo(\n relativePath: string,\n isFromCurrentDir: boolean,\n): Promise<PackageJsonType> {\n const filePath = isFromCurrentDir ? join(__dirname, relativePath) : relativePath;\n\n return await fs.readJson(filePath);\n}\n\nexport default getPackageJsonInfo;\n","/**\n * 包版本管理配置\n */\n\n// 需要动态更新版本的自有包列表\nexport const PACKAGES_TO_UPDATE = [\n '@verve-kit/react-script',\n // 可以在这里添加更多需要动态更新的自有包\n];\n","import os from 'node:os';\nimport { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport kleur from 'kleur';\n\nimport getPackageJsonInfo from './package_info.js';\nimport type { PackageJsonType } from '../types';\nimport { PACKAGES_TO_UPDATE } from './package-versions';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * 获取 npm 包的最新版本\n *\n * @param packageName - 包名\n * @returns Promise<string> - 最新版本号,如果获取失败则返回默认版本\n */\nasync function getLatestPackageVersion(packageName: string): Promise<string | null> {\n try {\n const response = await fetch(`https://registry.npmjs.org/${packageName}/latest`);\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data = await response.json();\n\n return `^${data.version}`;\n } catch (error) {\n console.warn(kleur.yellow(`⚠️ 无法获取 ${packageName} 的最新版本,跳过更新`));\n console.warn(kleur.gray(`错误信息: ${error}`));\n\n return null;\n }\n}\n\n/**\n * 更新包依赖的版本号为最新版本\n *\n * @param packageJson - package.json 对象\n * @returns Promise<PackageJsonType> - 更新后的 package.json 对象\n */\nasync function updatePackageVersions(packageJson: PackageJsonType): Promise<PackageJsonType> {\n console.log(kleur.cyan('🔄 正在获取最新包版本...'));\n\n const packagesToUpdate = PACKAGES_TO_UPDATE;\n\n // 并发获取所有包的最新版本\n const versionPromises = packagesToUpdate.map(async (packageName) => {\n const version = await getLatestPackageVersion(packageName);\n\n return { packageName, version };\n });\n\n try {\n const versionResults = await Promise.all(versionPromises);\n\n // 更新 dependencies\n if (packageJson.dependencies) {\n for (const { packageName, version } of versionResults) {\n if (version && packageJson.dependencies[packageName]) {\n packageJson.dependencies[packageName] = version;\n console.log(kleur.green(`✅ 更新 ${packageName}: ${version}`));\n }\n }\n }\n\n // 更新 devDependencies\n if (packageJson.devDependencies) {\n for (const { packageName, version } of versionResults) {\n if (version && packageJson.devDependencies[packageName]) {\n packageJson.devDependencies[packageName] = version;\n console.log(kleur.green(`✅ 更新 ${packageName}: ${version}`));\n }\n }\n }\n\n console.log(kleur.green('🎉 包版本更新完成'));\n } catch (error) {\n console.error(kleur.red('❌ 更新包版本时出错:'), error);\n }\n\n return packageJson;\n}\n\n/**\n * 合并 ESLint 配置到 package.json 中\n *\n * @param packageJson - 基础的 package.json 对象\n * @returns 合并了 ESLint 配置的 package.json 对象\n */\nasync function mergeEslintConfig(packageJson: PackageJsonType): Promise<PackageJsonType> {\n try {\n const eslintConfigPath = join(__dirname, './package/eslint.json');\n const eslintConfig = await getPackageJsonInfo(eslintConfigPath, false);\n\n if (!eslintConfig) {\n console.warn('⚠️ ESLint 配置文件未找到,跳过 ESLint 配置合并');\n\n return packageJson;\n }\n\n // 合并 scripts\n if (eslintConfig.scripts) {\n packageJson.scripts = {\n ...packageJson.scripts,\n ...eslintConfig.scripts,\n };\n }\n\n // 合并 devDependencies\n if (eslintConfig.devDependencies) {\n packageJson.devDependencies = {\n ...packageJson.devDependencies,\n ...eslintConfig.devDependencies,\n };\n }\n\n // 合并 lint-staged\n if (eslintConfig['lint-staged']) {\n packageJson['lint-staged'] = eslintConfig['lint-staged'];\n }\n\n console.log('✅ ESLint 配置已成功合并到 package.json');\n\n return packageJson;\n } catch (error) {\n console.error('❌ 合并 ESLint 配置时出错:', error);\n\n return packageJson;\n }\n}\n\n/**\n * 创建指定类型项目的 `package.json` 对象。\n *\n * @param projectType - 模板类型(如:react、vue、node 等)\n * @param projectName - 项目名称,会被写入到 `package.json.name`\n * @param enableEslint - 是否启用 ESLint 配置\n * @returns 返回已定制的 `package.json` 对象\n *\n * @example\n * ```ts\n * const pkg = createPackageJson('react-web-ts', 'my-app', true);\n * console.log(pkg.name); // 'my-app'\n * ```\n */\nasync function createPackageJson(\n projectType: string,\n projectName: string,\n enableEslint: boolean = false,\n): Promise<PackageJsonType> {\n try {\n // 从 package 目录读取对应项目类型的 JSON 文件\n const templatePath = join(__dirname, `./package/${projectType}.json`);\n console.log(`尝试读取模板: ${templatePath}`);\n\n const packageInfo = await getPackageJsonInfo(templatePath, false);\n if (!packageInfo) throw new Error('Package info is undefined');\n\n packageInfo.author = os.userInfo().username;\n packageInfo.name = projectName;\n\n // 更新包版本为最新版本\n const updatedPackageInfo = await updatePackageVersions(packageInfo);\n\n // 如果启用了 ESLint,合并 ESLint 配置\n if (enableEslint) {\n return await mergeEslintConfig(updatedPackageInfo);\n }\n\n return updatedPackageInfo;\n } catch (error) {\n console.error(`❌ Failed to create package.json for \"${projectType}\"`);\n console.error(error);\n process.exit(1);\n }\n}\n\n/**\n * 读取模板目录中的任意 JSON 文件为字符串内容。\n *\n * @param fileName - 模板文件名(例如:`config.json`)\n * @returns 返回文件内容的字符串\n *\n * @example\n * ```ts\n * const config = createTemplateFile('vite.config.json');\n * console.log(JSON.parse(config));\n * ```\n */\nfunction createTemplateFile(fileName: string): string {\n const filePath = join(__dirname, `./package/${fileName}`);\n\n return readFileSync(filePath, 'utf-8');\n}\n\nexport { createPackageJson, createTemplateFile };\n","import { join } from 'node:path';\nimport fs from 'fs-extra';\nimport { fileURLToPath } from 'node:url';\nimport { dirname } from 'node:path';\n\nimport { PackageJsonType } from '../types';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// 获取模板目录路径 - 总是相对于包根目录\nconst getTemplateDir = async () => {\n // 向上查找到包含 package.json 的目录(包根目录)\n let currentDir = __dirname;\n\n while (!(await fs.pathExists(join(currentDir, 'package.json')))) {\n const parent = dirname(currentDir);\n\n if (parent === currentDir) {\n throw new Error('无法找到包根目录');\n }\n\n currentDir = parent;\n }\n\n return join(currentDir, 'template');\n};\n\n// 移除自己实现的复制函数,使用 fs-extra 的 copy 方法\n\n/**\n * 为指定项目集成 commitlint 和相关 husky 配置。\n *\n * @param projectName - 项目目录名\n *\n * @example\n * ```ts\n * await createCommitlint('my-app');\n * ```\n */\nexport default async function createCommitlint(projectName: string): Promise<void> {\n try {\n // 复制 husky 模板文件\n const huskyTemplateSource = join(await getTemplateDir(), 'template-husky');\n\n if (await fs.pathExists(huskyTemplateSource)) {\n await fs.copy(huskyTemplateSource, projectName);\n console.log('✅ Husky 模板文件已复制');\n } else {\n console.warn('⚠️ Husky 模板目录未找到');\n\n return;\n }\n\n // 使用绝对路径\n const targetPackagePath = join(projectName, 'package.json');\n const huskyTemplatePath = join(__dirname, './package/husky.json');\n\n console.log(`读取 husky 模板: ${huskyTemplatePath}`);\n console.log(`读取项目 package.json: ${targetPackagePath}`);\n\n const huskyConfig = await fs.readJson(huskyTemplatePath);\n const projectPackageJson: PackageJsonType = await fs.readJson(targetPackagePath);\n\n // 合并 husky 配置到项目的 package.json 中\n for (const key in huskyConfig) {\n const sourceValue = huskyConfig[key];\n const targetValue = projectPackageJson[key];\n\n if (typeof sourceValue === 'object' && !Array.isArray(sourceValue)) {\n projectPackageJson[key] = {\n ...targetValue,\n ...sourceValue,\n };\n } else if (Array.isArray(sourceValue)) {\n projectPackageJson[key] = [...sourceValue, ...(targetValue ?? [])];\n } else {\n projectPackageJson[key] = sourceValue;\n }\n }\n\n await fs.writeJson(targetPackagePath, projectPackageJson, { spaces: 2 });\n console.log('✅ Commit Lint 配置已成功合并到 package.json');\n } catch (error) {\n console.error('❌ 创建 Commit Lint 配置时出错:', error);\n process.exit(1);\n }\n}\n","import { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport fs from 'fs-extra';\nimport kleur from 'kleur';\nimport { createSpinner } from 'nanospinner';\n\nimport { SUCCESS_MESSAGES } from './constants';\nimport { createPackageJson, createTemplateFile } from './create_file';\nimport createCommitlint from './create_commit_lint';\nimport type { ProjectTemplate, ProjectContext } from '../types';\n\n// 获取当前文件的目录路径\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// 获取模板目录路径 - 总是相对于包根目录\nconst getTemplateDir = async () => {\n // 向上查找到包含 package.json 的目录(包根目录)\n let currentDir = __dirname;\n\n while (!(await fs.pathExists(join(currentDir, 'package.json')))) {\n const parent = dirname(currentDir);\n\n if (parent === currentDir) {\n throw new Error('无法找到包根目录');\n }\n\n currentDir = parent;\n }\n\n return join(currentDir, 'template');\n};\n\n/**\n * 复制项目模板到目标目录\n */\nexport async function copyProjectTemplate(\n projectType: ProjectTemplate,\n projectRoot: string,\n): Promise<void> {\n const spinner = createSpinner(kleur.bold().cyan('正在复制项目模板...')).start();\n\n try {\n const templateSource = join(await getTemplateDir(), `template-${projectType}`);\n\n if (!(await fs.pathExists(templateSource))) {\n throw new Error(`模板目录不存在: ${templateSource}`);\n }\n\n await fs.copy(templateSource, projectRoot);\n spinner.success({ text: kleur.bold().green(SUCCESS_MESSAGES.TEMPLATE_COPY_SUCCESS) });\n } catch (error) {\n spinner.error({ text: kleur.bold().red('❌ 项目模板复制失败') });\n console.error('Error:', error);\n throw error;\n }\n}\n\n/**\n * 创建 ESLint 配置文件\n */\nexport async function createEslintConfig(root: string): Promise<void> {\n try {\n const eslintConfigSource = join(await getTemplateDir(), 'eslint/eslint.config.mjs');\n const eslintConfigDest = join(root, 'eslint.config.mjs');\n\n if (await fs.pathExists(eslintConfigSource)) {\n await fs.copy(eslintConfigSource, eslintConfigDest);\n console.log(SUCCESS_MESSAGES.ESLINT_CREATED);\n } else {\n console.warn(SUCCESS_MESSAGES.ESLINT_WARNING);\n }\n } catch (error) {\n console.error('❌ 创建 ESLint 配置文件时出错:', error);\n throw error;\n }\n}\n\n/**\n * 创建项目的基础文件\n */\nexport async function createProjectFiles(context: ProjectContext): Promise<void> {\n const { root, config, name } = context;\n\n try {\n // 创建 package.json\n const pkg = await createPackageJson(config.projectType, name, config.enableEslint);\n await fs.writeJson(join(root, 'package.json'), pkg, { spaces: 2 });\n\n // 创建 .gitignore\n await fs.writeFile(join(root, '.gitignore'), createTemplateFile('gitignore'));\n\n // 复制项目模板\n await copyProjectTemplate(config.projectType, root);\n\n // 创建 commit lint 配置\n if (config.commitLint) {\n await createCommitlint(root);\n }\n\n // 创建 ESLint 配置\n if (config.enableEslint) {\n await createEslintConfig(root);\n }\n } catch (error) {\n console.error(kleur.red('❌ 创建项目文件时出错:'), error);\n throw error;\n }\n}\n","import { execSync } from 'node:child_process';\n\n/**\n * 检查当前系统是否已安装 Git。\n *\n * @returns `true` 表示 Git 已安装,`false` 表示未安装。\n *\n * @example\n * ```ts\n * if (checkGitInstallation()) {\n * console.log('Git is available.');\n * } else {\n * console.log('Please install Git.');\n * }\n * ```\n */\nexport default function checkGitInstallation(): boolean {\n try {\n // 尝试静默执行 git --version,如果命令执行失败将抛出异常\n execSync('git --version', { stdio: 'ignore' });\n\n return true;\n } catch {\n return false;\n }\n}\n","import boxen from 'boxen';\nimport kleur from 'kleur';\n\nexport default function createSuccessInfo(name: string, packageManage: string) {\n const END_MSG = `${kleur.blue(\n '🎉 created project ' + kleur.green(name) + ' Successfully',\n )}\\n\\n 🙏 Thanks for using Create-Crack !`;\n\n const BOXEN_CONFIG = {\n padding: 1,\n margin: { top: 1, bottom: 1 },\n borderColor: 'cyan',\n align: 'center',\n borderStyle: 'double',\n title: '🚀 Congratulations',\n titleAlignment: 'center',\n };\n\n process.stdout.write(boxen(END_MSG, BOXEN_CONFIG as any));\n\n console.log('👉 Get started with the following commands:');\n console.log(`\\n\\r\\r cd ${kleur.cyan(name)}`);\n console.log(`\\r\\r ${kleur.cyan(packageManage)} start \\r\\n`);\n}\n","import { execa } from 'execa';\nimport kleur from 'kleur';\nimport { createSpinner } from 'nanospinner';\n\nimport isGitInstalled from './check_git_installation';\nimport createSuccessInfo from './create_success_info';\nimport { SUCCESS_MESSAGES } from './constants';\nimport type { PackageManager, ProjectContext } from '../types';\n\n/**\n * 安装项目依赖\n */\nexport async function installDependencies(\n packageManager: PackageManager,\n projectRoot: string,\n): Promise<void> {\n const spinner = createSpinner(kleur.bold('Installing dependencies...')).start();\n\n try {\n await execa(packageManager, ['install'], { cwd: projectRoot });\n spinner.success({ text: kleur.green(SUCCESS_MESSAGES.DEPENDENCY_INSTALL_SUCCESS) });\n } catch (error) {\n spinner.error({ text: kleur.red('Failed to install dependencies') });\n console.error(error);\n throw error;\n }\n}\n\n/**\n * 初始化 Git 仓库\n */\nexport async function initializeGitRepository(projectRoot: string): Promise<void> {\n try {\n if (isGitInstalled()) {\n await execa('git', ['init'], { cwd: projectRoot, stdio: 'ignore' });\n console.log(kleur.green('✅ Git 仓库初始化成功'));\n } else {\n console.warn(kleur.yellow('⚠️ Git 未安装,跳过 Git 仓库初始化'));\n }\n } catch (error) {\n console.warn(kleur.yellow('⚠️ Git 仓库初始化失败:'), error);\n }\n}\n\n/**\n * 显示项目创建成功的信息\n */\nexport function displaySuccessInfo(context: ProjectContext): void {\n const { name, config } = context;\n\n console.log(kleur.green(SUCCESS_MESSAGES.PROJECT_CREATED));\n console.log(kleur.cyan(SUCCESS_MESSAGES.FEATURES_INSTALLED));\n\n console.log(\n kleur.gray(\n ` • ${config.projectType === 'react-web-ts' ? 'React + TypeScript' : 'React + JavaScript'} 项目模板`,\n ),\n );\n\n if (config.enableEslint) {\n console.log(kleur.gray(' • ESLint 代码检查工具'));\n }\n\n if (config.commitLint) {\n console.log(kleur.gray(' • Commit Lint 提交规范'));\n }\n\n createSuccessInfo(name, config.packageManager);\n}\n\n/**\n * 执行后续设置:安装依赖、初始化Git、显示成功信息\n */\nexport async function performPostSetup(context: ProjectContext): Promise<void> {\n try {\n // 安装依赖\n await installDependencies(context.config.packageManager, context.root);\n\n // 初始化 Git 仓库\n await initializeGitRepository(context.root);\n\n // 显示成功信息\n displaySuccessInfo(context);\n } catch (error) {\n console.error(kleur.red('❌ 项目后续设置过程中发生错误:'), error);\n throw error;\n }\n}\n","import { resolveApp } from '@verve-kit/utils';\nimport { intro } from '@clack/prompts';\nimport kleur from 'kleur';\n\nimport { validateOptions } from './validators';\nimport { collectUserConfiguration, isNonInteractiveMode } from './user-interaction';\nimport { createProjectDirectory } from './directory-manager';\nimport { createProjectFiles } from './template-manager';\nimport { performPostSetup } from './dependency-installer';\nimport { UI_MESSAGES } from './constants';\nimport type { ProjectContext } from '../types';\n\n/**\n * 设置 Ctrl+C 退出监听(仅限终端环境)\n */\nfunction setupExitHandler(): void {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n process.stdin.on('data', (key) => {\n if (key[0] === 3) {\n console.log(UI_MESSAGES.CTRL_C_EXIT);\n process.exit(1);\n }\n });\n }\n}\n\n/**\n * 显示配置信息\n */\nfunction displayConfiguration(context: ProjectContext): void {\n const { name, config } = context;\n\n console.log(kleur.yellow(UI_MESSAGES.CREATING_PROJECT));\n console.log(kleur.gray(`📁 项目名称: ${name}`));\n console.log(kleur.gray(`🎯 项目类型: ${config.projectType}`));\n console.log(kleur.gray(`📦 包管理器: ${config.packageManager}`));\n console.log(kleur.gray(`🔍 ESLint: ${config.enableEslint ? '启用' : '禁用'}`));\n console.log(kleur.gray(`📝 Commit Lint: ${config.commitLint ? '启用' : '禁用'}`));\n}\n\n/**\n * 创建项目上下文\n */\nasync function createProjectContext(name: string, rawOptions: any): Promise<ProjectContext> {\n const options = validateOptions(rawOptions);\n const root = resolveApp(name);\n const config = await collectUserConfiguration(options);\n\n return {\n name,\n root,\n config,\n options,\n };\n}\n\n/**\n * 创建项目主流程\n *\n * @param name - 项目名\n * @param rawOptions - 控制参数\n */\nexport default async function createApp(name: string, rawOptions: any): Promise<void> {\n try {\n // 设置退出处理器\n setupExitHandler();\n\n // 显示欢迎信息\n intro(kleur.green(UI_MESSAGES.INTRO));\n\n // 创建项目上下文\n const context = await createProjectContext(name, rawOptions);\n\n // 如果是交互模式,显示配置选择提示\n if (!isNonInteractiveMode(context.options)) {\n console.log(kleur.cyan(UI_MESSAGES.CONFIG_SELECTION));\n }\n\n // 显示配置信息\n displayConfiguration(context);\n\n // 创建项目目录\n context.root = await createProjectDirectory(name, context.options);\n\n // 创建项目文件\n await createProjectFiles(context);\n\n // 执行后续设置(安装依赖、初始化Git、显示成功信息)\n await performPostSetup(context);\n } catch (error) {\n console.error(kleur.red('❌ 项目创建过程中发生错误:'), error);\n process.exit(1);\n }\n}\n","#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport kleur from 'kleur';\n\nimport createApp from './core/create_app';\nimport getPackageJsonInfo from './core/package_info';\n\nasync function main() {\n const program = new Command();\n\n // 异步获取版本号\n const packageInfo = await getPackageJsonInfo('../package.json', true);\n\n program\n .version(kleur.green(packageInfo.version as string))\n .arguments('<project-name>')\n .description(kleur.cyan('Create a directory for your project files'))\n .option('-f, --force', 'Overwrite target directory if it exists')\n .option('-t, --template <template>', 'Project template (react-web-js | react-web-ts)')\n .option('-p, --package-manager <manager>', 'Package manager (npm | yarn | pnpm | cnpm)')\n .option('-e, --eslint', 'Enable ESLint configuration')\n .option('-c, --commit-lint', 'Enable Commit Lint configuration')\n .option('--no-eslint', 'Disable ESLint configuration')\n .option('--no-commit-lint', 'Disable Commit Lint configuration')\n .addHelpText(\n 'after',\n `\n\n${kleur.yellow('Examples:')}\n ${kleur.gray('# Interactive mode (default)')}\n $ create-crack my-app\n\n ${kleur.gray('# Non-interactive mode with all options')}\n $ create-crack my-app -t react-web-ts -p pnpm -e -c\n\n ${kleur.gray('# Create React JS project with npm and ESLint')}\n $ create-crack my-app --template react-web-js --package-manager npm --eslint\n\n ${kleur.gray('# Create project without ESLint and Commit Lint')}\n $ create-crack my-app -t react-web-ts -p yarn --no-eslint --no-commit-lint\n\n${kleur.yellow('Available Templates:')}\n ${kleur.cyan('react-web-js')} - React + JavaScript Web应用程序\n ${kleur.cyan('react-web-ts')} - React + TypeScript Web应用程序\n\n${kleur.yellow('Available Package Managers:')}\n ${kleur.cyan('npm')} - Node Package Manager\n ${kleur.cyan('yarn')} - Yarn Package Manager \n ${kleur.cyan('pnpm')} - PNPM Package Manager\n ${kleur.cyan('cnpm')} - CNPM Package Manager\n`,\n )\n .action((name, options) => {\n createApp(name, options);\n })\n .parse(process.argv);\n}\n\nmain().catch(console.error);\n"],"names":["SUPPORTED_TEMPLATES","SUPPORTED_PACKAGE_MANAGERS","PROJECT_TYPE_OPTIONS","value","label","hint","PACKAGE_MANAGER_OPTIONS","UI_MESSAGES","INTRO","SELECT_PROJECT_TYPE","SELECT_PACKAGE_MANAGER","ENABLE_ESLINT","ENABLE_COMMIT_LINT","OVERWRITE_CONFIRM","CONFIG_SELECTION","CREATING_PROJECT","CTRL_C_EXIT","ERROR_MESSAGES","INVALID_TEMPLATE","template","INVALID_PACKAGE_MANAGER","manager","AVAILABLE_TEMPLATES","AVAILABLE_PACKAGE_MANAGERS","SUCCESS_MESSAGES","PROJECT_CREATED","FEATURES_INSTALLED","ESLINT_CREATED","ESLINT_WARNING","TEMPLATE_COPY_SUCCESS","DEPENDENCY_INSTALL_SUCCESS","validateTemplate","includes","validatePackageManager","validateTemplateOption","undefined","console","error","kleur","red","yellow","process","exit","validatePackageManagerOption","validateOptions","options","validated","force","Boolean","packageManager","eslint","commitLint","collectUserConfiguration","projectType","enableEslint","select","message","confirm","isNonInteractiveMode","createProjectDirectory","name","root","resolveApp","fs","pathExists","shouldOverwrite","log","remove","ensureDir","__filename","fileURLToPath","url","__dirname","dirname","getPackageJsonInfo","relativePath","isFromCurrentDir","filePath","join","readJson","PACKAGES_TO_UPDATE","getLatestPackageVersion","packageName","response","fetch","ok","Error","status","data","json","version","warn","gray","updatePackageVersions","packageJson","cyan","packagesToUpdate","versionPromises","map","versionResults","Promise","all","dependencies","green","devDependencies","mergeEslintConfig","eslintConfigPath","eslintConfig","scripts","createPackageJson","projectName","templatePath","packageInfo","author","os","userInfo","username","updatedPackageInfo","createTemplateFile","fileName","readFileSync","getTemplateDir","currentDir","parent","createCommitlint","huskyTemplateSource","copy","targetPackagePath","huskyTemplatePath","huskyConfig","projectPackageJson","key","sourceValue","targetValue","Array","isArray","writeJson","spaces","copyProjectTemplate","projectRoot","spinner","createSpinner","bold","start","templateSource","success","text","createEslintConfig","eslintConfigSource","eslintConfigDest","createProjectFiles","context","config","pkg","writeFile","checkGitInstallation","execSync","stdio","createSuccessInfo","packageManage","END_MSG","blue","BOXEN_CONFIG","padding","margin","top","bottom","borderColor","align","borderStyle","title","titleAlignment","stdout","write","boxen","installDependencies","execa","cwd","initializeGitRepository","isGitInstalled","displaySuccessInfo","performPostSetup","setupExitHandler","stdin","isTTY","setRawMode","on","displayConfiguration","createProjectContext","rawOptions","createApp","intro","main","program","Command","arguments","description","option","addHelpText","action","parse","argv","catch"],"mappings":"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"} |
+11
-4
| { | ||
| "name": "create-crack", | ||
| "version": "1.0.3", | ||
| "version": "2.0.0", | ||
| "description": "CLI tool for creating crack projects", | ||
@@ -10,3 +10,3 @@ "main": "dist/index.js", | ||
| "bin": { | ||
| "create-crack": "dist/index.js" | ||
| "create-crack": "dist/index.esm.js" | ||
| }, | ||
@@ -33,8 +33,11 @@ "publishConfig": { | ||
| "commander": "^14.0.0", | ||
| "execa": "8", | ||
| "fs-extra": "^11.3.0", | ||
| "kleur": "^4.1.5", | ||
| "nanospinner": "^1.2.2", | ||
| "tar": "^7.4.3", | ||
| "@verve-kit/utils": "1.0.0" | ||
| "@verve-kit/utils": "2.0.0" | ||
| }, | ||
| "devDependencies": { | ||
| "@types/fs-extra": "^11.0.4", | ||
| "rollup-plugin-copy": "^3.5.0" | ||
@@ -45,4 +48,8 @@ }, | ||
| "dev": "rollup -c -w", | ||
| "check-types": "tsc --noEmit" | ||
| "check-types": "tsc --noEmit", | ||
| "test": "vitest", | ||
| "test:run": "vitest run", | ||
| "lint:ci": "eslint src --ext .ts,.tsx --ignore-pattern '**/*.test.ts' --ignore-pattern '**/*.spec.ts' --max-warnings 0", | ||
| "format:ci": "prettier --check \"src/**/*.{ts,tsx}\"" | ||
| } | ||
| } |
-673
| #!/usr/bin/env node | ||
| import { Command } from 'commander'; | ||
| import kleur from 'kleur'; | ||
| import { resolveApp } from '@verve-kit/utils'; | ||
| import { existsSync, rmSync, readFileSync, writeFileSync, mkdirSync, readdirSync, statSync, copyFileSync } from 'node:fs'; | ||
| import { execSync, exec } from 'node:child_process'; | ||
| import { dirname, join } from 'node:path'; | ||
| import { fileURLToPath as fileURLToPath$1 } from 'node:url'; | ||
| import { intro, confirm, select } from '@clack/prompts'; | ||
| import { createSpinner } from 'nanospinner'; | ||
| import 'tar'; | ||
| import boxen from 'boxen'; | ||
| import { fileURLToPath } from 'url'; | ||
| import os from 'node:os'; | ||
| const template = [ | ||
| 'react-web-js', | ||
| 'react-web-ts' | ||
| ]; | ||
| const packageVersion = '1.0.1'; | ||
| const getProjectLink = (templates)=>new Map(templates.map((template)=>[ | ||
| template, | ||
| `https://registry.npmjs.org/@laconic/template-${template}/-/template-${template}-${packageVersion}.tgz` | ||
| ])); | ||
| getProjectLink(template); | ||
| /** | ||
| * 删除指定目录 | ||
| * | ||
| * @param directoryPath - 要删除的目录路径(默认 "node_modules") | ||
| * @param verbose - 是否显示终端提示信息 | ||
| */ async function removeDirectory(directoryPath = 'node_modules', verbose = true) { | ||
| const fullPath = resolveApp(directoryPath); | ||
| if (verbose) { | ||
| const spinner = createSpinner(kleur.bold().cyan('File being deleted...')).start(); | ||
| try { | ||
| if (existsSync(fullPath)) { | ||
| rmSync(fullPath, { | ||
| recursive: true, | ||
| force: true | ||
| }); | ||
| } | ||
| spinner.success({ | ||
| text: kleur.bold().green('Deleted successfully') | ||
| }); | ||
| } catch (error) { | ||
| spinner.error({ | ||
| text: kleur.bold().red('Deletion failed') | ||
| }); | ||
| console.error(error); | ||
| } | ||
| } else { | ||
| if (existsSync(fullPath)) { | ||
| rmSync(fullPath, { | ||
| recursive: true, | ||
| force: true | ||
| }); | ||
| } | ||
| } | ||
| } | ||
| function createSelectType(value, hint) { | ||
| const result = { | ||
| value, | ||
| label: value | ||
| }; | ||
| if (hint !== undefined) { | ||
| result.hint = hint; | ||
| } | ||
| return result; | ||
| } | ||
| // 优化后只保留两个可用的模板库 | ||
| const ProjectTypes = [ | ||
| createSelectType('react-web-js', 'React + JavaScript Web应用程序 🚀'), | ||
| createSelectType('react-web-ts', 'React + TypeScript Web应用程序 🚀') | ||
| ]; | ||
| const PackageManagers = [ | ||
| { | ||
| value: 'npm', | ||
| label: 'npm' | ||
| }, | ||
| { | ||
| value: 'yarn', | ||
| label: 'yarn' | ||
| }, | ||
| { | ||
| value: 'pnpm', | ||
| label: 'pnpm' | ||
| }, | ||
| { | ||
| value: 'cnpm', | ||
| label: 'cnpm' | ||
| } | ||
| ]; | ||
| /** | ||
| * 检查当前系统是否已安装 Git。 | ||
| * | ||
| * @returns `true` 表示 Git 已安装,`false` 表示未安装。 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * if (checkGitInstallation()) { | ||
| * console.log('Git is available.'); | ||
| * } else { | ||
| * console.log('Please install Git.'); | ||
| * } | ||
| * ``` | ||
| */ function checkGitInstallation() { | ||
| try { | ||
| // 尝试静默执行 git --version,如果命令执行失败将抛出异常 | ||
| execSync('git --version', { | ||
| stdio: 'ignore' | ||
| }); | ||
| return true; | ||
| } catch { | ||
| return false; | ||
| } | ||
| } | ||
| function createSuccessInfo(name, packageManage) { | ||
| const END_MSG = `${kleur.blue('🎉 created project ' + kleur.green(name) + ' Successfully')}\n\n 🙏 Thanks for using Create-Crack !`; | ||
| const BOXEN_CONFIG = { | ||
| padding: 1, | ||
| margin: { | ||
| top: 1, | ||
| bottom: 1 | ||
| }, | ||
| borderColor: 'cyan', | ||
| align: 'center', | ||
| borderStyle: 'double', | ||
| title: '🚀 Congratulations', | ||
| titleAlignment: 'center' | ||
| }; | ||
| process.stdout.write(boxen(END_MSG, BOXEN_CONFIG)); | ||
| console.log('👉 Get started with the following commands:'); | ||
| console.log(`\n\r\r cd ${kleur.cyan(name)}`); | ||
| console.log(`\r\r ${kleur.cyan(packageManage)} start \r\n`); | ||
| } | ||
| const __filename$3 = fileURLToPath(import.meta.url); | ||
| const __dirname$3 = dirname(__filename$3); | ||
| /** | ||
| * 获取并解析指定路径下的 package.json 文件。 | ||
| * | ||
| * @param relativePath - 相对于当前模块目录的路径(当 `isFromCurrentDir` 为 `true` 时) | ||
| * @param isFromCurrentDir - 如果为 `true`,则路径基于当前文件目录;否则视为绝对路径或调用方自定义路径 | ||
| * @returns 返回解析后的 package.json 内容对象 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * const pkg = getPackageJsonInfo('../package.json', true); | ||
| * console.log(pkg.name); | ||
| * ``` | ||
| */ function getPackageJsonInfo(relativePath, isFromCurrentDir) { | ||
| const filePath = isFromCurrentDir ? join(__dirname$3, relativePath) : relativePath; | ||
| const content = readFileSync(filePath, 'utf-8'); | ||
| return JSON.parse(content); | ||
| } | ||
| const __filename$2 = fileURLToPath$1(import.meta.url); | ||
| const __dirname$2 = dirname(__filename$2); | ||
| /** | ||
| * 递归复制文件夹 | ||
| * | ||
| * @param sourceDir - 源文件夹路径 | ||
| * @param destinationDir - 目标文件夹路径 | ||
| */ const copyFolderRecursive$1 = (sourceDir, destinationDir)=>{ | ||
| try { | ||
| if (!existsSync(destinationDir)) { | ||
| mkdirSync(destinationDir, { | ||
| recursive: true | ||
| }); | ||
| } | ||
| const items = readdirSync(sourceDir); | ||
| for (const item of items){ | ||
| const src = join(sourceDir, item); | ||
| const dest = join(destinationDir, item); | ||
| const stat = statSync(src); | ||
| if (stat.isDirectory()) { | ||
| copyFolderRecursive$1(src, dest); | ||
| } else { | ||
| copyFileSync(src, dest); | ||
| } | ||
| } | ||
| } catch (error) { | ||
| console.error(kleur.red('❌ 复制 husky 模板文件时出错:'), error); | ||
| process.exit(1); | ||
| } | ||
| }; | ||
| /** | ||
| * 为指定项目集成 commitlint 和相关 husky 配置。 | ||
| * | ||
| * @param projectName - 项目目录名 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * createCommitlint('my-app'); | ||
| * ``` | ||
| */ function createCommitlint(projectName) { | ||
| try { | ||
| // 复制 husky 模板文件 | ||
| const huskyTemplateSource = join(__dirname$2, '../template/template-husky'); | ||
| if (existsSync(huskyTemplateSource)) { | ||
| copyFolderRecursive$1(huskyTemplateSource, projectName); | ||
| console.log('✅ Husky 模板文件已复制'); | ||
| } else { | ||
| console.warn('⚠️ Husky 模板目录未找到'); | ||
| return; | ||
| } | ||
| // 使用绝对路径 | ||
| const targetPackagePath = join(projectName, 'package.json'); | ||
| const huskyTemplatePath = join(__dirname$2, './package/husky.json'); | ||
| console.log(`读取 husky 模板: ${huskyTemplatePath}`); | ||
| console.log(`读取项目 package.json: ${targetPackagePath}`); | ||
| const huskyConfig = getPackageJsonInfo(huskyTemplatePath, false); | ||
| const projectPackageJson = getPackageJsonInfo(targetPackagePath, false); | ||
| // 合并 husky 配置到项目的 package.json 中 | ||
| for(const key in huskyConfig){ | ||
| const sourceValue = huskyConfig[key]; | ||
| const targetValue = projectPackageJson[key]; | ||
| if (typeof sourceValue === 'object' && !Array.isArray(sourceValue)) { | ||
| projectPackageJson[key] = { | ||
| ...targetValue, | ||
| ...sourceValue | ||
| }; | ||
| } else if (Array.isArray(sourceValue)) { | ||
| projectPackageJson[key] = [ | ||
| ...sourceValue, | ||
| ...targetValue ?? [] | ||
| ]; | ||
| } else { | ||
| projectPackageJson[key] = sourceValue; | ||
| } | ||
| } | ||
| writeFileSync(targetPackagePath, JSON.stringify(projectPackageJson, null, 2), 'utf-8'); | ||
| console.log('✅ Commit Lint 配置已成功合并到 package.json'); | ||
| } catch (error) { | ||
| console.error('❌ 创建 Commit Lint 配置时出错:', error); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| /** | ||
| * 包版本管理配置 | ||
| */ // 需要动态更新版本的自有包列表 | ||
| const PACKAGES_TO_UPDATE = [ | ||
| '@verve-kit/react-script' | ||
| ]; | ||
| const __filename$1 = fileURLToPath$1(import.meta.url); | ||
| const __dirname$1 = dirname(__filename$1); | ||
| // 添加调试信息 | ||
| console.log('create_file.ts __dirname:', __dirname$1); | ||
| /** | ||
| * 获取 npm 包的最新版本 | ||
| * | ||
| * @param packageName - 包名 | ||
| * @returns Promise<string> - 最新版本号,如果获取失败则返回默认版本 | ||
| */ async function getLatestPackageVersion(packageName) { | ||
| try { | ||
| const response = await fetch(`https://registry.npmjs.org/${packageName}/latest`); | ||
| if (!response.ok) { | ||
| throw new Error(`HTTP error! status: ${response.status}`); | ||
| } | ||
| const data = await response.json(); | ||
| return `^${data.version}`; | ||
| } catch (error) { | ||
| console.warn(kleur.yellow(`⚠️ 无法获取 ${packageName} 的最新版本,跳过更新`)); | ||
| console.warn(kleur.gray(`错误信息: ${error}`)); | ||
| return null; | ||
| } | ||
| } | ||
| /** | ||
| * 更新包依赖的版本号为最新版本 | ||
| * | ||
| * @param packageJson - package.json 对象 | ||
| * @returns Promise<PackageJsonType> - 更新后的 package.json 对象 | ||
| */ async function updatePackageVersions(packageJson) { | ||
| console.log(kleur.cyan('🔄 正在获取最新包版本...')); | ||
| const packagesToUpdate = PACKAGES_TO_UPDATE; | ||
| // 并发获取所有包的最新版本 | ||
| const versionPromises = packagesToUpdate.map(async (packageName)=>{ | ||
| const version = await getLatestPackageVersion(packageName); | ||
| return { | ||
| packageName, | ||
| version | ||
| }; | ||
| }); | ||
| try { | ||
| const versionResults = await Promise.all(versionPromises); | ||
| // 更新 dependencies | ||
| if (packageJson.dependencies) { | ||
| for (const { packageName, version } of versionResults){ | ||
| if (version && packageJson.dependencies[packageName]) { | ||
| packageJson.dependencies[packageName] = version; | ||
| console.log(kleur.green(`✅ 更新 ${packageName}: ${version}`)); | ||
| } | ||
| } | ||
| } | ||
| // 更新 devDependencies | ||
| if (packageJson.devDependencies) { | ||
| for (const { packageName, version } of versionResults){ | ||
| if (version && packageJson.devDependencies[packageName]) { | ||
| packageJson.devDependencies[packageName] = version; | ||
| console.log(kleur.green(`✅ 更新 ${packageName}: ${version}`)); | ||
| } | ||
| } | ||
| } | ||
| console.log(kleur.green('🎉 包版本更新完成')); | ||
| } catch (error) { | ||
| console.error(kleur.red('❌ 更新包版本时出错:'), error); | ||
| } | ||
| return packageJson; | ||
| } | ||
| /** | ||
| * 合并 ESLint 配置到 package.json 中 | ||
| * | ||
| * @param packageJson - 基础的 package.json 对象 | ||
| * @returns 合并了 ESLint 配置的 package.json 对象 | ||
| */ function mergeEslintConfig(packageJson) { | ||
| try { | ||
| const eslintConfigPath = join(__dirname$1, './package/eslint.json'); | ||
| const eslintConfig = getPackageJsonInfo(eslintConfigPath, false); | ||
| if (!eslintConfig) { | ||
| console.warn('⚠️ ESLint 配置文件未找到,跳过 ESLint 配置合并'); | ||
| return packageJson; | ||
| } | ||
| // 合并 scripts | ||
| if (eslintConfig.scripts) { | ||
| packageJson.scripts = { | ||
| ...packageJson.scripts, | ||
| ...eslintConfig.scripts | ||
| }; | ||
| } | ||
| // 合并 devDependencies | ||
| if (eslintConfig.devDependencies) { | ||
| packageJson.devDependencies = { | ||
| ...packageJson.devDependencies, | ||
| ...eslintConfig.devDependencies | ||
| }; | ||
| } | ||
| // 合并 lint-staged | ||
| if (eslintConfig['lint-staged']) { | ||
| packageJson['lint-staged'] = eslintConfig['lint-staged']; | ||
| } | ||
| console.log('✅ ESLint 配置已成功合并到 package.json'); | ||
| return packageJson; | ||
| } catch (error) { | ||
| console.error('❌ 合并 ESLint 配置时出错:', error); | ||
| return packageJson; | ||
| } | ||
| } | ||
| /** | ||
| * 创建指定类型项目的 `package.json` 对象。 | ||
| * | ||
| * @param projectType - 模板类型(如:react、vue、node 等) | ||
| * @param projectName - 项目名称,会被写入到 `package.json.name` | ||
| * @param enableEslint - 是否启用 ESLint 配置 | ||
| * @returns 返回已定制的 `package.json` 对象 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * const pkg = createPackageJson('react-web-ts', 'my-app', true); | ||
| * console.log(pkg.name); // 'my-app' | ||
| * ``` | ||
| */ async function createPackageJson(projectType, projectName, enableEslint = false) { | ||
| try { | ||
| // 从 package 目录读取对应项目类型的 JSON 文件 | ||
| const templatePath = join(__dirname$1, `./package/${projectType}.json`); | ||
| console.log(`尝试读取模板: ${templatePath}`); | ||
| const packageInfo = getPackageJsonInfo(templatePath, false); | ||
| if (!packageInfo) throw new Error('Package info is undefined'); | ||
| packageInfo.author = os.userInfo().username; | ||
| packageInfo.name = projectName; | ||
| // 更新包版本为最新版本 | ||
| const updatedPackageInfo = await updatePackageVersions(packageInfo); | ||
| // 如果启用了 ESLint,合并 ESLint 配置 | ||
| if (enableEslint) { | ||
| return mergeEslintConfig(updatedPackageInfo); | ||
| } | ||
| return updatedPackageInfo; | ||
| } catch (error) { | ||
| console.error(`❌ Failed to create package.json for "${projectType}"`); | ||
| console.error(error); | ||
| process.exit(1); | ||
| } | ||
| } | ||
| /** | ||
| * 读取模板目录中的任意 JSON 文件为字符串内容。 | ||
| * | ||
| * @param fileName - 模板文件名(例如:`config.json`) | ||
| * @returns 返回文件内容的字符串 | ||
| * | ||
| * @example | ||
| * ```ts | ||
| * const config = createTemplateFile('vite.config.json'); | ||
| * console.log(JSON.parse(config)); | ||
| * ``` | ||
| */ function createTemplateFile(fileName) { | ||
| const filePath = join(__dirname$1, `./package/${fileName}`); | ||
| return readFileSync(filePath, 'utf-8'); | ||
| } | ||
| // 获取当前文件的目录路径 | ||
| const __filename = fileURLToPath$1(import.meta.url); | ||
| const __dirname = dirname(__filename); | ||
| /** | ||
| * 设置 Ctrl+C 退出监听(仅限终端环境) | ||
| */ if (process.stdin.isTTY) { | ||
| process.stdin.setRawMode(true); | ||
| process.stdin.on('data', (key)=>{ | ||
| if (key[0] === 3) { | ||
| console.log('⌨️ Ctrl+C pressed - Exiting the program'); | ||
| process.exit(1); | ||
| } | ||
| }); | ||
| } | ||
| /** | ||
| * 创建项目根目录,如有同名文件则询问是否覆盖 | ||
| * | ||
| * @param name - 项目名 | ||
| * @param force - 是否强制覆盖 | ||
| */ const makeDirectory = async (name, { force })=>{ | ||
| const root = resolveApp(name); | ||
| if (existsSync(root) && !force) { | ||
| const shouldOverwrite = await confirm({ | ||
| message: 'Target directory already exists. Overwrite?' | ||
| }); | ||
| if (!shouldOverwrite) process.exit(1); | ||
| await removeDirectory(name, true); | ||
| } | ||
| mkdirSync(root, { | ||
| recursive: true | ||
| }); | ||
| }; | ||
| /** | ||
| * 收集用户交互选择的信息 | ||
| */ const getTableInfo = async (options)=>{ | ||
| let projectType; | ||
| let packageManager; | ||
| let enableEslint; | ||
| let commitLint; | ||
| // 检查是否提供了模板参数 | ||
| if (options.template) { | ||
| if (![ | ||
| 'react-web-js', | ||
| 'react-web-ts' | ||
| ].includes(options.template)) { | ||
| console.error(kleur.red(`❌ 无效的模板类型: ${options.template}`)); | ||
| console.error(kleur.yellow('可用的模板: react-web-js, react-web-ts')); | ||
| process.exit(1); | ||
| } | ||
| projectType = options.template; | ||
| } else { | ||
| projectType = await select({ | ||
| message: '🎯 选择项目类型:', | ||
| options: ProjectTypes | ||
| }); | ||
| } | ||
| // 检查是否提供了包管理器参数 | ||
| if (options.packageManager) { | ||
| if (![ | ||
| 'npm', | ||
| 'yarn', | ||
| 'pnpm', | ||
| 'cnpm' | ||
| ].includes(options.packageManager)) { | ||
| console.error(kleur.red(`❌ 无效的包管理器: ${options.packageManager}`)); | ||
| console.error(kleur.yellow('可用的包管理器: npm, yarn, pnpm, cnpm')); | ||
| process.exit(1); | ||
| } | ||
| packageManager = options.packageManager; | ||
| } else { | ||
| packageManager = await select({ | ||
| message: '📦 选择包管理器:', | ||
| options: PackageManagers | ||
| }); | ||
| } | ||
| // 检查 ESLint 选项 | ||
| if (options.eslint !== undefined) { | ||
| enableEslint = options.eslint; | ||
| } else { | ||
| enableEslint = await confirm({ | ||
| message: '🔍 是否启用 ESLint 代码检查?' | ||
| }); | ||
| } | ||
| // 检查 Commit Lint 选项 | ||
| if (options.commitLint !== undefined) { | ||
| commitLint = options.commitLint; | ||
| } else { | ||
| commitLint = await confirm({ | ||
| message: '📝 是否启用 Commit Lint 配置?' | ||
| }); | ||
| } | ||
| return { | ||
| projectType, | ||
| packageManager, | ||
| enableEslint, | ||
| commitLint | ||
| }; | ||
| }; | ||
| /** | ||
| * 创建 ESLint 配置文件 | ||
| * | ||
| * @param root - 项目根目录路径 | ||
| */ const createEslintConfig = (root)=>{ | ||
| try { | ||
| const eslintConfigSource = join(__dirname, '../template/eslint/eslint.config.mjs'); | ||
| const eslintConfigDest = join(root, 'eslint.config.mjs'); | ||
| if (existsSync(eslintConfigSource)) { | ||
| copyFileSync(eslintConfigSource, eslintConfigDest); | ||
| console.log('✅ ESLint 配置文件已创建'); | ||
| } else { | ||
| console.warn('⚠️ ESLint 配置模板文件未找到'); | ||
| } | ||
| } catch (error) { | ||
| console.error('❌ 创建 ESLint 配置文件时出错:', error); | ||
| } | ||
| }; | ||
| /** | ||
| * 递归复制文件夹 | ||
| * | ||
| * @param sourceDir - 源文件夹路径 | ||
| * @param destinationDir - 目标文件夹路径 | ||
| */ const copyFolderRecursive = (sourceDir, destinationDir)=>{ | ||
| try { | ||
| if (!existsSync(destinationDir)) { | ||
| mkdirSync(destinationDir, { | ||
| recursive: true | ||
| }); | ||
| } | ||
| const items = readdirSync(sourceDir); | ||
| for (const item of items){ | ||
| const src = join(sourceDir, item); | ||
| const dest = join(destinationDir, item); | ||
| const stat = statSync(src); | ||
| if (stat.isDirectory()) { | ||
| copyFolderRecursive(src, dest); | ||
| } else { | ||
| copyFileSync(src, dest); | ||
| } | ||
| } | ||
| } catch (error) { | ||
| console.error(kleur.red('❌ 复制模板文件时出错:'), error); | ||
| process.exit(1); | ||
| } | ||
| }; | ||
| /** | ||
| * 复制本地模板到项目目录 | ||
| * | ||
| * @param projectType - 项目类型 | ||
| * @param projectRoot - 项目根目录 | ||
| */ const copyLocalTemplate = (projectType, projectRoot)=>{ | ||
| const spinner = createSpinner(kleur.bold().cyan('正在复制项目模板...')).start(); | ||
| try { | ||
| const templateSource = join(__dirname, `../template/template-${projectType}`); | ||
| if (!existsSync(templateSource)) { | ||
| throw new Error(`模板目录不存在: ${templateSource}`); | ||
| } | ||
| copyFolderRecursive(templateSource, projectRoot); | ||
| spinner.success({ | ||
| text: kleur.bold().green('✅ 项目模板复制成功') | ||
| }); | ||
| } catch (error) { | ||
| spinner.error({ | ||
| text: kleur.bold().red('❌ 项目模板复制失败') | ||
| }); | ||
| console.error('Error:', error); | ||
| process.exit(1); | ||
| } | ||
| }; | ||
| /** | ||
| * 创建项目主流程 | ||
| * | ||
| * @param name - 项目名 | ||
| * @param options - 控制参数 | ||
| */ async function createApp(name, options) { | ||
| intro(kleur.green(' 🚧 Create Your App - 项目脚手架工具 ')); | ||
| const root = resolveApp(name); | ||
| await makeDirectory(name, options); | ||
| // 检查是否使用了命令行参数(非交互模式) | ||
| const isNonInteractive = options.template || options.packageManager || options.eslint !== undefined || options.commitLint !== undefined; | ||
| if (!isNonInteractive) { | ||
| console.log(kleur.cyan('\n📋 请选择项目配置:\n')); | ||
| } | ||
| const { projectType, packageManager, enableEslint, commitLint } = await getTableInfo(options); | ||
| console.log(kleur.yellow('\n🔧 正在创建项目...')); | ||
| console.log(kleur.gray(`📁 项目名称: ${name}`)); | ||
| console.log(kleur.gray(`🎯 项目类型: ${projectType}`)); | ||
| console.log(kleur.gray(`📦 包管理器: ${packageManager}`)); | ||
| console.log(kleur.gray(`🔍 ESLint: ${enableEslint ? '启用' : '禁用'}`)); | ||
| console.log(kleur.gray(`📝 Commit Lint: ${commitLint ? '启用' : '禁用'}`)); | ||
| // 写入 package.json | ||
| const pkg = await createPackageJson(projectType, name, enableEslint); | ||
| writeFileSync(join(root, 'package.json'), JSON.stringify(pkg, null, 2)); | ||
| // 写入 .gitignore | ||
| writeFileSync(join(root, '.gitignore'), createTemplateFile('gitignore')); | ||
| // 复制本地模板文件 | ||
| copyLocalTemplate(projectType, root); | ||
| // 注入 lint 配置 | ||
| if (commitLint) { | ||
| createCommitlint(root); | ||
| } | ||
| // 创建 ESLint 配置文件 | ||
| if (enableEslint) { | ||
| createEslintConfig(root); | ||
| } | ||
| // 安装依赖 | ||
| const spinner = createSpinner(kleur.bold('Installing dependencies...')).start(); | ||
| exec(`${packageManager} install`, { | ||
| cwd: root | ||
| }, (err)=>{ | ||
| if (err) { | ||
| spinner.error({ | ||
| text: kleur.red('Failed to install dependencies') | ||
| }); | ||
| console.error(err); | ||
| process.exit(1); | ||
| } else { | ||
| spinner.success({ | ||
| text: kleur.green('✅ Project initialization complete') | ||
| }); | ||
| // 显示项目创建成功的详细信息 | ||
| console.log(kleur.green('\n🎉 项目创建成功!\n')); | ||
| console.log(kleur.cyan('📦 已安装的功能:')); | ||
| console.log(kleur.gray(` • ${projectType === 'react-web-ts' ? 'React + TypeScript' : 'React + JavaScript'} 项目模板`)); | ||
| if (enableEslint) { | ||
| console.log(kleur.gray(' • ESLint 代码检查工具')); | ||
| } | ||
| if (commitLint) { | ||
| console.log(kleur.gray(' • Commit Lint 提交规范')); | ||
| } | ||
| createSuccessInfo(name, packageManager); | ||
| } | ||
| }); | ||
| // 初始化 Git 仓库 | ||
| if (checkGitInstallation()) { | ||
| execSync('git init', { | ||
| cwd: root | ||
| }); | ||
| } | ||
| } | ||
| const program = new Command(); | ||
| program.version(kleur.green(getPackageJsonInfo('../package.json', true).version || '1.0.0')).arguments('<project-name>').description(kleur.cyan('Create a directory for your project files')).option('-f, --force', 'Overwrite target directory if it exists').option('-t, --template <template>', 'Project template (react-web-js | react-web-ts)').option('-p, --package-manager <manager>', 'Package manager (npm | yarn | pnpm | cnpm)').option('-e, --eslint', 'Enable ESLint configuration').option('-c, --commit-lint', 'Enable Commit Lint configuration').option('--no-eslint', 'Disable ESLint configuration').option('--no-commit-lint', 'Disable Commit Lint configuration').addHelpText('after', ` | ||
| ${kleur.yellow('Examples:')} | ||
| ${kleur.gray('# Interactive mode (default)')} | ||
| $ create-crack my-app | ||
| ${kleur.gray('# Non-interactive mode with all options')} | ||
| $ create-crack my-app -t react-web-ts -p pnpm -e -c | ||
| ${kleur.gray('# Create React JS project with npm and ESLint')} | ||
| $ create-crack my-app --template react-web-js --package-manager npm --eslint | ||
| ${kleur.gray('# Create project without ESLint and Commit Lint')} | ||
| $ create-crack my-app -t react-web-ts -p yarn --no-eslint --no-commit-lint | ||
| ${kleur.yellow('Available Templates:')} | ||
| ${kleur.cyan('react-web-js')} - React + JavaScript Web应用程序 | ||
| ${kleur.cyan('react-web-ts')} - React + TypeScript Web应用程序 | ||
| ${kleur.yellow('Available Package Managers:')} | ||
| ${kleur.cyan('npm')} - Node Package Manager | ||
| ${kleur.cyan('yarn')} - Yarn Package Manager | ||
| ${kleur.cyan('pnpm')} - PNPM Package Manager | ||
| ${kleur.cyan('cnpm')} - CNPM Package Manager | ||
| `).action((name, options)=>{ | ||
| createApp(name, options); | ||
| }).parse(process.argv); | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sources":["../src/core/constants.ts","../src/core/file_controller.ts","../src/core/question.ts","../src/core/check_git_installation.ts","../src/core/create_success_info.ts","../src/core/package_info.ts","../src/core/create_commit_lint.ts","../src/core/package-versions.ts","../src/core/create_file.ts","../src/core/create_app.ts","../src/index.ts"],"sourcesContent":["const template: string[] = ['react-web-js', 'react-web-ts'];\n\nexport const packageVersion = '1.0.1';\n\nconst getProjectLink = (templates: string[]): Map<string, string> =>\n new Map(\n templates.map((template) => [\n template,\n `https://registry.npmjs.org/@laconic/template-${template}/-/template-${template}-${packageVersion}.tgz`,\n ]),\n );\n\nexport const projectLink: Map<string, string> = getProjectLink(template);\n","import { resolveApp } from '@verve-kit/utils';\nimport kleur from 'kleur';\nimport { createSpinner } from 'nanospinner';\nimport {\n existsSync,\n rmSync,\n mkdirSync,\n copyFileSync,\n statSync,\n readdirSync,\n unlinkSync,\n writeFileSync,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport * as tar from 'tar';\n\nimport { packageVersion } from './constants';\n\n/**\n * 删除指定目录\n *\n * @param directoryPath - 要删除的目录路径(默认 \"node_modules\")\n * @param verbose - 是否显示终端提示信息\n */\nexport async function removeDirectory(directoryPath = 'node_modules', verbose = true) {\n const fullPath = resolveApp(directoryPath);\n\n if (verbose) {\n const spinner = createSpinner(kleur.bold().cyan('File being deleted...')).start();\n\n try {\n if (existsSync(fullPath)) {\n rmSync(fullPath, { recursive: true, force: true });\n }\n\n spinner.success({ text: kleur.bold().green('Deleted successfully') });\n } catch (error) {\n spinner.error({ text: kleur.bold().red('Deletion failed') });\n console.error(error);\n }\n } else {\n if (existsSync(fullPath)) {\n rmSync(fullPath, { recursive: true, force: true });\n }\n }\n}\n\n/**\n * 递归复制文件夹\n *\n * @param sourceDir - 源文件夹路径\n * @param destinationDir - 目标文件夹路径\n */\nasync function copyFolderRecursive(sourceDir: string, destinationDir: string) {\n try {\n if (!existsSync(destinationDir)) {\n mkdirSync(destinationDir, { recursive: true });\n }\n\n const items = readdirSync(sourceDir);\n\n for (const item of items) {\n const src = join(sourceDir, item);\n const dest = join(destinationDir, item);\n const stat = statSync(src);\n\n if (stat.isDirectory()) {\n await copyFolderRecursive(src, dest);\n } else {\n copyFileSync(src, dest);\n }\n }\n } catch (error) {\n console.error(\n kleur.red('\\n 😡😡😡 An error occurred during the template download, please try again'),\n error,\n );\n process.exit(1);\n }\n}\n\n/**\n * 下载并解压 NPM 包模板\n *\n * @param packageURL - 包的下载链接\n * @param packageName - 包名\n * @param projectName - 创建的项目目录名\n */\nexport async function getNpmPackage(\n packageURL: string,\n packageName: string,\n projectName: string,\n): Promise<void> {\n const spinner = createSpinner(kleur.bold().cyan('Creating a project...')).start();\n\n try {\n const response = await fetch(packageURL);\n\n if (!response.ok) {\n throw new Error(`Failed to download package: ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n\n const currentDir = resolveApp(projectName);\n const tgzPath = join(currentDir, `${packageName}-${packageVersion}.tgz`);\n writeFileSync(tgzPath, buffer);\n\n await tar.extract({\n file: tgzPath,\n cwd: currentDir,\n });\n\n unlinkSync(tgzPath);\n await copyFolderRecursive(join(projectName, 'package/template'), projectName);\n await removeDirectory(join(projectName, 'package'), false);\n\n spinner.success({ text: kleur.bold().green('Project creation successful') });\n } catch (error) {\n spinner.error({ text: kleur.bold().red('Project creation failed') });\n console.error('Error:', error);\n process.exit(1);\n }\n}\n","interface ISelectType {\n value: string;\n label: string;\n hint?: string;\n}\n\nfunction createSelectType(value: string, hint?: string): ISelectType {\n const result: ISelectType = { value, label: value };\n\n if (hint !== undefined) {\n result.hint = hint;\n }\n\n return result;\n}\n\n// 优化后只保留两个可用的模板库\nexport const ProjectTypes: ISelectType[] = [\n createSelectType('react-web-js', 'React + JavaScript Web应用程序 🚀'),\n createSelectType('react-web-ts', 'React + TypeScript Web应用程序 🚀'),\n];\n\nexport const PackageManagers: ISelectType[] = [\n { value: 'npm', label: 'npm' },\n { value: 'yarn', label: 'yarn' },\n { value: 'pnpm', label: 'pnpm' },\n { value: 'cnpm', label: 'cnpm' },\n];\n","import { execSync } from 'node:child_process';\n\n/**\n * 检查当前系统是否已安装 Git。\n *\n * @returns `true` 表示 Git 已安装,`false` 表示未安装。\n *\n * @example\n * ```ts\n * if (checkGitInstallation()) {\n * console.log('Git is available.');\n * } else {\n * console.log('Please install Git.');\n * }\n * ```\n */\nexport default function checkGitInstallation(): boolean {\n try {\n // 尝试静默执行 git --version,如果命令执行失败将抛出异常\n execSync('git --version', { stdio: 'ignore' });\n\n return true;\n } catch {\n return false;\n }\n}\n","import boxen from 'boxen';\nimport kleur from 'kleur';\n\nexport default function createSuccessInfo(name: string, packageManage: string) {\n const END_MSG = `${kleur.blue(\n '🎉 created project ' + kleur.green(name) + ' Successfully',\n )}\\n\\n 🙏 Thanks for using Create-Crack !`;\n\n const BOXEN_CONFIG = {\n padding: 1,\n margin: { top: 1, bottom: 1 },\n borderColor: 'cyan',\n align: 'center',\n borderStyle: 'double',\n title: '🚀 Congratulations',\n titleAlignment: 'center',\n };\n\n process.stdout.write(boxen(END_MSG, BOXEN_CONFIG as any));\n\n console.log('👉 Get started with the following commands:');\n console.log(`\\n\\r\\r cd ${kleur.cyan(name)}`);\n console.log(`\\r\\r ${kleur.cyan(packageManage)} start \\r\\n`);\n}\n","import { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'node:path';\n\nimport { PackageJsonType } from '../types';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * 获取并解析指定路径下的 package.json 文件。\n *\n * @param relativePath - 相对于当前模块目录的路径(当 `isFromCurrentDir` 为 `true` 时)\n * @param isFromCurrentDir - 如果为 `true`,则路径基于当前文件目录;否则视为绝对路径或调用方自定义路径\n * @returns 返回解析后的 package.json 内容对象\n *\n * @example\n * ```ts\n * const pkg = getPackageJsonInfo('../package.json', true);\n * console.log(pkg.name);\n * ```\n */\nfunction getPackageJsonInfo(relativePath: string, isFromCurrentDir: boolean): PackageJsonType {\n const filePath = isFromCurrentDir ? join(__dirname, relativePath) : relativePath;\n const content = readFileSync(filePath, 'utf-8');\n\n return JSON.parse(content) as PackageJsonType;\n}\n\nexport default getPackageJsonInfo;\n","import { join } from 'node:path';\nimport { writeFileSync, existsSync, copyFileSync, readdirSync, statSync, mkdirSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { dirname } from 'node:path';\nimport kleur from 'kleur';\n\nimport { PackageJsonType } from '../types';\nimport getPackageJsonInfo from './package_info.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * 递归复制文件夹\n *\n * @param sourceDir - 源文件夹路径\n * @param destinationDir - 目标文件夹路径\n */\nconst copyFolderRecursive = (sourceDir: string, destinationDir: string) => {\n try {\n if (!existsSync(destinationDir)) {\n mkdirSync(destinationDir, { recursive: true });\n }\n\n const items = readdirSync(sourceDir);\n\n for (const item of items) {\n const src = join(sourceDir, item);\n const dest = join(destinationDir, item);\n const stat = statSync(src);\n\n if (stat.isDirectory()) {\n copyFolderRecursive(src, dest);\n } else {\n copyFileSync(src, dest);\n }\n }\n } catch (error) {\n console.error(kleur.red('❌ 复制 husky 模板文件时出错:'), error);\n process.exit(1);\n }\n};\n\n/**\n * 为指定项目集成 commitlint 和相关 husky 配置。\n *\n * @param projectName - 项目目录名\n *\n * @example\n * ```ts\n * createCommitlint('my-app');\n * ```\n */\nexport default function createCommitlint(projectName: string): void {\n try {\n // 复制 husky 模板文件\n const huskyTemplateSource = join(__dirname, '../template/template-husky');\n\n if (existsSync(huskyTemplateSource)) {\n copyFolderRecursive(huskyTemplateSource, projectName);\n console.log('✅ Husky 模板文件已复制');\n } else {\n console.warn('⚠️ Husky 模板目录未找到');\n\n return;\n }\n\n // 使用绝对路径\n const targetPackagePath = join(projectName, 'package.json');\n const huskyTemplatePath = join(__dirname, './package/husky.json');\n\n console.log(`读取 husky 模板: ${huskyTemplatePath}`);\n console.log(`读取项目 package.json: ${targetPackagePath}`);\n\n const huskyConfig = getPackageJsonInfo(huskyTemplatePath, false);\n const projectPackageJson: PackageJsonType = getPackageJsonInfo(targetPackagePath, false);\n\n // 合并 husky 配置到项目的 package.json 中\n for (const key in huskyConfig) {\n const sourceValue = huskyConfig[key];\n const targetValue = projectPackageJson[key];\n\n if (typeof sourceValue === 'object' && !Array.isArray(sourceValue)) {\n projectPackageJson[key] = {\n ...targetValue,\n ...sourceValue,\n };\n } else if (Array.isArray(sourceValue)) {\n projectPackageJson[key] = [...sourceValue, ...(targetValue ?? [])];\n } else {\n projectPackageJson[key] = sourceValue;\n }\n }\n\n writeFileSync(targetPackagePath, JSON.stringify(projectPackageJson, null, 2), 'utf-8');\n console.log('✅ Commit Lint 配置已成功合并到 package.json');\n } catch (error) {\n console.error('❌ 创建 Commit Lint 配置时出错:', error);\n process.exit(1);\n }\n}\n","/**\n * 包版本管理配置\n */\n\n// 需要动态更新版本的自有包列表\nexport const PACKAGES_TO_UPDATE = [\n '@verve-kit/react-script',\n // 可以在这里添加更多需要动态更新的自有包\n];\n","import os from 'node:os';\nimport { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport kleur from 'kleur';\n\nimport getPackageJsonInfo from './package_info.js';\nimport type { PackageJsonType } from '../types';\nimport { PACKAGES_TO_UPDATE } from './package-versions';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// 添加调试信息\nconsole.log('create_file.ts __dirname:', __dirname);\n\n/**\n * 获取 npm 包的最新版本\n *\n * @param packageName - 包名\n * @returns Promise<string> - 最新版本号,如果获取失败则返回默认版本\n */\nasync function getLatestPackageVersion(packageName: string): Promise<string | null> {\n try {\n const response = await fetch(`https://registry.npmjs.org/${packageName}/latest`);\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data = await response.json();\n\n return `^${data.version}`;\n } catch (error) {\n console.warn(kleur.yellow(`⚠️ 无法获取 ${packageName} 的最新版本,跳过更新`));\n console.warn(kleur.gray(`错误信息: ${error}`));\n\n return null;\n }\n}\n\n/**\n * 更新包依赖的版本号为最新版本\n *\n * @param packageJson - package.json 对象\n * @returns Promise<PackageJsonType> - 更新后的 package.json 对象\n */\nasync function updatePackageVersions(packageJson: PackageJsonType): Promise<PackageJsonType> {\n console.log(kleur.cyan('🔄 正在获取最新包版本...'));\n\n const packagesToUpdate = PACKAGES_TO_UPDATE;\n\n // 并发获取所有包的最新版本\n const versionPromises = packagesToUpdate.map(async (packageName) => {\n const version = await getLatestPackageVersion(packageName);\n\n return { packageName, version };\n });\n\n try {\n const versionResults = await Promise.all(versionPromises);\n\n // 更新 dependencies\n if (packageJson.dependencies) {\n for (const { packageName, version } of versionResults) {\n if (version && packageJson.dependencies[packageName]) {\n packageJson.dependencies[packageName] = version;\n console.log(kleur.green(`✅ 更新 ${packageName}: ${version}`));\n }\n }\n }\n\n // 更新 devDependencies\n if (packageJson.devDependencies) {\n for (const { packageName, version } of versionResults) {\n if (version && packageJson.devDependencies[packageName]) {\n packageJson.devDependencies[packageName] = version;\n console.log(kleur.green(`✅ 更新 ${packageName}: ${version}`));\n }\n }\n }\n\n console.log(kleur.green('🎉 包版本更新完成'));\n } catch (error) {\n console.error(kleur.red('❌ 更新包版本时出错:'), error);\n }\n\n return packageJson;\n}\n\n/**\n * 合并 ESLint 配置到 package.json 中\n *\n * @param packageJson - 基础的 package.json 对象\n * @returns 合并了 ESLint 配置的 package.json 对象\n */\nfunction mergeEslintConfig(packageJson: PackageJsonType): PackageJsonType {\n try {\n const eslintConfigPath = join(__dirname, './package/eslint.json');\n const eslintConfig = getPackageJsonInfo(eslintConfigPath, false);\n\n if (!eslintConfig) {\n console.warn('⚠️ ESLint 配置文件未找到,跳过 ESLint 配置合并');\n\n return packageJson;\n }\n\n // 合并 scripts\n if (eslintConfig.scripts) {\n packageJson.scripts = {\n ...packageJson.scripts,\n ...eslintConfig.scripts,\n };\n }\n\n // 合并 devDependencies\n if (eslintConfig.devDependencies) {\n packageJson.devDependencies = {\n ...packageJson.devDependencies,\n ...eslintConfig.devDependencies,\n };\n }\n\n // 合并 lint-staged\n if (eslintConfig['lint-staged']) {\n packageJson['lint-staged'] = eslintConfig['lint-staged'];\n }\n\n console.log('✅ ESLint 配置已成功合并到 package.json');\n\n return packageJson;\n } catch (error) {\n console.error('❌ 合并 ESLint 配置时出错:', error);\n\n return packageJson;\n }\n}\n\n/**\n * 创建指定类型项目的 `package.json` 对象。\n *\n * @param projectType - 模板类型(如:react、vue、node 等)\n * @param projectName - 项目名称,会被写入到 `package.json.name`\n * @param enableEslint - 是否启用 ESLint 配置\n * @returns 返回已定制的 `package.json` 对象\n *\n * @example\n * ```ts\n * const pkg = createPackageJson('react-web-ts', 'my-app', true);\n * console.log(pkg.name); // 'my-app'\n * ```\n */\nasync function createPackageJson(\n projectType: string,\n projectName: string,\n enableEslint: boolean = false,\n): Promise<PackageJsonType> {\n try {\n // 从 package 目录读取对应项目类型的 JSON 文件\n const templatePath = join(__dirname, `./package/${projectType}.json`);\n console.log(`尝试读取模板: ${templatePath}`);\n\n const packageInfo = getPackageJsonInfo(templatePath, false);\n if (!packageInfo) throw new Error('Package info is undefined');\n\n packageInfo.author = os.userInfo().username;\n packageInfo.name = projectName;\n\n // 更新包版本为最新版本\n const updatedPackageInfo = await updatePackageVersions(packageInfo);\n\n // 如果启用了 ESLint,合并 ESLint 配置\n if (enableEslint) {\n return mergeEslintConfig(updatedPackageInfo);\n }\n\n return updatedPackageInfo;\n } catch (error) {\n console.error(`❌ Failed to create package.json for \"${projectType}\"`);\n console.error(error);\n process.exit(1);\n }\n}\n\n/**\n * 读取模板目录中的任意 JSON 文件为字符串内容。\n *\n * @param fileName - 模板文件名(例如:`config.json`)\n * @returns 返回文件内容的字符串\n *\n * @example\n * ```ts\n * const config = createTemplateFile('vite.config.json');\n * console.log(JSON.parse(config));\n * ```\n */\nfunction createTemplateFile(fileName: string): string {\n const filePath = join(__dirname, `./package/${fileName}`);\n\n return readFileSync(filePath, 'utf-8');\n}\n\nexport { createPackageJson, createTemplateFile };\n","import { resolveApp } from '@verve-kit/utils';\nimport { existsSync, writeFileSync, mkdirSync, copyFileSync, readdirSync, statSync } from 'node:fs';\nimport { execSync, exec } from 'node:child_process';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { confirm, intro, select } from '@clack/prompts';\nimport kleur from 'kleur';\nimport { createSpinner } from 'nanospinner';\n\nimport { removeDirectory } from './file_controller';\nimport { ProjectTypes, PackageManagers } from './question';\nimport isGitInstalled from './check_git_installation';\nimport createSuccessInfo from './create_success_info';\nimport createCommitlint from './create_commit_lint';\nimport { createPackageJson, createTemplateFile } from './create_file';\n\n// 获取当前文件的目录路径\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * 设置 Ctrl+C 退出监听(仅限终端环境)\n */\nif (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n process.stdin.on('data', (key) => {\n if (key[0] === 3) {\n console.log('⌨️ Ctrl+C pressed - Exiting the program');\n process.exit(1);\n }\n });\n}\n\n/**\n * 创建项目根目录,如有同名文件则询问是否覆盖\n *\n * @param name - 项目名\n * @param force - 是否强制覆盖\n */\nconst makeDirectory = async (name: string, { force }: { force: boolean }) => {\n const root = resolveApp(name);\n\n if (existsSync(root) && !force) {\n const shouldOverwrite = await confirm({\n message: 'Target directory already exists. Overwrite?',\n });\n if (!shouldOverwrite) process.exit(1);\n await removeDirectory(name, true);\n }\n\n mkdirSync(root, { recursive: true });\n};\n\n/**\n * 收集用户交互选择的信息\n */\nconst getTableInfo = async (options: any) => {\n let projectType: string;\n let packageManager: string;\n let enableEslint: boolean;\n let commitLint: boolean;\n\n // 检查是否提供了模板参数\n if (options.template) {\n if (!['react-web-js', 'react-web-ts'].includes(options.template)) {\n console.error(kleur.red(`❌ 无效的模板类型: ${options.template}`));\n console.error(kleur.yellow('可用的模板: react-web-js, react-web-ts'));\n process.exit(1);\n }\n\n projectType = options.template;\n } else {\n projectType = (await select({\n message: '🎯 选择项目类型:',\n options: ProjectTypes,\n })) as string;\n }\n\n // 检查是否提供了包管理器参数\n if (options.packageManager) {\n if (!['npm', 'yarn', 'pnpm', 'cnpm'].includes(options.packageManager)) {\n console.error(kleur.red(`❌ 无效的包管理器: ${options.packageManager}`));\n console.error(kleur.yellow('可用的包管理器: npm, yarn, pnpm, cnpm'));\n process.exit(1);\n }\n\n packageManager = options.packageManager;\n } else {\n packageManager = (await select({\n message: '📦 选择包管理器:',\n options: PackageManagers,\n })) as string;\n }\n\n // 检查 ESLint 选项\n if (options.eslint !== undefined) {\n enableEslint = options.eslint;\n } else {\n enableEslint = (await confirm({\n message: '🔍 是否启用 ESLint 代码检查?',\n })) as boolean;\n }\n\n // 检查 Commit Lint 选项\n if (options.commitLint !== undefined) {\n commitLint = options.commitLint;\n } else {\n commitLint = (await confirm({\n message: '📝 是否启用 Commit Lint 配置?',\n })) as boolean;\n }\n\n return { projectType, packageManager, enableEslint, commitLint };\n};\n\n/**\n * 创建 ESLint 配置文件\n *\n * @param root - 项目根目录路径\n */\nconst createEslintConfig = (root: string) => {\n try {\n const eslintConfigSource = join(__dirname, '../template/eslint/eslint.config.mjs');\n const eslintConfigDest = join(root, 'eslint.config.mjs');\n\n if (existsSync(eslintConfigSource)) {\n copyFileSync(eslintConfigSource, eslintConfigDest);\n console.log('✅ ESLint 配置文件已创建');\n } else {\n console.warn('⚠️ ESLint 配置模板文件未找到');\n }\n } catch (error) {\n console.error('❌ 创建 ESLint 配置文件时出错:', error);\n }\n};\n\n/**\n * 递归复制文件夹\n *\n * @param sourceDir - 源文件夹路径\n * @param destinationDir - 目标文件夹路径\n */\nconst copyFolderRecursive = (sourceDir: string, destinationDir: string) => {\n try {\n if (!existsSync(destinationDir)) {\n mkdirSync(destinationDir, { recursive: true });\n }\n\n const items = readdirSync(sourceDir);\n\n for (const item of items) {\n const src = join(sourceDir, item);\n const dest = join(destinationDir, item);\n const stat = statSync(src);\n\n if (stat.isDirectory()) {\n copyFolderRecursive(src, dest);\n } else {\n copyFileSync(src, dest);\n }\n }\n } catch (error) {\n console.error(kleur.red('❌ 复制模板文件时出错:'), error);\n process.exit(1);\n }\n};\n\n/**\n * 复制本地模板到项目目录\n *\n * @param projectType - 项目类型\n * @param projectRoot - 项目根目录\n */\nconst copyLocalTemplate = (projectType: string, projectRoot: string) => {\n const spinner = createSpinner(kleur.bold().cyan('正在复制项目模板...')).start();\n\n try {\n const templateSource = join(__dirname, `../template/template-${projectType}`);\n\n if (!existsSync(templateSource)) {\n throw new Error(`模板目录不存在: ${templateSource}`);\n }\n\n copyFolderRecursive(templateSource, projectRoot);\n spinner.success({ text: kleur.bold().green('✅ 项目模板复制成功') });\n } catch (error) {\n spinner.error({ text: kleur.bold().red('❌ 项目模板复制失败') });\n console.error('Error:', error);\n process.exit(1);\n }\n};\n\n/**\n * 创建项目主流程\n *\n * @param name - 项目名\n * @param options - 控制参数\n */\nexport default async function createApp(name: string, options: any) {\n intro(kleur.green(' 🚧 Create Your App - 项目脚手架工具 '));\n\n const root = resolveApp(name);\n await makeDirectory(name, options);\n\n // 检查是否使用了命令行参数(非交互模式)\n const isNonInteractive =\n options.template ||\n options.packageManager ||\n options.eslint !== undefined ||\n options.commitLint !== undefined;\n\n if (!isNonInteractive) {\n console.log(kleur.cyan('\\n📋 请选择项目配置:\\n'));\n }\n\n const { projectType, packageManager, enableEslint, commitLint } = await getTableInfo(options);\n\n console.log(kleur.yellow('\\n🔧 正在创建项目...'));\n console.log(kleur.gray(`📁 项目名称: ${name}`));\n console.log(kleur.gray(`🎯 项目类型: ${projectType}`));\n console.log(kleur.gray(`📦 包管理器: ${packageManager}`));\n console.log(kleur.gray(`🔍 ESLint: ${enableEslint ? '启用' : '禁用'}`));\n console.log(kleur.gray(`📝 Commit Lint: ${commitLint ? '启用' : '禁用'}`));\n\n // 写入 package.json\n const pkg = await createPackageJson(projectType, name, enableEslint);\n writeFileSync(join(root, 'package.json'), JSON.stringify(pkg, null, 2));\n\n // 写入 .gitignore\n writeFileSync(join(root, '.gitignore'), createTemplateFile('gitignore'));\n\n // 复制本地模板文件\n copyLocalTemplate(projectType, root);\n\n // 注入 lint 配置\n if (commitLint) {\n createCommitlint(root);\n }\n\n // 创建 ESLint 配置文件\n if (enableEslint) {\n createEslintConfig(root);\n }\n\n // 安装依赖\n const spinner = createSpinner(kleur.bold('Installing dependencies...')).start();\n exec(`${packageManager} install`, { cwd: root }, (err) => {\n if (err) {\n spinner.error({ text: kleur.red('Failed to install dependencies') });\n console.error(err);\n process.exit(1);\n } else {\n spinner.success({ text: kleur.green('✅ Project initialization complete') });\n\n // 显示项目创建成功的详细信息\n console.log(kleur.green('\\n🎉 项目创建成功!\\n'));\n console.log(kleur.cyan('📦 已安装的功能:'));\n console.log(\n kleur.gray(\n ` • ${projectType === 'react-web-ts' ? 'React + TypeScript' : 'React + JavaScript'} 项目模板`,\n ),\n );\n\n if (enableEslint) {\n console.log(kleur.gray(' • ESLint 代码检查工具'));\n }\n\n if (commitLint) {\n console.log(kleur.gray(' • Commit Lint 提交规范'));\n }\n\n createSuccessInfo(name, packageManager);\n }\n });\n\n // 初始化 Git 仓库\n if (isGitInstalled()) {\n execSync('git init', { cwd: root });\n }\n}\n","#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport kleur from 'kleur';\n\nimport createApp from './core/create_app.js';\nimport getPackageJsonInfo from './core/package_info.js';\n\nconst program = new Command();\n\nprogram\n .version(kleur.green(getPackageJsonInfo('../package.json', true).version || '1.0.0'))\n .arguments('<project-name>')\n .description(kleur.cyan('Create a directory for your project files'))\n .option('-f, --force', 'Overwrite target directory if it exists')\n .option('-t, --template <template>', 'Project template (react-web-js | react-web-ts)')\n .option('-p, --package-manager <manager>', 'Package manager (npm | yarn | pnpm | cnpm)')\n .option('-e, --eslint', 'Enable ESLint configuration')\n .option('-c, --commit-lint', 'Enable Commit Lint configuration')\n .option('--no-eslint', 'Disable ESLint configuration')\n .option('--no-commit-lint', 'Disable Commit Lint configuration')\n .addHelpText(\n 'after',\n `\n\n${kleur.yellow('Examples:')}\n ${kleur.gray('# Interactive mode (default)')}\n $ create-crack my-app\n\n ${kleur.gray('# Non-interactive mode with all options')}\n $ create-crack my-app -t react-web-ts -p pnpm -e -c\n\n ${kleur.gray('# Create React JS project with npm and ESLint')}\n $ create-crack my-app --template react-web-js --package-manager npm --eslint\n\n ${kleur.gray('# Create project without ESLint and Commit Lint')}\n $ create-crack my-app -t react-web-ts -p yarn --no-eslint --no-commit-lint\n\n${kleur.yellow('Available Templates:')}\n ${kleur.cyan('react-web-js')} - React + JavaScript Web应用程序\n ${kleur.cyan('react-web-ts')} - React + TypeScript Web应用程序\n\n${kleur.yellow('Available Package Managers:')}\n ${kleur.cyan('npm')} - Node Package Manager\n ${kleur.cyan('yarn')} - Yarn Package Manager \n ${kleur.cyan('pnpm')} - PNPM Package Manager\n ${kleur.cyan('cnpm')} - CNPM Package Manager\n`,\n )\n .action((name, options) => {\n createApp(name, options);\n })\n .parse(process.argv);\n"],"names":["template","packageVersion","getProjectLink","templates","Map","map","removeDirectory","directoryPath","verbose","fullPath","resolveApp","spinner","createSpinner","kleur","bold","cyan","start","existsSync","rmSync","recursive","force","success","text","green","error","red","console","createSelectType","value","hint","result","label","undefined","ProjectTypes","PackageManagers","checkGitInstallation","execSync","stdio","createSuccessInfo","name","packageManage","END_MSG","blue","BOXEN_CONFIG","padding","margin","top","bottom","borderColor","align","borderStyle","title","titleAlignment","process","stdout","write","boxen","log","__filename","fileURLToPath","url","__dirname","dirname","getPackageJsonInfo","relativePath","isFromCurrentDir","filePath","join","content","readFileSync","JSON","parse","copyFolderRecursive","sourceDir","destinationDir","mkdirSync","items","readdirSync","item","src","dest","stat","statSync","isDirectory","copyFileSync","exit","createCommitlint","projectName","huskyTemplateSource","warn","targetPackagePath","huskyTemplatePath","huskyConfig","projectPackageJson","key","sourceValue","targetValue","Array","isArray","writeFileSync","stringify","PACKAGES_TO_UPDATE","getLatestPackageVersion","packageName","response","fetch","ok","Error","status","data","json","version","yellow","gray","updatePackageVersions","packageJson","packagesToUpdate","versionPromises","versionResults","Promise","all","dependencies","devDependencies","mergeEslintConfig","eslintConfigPath","eslintConfig","scripts","createPackageJson","projectType","enableEslint","templatePath","packageInfo","author","os","userInfo","username","updatedPackageInfo","createTemplateFile","fileName","stdin","isTTY","setRawMode","on","makeDirectory","root","shouldOverwrite","confirm","message","getTableInfo","options","packageManager","commitLint","includes","select","eslint","createEslintConfig","eslintConfigSource","eslintConfigDest","copyLocalTemplate","projectRoot","templateSource","createApp","intro","isNonInteractive","pkg","exec","cwd","err","isGitInstalled","program","Command","arguments","description","option","addHelpText","action","argv"],"mappings":"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"} |
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
1
-50%124076
-33.79%9
28.57%2
100%43
-2.27%1438
-27.99%+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
- Removed
Updated