zixulu 1.76.0 → 1.76.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +31 -17
- package/dist/index.js.map +1 -1
- package/dist/src/utils/pullDockerImage.d.ts +1 -1
- package/dist/src/utils/updateDockerCompose.d.ts +31 -0
- package/package.json +1 -1
- package/src/index.ts +2 -2
- package/src/utils/pullDockerImage.ts +9 -6
- package/src/utils/updateDockerCompose.ts +47 -8
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/utils/addGitCommit.ts","../src/utils/hasChangeNoCommit.ts","../src/utils/isRepository.ts","../src/utils/shouldContinue.ts","../src/utils/backupFirst.ts","../src/utils/actionWithBackup.ts","../src/constant/index.ts","../src/utils/getPackageManager.ts","../src/utils/readBunConfig.ts","../src/utils/getRegistry.ts","../src/utils/isStableVersion.ts","../src/utils/getPackageRequiredVersion.ts","../src/utils/getPackageJsonPath.ts","../src/utils/readPackageJson.ts","../src/utils/retry.ts","../src/utils/writeJson.ts","../src/utils/writePackageJson.ts","../src/utils/addDependency.ts","../src/utils/addAntd.ts","../src/utils/addApi.ts","../src/utils/getCommitMessage.ts","../src/utils/addRuleToGitIgnore.ts","../src/utils/hasDependency.ts","../src/utils/insertWhen.ts","../src/utils/addBuildDocker.ts","../src/utils/sortArrayOrObject.ts","../src/utils/addScript.ts","../src/utils/installDependceny.ts","../src/utils/addEslint.ts","../src/utils/addGitAttributes.ts","../src/utils/addGitignore.ts","../src/utils/addHusky.ts","../src/utils/getFiles.ts","../src/utils/getRelativePath.ts","../src/utils/getTsFile.ts","../src/utils/getTsConfigPath.ts","../src/utils/readTsConfig.ts","../src/utils/writeTsConfig.ts","../src/utils/addPathAlias.ts","../src/utils/addPrettier.ts","../src/utils/addPrisma.ts","../src/utils/addStartScript.ts","../src/utils/addSyncPackageScript.ts","../src/utils/preprocessRegex.ts","../src/utils/addTag.ts","../src/utils/addPostCSSConfig.ts","../src/utils/addTailwindConfig.ts","../src/utils/getEntryCssDir.ts","../src/utils/createEntryCss.ts","../src/utils/addTailwindToCss.ts","../src/utils/addTailwind.ts","../src/utils/addZipDist.ts","../src/utils/getTypeInGenerics.ts","../src/utils/arrowToFunction.ts","../src/utils/betaVersion.ts","../src/utils/checkType.ts","../src/utils/clearDockerImage.ts","../src/utils/clearDockerLog.ts","../src/utils/code2Snippet.ts","../src/utils/createBrowserlistrc.ts","../src/utils/createPrismaDebugger.ts","../src/utils/getFilename.ts","../src/utils/download.ts","../src/utils/sleep.ts","../src/utils/downloadFromWinget.ts","../src/utils/download7Zip.ts","../src/utils/downloadAnydesk.ts","../src/utils/getLatestRelease.ts","../src/utils/downloadBun.ts","../src/utils/downloadChrome.ts","../src/utils/downloadFromPCQQ.ts","../src/utils/downloadDeskGo.ts","../src/utils/downloadFirefox.ts","../src/utils/downloadGeekUninstaller.ts","../src/utils/downloadGit.ts","../src/utils/downloadHoneyview.ts","../src/utils/downloadNodeJS.ts","../src/utils/downloadPeazip.ts","../src/utils/downloadPotPlayer.ts","../src/utils/downloadPowerShell.ts","../src/utils/downloadPowerToys.ts","../src/utils/downloadVscode.ts","../src/utils/readZixuluSetting.ts","../src/utils/writeZixuluSetting.ts","../src/utils/downloadLatestSoftware.ts","../src/utils/getPackageVersionInDependcy.ts","../src/utils/downloadNpm.ts","../src/utils/generatePrisma.ts","../src/utils/getHeaders.ts","../src/utils/initNode.ts","../src/utils/next.ts","../src/utils/getDependcy.ts","../src/utils/checkTailwind.ts","../src/utils/writeRsbuildConfig.ts","../src/utils/rsbuild.ts","../src/utils/setTsConfig.ts","../src/utils/vite.ts","../src/utils/initProject.ts","../src/utils/isUrl.ts","../src/utils/readZixuluCache.ts","../src/utils/removeZixuluCache.ts","../src/utils/writeZixuluCache.ts","../src/utils/sudoCommand.ts","../src/utils/unique.ts","../src/utils/setDockerRegistry.ts","../src/utils/installDocker.ts","../src/utils/splitExtendsType.ts","../src/utils/interfaceToType.ts","../src/utils/json2type.ts","../src/utils/processInfo.ts","../src/utils/killProcessByPort.ts","../src/utils/pnpm.ts","../src/utils/readPackageJsonSync.ts","../src/utils/reinstall.ts","../src/utils/removeComment.ts","../src/utils/removeFileOrFolderFromGit.ts","../src/utils/removeLock.ts","../src/utils/removeTag.ts","../src/utils/isAsset.ts","../src/utils/replaceAssets.ts","../src/utils/replaceCommitAuthor.ts","../src/utils/replaceCommitMessage.ts","../src/utils/replaceTag.ts","../src/utils/rollup.ts","../src/utils/rslib.ts","../src/utils/serverToAction.ts","../src/utils/writeBunConfig.ts","../src/utils/setBun.ts","../src/utils/setEnv.ts","../src/utils/setFatherConfig.ts","../src/utils/setGitProxy.ts","../src/utils/setGlobalConfig.ts","../src/utils/setRegistry.ts","../src/utils/isShellProxy.ts","../src/utils/setShellProxy.ts","../src/utils/sortPackageJson.ts","../src/utils/syncAgentRules.ts","../src/utils/syncCursorExtToCode.ts","../src/utils/getEditorExtensions.ts","../src/utils/hasAntiGravity.ts","../src/utils/hasCode.ts","../src/utils/hasCursor.ts","../src/utils/modifyJsonc.ts","../src/utils/syncEditorSetting.ts","../src/utils/downloadVscodeExts.ts","../src/utils/syncVscode.ts","../src/utils/tailwindPatch.ts","../src/utils/tar.ts","../src/utils/test.ts","../src/utils/updateDockerCompose.ts","../src/utils/getPackageVersionFromRange.ts","../src/utils/getPackageUpgradeVersion.ts","../src/utils/getUpgradeDependencyConfig.ts","../src/utils/upgradeDependency.ts","../src/utils/getPackageLatestVersion.ts","../src/utils/upgradeRsbuild.ts","../src/utils/upgradeTailwind.ts","../src/utils/upgradeWorkspaceDependceny.ts","../src/utils/verdaccio.ts","../src/utils/winget.ts","../src/utils/addOpenWith.ts","../src/utils/gdm.ts","../src/utils/pullDockerImage.ts","../src/utils/removeOpenWith.ts","../src/index.ts"],"sourcesContent":["import consola from \"consola\"\nimport { execAsync } from \"soda-nodejs\"\n\nexport interface AddGitCommitParams {\n message: string\n cwd?: string\n}\n\n/**\n * 添加 git 提交\n * @param message 提交信息\n */\nexport async function addGitCommit(messageOrParams: string | AddGitCommitParams) {\n const { message, cwd } = typeof messageOrParams === \"string\" ? { message: messageOrParams } : messageOrParams\n consola.start(\"提交代码\")\n await execAsync(\"git add .\", { cwd })\n await execAsync(`git commit -m \"${message}\"`, { cwd })\n}\n","import { execAsync } from \"soda-nodejs\"\n\nexport async function hasChangeNoCommit(cwd?: string) {\n const status = await execAsync(\"git status\", { cwd })\n return !status.includes(\"nothing to commit, working tree clean\")\n}\n","import { execAsync } from \"soda-nodejs\"\n\nexport async function isRepository() {\n try {\n await execAsync(\"git status\")\n return true\n } catch {\n return false\n }\n}\n","import inquirer from \"inquirer\"\n\n/**\n * 询问是否继续\n * @param message 询问信息\n * @returns 是否继续\n */\nexport async function shouldContinue(message = \"是否继续\"): Promise<boolean> {\n const { continue: cont } = await inquirer.prompt({\n type: \"confirm\",\n name: \"continue\",\n message,\n })\n return cont\n}\n","import { exit } from \"process\"\n\nimport consola from \"consola\"\n\nimport { hasChangeNoCommit } from \"./hasChangeNoCommit\"\nimport { isRepository } from \"./isRepository\"\nimport { shouldContinue } from \"./shouldContinue\"\n\n/**\n * 检查当前项目是否需要备份\n * 如果是 git 仓库且有未提交的更改,提示用户是否继续\n * 如果不是 git 仓库,建议用户备份代码\n *\n * @param forceRepo 是否强制要求是 git 仓库\n * @returns 如果是 git 仓库且检测到未提交的更改,选择继续则返回 true\n */\nexport async function backupFirst(forceRepo = false): Promise<true | void> {\n if (!(await isRepository())) {\n if (forceRepo) {\n consola.error(\"git 不可用\")\n throw new Error(\"git 不可用\")\n }\n\n consola.warn(\"建议使用前备份代码\")\n const cont = await shouldContinue()\n if (!cont) exit()\n return\n }\n\n if (await hasChangeNoCommit()) {\n consola.warn(\"建议使用前提交代码\")\n const cont = await shouldContinue()\n if (!cont) exit()\n return true\n }\n}\n","import consola from \"consola\"\nimport inquirer from \"inquirer\"\n\nimport { addGitCommit } from \"./addGitCommit\"\nimport { backupFirst } from \"./backupFirst\"\nimport { hasChangeNoCommit } from \"./hasChangeNoCommit\"\nimport { isRepository } from \"./isRepository\"\n\n/**\n * 包装一个操作,在执行前进行备份\n * @param action 要执行的操作\n * @param message 提交信息\n * @returns 包装后的函数\n */\nexport function actionWithBackup<T extends (...args: any[]) => Promise<string>>(action: T, message?: string): (...args: Parameters<T>) => Promise<void>\nexport function actionWithBackup<T extends (...args: any[]) => Promise<void>>(action: T, message: string): (...args: Parameters<T>) => Promise<void>\nexport function actionWithBackup(action: (...args: any[]) => Promise<string | void>, message?: string) {\n return async (...args: any[]) => {\n const skip = await backupFirst()\n const msg = await action(...args)\n if (!(await isRepository()) || skip || !(await hasChangeNoCommit())) return\n const { commit } = await inquirer.prompt({\n type: \"confirm\",\n name: \"commit\",\n message: \"是否自动提交代码\",\n default: true,\n })\n if (!commit) return\n let commitMessage: string\n\n if (typeof message === \"string\") commitMessage = message\n else {\n if (typeof msg === \"string\") commitMessage = msg\n else {\n consola.warn(\"请提供提交信息\")\n throw new Error(\"请提供提交信息\")\n }\n }\n\n await addGitCommit(commitMessage)\n }\n}\n","import { Agent } from \"http\"\n\nimport { HttpsProxyAgent } from \"https-proxy-agent\"\n\nexport enum PackageManager {\n npm = \"npm\",\n yarn = \"yarn\",\n pnpm = \"pnpm\",\n bun = \"bun\",\n}\n\nexport enum Registry {\n npm = \"https://registry.npmjs.com/\",\n taobao = \"https://registry.npmmirror.com/\",\n tencent = \"https://mirrors.cloud.tencent.com/npm/\",\n}\n\nexport enum Software {\n \"VS Code\" = \"VS Code\",\n \"Chrome\" = \"Chrome\",\n \"7zip\" = \"7zip\",\n \"PeaZip\" = \"PeaZip\",\n \"Git\" = \"Git\",\n \"NodeJS\" = \"NodeJS\",\n \"Geek Uninstaller\" = \"Geek Uninstaller\",\n \"DeskGo\" = \"DeskGo\",\n \"PowerToys\" = \"PowerToys\",\n \"Honeyview\" = \"Honeyview\",\n \"AnyDesk\" = \"AnyDesk\",\n \"Firefox\" = \"Firefox\",\n \"PotPlayer\" = \"PotPlayer\",\n \"Bun\" = \"Bun\",\n \"PowerShell\" = \"PowerShell\",\n}\n\nexport enum ProjectType {\n next = \"next\",\n remix = \"remix\",\n vite = \"vite\",\n rsbuild = \"rsbuild\",\n}\n\nexport enum CommitType {\n feature = \"feature\",\n fix = \"fix\",\n docs = \"docs\",\n wip = \"wip\",\n perfs = \"perfs\",\n rollback = \"rollback\",\n other = \"other\",\n}\n\nexport const CommitTypeMap = {\n [CommitType.feature]: \"✨feature: \",\n [CommitType.fix]: \"🐞 fix: \",\n [CommitType.docs]: \"📄 docs: \",\n [CommitType.wip]: \"🖥️ wip: \",\n [CommitType.perfs]: \"🚅 perfs: \",\n [CommitType.rollback]: \"⏪ rollback: \",\n [CommitType.other]: \"🔵 other: \",\n}\n\nexport const SpawnOptions = {\n shell: true,\n stdio: \"inherit\",\n}\n\nexport const agent = new HttpsProxyAgent(\"http://localhost:7890\") as Agent\n\nexport const addedRules = [\n \"package-lock.json\",\n \"pnpm-lock.yaml\",\n \"node_modules\",\n \"bun.lockb\",\n \"bun.lock\",\n \"dist*\",\n \"build\",\n \"yarn.lock\",\n \"yarn-error.log\",\n \".yarnrc.yml\",\n \".yarn\",\n \"test*\",\n]\n\nexport const isSudo = !!process.env.SUDO_USER\n","import { readdir } from \"fs/promises\"\n\nimport { getEnumValues } from \"deepsea-tools\"\nimport inquirer from \"inquirer\"\n\nimport { PackageManager } from \"@/constant\"\n\ndeclare global {\n var __ZIXULU_PACKAGE_MANAGER__: PackageManager | undefined\n}\n\n/**\n * 获取项目使用的包管理器\n * @param dir 项目目录,默认为当前目录\n * @returns 包管理器类型\n * @description\n * 1. 优先使用缓存的包管理器\n * 2. 通过锁文件判断使用的包管理器类型\n * 3. 如果无法判断,则提示用户选择\n */\nexport async function getPackageManager(dir = \".\"): Promise<PackageManager> {\n if (globalThis.__ZIXULU_PACKAGE_MANAGER__) return globalThis.__ZIXULU_PACKAGE_MANAGER__\n const dir2 = await readdir(dir)\n if (dir2.includes(\"yarn.lock\")) return PackageManager.yarn\n if (dir2.includes(\"package-lock.json\")) return PackageManager.npm\n if (dir2.includes(\"pnpm-lock.yaml\")) return PackageManager.pnpm\n if (dir2.includes(\"bun.lockb\") || dir2.includes(\"bun.lock\")) return PackageManager.bun\n\n type PromptResult = {\n manager: PackageManager\n }\n\n const { manager } = await inquirer.prompt<PromptResult>({\n type: \"list\",\n name: \"manager\",\n message: \"请选择包管理器\",\n choices: getEnumValues(PackageManager),\n })\n globalThis.__ZIXULU_PACKAGE_MANAGER__ = manager\n return manager\n}\n","import { existsSync } from \"fs\"\nimport { readFile } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\nimport { parse } from \"@iarna/toml\"\n\nexport async function readBunConfig() {\n const path = join(homedir(), \".bunfig.toml\")\n if (existsSync(path) === false) return {}\n const str = await readFile(join(homedir(), \".bunfig.toml\"), \"utf-8\")\n\n return parse(str) as any\n}\n","import { execAsync } from \"soda-nodejs\"\n\nimport { PackageManager } from \"@/constant\"\n\nimport { getPackageManager } from \"./getPackageManager\"\nimport { readBunConfig } from \"./readBunConfig\"\n\n/**\n * 获取当前包管理器使用的 registry 源地址\n * @returns registry URL\n * @description\n * 1. 优先使用缓存的 registry\n * 2. 如果使用 bun,尝试从 bun 配置中获取\n * 3. 否则通过命令行获取对应包管理器的 registry 配置\n */\nexport async function getRegistry() {\n if (global.__ZIXULU_REGISTRY__) return global.__ZIXULU_REGISTRY__\n const packageManager = await getPackageManager()\n\n if (packageManager === PackageManager.bun) {\n const config = await readBunConfig()\n if (config.install?.registry) return config.install.registry\n }\n\n const registry = await execAsync(\n `${packageManager === PackageManager.yarn || packageManager === PackageManager.pnpm ? packageManager : \"npm\"} config get registry`,\n )\n return registry\n}\n","export function isStableVersion(version: string) {\n return /^\\D*\\d+(\\.\\d+)*$/.test(version)\n}\n","import fetch from \"node-fetch\"\nimport semver from \"semver\"\n\nimport { agent } from \"@/constant\"\n\nimport { getRegistry } from \"./getRegistry\"\nimport { isStableVersion } from \"./isStableVersion\"\n\nexport interface Registry {\n _id: string\n _rev: string\n \"dist-tags\": Record<string, string>\n name: string\n time: Time\n versions: Record<string, Version>\n description: string\n license: string\n maintainers: NpmUser[]\n readme: string\n _source_registry_name: string\n keywords: string[]\n bugs: Bugs\n homepage: string\n repository: Repository\n}\n\nexport interface Repository {\n type: string\n url: string\n}\n\nexport interface Bugs {\n url: string\n}\n\nexport interface Version {\n name: string\n version: string\n main: string\n license: string\n type: string\n bin?: Record<string, string>\n scripts?: Record<string, string>\n devDependencies?: Record<string, string>\n dependencies?: Record<string, string>\n _id: string\n _nodeVersion: string\n _npmVersion: string\n dist: Dist\n _npmUser: NpmUser\n directories?: Record<string, string>\n maintainers: NpmUser[]\n _npmOperationalInternal: NpmOperationalInternal\n _hasShrinkwrap: boolean\n _cnpmcore_publish_time: string\n publish_time: number\n _source_registry_name: string\n}\n\nexport interface NpmOperationalInternal {\n host: string\n tmp: string\n}\n\nexport interface NpmUser {\n name: string\n email: string\n}\n\nexport interface Dist {\n integrity: string\n shasum: string\n tarball: string\n fileCount: number\n unpackedSize: number\n signatures: Signature[]\n size: number\n}\n\nexport interface Signature {\n keyid: string\n sig: string\n}\n\nexport type Time = {\n created: string\n modified: string\n [key: string]: string\n}\n\n/**\n * 获取 npm 包所有可用版本号列表\n * @param packageName npm 包名\n * @returns 版本号数组\n * @description\n * 通过 registry API 获取指定包的所有历史版本信息\n * 支持通过代理访问\n */\nexport async function getPackageRequiredVersion(packageName: string, versionRange?: string) {\n const registry = await getRegistry()\n const url = new URL(`/${packageName}`, registry)\n const response = await fetch(url, {\n agent: global.__ZIXULU_PROXY__ ? agent : undefined,\n })\n const data = (await response.json()) as Registry\n\n if (versionRange?.startsWith(\"@\")) {\n const version = versionRange.slice(1)\n\n // 先精确匹配版本\n let result = Object.keys(data.versions).find(item => item === version)\n\n if (result) return result\n // 再匹配 dist-tags 中的版本\n result = data[\"dist-tags\"][version]\n if (result) return result\n // 再匹配版本号开头匹配的版本\n result = Object.keys(data.versions)\n .filter(item => item.startsWith(version) && isStableVersion(item))\n .at(-1)\n if (result) return result\n throw new Error(`${packageName} 没有符合条件的版本`)\n }\n\n const result = Object.keys(data.versions)\n .filter(version => isStableVersion(version) && (!versionRange || semver.satisfies(version, versionRange)))\n .at(-1) as string | undefined\n if (!result) throw new Error(`${packageName} 没有符合条件的版本`)\n return result\n}\n","import { join } from \"path\"\n\n/**\n * 获取 package.json 的完整路径\n * @param dir 项目目录,默认为当前目录\n * @returns package.json 的完整路径\n */\nexport function getPackageJsonPath(dir = \".\") {\n return join(dir, \"package.json\")\n}\n","import { readFile } from \"fs/promises\"\n\nimport consola from \"consola\"\n\nimport { getPackageJsonPath } from \"./getPackageJsonPath\"\n\n/**\n * 读取 package.json\n * @param dir 目录\n * @returns package.json\n */\n\nexport async function readPackageJson(dir?: string): Promise<Record<string, any>> {\n try {\n const result = JSON.parse(await readFile(getPackageJsonPath(dir), \"utf-8\"))\n return result\n } catch (error) {\n consola.error(error)\n consola.fail(`读取 ${getPackageJsonPath(dir)} 失败`)\n throw new Error(\"读取 package.json 失败\")\n }\n}\n","export type RetryConfig<T> = {\n action: () => Promise<T>\n count?: number\n callback?: (error: unknown, current: number) => void\n}\n\nexport async function retry<T>(config: RetryConfig<T>): Promise<T>\nexport async function retry<T>(action: () => Promise<T>, count?: number): Promise<T>\nexport async function retry<T>(actionOrConfig: RetryConfig<T> | (() => Promise<T>), countNumber?: number) {\n let current = 1\n let {\n action,\n count = 2,\n\n callback,\n } = typeof actionOrConfig === \"function\" ? ({ action: actionOrConfig, count: countNumber } as RetryConfig<T>) : actionOrConfig\n\n async function _retry() {\n try {\n return await action()\n } catch (error) {\n callback?.(error, current)\n if (count === 1) throw error\n current++\n count--\n return await _retry()\n }\n }\n\n return await _retry()\n}\n","import { writeFile } from \"fs/promises\"\n\nexport type WriteJsonConfig = {\n data: Record<string, unknown> | unknown[]\n output: string\n}\n\nexport async function writeJson({ data, output }: WriteJsonConfig): Promise<void> {\n await writeFile(output, JSON.stringify(data, undefined, 4) + \"\\n\", \"utf-8\")\n}\n","import consola from \"consola\"\n\nimport { getPackageJsonPath } from \"./getPackageJsonPath\"\nimport { writeJson } from \"./writeJson\"\n\nexport type WritePackageJsonConfig = {\n data: Record<string, unknown>\n dir?: string\n}\n\n/** 写回 package.json */\nexport async function writePackageJson({ data, dir }: WritePackageJsonConfig): Promise<void> {\n try {\n await writeJson({ data, output: getPackageJsonPath(dir) })\n consola.success(\"修改 package.json 成功\")\n } catch (error) {\n consola.fail(\"修改 package.json 失败\")\n throw error\n }\n}\n","import consola from \"consola\"\n\nimport { getPackageRequiredVersion } from \"./getPackageRequiredVersion\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { retry } from \"./retry\"\nimport { writePackageJson } from \"./writePackageJson\"\n\n/** 依赖类型 */\nexport type DependencyType = \"dependencies\" | \"devDependencies\" | \"peerDependencies\" | \"optionalDependencies\"\n\nexport interface PackageVersion {\n packageName: string\n versionRange?: string\n}\n\n/** 添加依赖配置 */\nexport type AddDependenciesConfig = {\n /** 包名或包名列表 */\n package: string | PackageVersion | (string | PackageVersion)[]\n /** 依赖类型 */\n type?: DependencyType\n /** 项目目录 */\n dir?: string\n}\n\n/**\n * 写入依赖到 package.json\n * @param config 配置项\n * @returns 添加的包及其版本号\n */\nexport async function addDependency(config: AddDependenciesConfig): Promise<Record<string, string>> {\n try {\n const packages = (Array.isArray(config.package) ? config.package : [config.package]).map(item =>\n typeof item === \"string\" ? { packageName: item } : item)\n const { type = \"dependencies\", dir } = config\n const packageJson = await readPackageJson(dir)\n packageJson[type] ??= {}\n\n const addedPackages: Record<string, string> = {}\n\n for (const { packageName, versionRange } of packages) {\n if (\n packageJson.dependencies?.[packageName] ||\n packageJson.devDependencies?.[packageName] ||\n packageJson.peerDependencies?.[packageName] ||\n packageJson.optionalDependencies?.[packageName]\n ) {\n consola.warn(`${packageName} 已存在于依赖中`)\n continue\n }\n\n const version = await retry({\n action: () => getPackageRequiredVersion(packageName, versionRange),\n count: 4,\n callback: (error, current) => consola.error(`获取 ${packageName} 版本失败,第 ${current} 次重试`),\n })\n addedPackages[packageName] = version\n packageJson[type][packageName] ??= `^${version}`\n consola.success(`添加 ${packageName} 至依赖成功`)\n }\n\n const keys = Object.keys(packageJson[type])\n keys.sort()\n\n const sortedDependencies: Record<string, string> = {}\n\n for (const key of keys) sortedDependencies[key] = packageJson[type][key]\n\n packageJson[type] = sortedDependencies\n await writePackageJson({ data: packageJson, dir })\n return addedPackages\n } catch (error) {\n consola.error(error)\n throw error\n }\n}\n","import { mkdir, readdir, writeFile } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport consola from \"consola\"\n\nimport { addDependency } from \"./addDependency\"\nimport { readPackageJson } from \"./readPackageJson\"\n\n/**\n * 添加 antd 相关配置\n * 包括安装依赖、创建必要组件等\n */\nexport async function addAntd() {\n consola.start(\"开始添加 antd 配置\")\n await addDependency({\n package: [\"@ant-design/icons\", \"antd\"],\n })\n const dir = await readdir(\".\")\n const componentDir = dir.includes(\"src\") ? \"src/components\" : \"components\"\n await mkdir(componentDir, { recursive: true })\n const packageJson = await readPackageJson()\n\n if (packageJson.dependencies.next) await addDependency({ package: \"@ant-design/nextjs-registry\" })\n else await addDependency({ package: \"@ant-design/cssinjs\" })\n\n if (packageJson.dependencies.next) {\n await addDependency({ package: \"@ant-design/nextjs-registry\" })\n await writeFile(\n join(componentDir, \"Registry.tsx\"),\n `\"use client\"\n\nimport { FC, ReactNode } from \"react\"\nimport { AntdRegistry } from \"@ant-design/nextjs-registry\"\nimport { ConfigProvider } from \"antd\"\nimport zhCN from \"antd/locale/zh_CN\"\n\nexport interface RegistryProps {\n children?: ReactNode\n}\n\nconst Registry: FC<RegistryProps> = ({ children }) => {\n\n return (\n <AntdRegistry layer>\n <ConfigProvider locale={zhCN}>{children}</ConfigProvider>\n </AntdRegistry>\n )\n}\n\nexport default Registry\n`,\n )\n } else {\n await writeFile(\n join(componentDir, \"Registry.tsx\"),\n `import { StyleProvider } from \"@ant-design/cssinjs\"\nimport { ConfigProvider } from \"antd\"\nimport zhCN from \"antd/locale/zh_CN\"\nimport { FC, ReactNode } from \"react\"\n\nexport interface RegistryProps {\n children?: ReactNode\n}\n\nconst Registry: FC<RegistryProps> = ({ children }) => {\n\n return (\n <StyleProvider layer>\n <ConfigProvider locale={zhCN}>{children}</ConfigProvider>\n </StyleProvider>\n )\n}\n\nexport default Registry\n`,\n )\n }\n\n consola.success(\"添加 antd 配置成功\")\n}\n","import { existsSync } from \"fs\"\nimport { writeFile as _writeFile, mkdir } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport { capitalize } from \"deepsea-tools\"\nimport inquirer from \"inquirer\"\nimport { isPathLike } from \"soda-nodejs\"\n\nexport interface AddApiParams {\n type: string\n api?: string\n hook?: string\n}\n\nasync function writeFile(...args: Parameters<typeof _writeFile>) {\n const [path] = args\n\n if (isPathLike(path) && existsSync(path)) {\n interface Answer {\n override: boolean\n }\n\n const { override } = await inquirer.prompt<Answer>({\n type: \"confirm\",\n name: \"override\",\n message: `文件 ${path} 已存在,是否覆盖?`,\n })\n\n if (!override) return\n }\n\n return await _writeFile(...args)\n}\n\nexport async function addApi({ type, api, hook }: AddApiParams) {\n type = capitalize(type)\n api ??= \"apis\"\n hook ??= \"hooks\"\n\n await mkdir(api, { recursive: true })\n await mkdir(hook, { recursive: true })\n\n const type2 = type.replace(/([A-Z])/g, (_, c) => `-${c.toLowerCase()}`).replace(/^-/, \"\")\n\n interface Answer {\n items: string[]\n }\n\n const { items } = await inquirer.prompt<Answer>({\n type: \"checkbox\",\n name: \"items\",\n message: `请选择需要添加的${type}字段`,\n choices: [\"query\", \"get\", \"add\", \"update\", \"delete\"],\n })\n\n const query = `import { Page } from \"deepsea-tools\"\n\nimport { request } from \"@/utils/request\"\n\nexport interface Query${type}Params {\n pageSize?: number\n pageNum?: number\n}\n\nexport interface ${type} {\n id: string\n name: string\n}\n\nexport type ${type}Id = ${type}[\"id\"]\n\nexport const ${type}Name = \"${type}\"\n\nexport async function query${type}(params: Query${type}Params) {\n const response = await request<Page<${type}>>(\"/${type2}/query\", {\n method: \"POST\",\n body: params,\n })\n return response\n}\n`\n\n if (items.includes(\"query\")) await writeFile(join(api, `query${type}.ts`), query)\n\n const add = `import { request } from \"@/utils/request\"\n\nimport { ${type} } from \"./query${type}\"\n\nexport interface Add${type}Params extends Pick<${type}, \"name\"> {}\n\nexport async function add${type}(params: Add${type}Params) {\n const response = await request<${type}>(\"/${type2}/add\", {\n method: \"POST\",\n body: params,\n })\n return response\n}\n`\n\n if (items.includes(\"add\")) await writeFile(join(api, `add${type}.ts`), add)\n\n const update = `import { request } from \"@/utils/request\"\n\nimport { ${type} } from \"./query${type}\"\n\nexport interface Update${type}Params extends Pick<${type}, \"id\" | \"name\"> {}\n\nexport async function update${type}(params: Update${type}Params) {\n const response = await request<${type}>(\"/${type2}/update\", {\n method: \"POST\",\n body: params,\n })\n return response\n}\n`\n\n if (items.includes(\"update\")) await writeFile(join(api, `update${type}.ts`), update)\n\n const _delete = `import { request } from \"@/utils/request\"\n\nimport { ${type}, ${type}Id } from \"./query${type}\"\n\nexport type Delete${type}Params = ${type}Id\n\nexport async function delete${type}(id: Delete${type}Params) {\n const response = await request<${type}>(\\`/${type2}/delete/\\${id}\\`, {\n method: \"DELETE\",\n })\n return response\n}\n`\n\n if (items.includes(\"delete\")) await writeFile(join(api, `delete${type}.ts`), _delete)\n\n const get = `import { request } from \"@/utils/request\"\n\nimport { ${type}, ${type}Id } from \"./query${type}\"\n\nexport type Get${type}Params = ${type}Id\n\nexport async function get${type}(id: Get${type}Params) {\n const response = await request<${type}>(\\`/${type2}/get/\\${id}\\`, {\n method: \"POST\",\n })\n return response\n}\n`\n\n if (items.includes(\"get\")) await writeFile(join(api, `get${type}.ts`), get)\n\n const useQuery = `import { useQuery } from \"@tanstack/react-query\"\n\nimport { Query${type}Params, query${type} } from \"@/apis/query${type}\"\n\nexport function useQuery${type}(params: Query${type}Params) {\n return useQuery({\n queryKey: [\"query-${type2}\", params],\n queryFn: () => query${type}(params),\n })\n}\n`\n\n if (items.includes(\"query\")) await writeFile(join(hook, `useQuery${type}.ts`), useQuery)\n\n const useGet = `import { useQuery } from \"@tanstack/react-query\"\nimport { isNonNullable, resolveNull } from \"deepsea-tools\"\n\nimport { Get${type}Params, get${type} } from \"@/apis/get${type}\"\n\nexport interface UseGet${type}Params {\n id?: Get${type}Params | undefined\n enabled?: boolean\n}\n\nexport function useGet${type}(idOrParams?: UseGet${type}Params | Get${type}Params | undefined) {\n const { id, enabled = true } = typeof idOrParams === \"object\" ? idOrParams : { id: idOrParams, enabled: true }\n\n return useQuery({\n queryKey: [\"get-${type2}\", id],\n queryFn: isNonNullable(id) ? () => get${type}(id) : resolveNull,\n enabled,\n })\n}\n`\n\n if (items.includes(\"get\")) await writeFile(join(hook, `useGet${type}.ts`), useGet)\n\n const useAdd = `import { useId } from \"react\"\nimport { UseMutationOptions, useMutation, useQueryClient } from \"@tanstack/react-query\"\n\nimport { Add${type}Params, add${type} } from \"@/apis/add${type}\"\nimport { ${type}, ${type}Name } from \"@/apis/query${type}\"\n\nexport interface UseAdd${type}Params<TContext = never>\n extends Omit<UseMutationOptions<${type}, Error, Add${type}Params, TContext>, \"mutationFn\"> {}\n\nexport function useAdd${type}<TContext = never>({ onMutate, onSuccess, onError, onSettled, ...rest }: UseAdd${type}Params<TContext> = {}) {\n const key = useId()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: add${type},\n onMutate(variables) {\n message.open({\n key,\n type: \"loading\",\n content: \\`新增\\${${type}Name}中...\\`,\n duration: 0,\n })\n return onMutate?.(variables)\n },\n onSuccess(data, variables, context) {\n message.open({\n key,\n type: \"success\",\n content: \\`新增\\${${type}Name}成功\\`,\n })\n return onSuccess?.(data, variables, context)\n },\n onError(error, variables, context) {\n message.open({\n key,\n type: \"error\",\n content: \\`新增\\${${type}Name}失败\\`,\n })\n return onError?.(error, variables, context)\n },\n onSettled(data, error, variables, context) {\n queryClient.invalidateQueries({ queryKey: [\"query-${type2}\"] })\n return onSettled?.(data, error, variables, context)\n },\n ...rest,\n })\n}\n`\n\n if (items.includes(\"add\")) await writeFile(join(hook, `useAdd${type}.ts`), useAdd)\n\n const useUpdate = `import { useId } from \"react\"\nimport { UseMutationOptions, useMutation, useQueryClient } from \"@tanstack/react-query\"\n\nimport { ${type}, ${type}Name } from \"@/apis/query${type}\"\nimport { Update${type}Params, update${type} } from \"@/apis/update${type}\"\n\nexport interface UseUpdate${type}Params<TContext = never>\n extends Omit<UseMutationOptions<${type}, Error, Update${type}Params, TContext>, \"mutationFn\"> {}\n\nexport function useUpdate${type}<TContext = never>({ onMutate, onSuccess, onError, onSettled, ...rest }: UseUpdate${type}Params<TContext> = {}) {\n const key = useId()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: update${type},\n onMutate(variables) {\n message.open({\n key,\n type: \"loading\",\n content: \\`更新\\${${type}Name}中...\\`,\n duration: 0,\n })\n return onMutate?.(variables)\n },\n onSuccess(data, variables, context) {\n message.open({\n key,\n type: \"success\",\n content: \\`更新\\${${type}Name}成功\\`,\n })\n return onSuccess?.(data, variables, context)\n },\n onError(error, variables, context) {\n message.open({\n key,\n type: \"error\",\n content: \\`更新\\${${type}Name}失败\\`,\n })\n return onError?.(error, variables, context)\n },\n onSettled(data, error, variables, context) {\n queryClient.invalidateQueries({ queryKey: [\"get-${type2}\", variables.id] })\n queryClient.invalidateQueries({ queryKey: [\"query-${type2}\"] })\n return onSettled?.(data, error, variables, context)\n },\n ...rest,\n })\n}\n`\n\n if (items.includes(\"update\")) await writeFile(join(hook, `useUpdate${type}.ts`), useUpdate)\n\n const useDelete = `import { useId } from \"react\"\nimport { UseMutationOptions, useMutation, useQueryClient } from \"@tanstack/react-query\"\n\nimport { Delete${type}Params, delete${type} } from \"@/apis/delete${type}\"\nimport { ${type}, ${type}Name } from \"@/apis/query${type}\"\n\nexport interface UseDelete${type}Params<TContext = never>\n extends Omit<UseMutationOptions<${type}, Error, Delete${type}Params, TContext>, \"mutationFn\"> {}\n\nexport function useDelete${type}<TContext = never>({ onMutate, onSuccess, onError, onSettled, ...rest }: UseDelete${type}Params<TContext> = {}) {\n const key = useId()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: delete${type},\n onMutate(variables) {\n message.open({\n key,\n type: \"loading\",\n content: \\`删除\\${${type}Name}中...\\`,\n duration: 0,\n })\n return onMutate?.(variables)\n },\n onSuccess(data, variables, context) {\n message.open({\n key,\n type: \"success\",\n content: \\`删除\\${${type}Name}成功\\`,\n })\n return onSuccess?.(data, variables, context)\n },\n onError(error, variables, context) {\n message.open({\n key,\n type: \"error\",\n content: \\`删除\\${${type}Name}失败\\`,\n })\n return onError?.(error, variables, context)\n },\n onSettled(data, error, variables, context) {\n queryClient.invalidateQueries({ queryKey: [\"query-${type2}\"] })\n return onSettled?.(data, error, variables, context)\n },\n ...rest,\n })\n}\n`\n\n if (items.includes(\"delete\")) await writeFile(join(hook, `useDelete${type}.ts`), useDelete)\n}\n","import { CommitType, CommitTypeMap } from \"@/constant\"\n\n/**\n * 获取提交信息\n * @param type 类型\n * @param message 信息\n * @returns 提交信息\n */\nexport function getCommitMessage(type: CommitType, message: string) {\n return `${CommitTypeMap[type]}${message}`\n}\n","import { readdir, readFile, writeFile } from \"fs/promises\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { getCommitMessage } from \"./getCommitMessage\"\n\n/**\n * 向 .gitignore 文件添加规则\n * @param rules 要添加的规则列表\n * @returns commit message\n */\nexport async function addRuleToGitIgnore(...rules: string[]) {\n const dir = await readdir(\".\")\n const message = getCommitMessage(CommitType.feature, `添加 .gitignore 规则 ${rules.join(\", \")}`)\n\n if (!dir.includes(\".gitignore\")) {\n await writeFile(\".gitignore\", rules.join(\"\\n\"), \"utf-8\")\n return message\n }\n\n const gitignore = await readFile(\".gitignore\", \"utf-8\")\n const rules2 = gitignore.split(\"\\n\").map(v => v.trim())\n\n for (const rule of rules) {\n if (rules2.includes(rule)) continue\n rules2.push(rule)\n }\n\n await writeFile(\".gitignore\", rules2.join(\"\\n\"), \"utf-8\")\n return message\n}\n","import { readPackageJson } from \"./readPackageJson\"\n\nexport async function hasDependency(dependency: string | RegExp, dir?: string) {\n const packageJson = await readPackageJson(dir)\n const dependencies = packageJson.dependencies ?? {}\n const devDependencies = packageJson.devDependencies ?? {}\n const peerDependencies = packageJson.peerDependencies ?? {}\n\n const total = Object.keys({\n ...dependencies,\n ...devDependencies,\n ...peerDependencies,\n })\n\n return total.some(item => (typeof dependency === \"string\" ? item === dependency : dependency.test(item)))\n}\n","export interface InsertWhenParams {\n breakBefore?: boolean\n breakAfter?: boolean\n}\n\nexport function insertWhen(condition: unknown, str: string | string[], params: InsertWhenParams = {}) {\n const { breakBefore, breakAfter } = params\n const strs = Array.isArray(str) ? str : [str]\n if (breakBefore) strs.unshift(\"\")\n if (breakAfter) strs.push(\"\")\n return condition ? strs.join(\"\\n\") : \"\"\n}\n","import { copyFile, mkdir, readdir, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport { getEnumValues } from \"deepsea-tools\"\nimport inquirer from \"inquirer\"\n\nimport { PackageManager } from \"@/constant\"\n\nimport { addDependency } from \"./addDependency\"\nimport { addRuleToGitIgnore } from \"./addRuleToGitIgnore\"\nimport { backupFirst } from \"./backupFirst\"\nimport { getPackageManager } from \"./getPackageManager\"\nimport { hasDependency } from \"./hasDependency\"\nimport { insertWhen } from \"./insertWhen\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport const ApplicationType = {\n Frontend: \"Frontend\",\n Backend: \"Backend\",\n FullStack: \"FullStack\",\n} as const\n\nexport type ApplicationType = (typeof ApplicationType)[keyof typeof ApplicationType]\n\nexport async function addBuildDocker() {\n await backupFirst()\n\n interface Answer {\n type: ApplicationType\n manager: PackageManager\n name: string\n versions: string[]\n versionSource: string\n local: boolean\n docker: string\n format: string\n build: string\n dist: string\n useGitignore: string\n rules: string[]\n runtime: string\n port: string\n }\n\n const json = await readPackageJson()\n\n const isFullStack = await hasDependency(/^(next|@remix-run\\/|@react-router\\/|@tanstack\\/react-start$)/)\n\n const isBackend = await hasDependency(/^(express$|hono$|@nestjs\\/|koa$)/)\n\n const defaultType = isFullStack ? ApplicationType.FullStack : isBackend ? ApplicationType.Backend : ApplicationType.Frontend\n\n const defaultManager = await getPackageManager()\n\n const defaultBuild = json.scripts?.build ? \"build\" : (Object.keys(json.scripts ?? {}).find(item => /\\bbuild\\b/i.test(item)) ?? \"build\")\n\n const { type, name, local, versions } = await inquirer.prompt<Answer>([\n {\n type: \"list\",\n name: \"type\",\n message: \"Please select the application type\",\n choices: Object.entries(ApplicationType).map(([name, value]) => ({\n name,\n value,\n })),\n default: defaultType,\n },\n {\n type: \"input\",\n name: \"name\",\n message: \"Please enter the application name\",\n default: json.name?.trim(),\n },\n {\n type: \"confirm\",\n name: \"local\",\n message: \"Do you want to save the docker image locally?\",\n default: false,\n },\n {\n type: \"checkbox\",\n name: \"versions\",\n message: \"Please select the image versions\",\n choices: [\"latest\", \"custom\"],\n default: [\"latest\", \"custom\"],\n },\n ])\n\n if (versions.length === 0) {\n consola.error(\"Please select at least one image version\")\n process.exit(1)\n }\n\n const { port } = await inquirer.prompt<Answer>({\n type: \"input\",\n name: \"port\",\n message: \"Please enter the application port\",\n default: type === ApplicationType.Frontend ? \"80\" : \"3000\",\n })\n\n let versionSource: string | undefined\n\n if (versions.includes(\"custom\")) {\n const { versionSource: versionSource2 } = await inquirer.prompt<Answer>({\n type: \"list\",\n name: \"versionSource\",\n message: \"Please select the custom image version source\",\n choices: [\"Day.js version\", \"package.json version\", \"input\"],\n default: \"Day.js version\",\n })\n\n versionSource = versionSource2\n }\n\n let docker: string | undefined\n\n if (local) {\n const { docker: docker2 } = await inquirer.prompt<Answer>({\n type: \"input\",\n name: \"docker\",\n message: \"Please enter the directory to save images\",\n default: \"docker\",\n })\n\n docker = docker2\n }\n\n let format: string | undefined\n\n if (versionSource === \"Day.js version\") {\n const { format: format2 } = await inquirer.prompt<Answer>({\n type: \"input\",\n name: \"format\",\n message: \"Please enter the format\",\n default: \"YYMMDDHHmm\",\n })\n\n format = format2\n }\n\n const dir = await readdir(\".\")\n\n if (type === ApplicationType.Frontend) {\n const { manager } = await inquirer.prompt<Answer>({\n type: \"list\",\n name: \"manager\",\n message: \"Please select the package manager\",\n choices: getEnumValues(PackageManager),\n default: defaultManager,\n })\n\n const { build } = await inquirer.prompt<Answer>({\n type: \"input\",\n name: \"build\",\n message: \"Please enter the build command\",\n default: `${manager} run ${defaultBuild}`,\n })\n\n const defaultDist = dir.includes(\"build\") ? \"build\" : \"dist\"\n\n const { dist } = await inquirer.prompt<Answer>({\n type: \"input\",\n name: \"dist\",\n message: \"Please enter the dist directory\",\n default: defaultDist,\n })\n\n const buildLatest = versions.includes(\"latest\")\n const buildCustom = versions.includes(\"custom\")\n\n const script = `// @ts-check\n${insertWhen(versions.includes(\"custom\"), `import consola from \"consola\"`, { breakBefore: true })}${insertWhen(\n versionSource === \"Day.js version\",\n `import dayjs from \"dayjs\"`,\n { breakBefore: true },\n )}${insertWhen(versionSource === \"package.json version\", `import { readFile } from \"fs/promises\"`, {\n breakBefore: true,\n })}${insertWhen(local, `import { join } from \"path\"`, { breakBefore: true })}\nimport { spawnAsync } from \"soda-nodejs\"\n${insertWhen(\n versionSource === \"package.json version\",\n `\nconst str = await readFile(\"package.json\", \"utf-8\")\nconst json = JSON.parse(str)\n`,\n)}\nconst name = \"${name}\"\n\n${insertWhen(\n buildCustom,\n `let customTag = ${insertWhen(versionSource === \"package.json version\", \"json.version\")}${insertWhen(versionSource === \"Day.js version\", `dayjs().format(\"${format}\")`)}${insertWhen(\n versionSource === \"input\",\n `await consola.prompt(\"Please enter the image tag\", { type: \"text\" })`,\n )}`,\n)}\n\nconsole.log()\n\n/** @type {import(\"child_process\").SpawnOptions} */\nconst options = {\n shell: true,\n stdio: \"inherit\",\n}\n\nawait spawnAsync(\"${build}\", options)\n\nconsole.log()\n\nawait spawnAsync(\\`docker build${insertWhen(buildCustom, ` -t \\${name}:\\${customTag}`)}${insertWhen(buildLatest, ` -t \\${name}:latest`)} .\\`, options)\n${insertWhen(\n local,\n `${insertWhen(\n buildCustom,\n `\nconsole.log()\n\nawait spawnAsync(\\`docker save \\${name}:\\${customTag} > \\${join(\"${docker ?? \"docker\"}\", \\`\\${name}-\\${customTag}.tar\\`)}\\`, options)`,\n )}\n${insertWhen(\n buildLatest,\n `\nconsole.log()\nawait spawnAsync(\\`docker save \\${name}:latest > \\${join(\"${docker ?? \"docker\"}\", \\`\\${name}-latest.tar\\`)}\\`, options)`,\n)}`,\n)}`\n\n const dockerFile = `# 使用官方 nginx 镜像作为基础镜像\nFROM nginx:alpine\n\n# 设置工作目录\nWORKDIR /usr/share/nginx/html\n\n# 删除默认的 nginx 静态资源\nRUN rm -rf ./*\n\n# 将 dist 文件夹中的内容复制到 nginx 的 html 目录下\nCOPY ${dist} .\n\n# 可选:复制自定义的 nginx 配置\nCOPY nginx.conf /etc/nginx/nginx.conf\n\n# 暴露端口\nEXPOSE ${port}\n\n# 启动 nginx\nCMD [\"nginx\", \"-g\", \"daemon off;\"]\n`\n\n const nginxFile = `worker_processes 1;\n\nevents {\n worker_connections 1024;\n}\n\nhttp {\n include mime.types;\n # default_type application/octet-stream;\n\n sendfile on;\n keepalive_timeout 65;\n\n server {\n listen ${port};\n server_name localhost;\n\n root /usr/share/nginx/html;\n index index.html index.htm;\n location / {\n try_files $uri $uri/ /index.html; # 对于 SPA 应用的路由支持\n }\n }\n}\n`\n\n if (local) await mkdir(docker!, { recursive: true })\n await mkdir(\"scripts\", { recursive: true })\n await writeFile(\"scripts/build-docker.mjs\", script)\n await writeFile(\"Dockerfile\", dockerFile)\n await writeFile(\"nginx.conf\", nginxFile)\n await writePackageJson({\n data: {\n ...json,\n scripts: {\n ...json.scripts,\n \"build:docker\": `cross-env NODE_ENV=production ${manager === \"bun\" ? \"bun\" : \"node\"} scripts/build-docker.mjs`,\n },\n },\n })\n } else {\n let created = false\n\n if (dir.includes(\".gitignore\")) {\n const { useGitignore } = await inquirer.prompt<Answer>({\n type: \"confirm\",\n name: \"useGitignore\",\n message: \"Do you want to use the .gitignore as the dockerignore file?\",\n default: true,\n })\n\n if (useGitignore) {\n await copyFile(\".gitignore\", \".dockerignore\")\n created = true\n }\n }\n\n if (!created) {\n const { rules } = await inquirer.prompt<Answer>({\n type: \"checkbox\",\n name: \"rules\",\n message: \"Please select the rules\",\n choices: dir,\n default: dir.filter(item => ![\"node_modules\", \"dist\", \"build\", docker?.split(\"/\").at(0)].includes(item)),\n })\n\n await writeFile(\".dockerignore\", rules.join(\"\\n\"))\n }\n\n if (type === ApplicationType.Backend) {\n const dockerFile = `# 使用 bun 的 alpine 版本作为基础镜像\nFROM oven/bun:alpine\n\n# 设置工作目录\nWORKDIR /app\n\n# 复制源代码\nCOPY . .\n\n# 安装依赖\nRUN bun install --registry=https://registry.npmmirror.com\n\n# 暴露端口(根据你的应用需要调整)\nEXPOSE ${port}\n\n# 运行应用\nCMD [\"bun\", \"run\", \"index.ts\"]\n`\n\n await writeFile(\"Dockerfile\", dockerFile)\n } else {\n const dockerFile = `FROM oven/bun:alpine AS deps\nWORKDIR /app\nCOPY . .\nRUN bun install --registry=https://registry.npmmirror.com\n\nFROM oven/bun:alpine AS builder\nWORKDIR /app\nCOPY . .\nCOPY --from=deps /app/node_modules ./node_modules\nRUN bun run build\n\nFROM oven/bun:alpine AS runner\nWORKDIR /app\nCOPY --from=builder /app/node_modules ./node_modules\nCOPY --from=builder /app/package.json ./package.json\n\nEXPOSE ${port}\n\nCMD [\"bun\", \"run\", \"start\"]\n`\n\n await writeFile(\"Dockerfile\", dockerFile)\n }\n\n consola.warn(\"Please confirm the Dockerfile is correct\")\n }\n\n if (docker) await addRuleToGitIgnore(docker)\n\n const packages = [\"soda-nodejs\", \"cross-env\"]\n\n if (versionSource === \"Day.js version\") packages.push(\"dayjs\")\n\n if (versions.includes(\"custom\")) packages.push(\"consola\")\n\n await addDependency({\n package: packages,\n type: \"devDependencies\",\n })\n}\n","/**\n * 将数组或对象中的元素按字典序排序\n * @param data 要排序的数组或对象\n * @returns 排序后的数组或对象\n */\nexport function sortArrayOrObject(data: Record<string, unknown> | unknown[]) {\n if (typeof data !== \"object\" || data === null) return data\n\n if (Array.isArray(data)) {\n const _data = [...data]\n\n _data.sort()\n return _data\n }\n\n if (Object.getPrototypeOf(data) === Object.prototype) {\n const keys = Object.keys(data)\n keys.sort()\n\n const _data: Record<string, unknown> = {}\n\n for (const key of keys) _data[key] = data[key]\n\n return _data\n }\n\n return data\n}\n","import inquirer from \"inquirer\"\n\nimport { readPackageJson } from \"./readPackageJson\"\nimport { sortArrayOrObject } from \"./sortArrayOrObject\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport type Scripts = Record<string, string>\n\nexport async function addScript(scripts: Scripts) {\n const packageJson = await readPackageJson()\n\n interface Answer {\n replace: boolean\n }\n\n const keys: string[] = []\n\n for (const key of Object.keys(scripts)) {\n if (packageJson.scripts[key]) {\n if (scripts[key] === packageJson.scripts[key]) continue\n const { replace } = await inquirer.prompt<Answer>([\n {\n type: \"confirm\",\n name: \"replace\",\n message: `${key} 命令已存在 \\`${packageJson.scripts[key]}\\`,是否替换为 \\`${scripts[key]}\\``,\n },\n ])\n if (!replace) continue\n }\n\n keys.push(key)\n }\n\n keys.forEach(key => (packageJson.scripts[key] = scripts[key]))\n\n sortArrayOrObject(packageJson.scripts)\n\n await writePackageJson({ data: packageJson })\n}\n","import inquirer from \"inquirer\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nimport { PackageManager } from \"@/constant\"\n\nimport { getPackageManager } from \"@/utils/getPackageManager\"\n\nexport type InstallDependcenyConfig = {\n /**\n * 是否静默安装\n */\n silent?: boolean\n /**\n * 包管理器\n */\n manager?: PackageManager\n /**\n * 目录\n */\n dir?: string\n}\n\nexport async function installDependceny(config?: InstallDependcenyConfig): Promise<boolean> {\n let { silent, manager, dir } = config ?? {}\n\n if (!silent) {\n const { install } = await inquirer.prompt({\n type: \"confirm\",\n name: \"install\",\n message: \"安装依赖\",\n })\n\n if (install === false) return false\n }\n\n manager ??= await getPackageManager(dir)\n\n try {\n await spawnAsync(\n `${manager} install${global.__ZIXULU_REGISTRY__ ? ` --registry ${global.__ZIXULU_REGISTRY__}` : \"\"}${manager !== PackageManager.bun && global.__ZIXULU_PROXY__ ? ` --proxy http://localhost:7890 --https-proxy http://localhost:7890` : \"\"}`,\n { shell: true, stdio: \"inherit\", cwd: dir },\n )\n } catch (error) {\n await spawnAsync(\n `${manager} install${global.__ZIXULU_REGISTRY__ ? ` --registry ${global.__ZIXULU_REGISTRY__}` : \"\"}${manager !== PackageManager.bun && global.__ZIXULU_PROXY__ ? ` --proxy http://localhost:7890 --https-proxy http://localhost:7890` : \"\"}`,\n { shell: true, stdio: \"inherit\", cwd: dir },\n )\n }\n\n return true\n}\n","import { writeFile } from \"node:fs/promises\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { addDependency, PackageVersion } from \"./addDependency\"\nimport { addScript } from \"./addScript\"\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { hasDependency } from \"./hasDependency\"\nimport { installDependceny } from \"./installDependceny\"\n\ninterface GetEslintConfigParams {\n isReact: boolean\n}\n\nfunction getEslintConfig({ isReact }: GetEslintConfigParams) {\n const eslintConfig = `// @ts-check\n\nimport js from \"@eslint/js\"${\n isReact\n ? `\nimport reactHooks from \"eslint-plugin-react-hooks\"\nimport reactRefresh from \"eslint-plugin-react-refresh\"`\n : \"\"\n }\nimport { defineConfig, globalIgnores } from \"eslint/config\"\nimport globals from \"globals\"\nimport tseslint from \"typescript-eslint\"\n\nexport default defineConfig([\n globalIgnores([\"node_modules\", \"dist\", \"build\", \"public\"]),${\n isReact\n ? `\n reactHooks.configs.flat.recommended,`\n : \"\"\n }\n {\n files: [\"**/*.{js,mjs,ts${isReact ? \",tsx\" : \"\"}}\"],\n extends: [js.configs.recommended, tseslint.configs.recommended${isReact ? `, reactRefresh.configs.vite` : \"\"}],\n languageOptions: {\n ecmaVersion: \"latest\",\n globals: globals.browser,\n },\n rules: {\n \"@typescript-eslint/no-explicit-any\": \"off\",\n \"@typescript-eslint/no-empty-object-type\": \"off\",\n \"@typescript-eslint/no-non-null-asserted-optional-chain\": \"off\",\n \"no-empty\": \"off\",\n \"no-extra-boolean-cast\": \"off\",\n \"no-unused-vars\": \"off\",${\n isReact\n ? `\n \"react-refresh/only-export-components\": \"off\",`\n : \"\"\n }\n \"@typescript-eslint/no-unused-vars\": [\n \"warn\",\n {\n args: \"none\",\n caughtErrors: \"none\",\n ignoreRestSiblings: true,\n },\n ],\n \"prefer-const\": [\n \"off\",\n {\n destructuring: \"any\",\n },\n ],\n },\n },\n])\n`\n\n return eslintConfig\n}\n\nexport async function addEslint() {\n const isReact = await hasDependency(\"react\")\n const config = getEslintConfig({ isReact })\n await writeFile(\"eslint.config.mjs\", config)\n\n const packages: (string | PackageVersion)[] = [\"@eslint/js\", \"eslint\", \"typescript-eslint\", \"globals\"]\n\n if (isReact) packages.push(\"eslint-plugin-react-hooks\", \"eslint-plugin-react-refresh\")\n await addDependency({\n package: packages,\n type: \"devDependencies\",\n })\n await installDependceny()\n await addScript({ lint: \"eslint .\" })\n return getCommitMessage(CommitType.feature, \"add eslint\")\n}\n","import { writeFile } from \"fs/promises\"\n\nexport async function addGitAttributes() {\n await writeFile(\n \".gitattributes\",\n `# 将所有文本文件在提交到 Git 仓库时,自动转换为 LF 换行符\n* text=auto eol=lf`,\n \"utf-8\",\n )\n}\n","import { addedRules } from \"@/constant/index\"\n\nimport { addGitAttributes } from \"./addGitAttributes\"\nimport { addRuleToGitIgnore } from \"./addRuleToGitIgnore\"\n\n/**\n * 添加预设的 gitignore 规则\n */\nexport async function addGitignore() {\n await addGitAttributes()\n const message = await addRuleToGitIgnore(...addedRules)\n return message\n}\n","import { writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport simpleGit from \"simple-git\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nimport { AddDependenciesConfig, addDependency } from \"./addDependency\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { shouldContinue } from \"./shouldContinue\"\nimport { writePackageJson } from \"./writePackageJson\"\n\n/**\n * addHusky 参数\n */\nexport interface AddHuskyParams {\n /** 是否跳过用户交互确认 */\n skipConfirm?: boolean\n}\n\n/**\n * 添加 husky 及 lint-staged 配置\n */\nexport async function addHusky(params?: AddHuskyParams) {\n const options = params ?? {}\n\n const git = simpleGit()\n const isRepo = await git.checkIsRepo()\n\n if (!isRepo) {\n consola.info(\"当前目录不是 git 仓库,跳过 husky 配置\")\n return\n }\n\n if (!options.skipConfirm) {\n const shouldSetupHooks = await shouldContinue(\"是否配置 husky hooks,在每次 commit 前自动格式化修改的文件?\")\n\n if (!shouldSetupHooks) {\n consola.info(\"已取消 husky 配置\")\n return\n }\n } else consola.info(\"已根据外部指令跳过 husky 配置确认\")\n\n consola.start(\"开始配置 husky\")\n\n const huskyConfig: AddDependenciesConfig = {\n package: [\"husky\", \"lint-staged\"],\n type: \"devDependencies\",\n }\n\n await addDependency(huskyConfig)\n await installDependceny()\n\n try {\n consola.start(\"初始化 husky\")\n await spawnAsync(\"bunx husky init\")\n consola.success(\"husky 初始化成功\")\n } catch (error) {\n consola.error(\"husky 初始化失败\", error)\n }\n\n try {\n consola.start(\"配置 pre-commit hook\")\n const preCommitHook = \"npx lint-staged\"\n await writeFile(\".husky/pre-commit\", preCommitHook, \"utf-8\")\n consola.success(\"pre-commit hook 配置成功\")\n } catch (error) {\n consola.error(\"pre-commit hook 配置失败\", error)\n }\n\n const packageJson = await readPackageJson()\n packageJson[\"lint-staged\"] = {\n \"**/*\": \"prettier --write --ignore-unknown\",\n }\n await writePackageJson({ data: packageJson })\n consola.success(\"lint-staged 配置成功\")\n\n consola.success(\"husky 配置完成\")\n}\n","import { Stats } from \"fs\"\nimport { readdir, stat } from \"fs/promises\"\nimport { join, parse, ParsedPath } from \"path\"\n\nexport interface GetFilesOptions {\n /**\n * 目录\n */\n dir?: string\n /**\n * 匹配\n */\n match: (path: ParsedPath, stats: Stats) => boolean\n /**\n * 数量\n */\n count?: number\n /**\n * 深度\n */\n depth?: number\n /**\n * 排除\n */\n exclude?: (path: ParsedPath, stats: Stats) => boolean\n}\n\n/**\n * 递归获取指定目录下的文件\n * @param options 配置选项\n * @returns 符合条件的文件路径数组\n */\nexport async function getFiles(options: GetFilesOptions) {\n const { dir = \".\", match, count, depth, exclude } = options\n\n const result: string[] = []\n\n const e = Symbol() // 用于控制递归终止的特殊标记\n\n /**\n * 递归遍历目录的内部函数\n * @param path 当前处理的路径\n * @param depth 剩余遍历深度\n */\n async function _getFiles(path: string, depth: number | undefined) {\n const files = await readdir(path)\n\n for (const file of files) {\n const filePath = join(path, file)\n const parsedPath = parse(filePath)\n const stats = await stat(filePath)\n\n if (match(parsedPath, stats)) {\n const length = result.push(filePath)\n if (count !== undefined && length >= count) throw e\n }\n\n if (!stats.isDirectory()) continue\n if (exclude && exclude(parsedPath, stats)) continue\n if (depth === 1) continue\n await _getFiles(filePath, depth && depth - 1)\n }\n }\n\n try {\n await _getFiles(dir, depth)\n } catch (error) {\n if (error !== e) throw error\n }\n\n return result\n}\n","/**\n * 将路径转换为相对路径格式\n * @param path 需要转换的路径\n * @returns 转换后的相对路径,以 './' 开头\n */\nexport function getRelativePath(path: string) {\n path = path.replace(/\\\\/g, \"/\")\n if (path.startsWith(\"./\")) return path\n if (path.startsWith(\"../\")) return path\n return `./${path}`\n}\n","import { existsSync } from \"fs\"\nimport { join, parse } from \"path\"\n\nexport type TsFile = {\n depth: 0 | 1\n ext: \".ts\" | \".tsx\"\n path: string\n}\n\nexport function getTsFile(path: string): TsFile {\n const { ext } = parse(path)\n if (ext !== \"\" && ext !== \".ts\" && ext !== \".tsx\") throw new Error(\"请传入 ts 或 tsx 文件\")\n\n if (ext === \".ts\" || ext === \".tsx\") {\n return {\n depth: 0,\n ext: ext,\n path,\n }\n }\n\n const path2 = path + \".ts\"\n\n if (existsSync(path2)) {\n return {\n depth: 0,\n ext: \".ts\",\n path: path2,\n }\n }\n\n const path3 = path + \".tsx\"\n\n if (existsSync(path3)) {\n return {\n depth: 0,\n ext: \".tsx\",\n path: path3,\n }\n }\n\n const path4 = join(path, \"index.ts\")\n\n if (existsSync(path4)) {\n return {\n depth: 1,\n ext: \".ts\",\n path: path4,\n }\n }\n\n const path5 = join(path, \"index.tsx\")\n\n if (existsSync(path5)) {\n return {\n depth: 1,\n ext: \".tsx\",\n path: path5,\n }\n }\n\n throw new Error(`找不到 ${path} 对应的 ts 或 tsx 文件`)\n}\n","import { join } from \"path\"\nimport { cwd } from \"process\"\n\n/**\n * 获取 tsconfig.json 的完整路径\n * @param path 可选的基础路径,默认使用当前工作目录\n * @returns tsconfig.json 的完整路径\n */\nexport function getTsConfigJsonPath(path?: string) {\n return join(path ?? cwd(), \"tsconfig.json\")\n}\n","import { readFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport JSON5 from \"json5\"\n\nimport { getTsConfigJsonPath } from \"./getTsConfigPath\"\n\n/** 读取 tsconfig.json */\n\nexport async function readTsConfig(path?: string): Promise<Record<string, any>> {\n try {\n const result = JSON5.parse(await readFile(getTsConfigJsonPath(path), \"utf-8\"))\n return result\n } catch (error) {\n consola.fail(\"读取 tsconfig.json 失败\")\n throw error\n }\n}\n","import { writeFile } from \"fs/promises\"\n\nimport { getTsConfigJsonPath } from \"./getTsConfigPath\"\n\nexport async function writeTsConfig(config: Record<string, unknown>) {\n return await writeFile(getTsConfigJsonPath(), JSON.stringify(config, undefined, 4), \"utf-8\")\n}\n","import { readFile, writeFile } from \"fs/promises\"\nimport { join, parse } from \"path\"\n\nimport inquirer from \"inquirer\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { getFiles } from \"./getFiles\"\nimport { getRelativePath } from \"./getRelativePath\"\nimport { getTsFile } from \"./getTsFile\"\nimport { readTsConfig } from \"./readTsConfig\"\nimport { writeTsConfig } from \"./writeTsConfig\"\n\n/**\n * 获取路径别名配置\n * @param name 别名名称\n */\nexport async function getPathAlias(name: string) {\n const folder = await getFiles({\n match(path, stats) {\n return stats.isDirectory() && path.base === name\n },\n exclude(path, stats) {\n return (\n stats.isDirectory() &&\n (path.base === \"node_modules\" || path.base === \".git\" || path.base === \".vscode\" || path.base === \"dist\" || path.base === \"build\")\n )\n },\n count: 1,\n })\n const defaultPath = folder[0] ? getRelativePath(folder[0]) : undefined\n const { path } = await inquirer.prompt({\n type: \"input\",\n name: \"path\",\n message: `请输入你的 @${name}/ 的路径`,\n default: defaultPath,\n })\n return path\n}\n\n/** 路径别名配置项 */\nexport type PathAlias = {\n name: string\n path: string\n}\n\n/**\n * 添加路径别名配置到 tsconfig.json\n */\nexport async function addPathAlias(name: string, path: string): Promise<void>\nexport async function addPathAlias(alias: PathAlias[]): Promise<void>\nexport async function addPathAlias(nameOrAlias: string | PathAlias[], path?: string) {\n nameOrAlias = Array.isArray(nameOrAlias) ? nameOrAlias : [{ name: nameOrAlias, path: path! }]\n const tsConfig = await readTsConfig()\n tsConfig.compilerOptions ??= {}\n tsConfig.compilerOptions.paths ??= {}\n\n nameOrAlias.forEach(({ name, path }) => {\n tsConfig.compilerOptions.paths[`@${name}/*`] ??= []\n path = `${getRelativePath(path)}/*`\n if (!tsConfig.compilerOptions.paths[`@${name}/*`].includes(path)) tsConfig.compilerOptions.paths[`@${name}/*`].push(path)\n })\n\n await writeTsConfig(tsConfig)\n}\n\n/**\n * 替换所有文件中的相对路径为路径别名\n */\nexport async function replacePathAlias() {\n const tsConfig = await readTsConfig()\n const oldPaths: Record<string, string[]> = tsConfig.compilerOptions?.paths ?? {}\n\n const paths: Record<string, string[]> = {}\n\n Object.entries(oldPaths).forEach(([key, value]) => {\n paths[key.replace(/\\/?\\*?$/, \"\")] = value.map(item => item.replace(/\\/?\\*?$/, \"\"))\n })\n\n const files = await getFiles({\n match(path, stats) {\n return (path.ext === \".ts\" || path.ext === \".tsx\") && stats.isFile()\n },\n exclude(path, stats) {\n return (\n stats.isDirectory() &&\n (path.base === \"node_modules\" || path.base === \".git\" || path.base === \".vscode\" || path.base === \"dist\" || path.base === \"build\")\n )\n },\n })\n const reg = /(import [\\d\\D]*?\")(.+?)(\")/gm\n\n for (const file of files) {\n let code = await readFile(file, \"utf-8\")\n code = code.replace(reg, (match: string, arg: string, arg2: string, arg3: string) => {\n // 如果不是相对路径,直接返回\n if (!arg2.startsWith(\"./\") && !arg2.startsWith(\"../\")) return match\n\n /** 获取最终的 ts 文件地址 */\n let pathToReplace: string\n let depth: 0 | 1\n\n try {\n const tsFile = getTsFile(getRelativePath(join(file, \"../\", arg2)))\n pathToReplace = tsFile.path\n depth = tsFile.depth\n } catch {\n return match\n }\n\n pathToReplace = getRelativePath(pathToReplace)\n\n // 如果就是本目录的文件,直接返回\n if (arg2.startsWith(\"./\")) {\n const f = arg2.slice(2)\n if (parse(f).base === f && depth === 0) return match\n }\n\n let matchedKey = \"\"\n let matchedPath = \"\"\n\n Object.entries(paths).forEach(([key, value]) => {\n value.forEach(item => {\n /** 必须等于路径或者以路径开头 */\n if (pathToReplace === item || pathToReplace.startsWith(`${item}/`)) {\n if (!matchedPath || item.length > matchedPath.length) {\n matchedKey = key\n matchedPath = item\n }\n }\n })\n })\n\n if (matchedKey && matchedPath) {\n const newPath = `${matchedKey}${pathToReplace.slice(matchedPath.length)}`.replace(/\\/$/, \"\").replace(/\\.tsx?$/, \"\")\n const finalPath = `${arg}${newPath}${arg3}`\n return finalPath\n }\n\n return match\n })\n await writeFile(file, code, \"utf-8\")\n }\n\n return getCommitMessage(CommitType.feature, \"replace path alias\")\n}\n\n/**\n * 为文件夹添加路径别名\n */\nexport async function addFolderPathAlias() {\n const { folder } = await inquirer.prompt({\n type: \"input\",\n name: \"folder\",\n message: \"请输入文件夹路径\",\n default: \".\",\n })\n const dir = await getFiles({\n match(path, stats) {\n return stats.isDirectory()\n },\n depth: 1,\n dir: folder,\n })\n const names = dir.map(item => parse(item).name)\n const { result } = await inquirer.prompt({\n type: \"checkbox\",\n name: \"result\",\n message: \"请选择要添加的文件夹\",\n choices: names,\n default: names.filter(item => item !== \"node_modules\" && item !== \".git\" && item !== \".vscode\" && item !== \"dist\" && item !== \"build\"),\n })\n await addPathAlias(\n result.map((item: string) => ({\n name: item,\n path: getRelativePath(join(folder, item)),\n })),\n )\n return getCommitMessage(CommitType.feature, `add path alias: ${result.join(\", \")}`)\n}\n","import { writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport simpleGit from \"simple-git\"\n\nimport { AddDependenciesConfig, addDependency } from \"./addDependency\"\nimport { addHusky } from \"./addHusky\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { shouldContinue } from \"./shouldContinue\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nconst ignoreConfig = `node_modules\npublic\ndist\nbuild\ngenerated\n.next\n.vscode\n.generated\n**/components/ui/**\n`\n\nconst prettierConfig = `// @ts-check\n\n/**\n * @type {import(\"@1adybug/prettier\").Options}\n */\nconst config = {\n semi: false,\n tabWidth: 4,\n arrowParens: \"avoid\",\n endOfLine: \"lf\",\n printWidth: 160,\n plugins: [\"@1adybug/prettier\"],\n controlStatementBraces: \"add\",\n multiLineBraces: \"add\",\n nodeProtocol: true,\n}\n\nexport default config\n`\n\n/**\n * prettier 配置生成器参数\n */\nexport interface GetPluginConfigParams {\n /** 是否使用 tailwind */\n isTailwind: boolean\n /** 是否是 react 项目 */\n isReact: boolean\n}\n\n/**\n * 添加 prettier 相关配置\n * 包括安装依赖、创建配置文件等\n */\nexport async function addPrettier() {\n consola.start(\"开始添加 prettier 配置\")\n await writeFile(\"prettier.config.mjs\", prettierConfig, \"utf-8\")\n await writeFile(\".prettierignore\", ignoreConfig, \"utf-8\")\n\n const config2: AddDependenciesConfig = {\n package: [\"prettier\", \"@1adybug/prettier\"],\n type: \"devDependencies\",\n }\n\n await addDependency(config2)\n const packageJson2 = await readPackageJson()\n packageJson2.scripts ??= {}\n packageJson2.scripts.format = \"prettier --write .\"\n packageJson2.scripts.fg = 'npm run format && git add . && git commit -m \"✨feature: format\"'\n await writePackageJson({ data: packageJson2 })\n await installDependceny()\n\n const git = simpleGit()\n const isRepo = await git.checkIsRepo()\n\n if (!isRepo) {\n consola.info(\"当前目录不是 git 仓库,跳过 git hooks 配置\")\n consola.success(\"添加 prettier 配置成功\")\n return\n }\n\n consola.info(\"检测到 git 仓库\")\n const shouldSetupHooks = await shouldContinue(\"是否配置 git hooks,在每次 commit 前自动格式化修改的文件?\")\n\n if (!shouldSetupHooks) {\n consola.info(\"跳过 git hooks 配置\")\n consola.success(\"添加 prettier 配置成功\")\n return\n }\n\n await addHusky({ skipConfirm: true })\n\n consola.success(\"添加 prettier 配置成功\")\n}\n","import { readdir, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nimport { PackageManager } from \"@/constant\"\n\nimport { addDependency } from \"./addDependency\"\nimport { installDependceny } from \"./installDependceny\"\n\nconst prismaFile = `import { PrismaClient } from \"@prisma/client\"\n\ndeclare global {\n var __PRISMA__: PrismaClient\n}\n\nglobalThis.__PRISMA__ ??= new PrismaClient()\n\nexport const prisma = globalThis.__PRISMA__\n`\n\n/**\n * 添加 Prisma 相关配置\n * 包括安装依赖、初始化配置等\n * @param manager 包管理器类型\n */\nexport async function addPrisma(manager?: PackageManager) {\n consola.start(\"开始添加 Prisma 配置\")\n await addDependency({\n package: \"@prisma/client\",\n })\n await addDependency({\n package: [\"prisma\", \"ts-node\", \"@types/node\", \"typescript\"],\n type: \"devDependencies\",\n })\n const dir = await readdir(\".\")\n await installDependceny({ silent: true, manager })\n if (!dir.includes(\"tsconfig.json\")) await spawnAsync(\"npx tsc --init\", { shell: true, stdio: \"inherit\" })\n await spawnAsync(\"npx prisma init --datasource-provider sqlite\", {\n shell: true,\n stdio: \"inherit\",\n })\n await writeFile(\"prisma/index.ts\", prismaFile, \"utf-8\")\n consola.success(\"添加 Prisma 配置成功\")\n}\n","import { mkdir, readFile, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { addDependency } from \"./addDependency\"\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nconst script = `// @ts-check\nimport { spawn } from \"child_process\"\nimport { config } from \"dotenv\"\nimport { readFile } from \"fs/promises\"\nimport { cpus } from \"os\"\n\nconfig()\n\nasync function main() {\n let core = parseInt(process.env.CORE || \"1\")\n if (!Number.isInteger(core)) core = 1\n if (core < 1) core = 1\n if (core > cpus().length) core = cpus().length\n const packageJson = JSON.parse(await readFile(\"package.json\", \"utf-8\"))\n\n spawn(\\`pm2 start scripts/server.mjs --name \\${packageJson.name} -i \\${core}\\`, { shell: true, stdio: \"inherit\" })\n}\n\nmain()\n`\n\nconst expressScript = `// @ts-check\nimport compression from \"compression\"\nimport cors from \"cors\"\nimport { config } from \"dotenv\"\nimport express from \"express\"\nimport { readFileSync } from \"fs\"\nimport { createServer as createHttpServer } from \"http\"\nimport { createServer as createHttpsServer } from \"https\"\nimport morgan from \"morgan\"\nimport { join, resolve } from \"path\"\n\nconfig()\n\nfunction createServer() {\n const app = express()\n app.disable(\"x-powered-by\")\n app.use(compression())\n app.use(cors())\n app.use(morgan(\"tiny\"))\n\n const PEM_PATH = process.env.PEM_PATH\n const HTTPS = !!PEM_PATH\n const PORT = process.env.PORT ? Number(process.env.PORT) : HTTPS ? 443 : 80\n const HOSTNAME = process.env.HOSTNAME?.trim() || undefined\n\n if (!HTTPS) {\n createHttpServer(app).listen(PORT, HOSTNAME)\n } else {\n const key = readFileSync(join(PEM_PATH, \"privkey.pem\"), \"utf8\")\n const cert = readFileSync(join(PEM_PATH, \"cert.pem\"), \"utf8\")\n const ca = readFileSync(join(PEM_PATH, \"chain.pem\"), \"utf8\")\n createHttpsServer({ key, cert, ca }, app).listen(PORT, HOSTNAME)\n }\n\n return app\n}\n\nasync function main() {\n const ROOT = process.env.ROOT || \"dist\"\n if (!!process.env.BASE && !process.env.BASE.startsWith(\"/\")) throw new Error(\"BASE 必须以 / 开头\")\n const BASE = process.env.BASE || \"/\"\n\n const server = createServer()\n\n server.use(\\`\\${BASE.replace(/\\\\/+$/, \"\")}/\\`, express.static(ROOT))\n\n server.get(\\`\\${BASE.replace(/\\\\/+$/, \"\")}/*\\`, async (request, response) => response.sendFile(resolve(ROOT, \"index.html\")))\n\n if (BASE !== \"/\") server.get(\"/\", async (request, response) => response.redirect(BASE))\n}\n\nmain()\n`\n\nconst nextScript = `// @ts-check\nimport compression from \"compression\"\nimport cors from \"cors\"\nimport { config } from \"dotenv\"\nimport express from \"express\"\nimport { readFileSync } from \"fs\"\nimport { createServer as createHttpServer } from \"http\"\nimport { createServer as createHttpsServer } from \"https\"\nimport morgan from \"morgan\"\nimport next from \"next\"\nimport { join } from \"path\"\n\nconfig()\n\nfunction createServer() {\n const app = express()\n app.disable(\"x-powered-by\")\n app.use(compression())\n app.use(cors())\n app.use(morgan(\"tiny\"))\n\n const PEM_PATH = process.env.PEM_PATH\n const HTTPS = !!PEM_PATH\n const PORT = process.env.PORT ? Number(process.env.PORT) : HTTPS ? 443 : 80\n const HOSTNAME = process.env.HOSTNAME?.trim() || undefined\n\n if (!HTTPS) {\n createHttpServer(app).listen(PORT, HOSTNAME)\n } else {\n const key = readFileSync(join(PEM_PATH, \"privkey.pem\"), \"utf8\")\n const cert = readFileSync(join(PEM_PATH, \"cert.pem\"), \"utf8\")\n const ca = readFileSync(join(PEM_PATH, \"chain.pem\"), \"utf8\")\n createHttpsServer({ key, cert, ca }, app).listen(PORT, HOSTNAME)\n }\n\n return app\n}\n\nasync function main() {\n const PEM_PATH = process.env.PEM_PATH\n const HTTPS = !!PEM_PATH\n\n const app = next({ experimentalHttpsServer: HTTPS })\n const handle = app.getRequestHandler()\n await app.prepare()\n\n const server = createServer()\n server.all(\"*\", (request, response) => handle(request, response))\n}\n\nmain()\n`\n\nconst scripts = {\n express: expressScript,\n next: nextScript,\n}\n\n/**\n * 添加启动脚本配置选项\n */\nexport type AddStartScriptOptions = {\n /** 服务器类型:express 或 next */\n type: keyof typeof scripts\n /** SSL 证书路径 */\n pemPath?: string\n /** 服务器端口 */\n port?: string\n /** PM2 实例数量 */\n core?: string\n /** 服务器主机名 */\n hostname?: string\n}\n\n/**\n * 添加生产环境启动脚本\n * 支持 Express 和 Next.js 服务器\n * 配置 PM2 多进程管理\n * 支持 HTTPS\n *\n * @param options 配置选项\n * @returns commit message\n */\nexport async function addStartScript({ type, pemPath, port, core, hostname }: AddStartScriptOptions) {\n await addDependency({\n package: [\"@types/compression\", \"@types/cors\", \"@types/express\", \"@types/morgan\", \"@types/node\", \"compression\", \"cors\", \"dotenv\", \"express\", \"morgan\"],\n type: \"devDependencies\",\n })\n await mkdir(\"scripts\", { recursive: true })\n await writeFile(\"scripts/start.mjs\", script, \"utf-8\")\n consola.success(\"已添加 scripts/start.js\")\n await writeFile(\"scripts/server.mjs\", scripts[type], \"utf-8\")\n consola.success(\"已添加 scripts/server.js\")\n let env = \"\"\n\n try {\n env = await readFile(\".env\", \"utf-8\")\n } catch {\n /* empty */\n }\n\n // 添加证书目录\n if (/^ *PEM_PATH=/m.test(env)) env = env.replace(/^ *PEM_PATH=.*$/m, `PEM_PATH=\"${pemPath ?? \"\"}\"`)\n else env += `\\nPEM_PATH=\"${pemPath ?? \"\"}\"`\n\n // 添加端口号\n if (/^ *PORT=/m.test(env)) env = env.replace(/^ *PORT=.*$/m, `PORT=\"${port ?? \"\"}\"`)\n else env += `\\nPORT=\"${port ?? \"\"}\"`\n\n // 添加实例数\n if (/^ *CORE=/m.test(env)) env = env.replace(/^ *CORE=.*$/m, `CORE=\"${core ?? \"\"}\"`)\n else env += `\\nCORE=\"${core ?? \"\"}\"`\n\n // 添加主机\n if (/^ *HOSTNAME=/m.test(env)) env = env.replace(/^ *HOSTNAME=.*$/m, `HOSTNAME=\"${hostname || \"\"}\"`)\n else env += `\\nHOSTNAME=\"${hostname || \"\"}\"`\n\n await writeFile(\".env\", env, \"utf-8\")\n const packageJson = await readPackageJson()\n packageJson.scripts ??= {}\n packageJson.scripts.start = \"node scripts/start.mjs\"\n await writePackageJson({ data: packageJson })\n consola.success(\"已添加启动命令 start\")\n await installDependceny()\n return getCommitMessage(CommitType.feature, \"添加启动命令\")\n}\n","import { mkdir, writeFile } from \"fs/promises\"\n\nimport inquirer from \"inquirer\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\n/**\n * 同步包脚本配置选项\n */\nexport type AddSyncPackageScriptParams = {\n /** 是否是 monorepo 项目 */\n monorepo?: boolean\n}\n\n/**\n * 添加同步包脚本\n * 用于同步 npm 包到国内镜像源\n * 支持单包项目和 monorepo 项目\n *\n * @param params 配置选项\n * @returns commit message\n */\nexport async function addSyncPackageScript({ monorepo }: AddSyncPackageScriptParams = {}) {\n let dir: string | undefined\n\n if (monorepo) {\n type Answer = {\n dir: string\n }\n\n const result = await inquirer.prompt<Answer>([\n {\n type: \"input\",\n name: \"dir\",\n message: \"请输入包目录\",\n default: \"packages\",\n },\n ])\n dir = result.dir\n }\n\n const syncPackageScript = `// @ts-check\n\n/**\n * 同步包\n * @param {string} packageName 包名\n */\nfunction syncPackage(packageName) {\n return fetch(\\`https://registry-direct.npmmirror.com/-/package/\\${packageName}/syncs\\`, {\n referrer: \"https://npmmirror.com/\",\n referrerPolicy: \"strict-origin-when-cross-origin\",\n method: \"PUT\",\n mode: \"cors\",\n credentials: \"omit\",\n })\n}\n\n${\n monorepo\n ? `async function main() {\n const { readdir, readFile, stat } = await import(\"fs/promises\")\n const { join } = await import(\"path\")\n const dir = \"${dir}\"\n const dir2 = await readdir(dir)\n /** @type {string[]} */\n const packages2 = []\n for (const item of dir2) {\n const stat2 = await stat(join(dir, item))\n if (!stat2.isDirectory()) continue\n const dir3 = await readdir(join(dir, item))\n if (!dir3.includes(\"package.json\")) continue\n const packageJson = JSON.parse(await readFile(join(dir, item, \"package.json\"), \"utf-8\"))\n if (packageJson.private) continue\n packages2.push(packageJson.name)\n }\n await Promise.all(packages2.map(syncPackage))\n}`\n : `async function main() {\n const { readFile } = await import(\"fs/promises\")\n const packageJson = JSON.parse(await readFile(\"package.json\", \"utf-8\"))\n await syncPackage(packageJson.name)\n}`\n}\n\nmain()\n`\n\n await mkdir(\"scripts\", { recursive: true })\n await writeFile(\"scripts/syncPackage.mjs\", syncPackageScript)\n const packageJson = await readPackageJson()\n packageJson.scripts ??= {}\n let name = \"sync\"\n\n if (packageJson.scripts.sync) {\n type Answer = {\n override: boolean\n }\n\n const { override } = await inquirer.prompt<Answer>([\n {\n type: \"confirm\",\n name: \"override\",\n message: \"sync 命令已存在,是否覆盖\",\n default: false,\n },\n ])\n\n if (!override) {\n type Answer = {\n name: string\n }\n\n const answer = await inquirer.prompt<Answer>([\n {\n type: \"input\",\n name: \"name\",\n message: \"请输入同步包脚本名称\",\n default: \"syncPackage\",\n },\n ])\n name = answer.name\n }\n }\n\n packageJson.scripts[name] = \"node scripts/syncPackage.mjs\"\n\n if (packageJson.scripts.postpublish) packageJson.scripts.postpublish += ` && npm run ${name}`\n else packageJson.scripts.postpublish = `npm run ${name}`\n\n await writePackageJson({ data: packageJson })\n return getCommitMessage(CommitType.feature, \"添加同步包脚本\")\n}\n","/**\n * 预处理正则表达式字符串,将易于输入的占位符替换为特殊字符\n * 支持的占位符:\n * - {{CARET}} -> ^ (匹配字符串开头)\n */\nexport function preprocessRegex(reg: string): string {\n return reg.replace(/\\{\\{CARET\\}\\}/g, \"^\")\n}\n","import { consola } from \"consola\"\nimport { simpleGit } from \"simple-git\"\n\nimport { preprocessRegex } from \"./preprocessRegex\"\nimport { shouldContinue } from \"./shouldContinue\"\n\nexport interface AddTagParams {\n /** 用于匹配 commit message 的正则表达式字符串 */\n reg: string\n /** 正则表达式标志,如 i、g、m 等 */\n flags?: string\n /** 用于替换的字符串模板,生成 tag 名称 */\n replacement: string\n /** 是否同时推送到远程仓库 */\n push?: boolean\n /** 远程仓库名称,默认为 origin */\n remote?: string\n /** 是否覆盖已存在的 tag */\n force?: boolean\n}\n\n/**\n * 为匹配的 commit 添加 git tag\n */\nexport async function addTag({ reg, flags, replacement, push, remote = \"origin\", force }: AddTagParams) {\n const git = simpleGit()\n\n // 检查是否是 git 仓库\n const isRepo = await git.checkIsRepo()\n\n if (!isRepo) {\n consola.error(\"当前目录不是 git 仓库\")\n return\n }\n\n // 检查是否有未提交的更改\n const status = await git.status()\n\n if (status.files.length > 0) {\n consola.error(\"当前 Git 仓库存在未提交的文件,请先提交或暂存这些文件\")\n return\n }\n\n // 预处理正则表达式,替换占位符\n const processedReg = preprocessRegex(reg)\n\n // 显示正则表达式和替换字符串\n consola.info(`正则表达式: /${processedReg}/${flags ?? \"\"}`)\n\n consola.info(`替换字符串: ${replacement}`)\n\n // 询问用户是否继续\n const cont = await shouldContinue(\"是否继续?\")\n\n if (!cont) {\n consola.info(\"操作已取消\")\n return\n }\n\n // 获取所有 commit 日志\n const log = await git.log()\n const commits = log.all\n\n if (commits.length === 0) {\n consola.warn(\"当前仓库没有任何 commit\")\n return\n }\n\n consola.info(`找到 ${commits.length} 个 commit`)\n\n // 获取所有已存在的 tag\n const existingTags = await git.tags()\n const allExistingTags = new Set(existingTags.all)\n\n const tagsToAdd = []\n\n // 遍历所有 commit,查找匹配的 commit message\n for (const commit of commits) {\n // 每次循环创建新的正则表达式,避免 g 标志可能带来的状态问题\n const regexp = new RegExp(processedReg, flags)\n\n // 如果 commit message 匹配正则表达式\n if (regexp.test(commit.message)) {\n // 使用正则替换生成 tag 名称\n const tagName = commit.message.replace(new RegExp(processedReg, flags), replacement)\n\n // 检查 tag 名称是否有效\n if (tagName && tagName.trim()) {\n tagsToAdd.push({\n hash: commit.hash,\n message: commit.message,\n tagName: tagName.trim(),\n })\n }\n }\n }\n\n if (tagsToAdd.length === 0) {\n consola.warn(\"没有匹配的 commit 需要添加 tag\")\n return\n }\n\n consola.info(`将要为 ${tagsToAdd.length} 个 commit 添加 tag`)\n\n // 执行添加操作\n for (const { hash, message, tagName } of tagsToAdd) {\n try {\n // 检查 tag 是否已存在\n if (allExistingTags.has(tagName)) {\n if (force) {\n // 如果强制覆盖,先删除已存在的 tag\n await git.tag([\"-d\", tagName])\n consola.info(`删除已存在的 tag: ${tagName}`)\n } else {\n consola.warn(`tag ${tagName} 已存在,跳过 (使用 force 选项可覆盖)`)\n continue\n }\n }\n\n // 为指定的 commit 添加 tag\n await git.tag([tagName, hash])\n consola.success(`本地: 为 commit ${hash.substring(0, 7)} (${message.substring(0, 50)}...) 添加 tag ${tagName}`)\n\n // 如果需要推送到远程仓库\n if (push) {\n try {\n // 推送 tag 到远程\n const pushArgs = force ? [remote, tagName, \"--force\"] : [remote, tagName]\n await git.push(pushArgs)\n consola.success(`远程: 推送 tag ${tagName}`)\n } catch (error) {\n consola.error(`推送 tag ${tagName} 到远程失败:`, error)\n }\n }\n } catch (error) {\n consola.error(`为 commit ${hash} 添加 tag ${tagName} 失败:`, error)\n }\n }\n\n consola.success(\"所有匹配的 tag 添加完成\")\n}\n","import { rm, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\n\n/** PostCSS 配置文件内容 */\nconst postcssConfig = `// @ts-check\n\n/** @type {import(\"postcss-load-config\").Config} */\nconst config = {\n plugins: {\n tailwindcss: {},\n autoprefixer: {},\n },\n}\n\nexport default config\n`\n\n/**\n * 添加 postcss.config.js 配置\n * 会先删除已存在的配置文件,然后创建新的\n */\nexport async function addPostCSSConfig() {\n try {\n await rm(\"postcss.config.js\", { force: true })\n await rm(\"postcss.config.mjs\", { force: true })\n await rm(\"postcss.config.cjs\", { force: true })\n await writeFile(\"postcss.config.mjs\", postcssConfig, \"utf-8\")\n consola.success(\"添加 postcss.config.mjs 配置成功\")\n } catch {\n consola.fail(\"添加 postcss.config.mjs 配置失败\")\n }\n}\n","import { writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\n\nimport { hasDependency } from \"./hasDependency\"\n\n/** Tailwind 默认配置内容 */\nexport const tailwindConfig = `import { Config } from \"tailwindcss\"\n\nconst config: Config = {\n content: [\n \"./*.{js,ts,jsx,tsx,html}\",\n \"./public/index.html\",\n \"./src/**/*.{js,ts,jsx,tsx}\",\n \"./app/**/*.{js,ts,jsx,tsx}\",\n \"./components/**/*.{js,ts,jsx,tsx}\",\n \"./pages/**/*.{js,ts,jsx,tsx}\",\n \"./routes/**/*.{js,ts,jsx,tsx}\",\n \"./utils/**/*.{js,ts,jsx,tsx}\"\n ],\n theme: {\n extend: {},\n },\n plugins: [],\n}\n\nexport default config\n`\n\nexport const tailwindConfigWithHeroUi = `import { heroui } from \"@heroui/react\"\nimport { Config } from \"tailwindcss\"\n\nconst config: Config = {\n content: [\n \"./*.{js,ts,jsx,tsx,html}\",\n \"./public/index.html\",\n \"./src/**/*.{js,ts,jsx,tsx}\",\n \"./app/**/*.{js,ts,jsx,tsx}\",\n \"./components/**/*.{js,ts,jsx,tsx}\",\n \"./pages/**/*.{js,ts,jsx,tsx}\",\n \"./routes/**/*.{js,ts,jsx,tsx}\",\n \"./utils/**/*.{js,ts,jsx,tsx}\",\n \"./node_modules/@heroui/theme/dist/**/*.{js,ts,jsx,tsx}\",\n ],\n theme: {\n extend: {},\n },\n darkMode: \"class\",\n plugins: [heroui()],\n}\n\nexport default config\n`\n\n/**\n * 添加 Tailwind 配置文件\n * 创建 tailwind.config.ts 文件并写入默认配置\n */\nexport async function addTailwindConfig() {\n try {\n const hasHeroUi = await hasDependency(/^@heroui\\//)\n const config = hasHeroUi ? tailwindConfigWithHeroUi : tailwindConfig\n await writeFile(\"tailwind.config.ts\", config, \"utf-8\")\n consola.success(\"添加 tailwind.config.ts 配置成功\")\n } catch {\n consola.fail(\"添加 tailwind.config.ts 配置失败\")\n }\n}\n","import { readdir, stat } from \"fs/promises\"\nimport { join } from \"path\"\n\n/**\n * 获取入口 CSS 路径\n * @param dir 目录\n * @returns 入口 CSS 目录\n */\nexport async function getEntryCssDir(dir: string): Promise<string> {\n const dir2 = await readdir(dir)\n\n if (dir2.includes(\"app\")) {\n const stats = await stat(join(dir, \"app\"))\n if (stats.isDirectory()) return getEntryCssDir(join(dir, \"app\"))\n }\n\n if (dir2.includes(\"src\")) {\n const stats = await stat(join(dir, \"src\"))\n if (stats.isDirectory()) return getEntryCssDir(join(dir, \"src\"))\n }\n\n return dir\n}\n","import { readdir, writeFile } from \"fs/promises\"\nimport { join, parse } from \"path\"\n\nimport { getEntryCssDir } from \"./getEntryCssDir\"\n\n/**\n * 创建项目的入口 CSS 文件\n * 根据目录中是否存在 index/main 或 app 文件来决定 CSS 文件名\n * @param dir 目标目录\n * @returns CSS 文件的完整路径\n */\nexport async function createEntryCss(dir = \".\") {\n const path = await getEntryCssDir(dir)\n const dir2 = await readdir(path)\n let hasIndex = false\n let hasApp = false\n\n for (const item of dir2) {\n const parsedPath = parse(item)\n if (!(parsedPath.ext === \"ts\" || parsedPath.ext === \"tsx\" || parsedPath.ext === \"js\" || parsedPath.ext === \"jsx\")) continue\n if (parsedPath.name.toLowerCase() === \"index\" || parsedPath.name.toLowerCase() === \"main\") hasIndex = true\n if (parsedPath.name.toLowerCase() === \"app\") hasApp = true\n if (hasIndex && hasApp) break\n }\n\n const cssPath = hasIndex || !hasApp ? join(path, \"index.css\") : join(path, \"app.css\")\n await writeFile(cssPath, \"\")\n return cssPath\n}\n","import { readFile, writeFile } from \"fs/promises\"\nimport { parse } from \"path\"\n\nimport consola from \"consola\"\n\nimport { createEntryCss } from \"./createEntryCss\"\nimport { getFiles } from \"./getFiles\"\n\n/**\n * 向项目中添加 Tailwind CSS 配置\n * 会在 index.css/app.css/globals.css 中添加 Tailwind 引用\n * 如果没有找到这些文件,会创建一个新的 index.css\n */\nexport async function addTailwindToCss() {\n try {\n const files = await getFiles({\n match: (path, stats) =>\n (path.base.toLowerCase() === \"index.css\" || path.base.toLowerCase() === \"app.css\" || path.base.toLowerCase() === \"globals.css\") &&\n stats.isFile(),\n count: 1,\n exclude: (path, stats) => path.base === \"node_modules\" && stats.isDirectory(),\n })\n if (files.length === 0) files.push(await createEntryCss())\n const file = files[0]\n const { base } = parse(file)\n const css = await readFile(file, \"utf-8\")\n\n if (css.includes(\"@tailwind\")) {\n consola.warn(`${base} 已经包含 tailwind`)\n return\n }\n\n await writeFile(\n file,\n `@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n${css}`,\n \"utf-8\",\n )\n consola.success(`添加 tailwind 成功`)\n } catch (error) {\n console.log(error)\n consola.fail(`添加 tailwind 失败`)\n }\n}\n","import consola from \"consola\"\n\nimport { addDependency } from \"./addDependency\"\nimport { addPostCSSConfig } from \"./addPostCSSConfig\"\nimport { addPrettier } from \"./addPrettier\"\nimport { addTailwindConfig } from \"./addTailwindConfig\"\nimport { addTailwindToCss } from \"./addTailwindToCss\"\n\n/** 添加 tailwind */\nexport async function addTailwind() {\n consola.start(\"开始添加 tailwind 配置\")\n await addDependency({\n package: [{ packageName: \"tailwindcss\", versionRange: \"^3\" }, \"autoprefixer\", \"postcss\", \"prettier\", \"prettier-plugin-tailwindcss\"],\n type: \"devDependencies\",\n })\n await addTailwindConfig()\n await addPostCSSConfig()\n await addTailwindToCss()\n await addPrettier()\n consola.success(\"添加 tailwind 配置成功\")\n}\n","import { mkdir, writeFile } from \"fs/promises\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { addDependency } from \"./addDependency\"\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nconst zipDistContent = `// @ts-check\nimport { rm } from \"fs/promises\"\nimport { zip } from \"soda-nodejs\"\n\nconst filename = process.env.FILENAME || \"dist.zip\"\n\nasync function main() {\n await rm(filename, { force: true })\n await zip({\n input: \"dist\",\n output: filename,\n })\n}\n\nmain()\n`\n\n/**\n * 压缩脚本的配置选项\n */\ntype AddZipDistConfig = {\n /** 是否自动安装依赖 */\n install?: boolean\n}\n\n/**\n * 添加构建产物压缩脚本\n * 1. 添加必要的依赖\n * 2. 创建压缩脚本\n * 3. 修改构建命令\n *\n * @param config 配置选项\n * @returns commit message\n */\nexport async function addZipDist({ install }: AddZipDistConfig = {}) {\n await addDependency({\n package: [\"soda-nodejs\"],\n type: \"devDependencies\",\n })\n await mkdir(\"scripts\", { recursive: true })\n await writeFile(\"scripts/zipDist.mjs\", zipDistContent, \"utf-8\")\n const packageJson = await readPackageJson()\n packageJson.scripts.build = `${packageJson.scripts.build} && node scripts/zipDist.mjs`\n await writePackageJson({ data: packageJson })\n if (install) await installDependceny()\n return getCommitMessage(CommitType.feature, \"添加压缩脚本\")\n}\n","export function getTypeInGenerics(str: string, start = 0) {\n if (str[start] !== \"<\") throw new Error(\"无效的泛型\")\n let count = 1\n let index: number | undefined = undefined\n\n for (let i = start + 1; i < str.length; i++) {\n const w = str[i]\n\n if (w === \"<\") {\n count++\n continue\n }\n\n if (w === \">\") {\n count--\n\n if (count === 0) {\n index = i\n break\n }\n }\n }\n\n if (index === undefined) throw new Error(\"无效的泛型\")\n return str.slice(start + 1, index)\n}\n","import { readFile, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\n\nimport { getFiles } from \"./getFiles\"\nimport { getTypeInGenerics } from \"./getTypeInGenerics\"\n\n/**\n * 表示箭头函数转换选项的类型\n */\nexport type ArrowToFunctionChoice = {\n /** 选项值 */\n value: string\n /** 简短显示名 */\n short: string\n /** 完整显示名 */\n name: string\n /** 是否默认选中 */\n checked: boolean\n}\n\n/**\n * 将 React 箭头函数组件转换为普通函数组件\n * 支持自动模式和手动选择模式\n * 自动跳过包含 memo 和 forwardRef 的组件\n */\nexport async function arrowToFunction() {\n consola.start(\"开始将转换箭头函数组件为函数组件\")\n const files = await getFiles({\n dir: \"src\",\n match: (path, stats) => path.ext === \".tsx\" && stats.isFile(),\n })\n const reg = /^(export )?const \\w+?: FC.+?$/gm\n const { auto } = await inquirer.prompt({\n type: \"confirm\",\n name: \"auto\",\n message: \"是否自动选择要转换的组件\",\n })\n\n const warnFiles: Set<string> = new Set()\n const modifiedFiles: Set<string> = new Set()\n\n if (auto) {\n for (const file of files) {\n let code = await readFile(file, \"utf-8\")\n let exportDefaultReg: RegExp | undefined = undefined\n code = code.replace(reg, match => {\n if (match.includes(\"memo(\") || match.includes(\"forwardRef(\")) {\n warnFiles.add(file)\n return match\n }\n\n modifiedFiles.add(file)\n const hasExport = match.startsWith(\"export \")\n const name = match.match(/const (\\w+?):/)![1]\n const edReg = new RegExp(`^export default ${name}$`, \"m\")\n let hasExportDefault = false\n\n if (!exportDefaultReg && !hasExport && edReg.test(code)) {\n exportDefaultReg = edReg\n hasExportDefault = true\n }\n\n const typeIndex = match.indexOf(\"FC<\")\n\n if (typeIndex > 0) {\n const type = getTypeInGenerics(match, typeIndex + 2)\n return `${hasExport ? \"export \" : \"\"}${hasExportDefault ? \"export default \" : \"\"}function ${name}(props: ${type}) {`\n }\n\n return `${hasExport ? \"export \" : \"\"}${hasExportDefault ? \"export default \" : \"\"}function ${name}() {`\n })\n if (exportDefaultReg) code = code.replace(exportDefaultReg, \"\")\n await writeFile(file, code, \"utf-8\")\n }\n } else {\n for (const file of files) {\n let code = await readFile(file, \"utf-8\")\n const matches = code.match(reg)\n if (!matches) continue\n consola.start(file)\n\n const choices = Array.from(matches).reduce((prev: ArrowToFunctionChoice[], match, index) => {\n if (match.includes(\"memo(\") || match.includes(\"forwardRef(\")) {\n warnFiles.add(file)\n return prev\n }\n\n modifiedFiles.add(file)\n const hasExport = match.startsWith(\"export \")\n const funName = match.match(/const (\\w+?):/)![1]\n const typeIndex = match.indexOf(\"FC<\")\n\n if (typeIndex > 0) {\n const type = getTypeInGenerics(match, typeIndex + 2)\n\n const name = `◆ ${match}\n ◆ ${hasExport ? \"export \" : \"\"}function ${funName}(props: ${type}) {`\n\n prev.push({\n value: index.toString(),\n short: funName,\n name,\n checked: true,\n })\n } else {\n const name = `◆ ${match}\n ◆ ${hasExport ? \"export \" : \"\"}function ${funName}() {`\n\n prev.push({\n value: index.toString(),\n short: funName,\n name,\n checked: true,\n })\n }\n\n return prev\n }, [])\n\n const length = choices.length.toString().length\n\n choices.forEach((choice, index) => {\n let first = true\n choice.name = choice.name.replace(/◆/g, () => {\n if (first) {\n first = false\n return `◆ ${(index + 1).toString().padStart(length, \"0\")}.`\n }\n\n return \"\".padStart(length + 3, \" \")\n })\n })\n\n const { indexs } = await inquirer.prompt({\n type: \"checkbox\",\n name: \"indexs\",\n message: `total ${choices.length} component${choices.length > 1 ? \"s\" : \"\"}`,\n choices,\n })\n\n const index = 0\n\n let exportDefaultReg: RegExp | undefined = undefined\n\n code = code.replace(reg, match => {\n if (!indexs.includes(index.toString())) return match\n const hasExport = match.startsWith(\"export \")\n const name = match.match(/const (\\w+?):/)![1]\n const edReg = new RegExp(`^export default ${name}$`, \"m\")\n let hasExportDefault = false\n\n if (!exportDefaultReg && !hasExport && edReg.test(code)) {\n exportDefaultReg = edReg\n hasExportDefault = true\n }\n\n const typeIndex = match.indexOf(\"FC<\")\n\n if (typeIndex > 0) {\n const type = getTypeInGenerics(match, typeIndex + 2)\n return `${hasExport ? \"export \" : \"\"}${hasExportDefault ? \"export default \" : \"\"}function ${name}(props: ${type}) {`\n }\n\n return `${hasExport ? \"export \" : \"\"}${hasExportDefault ? \"export default \" : \"\"}function ${name}() {`\n })\n\n if (exportDefaultReg) code = code.replace(exportDefaultReg, \"\")\n\n console.log()\n\n await writeFile(file, code, \"utf-8\")\n }\n }\n\n if (modifiedFiles.size > 0) consola.success(`以下文件中的箭头函数组件已经转换为函数组件:\\n\\n${Array.from(modifiedFiles).join(\"\\n\")}`)\n\n if (warnFiles.size > 0) consola.warn(`以下文件中存在 memo 或 forwardRef,请手动转换:\\n\\n${Array.from(warnFiles).join(\"\\n\")}`)\n}\n","import consola from \"consola\"\nimport dayjs from \"dayjs\"\nimport inquirer from \"inquirer\"\nimport { execAsync, spawnAsync } from \"soda-nodejs\"\n\nimport { backupFirst } from \"./backupFirst\"\nimport { isRepository } from \"./isRepository\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\n/**\n * 获取新的测试版本号\n * 如果当前是测试版本,则生成新的测试版本号\n * 如果当前是正式版本,则提示选择升级级别后生成测试版本号\n * @returns 新的测试版本号\n */\nexport async function getBetaVersion() {\n const packageJson = await readPackageJson()\n const { version } = packageJson\n const reg = /^(\\d+)\\.(\\d+)\\.(\\d+)(-beta\\.(\\d+))?$/\n const match = version.match(reg)\n\n if (!match) {\n consola.error(\"版本号不符合规范\")\n throw new Error(\"版本号不符合规范\")\n }\n\n const [, major, minor, patch, , beta] = match\n\n if (beta) {\n const newVersion = `${major}.${minor}.${patch}-beta.${dayjs().format(\"YYYYMMDDHHmmss\")}`\n packageJson.version = newVersion\n return newVersion\n }\n\n const { level } = await inquirer.prompt({\n type: \"list\",\n name: \"level\",\n message: \"请选择升级的级别\",\n choices: [\"major\", \"minor\", \"patch\", \"none\"],\n })\n let newBaseVersion = \"\"\n\n switch (level) {\n case \"major\":\n newBaseVersion = `${parseInt(major) + 1}.0.0`\n break\n case \"minor\":\n newBaseVersion = `${major}.${parseInt(minor) + 1}.0`\n break\n case \"patch\":\n newBaseVersion = `${major}.${minor}.${parseInt(patch) + 1}`\n break\n case \"none\":\n newBaseVersion = `${major}.${minor}.${patch}`\n break\n }\n\n const newVersion = `${newBaseVersion}-beta.${dayjs().format(\"YYYYMMDDHHmmss\")}`\n packageJson.version = newVersion\n return newVersion\n}\n\n/**\n * 发布测试版本\n * 1. 备份当前代码\n * 2. 更新版本号\n * 3. 提交代码并打标签\n * 4. 可选发布到 npm\n */\nexport async function betaVersion() {\n await backupFirst()\n const version = await getBetaVersion()\n const packageJson = await readPackageJson()\n packageJson.version = version\n await writePackageJson({ data: packageJson })\n\n if (await isRepository()) {\n await execAsync(\"git add .\")\n await execAsync(`git commit -m \"${version}\"`)\n await execAsync(`git tag ${version}`)\n }\n\n const { publish } = await inquirer.prompt({\n type: \"confirm\",\n name: \"publish\",\n message: \"是否现在发布\",\n })\n\n if (publish) {\n await spawnAsync(\"npm publish --tag beta\", {\n shell: true,\n stdio: \"inherit\",\n })\n }\n}\n","import { spawnAsync } from \"soda-nodejs\"\n\n/**\n * 执行 TypeScript 类型检查\n * 使用 tsc --noEmit 命令检查项目中的类型错误\n */\nexport async function checkType() {\n await spawnAsync(\"npx tsc --noEmit\", { shell: true, stdio: \"inherit\" })\n}\n","import consola from \"consola\"\nimport inquirer from \"inquirer\"\nimport { execAsync, spawnAsync } from \"soda-nodejs\"\n\nexport async function clearDockerImage(name?: string) {\n name = name?.trim()\n const output = await execAsync(`docker images -f \"dangling=true\"${name ? ` -f \"reference=*${name}*\"` : \"\"}`)\n const outputs = output.split(\"\\n\").filter(Boolean)\n\n if (outputs.length === 1) {\n consola.warn(\"没有找到需要删除的镜像\")\n return\n }\n\n const images = outputs.slice(1).map(item => item.match(/<none> +([0-9a-f]{12}) +/)![1])\n\n interface Answer {\n images: string[]\n }\n\n const { images: images2 } = await inquirer.prompt<Answer>({\n type: \"checkbox\",\n name: \"images\",\n message: \"选择要删除的镜像\",\n choices: outputs.map((item, index) => ({\n name: item,\n value: index === 0 ? \"\" : images[index - 1],\n disabled: index === 0,\n checked: index !== 0, // 默认选中除第一项外的所有项\n })),\n })\n\n for (let i = 0; i < images2.length; i++) {\n const image = images2[i]\n\n try {\n consola.ready(`正在删除 ${image}`)\n await spawnAsync(`docker rmi ${image}`, {\n shell: true,\n stdio: \"inherit\",\n })\n consola.success(`删除 ${image} 成功`)\n } catch {\n consola.error(`删除 ${image} 失败`)\n if (i === images2.length - 1) break\n\n interface Answer2 {\n next: boolean\n }\n\n const { next } = await inquirer.prompt<Answer2>({\n type: \"confirm\",\n name: \"next\",\n message: \"是否继续删除下一个镜像\",\n default: true,\n })\n if (!next) break\n }\n }\n}\n","import { spawnAsync } from \"soda-nodejs\"\n\nexport async function clearDockerLog(name: string) {\n await spawnAsync(`truncate -s 0 $(docker inspect --format='{{.LogPath}}' ${name})`, {\n shell: true,\n stdio: \"inherit\",\n })\n}\n","/**\n * 将代码文件转换为 VS Code 代码片段格式\n * 支持自定义占位符替换\n * @param path 源代码文件路径\n */\nimport { readFile } from \"fs/promises\"\nimport { parse } from \"path\"\n\nimport clipboard from \"clipboardy\"\nimport inquirer from \"inquirer\"\n\nexport async function code2Snippet(path: string) {\n const { name } = parse(path)\n const code = await readFile(path, \"utf-8\")\n\n const placeholders: string[] = []\n\n while (true) {\n let { placeholder } = await inquirer.prompt({\n type: \"input\",\n name: \"placeholder\",\n message: \"请输入需要替换的占位符,输入空字符串结束\",\n })\n placeholder = placeholder.trim()\n if (!placeholder) break\n placeholders.push(placeholder)\n }\n\n const lines = code.split(\"\\n\")\n const reg = /^ *$/\n const reg2 = /^ */\n const trim = Math.min(...lines.map(line => (reg.test(line) ? Infinity : reg2.exec(line)![0].length)))\n\n function line2Snippet(line: string) {\n line = line.slice(trim).trimEnd().replace(/\\\\/g, `\\\\\\\\`).replace(/\"/g, `\\\\\"`).replace(/\\$/g, `\\\\\\\\$`)\n\n placeholders.forEach((placeholder, index) => {\n const reg = new RegExp(placeholder, \"g\")\n line = line.replace(reg, `\\${${index + 1}:${placeholder}}`)\n })\n\n return ` \"${line}\"`\n }\n\n const body = lines.map(line2Snippet).join(\",\\n\")\n\n const snippet = `,\n \"${name}\": {\n \"scope\": \"javascript,javascriptreact,typescript,typescriptreact\",\n \"prefix\": \"${name.toLowerCase().replace(/\\W/, \"\")}\",\n \"body\": [\n${body}\n ]\n }`\n\n await clipboard.write(snippet)\n}\n","import { writeFile } from \"fs/promises\"\n\n/**\n * 创建 .browserslistrc 配置文件\n * 用于指定项目支持的浏览器版本范围\n */\nexport async function createBrowserlistrc() {\n await writeFile(\n \".browserslistrc\",\n `chrome >= 87\nedge >= 88\nfirefox >= 78\nsafari >= 14`,\n \"utf-8\",\n )\n}\n","import { copyFile, mkdir, readdir, rm, writeFile } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport { spawnAsync, zip } from \"soda-nodejs\"\n\nconst json = {\n name: \"prisma-debugger\",\n version: \"1.0.0\",\n main: \"index.ts\",\n type: \"module\",\n dependencies: {},\n devDependencies: {},\n}\n\nconst schema = `// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"generated\"\n runtime = \"nodejs\"\n moduleFormat = \"esm\"\n generatedFileExtension = \"ts\"\n importFileExtension = \"\"\n binaryTargets = [\"windows\", \"debian-openssl-1.0.x\", \"debian-openssl-1.1.x\", \"debian-openssl-3.0.x\", \"rhel-openssl-1.0.x\", \"rhel-openssl-1.1.x\", \"rhel-openssl-3.0.x\"]\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel User {\n id String @id @default(uuid()) // 主键ID\n name String\n}\n`\n\nconst index = `import { PrismaClient } from \"./prisma/generated/client\"\n\nconst prisma = new PrismaClient()\n`\n\nconst env = `DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres`\n\nexport async function createPrismaDebugger() {\n try {\n await mkdir(\"prisma-debugger/prisma\", { recursive: true })\n await writeFile(\"prisma-debugger/package.json\", JSON.stringify(json, null, 4), \"utf-8\")\n\n await spawnAsync(\"npm i @prisma/client\", {\n cwd: \"prisma-debugger\",\n stdio: \"inherit\",\n shell: true,\n })\n\n await spawnAsync(\"npm i @types/node cross-env prisma tsx typescript --save-dev\", {\n cwd: \"prisma-debugger\",\n stdio: \"inherit\",\n shell: true,\n })\n\n await writeFile(\"prisma-debugger/prisma/schema.prisma\", schema, \"utf-8\")\n\n await spawnAsync(\"npx prisma generate\", {\n cwd: \"prisma-debugger\",\n stdio: \"inherit\",\n shell: true,\n })\n\n const dir = await readdir(\"prisma-debugger/prisma/generated\")\n\n for (const item of dir) {\n if (item.endsWith(\".node\")) await copyFile(join(\"prisma-debugger/prisma/generated\", item), join(\"prisma-debugger/node_modules/prisma\", item))\n }\n\n await writeFile(\"prisma-debugger/index.ts\", index, \"utf-8\")\n await writeFile(\"prisma-debugger/.env\", env, \"utf-8\")\n\n await zip({\n input: \"prisma-debugger\",\n output: \"prisma-debugger.zip\",\n })\n } catch (error) {\n await rm(\"prisma-debugger\", { recursive: true })\n }\n\n await rm(\"prisma-debugger\", { recursive: true })\n}\n","import type { Headers as NodeFetchHeaders } from \"node-fetch\"\n\n/**\n * 从 HTTP headers 中提取文件名\n * @param headers HTTP headers对象\n * @returns 文件名,如果未找到则返回 undefined\n */\nexport function getFilename(headers: Headers | NodeFetchHeaders) {\n const disposition = headers.get(\"content-disposition\")\n if (!disposition) return undefined\n const reg = /filename=(.+?);/\n const result = disposition.match(reg)\n if (!result) return undefined\n return result[1]\n}\n","import { createWriteStream } from \"fs\"\nimport { join } from \"path\"\nimport { Readable } from \"stream\"\n\nimport fetch from \"node-fetch\"\n\nimport { agent } from \"@/constant/index\"\n\nimport { getFilename } from \"./getFilename\"\n\n/**\n * 通用文件下载函数\n * @param url 下载地址\n * @param dir 下载目标目录\n * @param filename 可选的文件名\n * @returns 实际保存的文件名\n */\nexport async function download(url: string, dir: string, filename?: string) {\n const response = await fetch(url, { agent })\n filename = getFilename(response.headers) || filename || new URL(url).pathname.split(\"/\").at(-1)!\n filename = filename.replace(/^\"(.+?)\"$/, \"$1\")\n const writeable = createWriteStream(join(dir, filename))\n await new Promise<0>((resolve, reject) =>\n Readable.from(response.body!)\n .pipe(writeable)\n .on(\"finish\", () => resolve(0))\n .on(\"error\", reject))\n return filename\n}\n","export async function sleep(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n","import { rename } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport consola from \"consola\"\nimport fetch from \"node-fetch\"\nimport YAML from \"yaml\"\n\nimport { agent } from \"@/constant/index\"\n\nimport { download } from \"./download\"\nimport { sleep } from \"./sleep\"\n\n/**\n * Winget 包管理器相关类型定义\n */\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Winget {\n export interface Package {\n PackageIdentifier: string\n PackageVersion: string\n InstallerType: string\n InstallModes: string[]\n InstallerSwitches: InstallerSwitches\n ExpectedReturnCodes: ExpectedReturnCode[]\n UpgradeBehavior: string\n Protocols: string[]\n FileExtensions: string[]\n AppsAndFeaturesEntries: AppsAndFeaturesEntry[]\n Installers: Installer[]\n ManifestType: string\n ManifestVersion: string\n }\n\n export interface Installer {\n Architecture: string\n Scope?: string\n InstallerUrl: string\n InstallerSha256: string\n InstallerLocale?: string\n InstallerType?: string\n }\n\n export interface InstallerSwitches2 {\n Custom: string\n }\n\n export interface AppsAndFeaturesEntry {\n UpgradeCode: string\n InstallerType: string\n }\n\n export interface ExpectedReturnCode {\n InstallerReturnCode: number\n ReturnResponse: string\n }\n\n export interface InstallerSwitches {\n Log: string\n }\n}\n\nexport interface GithubContent {\n name: string\n path: string\n sha: string\n size: number\n url: string\n html_url: string\n git_url: string\n download_url?: string | null\n type: string\n _links: Links\n}\n\nexport interface Links {\n self: string\n git: string\n html: string\n}\n\n/**\n * 从 Winget 仓库下载软件\n * 1. 获取软件最新版本信息\n * 2. 解析安装包配置\n * 3. 下载并重命名安装包\n * @param param0 下载配置\n * @param param0.name 软件名称\n * @param param0.id Winget ID\n * @param param0.dir 下载目录\n * @param param0.filter 安装包筛选函数\n */\nexport async function downloadFromWinget({ name, id, dir, filter }: WingetDownloadInfo) {\n const firstLetter = id[0].toLowerCase()\n const path = id.replace(/\\./g, \"/\")\n const response = await fetch(`https://api.github.com/repos/microsoft/winget-pkgs/contents/manifests/${firstLetter}/${path}`, { agent })\n\n const data: GithubContent[] = (await response.json()) as any\n\n if (!Array.isArray(data)) throw new Error((data as any).message)\n\n const reg2 = /^\\d+(\\.\\d+?)*$/\n const stables = data.filter(item => reg2.test(item.name))\n\n stables.sort((a, b) => {\n const avs = a.name.split(\".\")\n const bvs = b.name.split(\".\")\n const max = Math.max(avs.length, bvs.length)\n\n for (let i = 0; i < max; i++) {\n const av = avs[i] ? parseInt(avs[i]) : 0\n const bv = bvs[i] ? parseInt(bvs[i]) : 0\n if (av < bv) return 1\n if (av > bv) return -1\n }\n\n return 0\n })\n\n const response2 = await fetch(\n `https://raw.githubusercontent.com/microsoft/winget-pkgs/master/manifests/${firstLetter}/${path}/${stables[0].name}/${id}.installer.yaml`,\n { agent },\n )\n const yaml = await response2.text()\n const pkg: Winget.Package = YAML.parse(yaml)\n\n const installers = filter ? pkg.Installers.filter(filter) : pkg.Installers\n\n if (installers.length === 0) {\n consola.warn(`未找到 ${name} 的安装程序`)\n return\n }\n\n const result: WingetItem[] = []\n\n for (const { InstallerUrl, Architecture } of installers) {\n const filename = await download(InstallerUrl, dir)\n\n result.push({\n filename,\n version: pkg.PackageVersion,\n ext: new URL(InstallerUrl).pathname.endsWith(\".exe\") ? \"exe\" : \"msi\",\n architecture: Architecture,\n })\n }\n\n for (const { version, filename, architecture, ext } of result) {\n await sleep(100)\n await rename(join(dir, filename), join(dir, `${name}-${version}-${architecture}.${ext}`))\n }\n}\n\nexport type WingetItem = {\n filename: string\n version: string\n ext: string\n architecture: string\n}\n\nexport type WingetDownloadInfo = {\n name: string\n id: string\n dir: string\n filter: (item: Winget.Installer, index: number, arr: Winget.Installer[]) => boolean\n}\n","/**\n * 从 Winget 下载 7Zip 压缩软件\n * @param dir 下载目标目录\n */\nimport { downloadFromWinget } from \"./downloadFromWinget\"\n\nexport async function download7Zip(dir: string) {\n await downloadFromWinget({\n name: \"7Zip\",\n id: \"7zip.7zip\",\n dir,\n filter: item => item.Architecture === \"x64\" && item.InstallerType === \"exe\",\n })\n}\n","import { downloadFromWinget } from \"./downloadFromWinget\"\n\n/**\n * 从 Winget 下载 AnyDesk 远程控制软件\n * @param dir 下载目标目录\n */\nexport async function downloadAnydesk(dir: string) {\n await downloadFromWinget({\n name: \"AnyDesk\",\n id: \"AnyDeskSoftwareGmbH.AnyDesk\",\n dir,\n filter: item => item.InstallerType === \"exe\",\n })\n}\n","import fetch from \"node-fetch\"\n\nimport { agent } from \"@/constant\"\n\n/**\n * GitHub Release 信息接口\n */\nexport interface Release {\n url: string\n assets_url: string\n upload_url: string\n html_url: string\n id: number\n author: Author\n node_id: string\n tag_name: string\n target_commitish: string\n name: string\n draft: boolean\n prerelease: boolean\n created_at: string\n published_at: string\n assets: Asset[]\n tarball_url: string\n zipball_url: string\n body: string\n discussion_url: string\n reactions: Reactions\n}\n\nexport interface Reactions {\n url: string\n total_count: number\n \"+1\": number\n \"-1\": number\n laugh: number\n hooray: number\n confused: number\n heart: number\n rocket: number\n eyes: number\n}\n\nexport interface Asset {\n url: string\n id: number\n node_id: string\n name: string\n label?: string\n uploader: Author\n content_type: string\n state: string\n size: number\n download_count: number\n created_at: string\n updated_at: string\n browser_download_url: string\n}\n\nexport interface Author {\n login: string\n id: number\n node_id: string\n avatar_url: string\n gravatar_id: string\n url: string\n html_url: string\n followers_url: string\n following_url: string\n gists_url: string\n starred_url: string\n subscriptions_url: string\n organizations_url: string\n repos_url: string\n events_url: string\n received_events_url: string\n type: string\n site_admin: boolean\n}\n\n/**\n * 获取 GitHub 仓库的最新发布版本信息\n * @param owner 仓库所有者\n * @param repo 仓库名称\n * @returns Release 信息\n * @description 通过 GitHub API 获取仓库的最新发布信息\n */\nexport async function getLatestRelease(owner: string, repo: string): Promise<Release> {\n const url = `https://api.github.com/repos/${owner}/${repo}/releases/latest`\n const response = await fetch(url, { agent })\n const data = await response.json()\n return data as Release\n}\n","import { rename, rm } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport { unzip } from \"soda-nodejs\"\n\nimport { download } from \"./download\"\nimport { getLatestRelease } from \"./getLatestRelease\"\n\n/**\n * 从 GitHub 下载 Bun 运行时并解压安装\n * @param dir 下载目标目录\n * @throws 如果找不到对应的下载文件\n */\nexport async function downloadBun(dir: string) {\n const release = await getLatestRelease(\"oven-sh\", \"bun\")\n const url = release.assets.find(asset => asset.name === \"bun-windows-x64.zip\")?.browser_download_url\n if (!url) throw new Error(\"未找到 bun-windows-x64.zip\")\n await download(url, dir)\n await unzip({\n input: \"bun-windows-x64.zip\",\n output: \".\",\n cwd: dir,\n })\n await rename(join(dir, \"bun-windows-x64\", \"bun.exe\"), join(dir, \"bun.exe\"))\n await rm(join(dir, \"bun-windows-x64.zip\"), { force: true })\n await rm(join(dir, \"bun-windows-x64\"), { force: true, recursive: true })\n}\n","import { downloadFromWinget } from \"./downloadFromWinget\"\n\n/**\n * 从 Winget 下载 Chrome 浏览器\n * @param dir 下载目标目录\n */\nexport async function downloadChrome(dir: string) {\n await downloadFromWinget({\n name: \"Chrome\",\n id: \"Google.Chrome\",\n dir,\n filter: item => item.Architecture === \"x64\",\n })\n}\n","import { download } from \"./download\"\n\n/**\n * PCQQ 下载接口返回数据类型\n */\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace PCQQ {\n export interface Result {\n resp: Resp\n }\n\n export interface Resp {\n soft_list: Softlist[]\n retCode: number\n }\n\n export interface Softlist {\n soft_id: number\n os_type: number\n os_bit: number\n display_name: string\n nick_ver: string\n ver_name: string\n file_size: string\n file_name: string\n publish_date: string\n download_url: string\n download_https_url: string\n }\n}\n\n/**\n * 从腾讯电脑管家下载软件\n * @param dir 下载目录\n * @param cmdid 命令ID\n * @param soft_id_list 软件ID列表\n */\nexport async function downloadFromPCQQ(dir: string, cmdid: number, soft_id_list: number) {\n const data = new URLSearchParams()\n data.set(\"cmdid\", cmdid.toString())\n data.set(\"jprxReq[req][soft_id_list][]\", soft_id_list.toString())\n const headers = new Headers()\n headers.set(\"Content-Type\", \"application/x-www-form-urlencoded\")\n const response = await fetch(`https://luban.m.qq.com/api/public/software-manager/softwareProxy`, {\n method: \"POST\",\n headers,\n body: data.toString(),\n })\n const result: PCQQ.Result = await response.json()\n await download(result.resp.soft_list[0].download_https_url, dir, result.resp.soft_list[0].file_name)\n}\n","import { readdir, rename } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport { downloadFromPCQQ } from \"./downloadFromPCQQ\"\n\n/**\n * 下载 DeskGo 工具并重命名文件\n * @param dir 下载目标目录\n */\nexport async function downloadDeskGo(dir: string) {\n await downloadFromPCQQ(dir, 3318, 23125)\n const dir2 = await readdir(dir)\n const file = dir2.find(item => item.startsWith(\"DeskGo\"))!\n await rename(\n join(dir, file),\n join(\n dir,\n file.replace(/^DeskGo_(.+)_full\\.exe$/, (match, arg) => `DeskGo-${arg.replace(/_/g, \".\")}-x64.exe`),\n ),\n )\n}\n","import { downloadFromWinget } from \"./downloadFromWinget\"\n\n/**\n * 下载 Firefox 浏览器中文版\n * @param dir 下载目录\n */\nexport async function downloadFirefox(dir: string) {\n await downloadFromWinget({\n name: \"Firefox\",\n id: \"Mozilla.Firefox.zh-CN\",\n dir,\n filter: item => item.Architecture === \"x64\",\n })\n}\n","import { rename, rm } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport { unzip } from \"soda-nodejs\"\n\nimport { download } from \"./download\"\n\n/**\n * 下载 Geek Uninstaller 卸载工具\n * 1. 下载 zip 文件\n * 2. 解压并获取版本号\n * 3. 重命名为带版本号的文件名\n * @param dir 下载目录\n */\nexport async function downloadGeekUninstaller(dir: string) {\n await download(`https://geekuninstaller.com/geek.zip`, dir)\n await unzip({\n input: join(dir, \"geek.zip\"),\n output: dir,\n })\n await rm(join(dir, \"geek.zip\"), { force: true })\n const response = await fetch(\"https://geekuninstaller.com/download\")\n const text = await response.text()\n const version = text.match(/<b>(.+?)<\\/b>/)![1]\n await rename(join(dir, \"geek.exe\"), join(dir, `Geek-${version}-x64.exe`))\n}\n","import { downloadFromWinget } from \"./downloadFromWinget\"\n\n/**\n * 下载 Git 版本控制工具\n * @param dir 下载目录\n */\nexport async function downloadGit(dir: string) {\n await downloadFromWinget({\n name: \"Git\",\n id: \"Git.Git\",\n dir,\n filter: item => item.Architecture === \"x64\" && item.Scope === \"machine\",\n })\n}\n","import { download } from \"./download\"\n\n/**\n * 下载 Honeyview 图片查看器\n * @param dir 下载目录\n */\nexport async function downloadHoneyview(dir: string) {\n await download(\"https://www.bandisoft.com/honeyview/dl.php?web\", dir, \"Honeyview-5.53-neutral.exe\")\n}\n","import { downloadFromWinget } from \"./downloadFromWinget\"\n\n/**\n * 下载 NodeJS LTS 版本\n * @param dir 下载目录\n */\nexport async function downloadNodeJS(dir: string) {\n await downloadFromWinget({\n name: \"NodeJS\",\n id: \"OpenJS.NodeJS.LTS\",\n dir,\n filter: item => item.Architecture === \"x64\",\n })\n}\n","import { downloadFromWinget } from \"./downloadFromWinget\"\n\n/**\n * 下载 peazip 压缩软件\n * @param dir 下载目录\n */\nexport async function downloadPeaZip(dir: string) {\n await downloadFromWinget({\n name: \"PeaZip\",\n id: \"Giorgiotani.Peazip\",\n dir,\n filter: item => item.Architecture === \"x64\",\n })\n}\n","import { downloadFromWinget } from \"./downloadFromWinget\"\n\n/**\n * 下载 PotPlayer 播放器\n * @param dir 下载目录\n */\nexport async function downloadPotPlayer(dir: string) {\n await downloadFromWinget({\n name: \"PotPlayer\",\n id: \"Daum.PotPlayer\",\n dir,\n filter: item => item.Architecture === \"x64\",\n })\n}\n","import { downloadFromWinget } from \"./downloadFromWinget\"\n\n/**\n * 下载 PowerShell\n * @param dir 下载目录\n */\nexport async function downloadPowerShell(dir: string) {\n await downloadFromWinget({\n name: \"PowerShell\",\n id: \"Microsoft.PowerShell\",\n dir,\n filter: item => item.Architecture === \"x64\",\n })\n}\n","/**\n * 通过 winget 下载 PowerToys\n * @param dir 下载目标目录\n */\nimport { downloadFromWinget } from \"./downloadFromWinget\"\n\nexport async function downloadPowerToys(dir: string) {\n await downloadFromWinget({\n name: \"PowerToys\",\n id: \"Microsoft.PowerToys\",\n dir,\n filter: item => item.Architecture === \"x64\" && item.Scope === \"machine\",\n })\n}\n","import { downloadFromWinget } from \"./downloadFromWinget\"\n\n/**\n * 通过 winget 下载 VSCode\n * @param dir 下载目标目录\n */\nexport async function downloadVscode(dir: string) {\n await downloadFromWinget({\n name: \"VSCode\",\n id: \"Microsoft.VisualStudioCode\",\n dir,\n filter: item => item.Architecture === \"x64\" && item.Scope === \"machine\",\n })\n}\n","import { existsSync } from \"fs\"\nimport { readFile } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\nimport { EditorConfigType, SyncEditorSettingSource } from \"./syncEditorSetting\"\n\nexport interface SyncEditorFileConfig {\n backup?: boolean\n}\n\nexport interface SyncEditorConfig {\n fileConfigs?: Record<string, SyncEditorFileConfig>\n types?: EditorConfigType[]\n source?: SyncEditorSettingSource\n targets?: SyncEditorSettingSource[]\n onlinePath?: string\n}\n\nexport interface ZixuluSetting {\n vscodeDownloadHistory?: string[]\n softwareDownloadHistory?: string[]\n upgradeWorkspaceDependcenyHistory?: Record<string, string[]>\n syncEditor?: SyncEditorConfig\n verdaccioPath?: string\n}\n\nexport async function readZixuluSetting(): Promise<ZixuluSetting> {\n const userDir = homedir()\n const settingPath = join(userDir, \".zixulu.json\")\n\n if (existsSync(settingPath)) {\n const setting = JSON.parse(await readFile(settingPath, \"utf-8\"))\n return setting\n }\n\n return {}\n}\n","import { writeFile } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\nimport { ZixuluSetting } from \"./readZixuluSetting\"\n\nexport async function writeZixuluSetting(setting: ZixuluSetting) {\n const userDir = homedir()\n const settingPath = join(userDir, \".zixulu.json\")\n await writeFile(settingPath, JSON.stringify(setting, undefined, 4), \"utf-8\")\n}\n","import { mkdir } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport dayjs from \"dayjs\"\nimport inquirer from \"inquirer\"\n\nimport { Software } from \"@/constant/index\"\n\nimport { download7Zip } from \"./download7Zip\"\nimport { downloadAnydesk } from \"./downloadAnydesk\"\nimport { downloadBun } from \"./downloadBun\"\nimport { downloadChrome } from \"./downloadChrome\"\nimport { downloadDeskGo } from \"./downloadDeskGo\"\nimport { downloadFirefox } from \"./downloadFirefox\"\nimport { downloadGeekUninstaller } from \"./downloadGeekUninstaller\"\nimport { downloadGit } from \"./downloadGit\"\nimport { downloadHoneyview } from \"./downloadHoneyview\"\nimport { downloadNodeJS } from \"./downloadNodeJS\"\nimport { downloadPeaZip } from \"./downloadPeazip\"\nimport { downloadPotPlayer } from \"./downloadPotPlayer\"\nimport { downloadPowerShell } from \"./downloadPowerShell\"\nimport { downloadPowerToys } from \"./downloadPowerToys\"\nimport { downloadVscode } from \"./downloadVscode\"\nimport { readZixuluSetting } from \"./readZixuluSetting\"\nimport { writeZixuluSetting } from \"./writeZixuluSetting\"\n\n/**\n * 软件下载函数映射表\n * 键为软件名称,值为对应的下载函数\n */\nexport const SoftwareDownloadMap: Record<Software, (dir: string) => Promise<void>> = {\n [Software.Chrome]: downloadChrome,\n [Software.NodeJS]: downloadNodeJS,\n [Software[\"7zip\"]]: download7Zip,\n [Software[\"PeaZip\"]]: downloadPeaZip,\n [Software.Git]: downloadGit,\n [Software.DeskGo]: downloadDeskGo,\n [Software[\"Geek Uninstaller\"]]: downloadGeekUninstaller,\n [Software[\"VS Code\"]]: downloadVscode,\n [Software.PowerToys]: downloadPowerToys,\n [Software.Honeyview]: downloadHoneyview,\n [Software.AnyDesk]: downloadAnydesk,\n [Software.Firefox]: downloadFirefox,\n [Software.PotPlayer]: downloadPotPlayer,\n [Software.Bun]: downloadBun,\n [Software.PowerShell]: downloadPowerShell,\n}\n\n/**\n * 交互式下载最新版本的软件\n * 1. 提示用户选择要下载的软件\n * 2. 创建下载目录\n * 3. 依次下载选中的软件\n */\nexport async function downloadLatestSoftware() {\n consola.start(\"开始下载软件\")\n const dir = `softwares-${dayjs().format(\"YYYYMMDDHHmmss\")}`\n const setting = await readZixuluSetting()\n const softwareDownloadHistory = setting?.softwareDownloadHistory as Software[] | undefined\n const { softwares } = await inquirer.prompt({\n type: \"checkbox\",\n name: \"softwares\",\n message: \"请选择要下载的软件\",\n choices: Object.values(Software),\n default: softwareDownloadHistory?.filter(software => Object.values(Software).includes(software)) ?? Object.values(Software),\n })\n setting.softwareDownloadHistory = softwares\n await writeZixuluSetting(setting)\n if (softwares.length === 0) return\n await mkdir(dir, { recursive: true })\n\n for (const software of softwares) {\n consola.start(`正在下载 ${software}`)\n await SoftwareDownloadMap[software as Software](dir)\n }\n\n consola.success(\"软件下载完成\")\n}\n","import { readPackageJson } from \"./readPackageJson\"\n\n/**\n * 获取指定包在 package.json 中的版本号\n * @param packageName 包名\n * @param dir 项目目录,默认为当前目录\n * @returns 版本号,如果未找到则返回 undefined\n * @description 依次检查 dependencies、devDependencies、peerDependencies 和 optionalDependencies\n */\nexport async function getPackageVersionInDependcy(packageName: string, dir = \".\"): Promise<string | undefined> {\n const packageJson = await readPackageJson(dir)\n const version =\n packageJson.dependencies?.[packageName] ??\n packageJson.devDependencies?.[packageName] ??\n packageJson.peerDependencies?.[packageName] ??\n packageJson.optionalDependencies?.[packageName]\n if (!version) return undefined\n return version.replace(/^\\D+/, \"\")\n}\n","import { mkdir, readdir, rename, rm } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport consola from \"consola\"\nimport { execAsync, zip } from \"soda-nodejs\"\n\nimport { getPackageVersionInDependcy } from \"./getPackageVersionInDependcy\"\n\n/**\n * 下载 NPM 包并打包成 zip\n * @param name NPM 包名\n * @throws {Error} 如果目标文件夹已存在\n */\nexport async function downloadNpm(name: string) {\n consola.start(`开始下载 ${name}`)\n const folder = `${name}-cache`\n const dir = await readdir(\".\")\n\n if (dir.includes(folder)) {\n consola.warn(\"文件夹已存在\")\n throw new Error(\"文件夹已存在\")\n }\n\n await mkdir(folder, { recursive: true })\n await execAsync(`npm init -y`, { cwd: folder })\n await execAsync(`npm install ${name}`, { cwd: folder })\n const version = await getPackageVersionInDependcy(name, folder)\n const file = `${name}@${version}.zip`\n await mkdir(join(folder, \"node_modules\", name, \"node_modules\"))\n const dir2 = await readdir(join(folder, \"node_modules\"))\n\n for (const item of dir2) {\n if (item === name) continue\n\n if (item.startsWith(\".\")) {\n await rm(join(folder, \"node_modules\", item), { recursive: true })\n continue\n }\n\n await rename(join(folder, \"node_modules\", item), join(folder, \"node_modules\", name, \"node_modules\", item))\n }\n\n await zip({\n input: name,\n output: file,\n cwd: join(folder, \"node_modules\"),\n })\n await rename(join(folder, \"node_modules\", file), join(file))\n await rm(folder, { recursive: true })\n consola.success(`下载 ${name} 完成`)\n}\n","import { spawnAsync } from \"soda-nodejs\"\n\n/**\n * 执行 Prisma 数据库推送和客户端生成命令\n * 运行 'npx prisma db push' 和 'npx prisma generate'\n */\nexport async function generatePrisma() {\n await spawnAsync(\"npx prisma db push && npx prisma generate\", {\n shell: true,\n stdio: \"inherit\",\n })\n}\n","import clipboard from \"clipboardy\"\n\n/**\n * 将浏览器中直接复制的 headers 转换为对象\n * 此函数从剪贴板读取 headers 文本,并转换为 Headers 对象的初始化代码\n * @returns void - 将生成的代码写入剪贴板\n * @throws Error 当 headers 格式不正确时抛出错误\n */\nexport async function getHeaders() {\n const str = await clipboard.read()\n const reg = /^(.+?):$[\\n\\r]*^(.+?)$/gm\n const reg2 = new RegExp(reg.source, \"m\")\n\n const result = [`const headers = new Headers()`]\n\n const match = str.match(reg)\n if (!match) throw new Error(\"headers 格式错误\")\n\n Array.from(match).forEach(item => {\n const match2 = item.match(reg2)\n result.push(`headers.set(\"${match2![1].trim()}\", \\`${match2![2].trim()}\\`)`)\n })\n\n await clipboard.write(result.join(\"\\n\"))\n}\n","import { writeFile } from \"fs/promises\"\nimport { parse, resolve } from \"path\"\n\nconst { name } = parse(resolve(\".\"))\n\nconst packageJson = `{\n \"name\": \"${name}\",\n \"version\": \"1.0.0\",\n \"description\": \"\",\n \"main\": \"index.ts\",\n \"scripts\": {},\n \"keywords\": [],\n \"author\": \"\",\n \"license\": \"ISC\",\n \"type\": \"module\",\n \"dependencies\": {},\n \"devDependencies\": {\n \"@types/node\": \"^22.14.1\",\n \"typescript\": \"^5.8.3\"\n }\n}\n`\n\nconst config = `{\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"esModuleInterop\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"strict\": true,\n \"skipLibCheck\": true\n }\n}\n`\n\nexport async function initNode() {\n await writeFile(\"index.ts\", \"\", \"utf-8\")\n await writeFile(\"package.json\", packageJson, \"utf-8\")\n await writeFile(\"tsconfig.json\", config, \"utf-8\")\n}\n","import consola from \"consola\"\n\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport async function next() {\n consola.start(\"开始设置 next 配置\")\n const pkg = await readPackageJson()\n pkg.scripts.dev += \" --hostname 0.0.0.0 --port 5173\"\n await writePackageJson({ data: pkg })\n consola.success(\"设置 next 配置成功\")\n}\n","import { readPackageJson } from \"./readPackageJson\"\n\n/**\n * 从 package.json 中获取指定依赖的版本\n * @param name 依赖包名称\n * @returns 依赖版本号,如果未找到则返回 undefined\n */\nexport async function getDependcy(name: string): Promise<string | undefined> {\n const packageJson = await readPackageJson()\n return (\n packageJson.dependencies?.[name] ||\n packageJson.devDependencies?.[name] ||\n packageJson.peerDependencies?.[name] ||\n packageJson.optionalDependencies?.[name]\n )\n}\n","import { getDependcy } from \"./getDependcy\"\n\n/**\n * 检查项目是否安装了 Tailwind CSS\n * @returns 返回 true 表示已安装 Tailwind CSS,false 表示未安装\n */\nexport async function checkTailwind() {\n return !!(await getDependcy(\"tailwindcss\"))\n}\n","import { writeFile } from \"fs/promises\"\n\nexport interface WriteRsbuildConfigParams {\n /** 项目标题 */\n title: string\n /** 项目描述 */\n description: string\n /** 挂载 id */\n mountId: string\n}\n\nexport async function writeRsbuildConfig({ title, description, mountId }: WriteRsbuildConfigParams) {\n const rsbuildConfig = `import { defineConfig } from \"@rsbuild/core\"\nimport { pluginBabel } from \"@rsbuild/plugin-babel\"\nimport { pluginReact } from \"@rsbuild/plugin-react\"\nimport { pluginSvgr } from \"@rsbuild/plugin-svgr\"\n\nexport default defineConfig({\n html: {\n title: \"${title}\",\n meta: {\n description: \"${description}\",\n },\n mountId: \"${mountId}\",\n },\n plugins: [\n pluginReact(),\n pluginBabel({\n include: /\\\\.(?:jsx|tsx)$/,\n babelLoaderOptions(config) {\n config.plugins ??= []\n config.plugins?.unshift(\"babel-plugin-react-compiler\")\n },\n }),\n pluginSvgr({\n svgrOptions: {\n exportType: \"default\",\n svgoConfig: {\n plugins: [\n {\n name: \"prefixIds\",\n params: {\n prefixIds: false,\n prefixClassNames: false,\n },\n },\n ],\n },\n },\n }),\n ],\n server: {\n port: 5173,\n },\n output: {\n polyfill: \"entry\",\n },\n})\n`\n\n await writeFile(\"rsbuild.config.ts\", rsbuildConfig, \"utf-8\")\n}\n","import { rm, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\n\nimport { addDependency } from \"./addDependency\"\nimport { checkTailwind } from \"./checkTailwind\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { readTsConfig } from \"./readTsConfig\"\nimport { writeRsbuildConfig, WriteRsbuildConfigParams } from \"./writeRsbuildConfig\"\nimport { writeTsConfig } from \"./writeTsConfig\"\n\nexport async function rsbuild() {\n consola.start(\"开始设置 rsbuild 配置\")\n await addDependency({\n package: [\"@rsbuild/plugin-svgr\", \"@rsbuild/plugin-babel\", \"babel-plugin-react-compiler\"],\n type: \"devDependencies\",\n })\n const packageJson = await readPackageJson()\n const tsConfig = await readTsConfig()\n tsConfig.compilerOptions.lib = tsConfig.compilerOptions.lib.map((item: string) => (item === tsConfig.compilerOptions.target ? \"ESNext\" : item))\n tsConfig.compilerOptions.target = \"ESNext\"\n await writeTsConfig(tsConfig)\n const { description, title, mountId } = await inquirer.prompt<WriteRsbuildConfigParams>([\n {\n type: \"input\",\n name: \"description\",\n message: \"项目描述\",\n default: \"designed by someone\",\n },\n {\n type: \"input\",\n name: \"title\",\n message: \"项目标题\",\n default: packageJson.name,\n },\n {\n type: \"input\",\n name: \"mountId\",\n message: \"入口 id\",\n default: \"root\",\n },\n ])\n await writeRsbuildConfig({ description, title, mountId })\n await rm(`src/App.css`, { force: true })\n\n await writeFile(\n `src/index.css`,\n (await checkTailwind())\n ? `@tailwind base; \n@tailwind components;\n@tailwind utilities;\n`\n : ``,\n \"utf-8\",\n )\n\n await writeFile(\n `src/App.tsx`,\n `import { FC } from \"react\"\n\nconst App: FC = () => {\n return <div>Hello, World!</div>\n}\n\nexport default App`,\n \"utf-8\",\n )\n\n await writeFile(\n `src/index.tsx`,\n `import { StrictMode } from \"react\"\nimport { createRoot } from \"react-dom/client\"\n\nimport App from \"./App\"\n\nimport \"./index.css\"\n\nconst root = createRoot(document.getElementById(\"${mountId}\") as HTMLDivElement)\n\nroot.render(\n <StrictMode>\n <App />\n </StrictMode>\n)`,\n \"utf-8\",\n )\n consola.success(\"设置 rsbuild 配置成功\")\n}\n","import { exit } from \"process\"\n\nimport consola from \"consola\"\n\nimport { readTsConfig } from \"./readTsConfig\"\nimport { writeTsConfig } from \"./writeTsConfig\"\n\nexport enum Target {\n ES2015 = \"ES2015\",\n ES2016 = \"ES2016\",\n ES2017 = \"ES2017\",\n ES2018 = \"ES2018\",\n ES2019 = \"ES2019\",\n ES2020 = \"ES2020\",\n ES2021 = \"ES2021\",\n ES2022 = \"ES2022\",\n ES2023 = \"ES2023\",\n ES3 = \"ES3\",\n ES5 = \"ES5\",\n ES6 = \"ES6\",\n ESNext = \"ESNext\",\n}\n\nexport enum Module {\n AMD = \"AMD\",\n CommonJS = \"CommonJS\",\n ES2015 = \"ES2015\",\n ES2020 = \"ES2020\",\n ES2022 = \"ES2022\",\n ES6 = \"ES6\",\n ESNext = \"ESNext\",\n Node16 = \"Node16\",\n NodeNext = \"NodeNext\",\n None = \"None\",\n System = \"System\",\n UMD = \"UMD\",\n}\n\nexport enum ModuleResolution {\n Bundler = \"Bundler\",\n Classic = \"Classic\",\n Node = \"Node\",\n Node10 = \"Node10\",\n Node16 = \"Node16\",\n NodeNext = \"NodeNext\",\n}\n\nexport async function setTsConfig(key: string, value?: any) {\n const tsconfig = await readTsConfig()\n\n if (value === undefined) delete tsconfig.compilerOptions[key]\n else {\n switch (key) {\n case \"target\": {\n const t = Object.values(Target).find(t => t.toLowerCase() === value.trim().toLowerCase())\n\n if (!t) {\n consola.fail(\"无效的 target 选项\")\n exit()\n }\n\n tsconfig.compilerOptions.target = t\n break\n }\n case \"module\": {\n const m = Object.values(Module).find(m => m.toLowerCase() === value.trim().toLowerCase())\n\n if (!m) {\n consola.fail(\"无效的 module 选项\")\n exit()\n }\n\n tsconfig.compilerOptions.module = m\n break\n }\n case \"moduleResolution\": {\n const mr = Object.values(ModuleResolution).find(mr => mr.toLowerCase() === value.trim().toLowerCase())\n\n if (!mr) {\n consola.fail(\"无效的 moduleResolution 选项\")\n exit()\n }\n\n tsconfig.compilerOptions.moduleResolution = mr\n break\n }\n case \"noEmit\":\n tsconfig.compilerOptions.noEmit = !!value\n break\n default:\n consola.fail(`暂不支持 ${key} 项`)\n exit()\n }\n }\n\n await writeTsConfig(tsconfig)\n consola.success(`修改 ${key} 成功`)\n}\n","import consola from \"consola\"\n\nimport { readPackageJson } from \"./readPackageJson\"\nimport { setTsConfig } from \"./setTsConfig\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport async function vite() {\n consola.start(\"开始设置 vite 配置\")\n await setTsConfig(\"noUnusedLocals\")\n await setTsConfig(\"noUnusedParameters\")\n const pkg = await readPackageJson()\n pkg.scripts.dev += \" --host\"\n await writePackageJson({ data: pkg })\n consola.success(\"设置 vite 配置成功\")\n}\n","import consola from \"consola\"\nimport inquirer from \"inquirer\"\n\nimport { ProjectType } from \"@/constant/index\"\n\nimport { addAntd } from \"./addAntd\"\nimport { addDependency } from \"./addDependency\"\nimport { addEslint } from \"./addEslint\"\nimport { addGitignore } from \"./addGitignore\"\nimport { addPrettier } from \"./addPrettier\"\nimport { addPrisma } from \"./addPrisma\"\nimport { addTailwind } from \"./addTailwind\"\nimport { createBrowserlistrc } from \"./createBrowserlistrc\"\nimport { getPackageManager } from \"./getPackageManager\"\nimport { installDependceny } from \"./installDependceny\"\nimport { next } from \"./next\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { rsbuild } from \"./rsbuild\"\nimport { setTsConfig } from \"./setTsConfig\"\nimport { vite } from \"./vite\"\n\nexport async function initProject() {\n consola.start(\"开始初始化项目\")\n await createBrowserlistrc()\n await addEslint()\n const packageJson = await readPackageJson()\n const allDependcies = Object.keys(packageJson.dependencies || {}).concat(Object.keys(packageJson.devDependencies || {}))\n\n if (!allDependcies.includes(\"react\") || !allDependcies.includes(\"react-dom\")) {\n consola.error(\"仅支持 React 项目\")\n return\n }\n\n let type: ProjectType\n\n if (allDependcies.some(item => item === \"next\")) type = ProjectType.next\n else {\n if (allDependcies.some(item => item === \"@remix-run/react\")) type = ProjectType.remix\n else {\n if (allDependcies.some(item => item === \"vite\")) type = ProjectType.vite\n else {\n if (allDependcies.some(item => item === \"@rsbuild/core\")) type = ProjectType.rsbuild\n else {\n consola.error(\"仅支持 Next、Remix、Vite、Rsbuild 项目\")\n return\n }\n }\n }\n }\n\n await addGitignore()\n await addDependency({\n package: [\"@types/node\"],\n type: \"devDependencies\",\n })\n const manager = await getPackageManager()\n const isFullStack = type === ProjectType.next || type === ProjectType.remix\n const choices = isFullStack\n ? [\n \"antd\",\n \"@heroui/react\",\n \"@tanstack/react-form\",\n \"@tanstack/react-query\",\n \"dayjs\",\n \"deepsea-components\",\n \"deepsea-tools\",\n \"prisma\",\n \"tailwind\",\n \"zod\",\n ]\n : [\"antd\", \"@heroui/react\", \"@tanstack/react-form\", \"@tanstack/react-query\", \"dayjs\", \"deepsea-components\", \"deepsea-tools\", \"tailwind\", \"react-router\"]\n\n const { modules } = await inquirer.prompt({\n type: \"checkbox\",\n name: \"modules\",\n message: \"请选择要添加的模块\",\n choices,\n default: choices,\n })\n\n const added: string[] = []\n\n if (modules.includes(\"antd\")) await addAntd()\n\n if (modules.includes(\"tailwind\")) await addTailwind()\n else await addPrettier()\n\n if (modules.includes(\"@heroui/react\")) added.push(\"@heroui/react\", \"soda-heroui\")\n if (modules.includes(\"@tanstack/react-query\")) added.push(\"@tanstack/react-query\")\n if (modules.includes(\"@tanstack/react-form\")) added.push(\"@tanstack/react-form\", \"soda-tanstack-form\")\n if (modules.includes(\"dayjs\")) added.push(\"dayjs\")\n if (modules.includes(\"deepsea-components\")) added.push(\"deepsea-components\")\n if (modules.includes(\"deepsea-tools\")) added.push(\"deepsea-tools\")\n if (modules.includes(\"stable-hash\")) added.push(\"stable-hash\")\n if (modules.includes(\"zod\")) added.push(\"zod\")\n if (modules.includes(\"react-router\")) added.push(\"react-router\")\n if (modules.includes(\"stable-hash\")) added.push(\"stable-hash\")\n\n await addDependency({\n package: added,\n type: \"dependencies\",\n })\n\n switch (type) {\n case ProjectType.next:\n await next()\n break\n\n case ProjectType.remix:\n await vite()\n break\n\n case ProjectType.vite:\n await vite()\n break\n\n case ProjectType.rsbuild:\n await rsbuild()\n break\n }\n\n let installed = false\n\n if (modules.includes(\"prisma\")) {\n await addPrisma(manager)\n installed = true\n }\n\n if (!installed) await installDependceny({ silent: true, manager })\n await setTsConfig(\"noEmit\", true)\n consola.success(\"项目初始化完成\")\n}\n","const reg = /^(((ht|f)tps?):\\/\\/)?([^!@#$%^&*?.\\s-]([^!@#$%^&*?.\\s]{0,63}[^!@#$%^&*?.\\s])?\\.)+[a-z]{2,6}\\/?/\n\nexport function isUrl(url: string) {\n return reg.test(url)\n}\n","import { existsSync } from \"fs\"\nimport { readFile } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\nexport type ZixuluCache = {\n sudoRequested?: boolean\n}\n\nexport async function readZixuluCache(): Promise<ZixuluCache> {\n const userDir = homedir()\n const settingPath = join(userDir, \".zixulu.cache\")\n\n if (existsSync(settingPath)) {\n const setting = JSON.parse(await readFile(settingPath, \"utf-8\"))\n return setting\n }\n\n return {}\n}\n","import { rm } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\nexport async function removeZixuluCache() {\n const userDir = homedir()\n const cachePath = join(userDir, \".zixulu.cache\")\n await rm(cachePath, { recursive: true, force: true })\n}\n","import { writeFile } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\nimport { ZixuluCache } from \"./readZixuluCache\"\n\nexport async function writeZixuluCache(cache: ZixuluCache) {\n const userDir = homedir()\n const cachePath = join(userDir, \".zixulu.json\")\n await writeFile(cachePath, JSON.stringify(cache, undefined, 4), \"utf-8\")\n}\n","import { spawnAsync } from \"soda-nodejs\"\n\nimport { readZixuluCache } from \"./readZixuluCache\"\nimport { removeZixuluCache } from \"./removeZixuluCache\"\nimport { writeZixuluCache } from \"./writeZixuluCache\"\n\nexport async function sudoCommand() {\n try {\n const cache = await readZixuluCache()\n if (cache.sudoRequested) throw new Error(\"请在 sudo 下运行\")\n cache.sudoRequested = true\n await writeZixuluCache(cache)\n await spawnAsync(\"sudo\", [\"env\", `\"PATH=$PATH\"`, \"npx\", \"zixulu\", ...process.argv.slice(2)])\n } finally {\n await removeZixuluCache()\n }\n}\n","export function unique<T>(data: T[]): T[] {\n return Array.from(new Set(data))\n}\n","import { readFile, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\nimport { execAsync } from \"soda-nodejs\"\n\nimport { isSudo } from \"@/constant\"\n\nimport { isUrl } from \"./isUrl\"\nimport { sudoCommand } from \"./sudoCommand\"\nimport { unique } from \"./unique\"\n\nexport async function setDockerRegistry() {\n if (!isSudo) return sudoCommand()\n await execAsync(`mkdir -p /etc/docker`)\n\n let daemon: any = {}\n\n try {\n daemon = JSON.parse(await readFile(\"/etc/docker/daemon.json\", \"utf-8\"))\n } catch {\n /* empty */\n }\n\n daemon[\"registry-mirrors\"] ??= []\n daemon[\"registry-mirrors\"].push(\"https://docker.sunzishaokao.com\", \"https://hub.hxui.site\", \"https://docker.1ms.run\")\n daemon[\"registry-mirrors\"] = unique(daemon[\"registry-mirrors\"])\n daemon[\"exec-opts\"] ??= []\n daemon[\"exec-opts\"].push(\"native.cgroupdriver=systemd\")\n daemon[\"exec-opts\"] = unique(daemon[\"exec-opts\"])\n\n type Answer = {\n mirrors: string\n }\n\n const { mirrors } = await inquirer.prompt<Answer>([\n {\n type: \"input\",\n name: \"mirrors\",\n message: \"请输入镜像地址,多个用逗号分隔,留空则跳过\",\n },\n ])\n daemon[\"registry-mirrors\"].push(...mirrors.split(/[,,]/).filter(isUrl))\n await writeFile(\"/etc/docker/daemon.json\", JSON.stringify(daemon, undefined, 4), \"utf-8\")\n consola.success(\"镜像地址设置成功\")\n consola.info(\"建议重启docker服务:\")\n consola.info(\"sudo systemctl daemon-reload\")\n consola.info(\"sudo systemctl restart docker\")\n}\n","import { readdir, rm } from \"fs/promises\"\n\nimport inquirer from \"inquirer\"\nimport { JSDOM } from \"jsdom\"\nimport { execAsync } from \"soda-nodejs\"\n\nimport { isSudo } from \"@/constant\"\n\nimport { setDockerRegistry } from \"./setDockerRegistry\"\nimport { sudoCommand } from \"./sudoCommand\"\n\nexport async function installDocker() {\n if (!isSudo) return sudoCommand()\n const info = await execAsync(\"lsb_release -a\")\n const distributorId = info.match(/Distributor ID:\\s+(.+)/)?.[1]\n if (distributorId !== \"Ubuntu\") throw new Error(\"暂不支持 Ubuntu 以外的系统\")\n const codename = info.trim().match(/Codename:\\s+(.+)/)?.[1]\n if (!codename) throw new Error(\"无法获取 codename\")\n const response = await fetch(`https://download.docker.com/linux/ubuntu/dists/${codename}/pool/stable/amd64/`)\n const data = await response.text()\n const dom = new JSDOM(data)\n const hrefs = Array.from(dom.window.document.querySelectorAll(\"a\")).map(({ href }) => href)\n const deb = hrefs.findLast(item => item.startsWith(\"containerd.io_\"))!\n const deb2 = hrefs.findLast(item => item.startsWith(\"docker-ce_\"))!\n const deb3 = hrefs.findLast(item => item.startsWith(\"docker-ce-cli_\"))!\n const deb4 = hrefs.findLast(item => item.startsWith(\"docker-buildx-plugin_\"))!\n const deb5 = hrefs.findLast(item => item.startsWith(\"docker-compose-plugin_\"))!\n\n const debs = [deb, deb2, deb3, deb4, deb5]\n\n const dir = await readdir(\".\")\n await Promise.all(\n debs\n .filter(deb => !dir.includes(deb))\n .map(deb => execAsync(`wget -q https://download.docker.com/linux/ubuntu/dists/${codename}/pool/stable/amd64/${deb}`)),\n )\n await execAsync(`dpkg -i ${debs.join(\" \")}`)\n for (const deb of debs) await rm(deb, { force: true, recursive: true })\n\n type Answer = {\n addMirrors?: boolean\n }\n\n const { addMirrors } = await inquirer.prompt<Answer>([\n {\n type: \"confirm\",\n name: \"addMirrors\",\n message: \"是否添加镜像地址\",\n default: true,\n },\n ])\n if (!addMirrors) return\n setDockerRegistry()\n}\n","import { getTypeInGenerics } from \"./getTypeInGenerics\"\n\nexport function splitExtendsType(str: string) {\n const types: string[] = []\n\n let index = 0\n\n for (let i = 0; i < str.length; i++) {\n const w = str[i]\n\n if (w === \"<\") {\n const type = getTypeInGenerics(str, i)\n i += type.length + 1\n continue\n }\n\n if (w === \",\") {\n types.push(str.slice(index, i))\n index = i + 1\n }\n }\n\n types.push(str.slice(index))\n return types.map(v => v.trim()).filter(v => v)\n}\n","import { readFile, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\n\nimport { checkType } from \"./checkType\"\nimport { getFiles } from \"./getFiles\"\nimport { splitExtendsType } from \"./splitExtendsType\"\n\n/**\n * 将项目中的 interface 转换为 type\n */\nexport async function interfaceToType() {\n consola.start(\"开始将项目中的 interface 转换为 type\")\n\n const files = await getFiles({\n match: (path, stats) => (path.ext === \".tsx\" || path.ext === \".ts\") && !path.base.endsWith(\".d.ts\") && stats.isFile(),\n exclude: (path, stats) => stats.isDirectory() && path.base === \"node_modules\",\n })\n\n const { cont } = await inquirer.prompt({\n type: \"confirm\",\n name: \"cont\",\n message: \"是否继续\",\n })\n\n if (!cont) return\n\n const reg = /(export )?interface (.+?) {/gm\n const reg1 = /\\bexport\\b/\n const reg2 = /(\\w+?) extends (.+)/\n const modifiedFiles: Set<string> = new Set()\n\n for (const file of files) {\n const code = await readFile(file, \"utf-8\")\n\n const newCode = code.replace(reg, match => {\n modifiedFiles.add(file)\n const hasExport = reg1.test(match)\n const $2 = match.replace(reg, \"$2\")\n const matches = $2.match(reg2)\n\n if (matches) {\n const name = matches[1]\n const extendsTypes = splitExtendsType(matches[2]).join(\" & \")\n\n return `${hasExport ? \"export \" : \"\"}type ${name} = ${extendsTypes} & {`\n }\n\n return `${hasExport ? \"export \" : \"\"}type ${$2} = {`\n })\n\n await writeFile(file, newCode, \"utf-8\")\n }\n\n if (modifiedFiles.size > 0) consola.success(`以下文件中的 interface 已经转换为 type:\\n\\n${Array.from(modifiedFiles).join(\"\\n\")}`)\n\n consola.start(\"检查项目是否存在 TypeScript 错误\")\n\n await checkType()\n\n consola.success(\"interface 转换为 type 完成\")\n}\n","import { readFile } from \"fs/promises\"\n\nimport clipboard from \"clipboardy\"\nimport consola from \"consola\"\nimport { isNonNullable, json2type as j2t } from \"deepsea-tools\"\n\nexport async function json2type(path?: string) {\n const json = isNonNullable(path) ? await readFile(path, \"utf-8\") : await clipboard.read()\n\n try {\n JSON.parse(json)\n } catch {\n consola.error(`请输入有效的 json 文件路径或复制有效的 json 文本`)\n }\n\n const type = j2t(json)\n await clipboard.write(type)\n consola.success(\"类型已复制到剪贴板\")\n}\n","import { execAsync } from \"soda-nodejs\"\n\nexport type PidInfo = {\n pid: number\n info: string\n}\n\nexport async function getProcessInfoFromPid(pid: number) {\n try {\n const stdout = await execAsync(`tasklist | findstr ${pid}`)\n const reg = new RegExp(`( +)${pid}( (Services|Console) +)`)\n return stdout\n .split(/[\\n\\r]/)\n .find(line => reg.test(line))\n ?.replace(reg, \"$1$2\")\n ?.replace(/ +/g, \" \")\n } catch {\n return undefined\n }\n}\n\nexport async function getPidInfoFromPort(port: number) {\n try {\n const stdout = await execAsync(`netstat -ano | findstr :${port}`)\n const reg = new RegExp(` (\\\\[::\\\\]|(\\\\d{1,3}\\\\.){3}\\\\d{1,3}):${port} `)\n\n const result = Array.from(\n new Set(\n stdout\n .split(/[\\n\\r]/)\n .filter(line => reg.test(line))\n .map(line => ({\n pid: parseInt(line.match(reg)![1]),\n info: line,\n })),\n ),\n )\n\n for (let i = 0; ; ) {\n if (result.some(({ info }) => info[i] === undefined)) break\n\n if (result.some(({ info }) => info[i] !== \" \" || info[i + 1] !== \" \")) {\n i++\n continue\n }\n\n result.forEach(item => (item.info = `${item.info.slice(0, i)}${item.info.slice(i + 1)}`))\n }\n\n return result\n } catch {\n return []\n }\n}\n","import { exec } from \"child_process\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\n\nimport { getPidInfoFromPort, getProcessInfoFromPid } from \"./processInfo\"\n\nexport async function killProcessByPort(port: string | number) {\n port = typeof port === \"string\" ? parseInt(port) : port\n\n if (!Number.isInteger(port)) {\n consola.error(\"无效的端口号\")\n throw new Error(\"无效的端口号\")\n }\n\n const pidInfos = await getPidInfoFromPort(port)\n\n const choices: { name: string; value: number }[] = []\n\n for (const { pid, info } of pidInfos) {\n const name = await getProcessInfoFromPid(pid)\n if (name) choices.push({ name: `${info} ${name}`, value: pid })\n }\n\n if (choices.length === 0) {\n consola.warn(\"没有找到对应的进程\")\n return\n }\n\n const { chosenPids } = await inquirer.prompt({\n type: \"checkbox\",\n name: \"chosenPids\",\n message: \"请选择要结束的进程\",\n choices,\n default: choices.map(choice => choice.value),\n })\n\n for (const pid of chosenPids) exec(`taskkill /f /pid ${pid}`)\n}\n","import { existsSync } from \"fs\"\nimport { readFile, writeFile } from \"fs/promises\"\n\nexport async function pnpm() {\n let content = ``\n if (existsSync(\".npmrc\")) content = await readFile(\".npmrc\", \"utf-8\")\n\n const lines = content\n .split(\"\\n\")\n .map(line => line.trim())\n .filter(Boolean)\n\n lines.push(`node-linker=hoisted`)\n lines.push(`shamefully-hoist=true`)\n writeFile(\".npmrc\", lines.join(\"\\n\"))\n}\n","import { readFileSync } from \"fs\"\n\nimport consola from \"consola\"\n\nimport { getPackageJsonPath } from \"./getPackageJsonPath\"\n\n/**\n * 读取 package.json\n * @param dir 目录\n * @returns package.json\n */\n\nexport function readPackageJsonSync(dir?: string): Record<string, any> {\n try {\n const result = JSON.parse(readFileSync(getPackageJsonPath(dir), \"utf-8\"))\n return result\n } catch (error) {\n consola.error(error)\n consola.fail(\"读取 package.json 失败\")\n throw new Error(\"读取 package.json 失败\")\n }\n}\n","import { rm } from \"fs/promises\"\n\nimport { getPackageManager } from \"./getPackageManager\"\nimport { installDependceny } from \"./installDependceny\"\n\nexport async function reinstall() {\n const manager = await getPackageManager()\n await rm(\"node_modules\", { recursive: true, force: true })\n await rm(\"pnpm-lock.yaml\", { force: true })\n await rm(\"yarn.lock\", { force: true })\n await rm(\"package-lock.json\", { force: true })\n await installDependceny({ manager, silent: true })\n}\n","import { readFile, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\n\nexport async function removeComment(path: string) {\n consola.start(\"开始删除注释\")\n const text = await readFile(path, \"utf-8\")\n const newText = text.replace(/^ *?\\/\\/.*?$/gm, \"\")\n await writeFile(path, newText, \"utf-8\")\n consola.success(\"删除注释成功\")\n}\n","import { stat } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nimport { backupFirst } from \"./backupFirst\"\n\n/**\n * 从 git 中删除文件或文件夹\n * @param input 文件或文件夹路径\n */\nexport async function removeFileOrFolderFromGit(input: string) {\n input = input.replace(/\\\\/g, \"/\")\n let recursive = false\n\n try {\n const stats = await stat(input)\n recursive = stats.isDirectory()\n } catch {\n type Answer = {\n recursive: boolean\n }\n\n const answer = await inquirer.prompt<Answer>({\n type: \"confirm\",\n name: \"recursive\",\n message: \"是否是文件夹\",\n default: false,\n })\n recursive = answer.recursive\n }\n\n await backupFirst(true)\n consola.start(`开始从 git 中删除 ${input}`)\n await spawnAsync(\n `git filter-branch --force --index-filter \"git rm${recursive ? \" -r\" : \"\"} --cached --ignore-unmatch ${input}\" --prune-empty --tag-name-filter cat -- --all`,\n )\n consola.success(`从 git 中删除 ${input} 成功`)\n}\n","import { rm } from \"fs/promises\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { addRuleToGitIgnore } from \"./addRuleToGitIgnore\"\nimport { getCommitMessage } from \"./getCommitMessage\"\n\nexport async function removeLock() {\n await rm(\"package-lock.json\", { force: true, recursive: true })\n await rm(\"yarn.lock\", { force: true, recursive: true })\n await rm(\"pnpm-lock.yaml\", { force: true, recursive: true })\n await rm(\"bun.lockb\", { force: true, recursive: true })\n await rm(\"bun.lock\", { force: true, recursive: true })\n await addRuleToGitIgnore(\"package-lock.json\", \"yarn.lock\", \"pnpm-lock.yaml\", \"bun.lockb\", \"bun.lock\")\n return getCommitMessage(CommitType.feature, \"删除包管理 lock 文件\")\n}\n","import { consola } from \"consola\"\nimport { simpleGit } from \"simple-git\"\n\nimport { preprocessRegex } from \"./preprocessRegex\"\nimport { shouldContinue } from \"./shouldContinue\"\n\nexport interface RemoveTagParams {\n /** 正则表达式字符串 */\n reg: string\n /** 正则表达式标志,如 i、g、m 等 */\n flags?: string\n /** 是否同时删除远程仓库的 tag */\n push?: boolean\n /** 远程仓库名称,默认为 origin */\n remote?: string\n}\n\n/**\n * 移除匹配的 git tag\n */\nexport async function removeTag({ reg, flags, push, remote = \"origin\" }: RemoveTagParams) {\n const git = simpleGit()\n\n // 检查是否是 git 仓库\n const isRepo = await git.checkIsRepo()\n\n if (!isRepo) {\n consola.error(\"当前目录不是 git 仓库\")\n return\n }\n\n // 检查是否有未提交的更改\n const status = await git.status()\n\n if (status.files.length > 0) {\n consola.error(\"当前 Git 仓库存在未提交的文件,请先提交或暂存这些文件\")\n return\n }\n\n // 预处理正则表达式,替换占位符\n const processedReg = preprocessRegex(reg)\n\n // 显示正则表达式\n consola.info(`正则表达式: /${processedReg}/${flags ?? \"\"}`)\n\n // 询问用户是否继续\n const cont = await shouldContinue(\"是否继续?\")\n\n if (!cont) {\n consola.info(\"操作已取消\")\n return\n }\n\n // 获取所有 tag\n const tags = await git.tags()\n const allTags = tags.all\n\n if (allTags.length === 0) {\n consola.warn(\"当前仓库没有任何 tag\")\n return\n }\n\n consola.info(`找到 ${allTags.length} 个 tag`)\n\n const tagsToRemove = []\n\n // 遍历所有 tag,查找匹配的 tag\n for (const tag of allTags) {\n // 每次循环创建新的正则表达式,避免 g 标志可能带来的状态问题\n const regexp = new RegExp(processedReg, flags)\n\n // 如果 tag 匹配正则表达式,加入待删除列表\n if (regexp.test(tag)) tagsToRemove.push(tag)\n }\n\n if (tagsToRemove.length === 0) {\n consola.warn(\"没有匹配的 tag 需要删除\")\n return\n }\n\n consola.info(`将要删除 ${tagsToRemove.length} 个 tag`)\n\n // 执行删除操作\n for (const tag of tagsToRemove) {\n try {\n // 删除本地 tag\n await git.tag([\"-d\", tag])\n consola.success(`本地: 删除 ${tag}`)\n\n // 如果需要删除远程仓库的 tag\n if (push) {\n try {\n // 删除远程的 tag\n await git.push([remote, \"--delete\", tag])\n consola.success(`远程: 删除 ${tag}`)\n } catch (error) {\n // 如果远程没有这个 tag,忽略错误\n consola.warn(`远程可能不存在 ${tag},跳过删除`)\n }\n }\n } catch (error) {\n consola.error(`删除 ${tag} 失败:`, error)\n }\n }\n\n consola.success(\"所有匹配的 tag 删除完成\")\n}\n","/**\n * 判断一个 url 是否是资源链接\n * @param url 链接\n * @returns 是否是资源链接\n */\nexport function isAsset(url: string) {\n const lower = url.toLowerCase()\n return (\n lower.endsWith(\".svg\") ||\n lower.endsWith(\".png\") ||\n lower.endsWith(\".jpg\") ||\n lower.endsWith(\".jpeg\") ||\n lower.endsWith(\".gif\") ||\n lower.endsWith(\".webp\") ||\n lower.endsWith(\".ico\") ||\n lower.endsWith(\".ttf\") ||\n lower.endsWith(\".woff\") ||\n lower.endsWith(\".woff2\") ||\n lower.endsWith(\".css\") ||\n lower.endsWith(\".js\") ||\n lower.endsWith(\".json\") ||\n lower.includes(\"/img/\") ||\n lower.includes(\"/file/\") ||\n lower.includes(\"/assets/\")\n )\n}\n","import { createWriteStream } from \"fs\"\nimport { mkdir, readdir, readFile, stat, writeFile } from \"fs/promises\"\nimport { join, parse } from \"path\"\nimport { Readable } from \"stream\"\n\nimport consola from \"consola\"\nimport md5 from \"md5\"\nimport fetch, { Headers, Response } from \"node-fetch\"\n\nimport { agent } from \"@/constant\"\n\nimport { isAsset } from \"./isAsset\"\nimport { retry } from \"./retry\"\n\nfunction getReg() {\n return /(https?:|href=\")\\/\\/[a-zA-Z0-9.\\-*_/&=:,%@]+/gm\n}\n\nfunction getReg2() {\n return /((from|import) *?[\"'])([a-zA-Z0-9.\\-*_/&=:,%@]+\\.js)([\"'])/gm\n}\n\nconst reg3 = /([\"'])([a-zA-Z0-9.\\-*_/&=:,%@]+\\.js)([\"'])/\n\nconst reg4 = /[a-z0-9]{32}\\.js/\n\nexport type ReplaceAssetsOptions = {\n base?: string\n input: string\n output?: string\n proxy?: boolean\n}\n\nexport async function replaceAssets(options: ReplaceAssetsOptions) {\n const { base, input, output = \"assets\", proxy } = options\n\n await mkdir(output, { recursive: true })\n\n const headers = new Headers()\n headers.set(\n \"accept\",\n `text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7`,\n )\n headers.set(\"accept-encoding\", `gzip, deflate, br, zstd`)\n headers.set(\"accept-language\", `en,zh-CN;q=0.9,zh;q=0.8`)\n headers.set(\"cache-control\", `no-cache`)\n headers.set(\"dnt\", `1`)\n headers.set(\"pragma\", `no-cache`)\n headers.set(\"priority\", `u=0, i`)\n headers.set(\"sec-ch-ua\", `\"Not)A;Brand\";v=\"99\", \"Google Chrome\";v=\"127\", \"Chromium\";v=\"127\"`)\n headers.set(\"sec-ch-ua-mobile\", `?0`)\n headers.set(\"sec-ch-ua-platform\", `\"Windows\"`)\n headers.set(\"sec-fetch-dest\", `document`)\n headers.set(\"sec-fetch-mode\", `navigate`)\n headers.set(\"sec-fetch-site\", `none`)\n headers.set(\"sec-fetch-user\", `?1`)\n headers.set(\"upgrade-insecure-requests\", `1`)\n headers.set(\"user-agent\", `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36`)\n\n const downloadMap: Map<string, string> = new Map()\n\n const errors: Set<string> = new Set()\n\n async function download(url: string) {\n try {\n if (downloadMap.has(url)) return downloadMap.get(url)!\n consola.start(`download ${url}`)\n const { ext } = parse(new URL(url).pathname)\n let response: Response\n let filename: string\n\n if (ext) filename = `${md5(url)}${ext}`\n else {\n response = await fetch(url, {\n agent: proxy ? agent : undefined,\n headers,\n })\n filename = `${md5(url)}.${response.headers.get(\"content-type\")?.split(\"/\")[1].split(\"+\")[0]}`\n }\n\n const dir = await readdir(output)\n\n if (!dir.includes(filename)) {\n response ??= await fetch(url, {\n agent: proxy ? agent : undefined,\n headers,\n })\n const file = createWriteStream(join(output, filename))\n await new Promise<0>((resolve, reject) =>\n Readable.from(response.body!)\n .pipe(file)\n .on(\"finish\", () => resolve(0))\n .on(\"error\", reject))\n }\n\n const url2 = `${base ? (base.endsWith(\"/\") ? base.slice(0, -1) : base) : \"\"}/${filename}`\n\n // consola.success(`${url} -> ${url2}`)\n downloadMap.set(url, url2)\n\n errors.delete(url)\n\n if (filename.endsWith(\".js\")) await replace(join(output, filename), url)\n\n return url2\n } catch (error) {\n consola.error(error)\n errors.add(url)\n throw error\n }\n }\n\n async function getReplaceUrl(url: string, source?: string) {\n if (url.startsWith(`href=\"`)) {\n try {\n const newUrl = url.replace(/^href=\"/, \"http:\")\n const replaceUrl = await retry(() => download(newUrl), 4)\n return `href=\"${replaceUrl}`\n } catch {\n /* empty */\n }\n\n try {\n const newUrl = url.replace(/^href=\"/, \"https:\")\n const replaceUrl = await retry(() => download(newUrl), 4)\n return `href=\"${replaceUrl}`\n } catch {\n /* empty */\n }\n\n return url\n }\n\n if (url.startsWith(\"from\") || url.startsWith(\"import\")) {\n const match = url.match(reg3)\n if (!match) return url\n let url2 = match[2].trim()\n\n if (!url2.startsWith(\"http\")) {\n if (url2.startsWith(\"/\")) url2 = new URL(url2, source).toString()\n else {\n if (url2.startsWith(\"./\")) url2 = parse(source!).dir + url2.slice(1)\n else {\n if (url2.startsWith(\"../\")) url2 = parse(parse(source!).dir).dir + url2.slice(2)\n else return url\n }\n }\n }\n\n const replaceUrl = await retry(() => download(url2), 4)\n if (replaceUrl === url2) return url\n return url.replace(reg3, `$1${replaceUrl.startsWith(\"/\") ? \".\" : \"\"}${replaceUrl}$3`)\n }\n\n try {\n const replaceUrl = await retry(() => download(url), 4)\n return replaceUrl\n } catch {\n return url\n }\n }\n\n async function replace(input: string, source?: string) {\n consola.start(`scanning ${input.replace(/\\\\/g, \"/\")}`)\n const status = await stat(input)\n\n if (status.isFile()) {\n const path = parse(input)\n\n if (path.ext === \".js\" || path.ext === \".html\" || path.ext === \".css\" || path.ext === \".json\") {\n const data = await readFile(input, \"utf-8\")\n const match = data.match(source ? getReg2() : getReg())\n if (!match) return\n\n const urlsToReplace: string[] = []\n\n let index = 0\n\n for (const url of match) {\n if (isAsset(url) || getReg2().test(url)) {\n const url2 = await getReplaceUrl(url, source)\n urlsToReplace.push(url2)\n } else urlsToReplace.push(url)\n }\n\n const newData = data.replace(source ? getReg2() : getReg(), () => urlsToReplace[index++])\n\n if (source) {\n urlsToReplace.forEach(url => {\n if (!reg4.test(url)) console.log(url)\n })\n }\n\n await writeFile(input, newData, \"utf-8\")\n }\n\n return\n }\n\n if (status.isDirectory()) {\n const dir2 = await readdir(input)\n\n for (const item of dir2) await replace(join(input, item))\n }\n }\n\n await replace(input)\n\n consola.success(errors.size > 0 ? \"替换完成,以下文件下载失败:\" : \"替换完成\")\n\n errors.forEach(url => consola.error(url))\n}\n","import consola from \"consola\"\nimport simpleGit from \"simple-git\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nconst git = simpleGit()\n\nexport type CommitAuthor = {\n name?: string\n email?: string\n}\n\nexport type ReplaceCommitAuthorParams = {\n prev?: CommitAuthor\n next?: CommitAuthor\n}\n\n// 执行 Git 历史重写的函数\nexport async function replaceCommitAuthor({\n prev: { name: prevName, email: prevEmail } = {},\n next: { name: nextName, email: nextEmail } = {},\n}: ReplaceCommitAuthorParams) {\n if (!nextName && !nextEmail) throw new Error(\"新的作者信息不能为空。请提供新的作者名称或邮箱。\")\n const isRepo = await git.checkIsRepo()\n if (!isRepo) throw new Error(\"当前目录不是一个 Git 仓库。请在一个有效的 Git 仓库中运行此命令。\")\n const status = await git.status()\n if (status.files.length) throw new Error(\"当前 Git 仓库存在未提交的文件。请提交或暂存这些文件后再试。\")\n consola.start(\"开始修改 Git 提交历史...\")\n console.log()\n const committerName = nextName ? ` export GIT_COMMITTER_NAME=\\\\\"${nextName}\\\\\"` : \"\"\n const committerEmail = nextEmail ? ` export GIT_COMMITTER_EMAIL=\\\\\"${nextEmail}\\\\\"` : \"\"\n const authorName = nextName ? ` export GIT_AUTHOR_NAME=\\\\\"${nextName}\\\\\"` : \"\"\n const authorEmail = nextEmail ? ` export GIT_AUTHOR_EMAIL=\\\\\"${nextEmail}\\\\\"` : \"\"\n const committerCondition =\n prevName && prevEmail\n ? `[ \\\\\"$GIT_COMMITTER_NAME\\\\\" = \\\\\"${prevName}\\\\\" ] && [ \\\\\"$GIT_COMMITTER_EMAIL\\\\\" = \\\\\"${prevEmail}\\\\\" ]`\n : prevName\n ? `[ \\\\\"$GIT_COMMITTER_NAME\\\\\" = \\\\\"${prevName}\\\\\" ]`\n : prevEmail\n ? `[ \\\\\"$GIT_COMMITTER_EMAIL\\\\\" = \\\\\"${prevEmail}\\\\\" ]`\n : `[ \\\\\"true\\\\\" = \\\\\"true\\\\\" ]`\n const authorCondition =\n prevName && prevEmail\n ? `[ \\\\\"$GIT_AUTHOR_NAME\\\\\" = \\\\\"${prevName}\\\\\" ] && [ \\\\\"$GIT_AUTHOR_EMAIL\\\\\" = \\\\\"${prevEmail}\\\\\" ]`\n : prevName\n ? `[ \\\\\"$GIT_AUTHOR_NAME\\\\\" = \\\\\"${prevName}\\\\\" ]`\n : prevEmail\n ? `[ \\\\\"$GIT_AUTHOR_EMAIL\\\\\" = \\\\\"${prevEmail}\\\\\" ]`\n : `[ \\\\\"true\\\\\" = \\\\\"true\\\\\" ]`\n\n await spawnAsync(\n `git filter-branch -f --env-filter \"if ${committerCondition}; then export ${[committerName, committerEmail].filter(Boolean).join(\" && \")}; fi && if ${authorCondition}; then ${[authorName, authorEmail].filter(Boolean).join(\" && \")}; fi\" --tag-name-filter cat -- --branches --tags`,\n )\n\n console.log()\n consola.success(\"Git 提交历史修改完成!\")\n consola.warn(\"请强制推送以覆盖远程仓库:git push -f\")\n}\n","import { unlink, writeFile } from \"fs/promises\"\nimport { tmpdir } from \"os\"\nimport { join } from \"path\"\n\nimport { consola } from \"consola\"\nimport { simpleGit } from \"simple-git\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nimport { preprocessRegex } from \"./preprocessRegex\"\nimport { shouldContinue } from \"./shouldContinue\"\n\nexport interface ReplaceCommitMessageParams {\n /** 正则表达式字符串 */\n reg: string\n /** 替换字符串 */\n replace: string\n /** 正则表达式标志,如 i、g、m 等 */\n flags?: string\n /** 是否强制推送到远程仓库 */\n push?: boolean\n /** 远程仓库名称,默认为 origin */\n remote?: string\n /** 分支名称,默认为当前分支 */\n branch?: string\n}\n\n/**\n * 替换所有提交消息\n * ⚠️ 警告:此操作会重写 Git 历史,请谨慎使用\n */\nexport async function replaceCommitMessage({ reg, replace, flags, push, remote = \"origin\", branch }: ReplaceCommitMessageParams) {\n const git = simpleGit()\n\n // 检查是否是 git 仓库\n const isRepo = await git.checkIsRepo()\n\n if (!isRepo) {\n consola.error(\"当前目录不是 git 仓库\")\n return\n }\n\n // 检查是否有未提交的更改\n const status = await git.status()\n\n if (status.files.length > 0) {\n consola.error(\"当前 Git 仓库存在未提交的文件,请先提交或暂存这些文件\")\n return\n }\n\n // 获取当前分支\n const currentBranch = branch ?? (await git.revparse([\"--abbrev-ref\", \"HEAD\"]))\n\n // 预处理正则表达式,替换占位符\n const processedReg = preprocessRegex(reg)\n\n consola.warn(\"⚠️ 警告:此操作将重写 Git 历史,建议先备份\")\n consola.info(`目标分支: ${currentBranch}`)\n\n // 显示正则表达式和替换字符串\n consola.info(`正则表达式: /${processedReg}/${flags ?? \"\"}`)\n\n consola.info(`替换字符串: ${replace}`)\n\n // 询问用户是否继续\n const cont = await shouldContinue(\"⚠️ 是否继续?此操作将重写 Git 历史\")\n\n if (!cont) {\n consola.info(\"操作已取消\")\n return\n }\n\n // 获取提交数量\n const logResult = await git.log([currentBranch])\n const commitCount = logResult.total\n\n consola.info(`找到 ${commitCount} 个提交`)\n\n // 创建临时脚本文件,避免转义问题\n const tempScriptPath = join(tmpdir(), `git-msg-filter-${Date.now()}.js`)\n\n // 生成 Node.js 脚本内容\n const scriptContent = `\nconst reg = ${JSON.stringify(processedReg)}\nconst replace = ${JSON.stringify(replace)}\nconst flags = ${JSON.stringify(flags ?? \"\")}\n\nlet input = \"\"\n\nprocess.stdin.on(\"data\", chunk => {\n input += chunk.toString()\n})\n\nprocess.stdin.on(\"end\", () => {\n const regexp = new RegExp(reg, flags)\n const result = input.replace(regexp, replace)\n process.stdout.write(result)\n})\n`\n\n // 清理之前可能存在的 filter-branch 引用\n try {\n await git.raw([\"update-ref\", \"-d\", `refs/original/refs/heads/${currentBranch}`])\n consola.info(\"清理了之前的 filter-branch 引用\")\n } catch {\n // 如果不存在引用,忽略错误\n }\n\n consola.start(\"开始替换提交消息...\")\n\n try {\n // 写入临时脚本文件\n await writeFile(tempScriptPath, scriptContent, \"utf-8\")\n\n // 使用 filter-branch 重写提交消息\n // 在 Windows 上,路径需要使用正斜杠或双引号包裹\n // 将反斜杠转换为正斜杠,Node.js 在 Windows 上也支持这种格式\n const scriptPathForCommand = tempScriptPath.replace(/\\\\/g, \"/\")\n\n const filterCommand = `git filter-branch -f --msg-filter \"node \\\\\"${scriptPathForCommand}\\\\\"\" -- ${currentBranch}`\n\n await spawnAsync(filterCommand)\n\n // 删除临时脚本文件\n await unlink(tempScriptPath)\n\n consola.success(\"提交消息替换完成\")\n\n // 如果需要推送到远程仓库\n if (push) {\n consola.start(`强制推送到远程仓库 ${remote}...`)\n\n try {\n await git.push([remote, currentBranch, \"--force\"])\n consola.success(`已强制推送到 ${remote}/${currentBranch}`)\n } catch (error) {\n consola.error(`推送到远程失败:`, error)\n consola.warn(`你可以手动执行: git push ${remote} ${currentBranch} --force`)\n }\n } else consola.warn(`如需推送到远程,请执行: git push ${remote} ${currentBranch} --force`)\n } catch (error) {\n consola.error(\"替换提交消息失败:\", error)\n consola.info(\"如果出现错误,可以使用以下命令恢复:\")\n consola.info(\"git reset --hard refs/original/refs/heads/\" + currentBranch)\n\n // 确保删除临时脚本文件\n try {\n await unlink(tempScriptPath)\n } catch {\n // 忽略删除失败的错误\n }\n }\n}\n","import { consola } from \"consola\"\nimport { simpleGit } from \"simple-git\"\n\nimport { preprocessRegex } from \"./preprocessRegex\"\nimport { shouldContinue } from \"./shouldContinue\"\n\nexport interface ReplaceTagParams {\n /** 正则表达式字符串 */\n reg: string\n /** 替换字符串 */\n replace: string\n /** 正则表达式标志,如 i、g、m 等 */\n flags?: string\n /** 是否推送到远程仓库 */\n push?: boolean\n /** 远程仓库名称,默认为 origin */\n remote?: string\n}\n\n/**\n * 替换所有 git tag\n */\nexport async function replaceTag({ reg, replace, flags, push, remote = \"origin\" }: ReplaceTagParams) {\n const git = simpleGit()\n\n // 检查是否是 git 仓库\n const isRepo = await git.checkIsRepo()\n\n if (!isRepo) {\n consola.error(\"当前目录不是 git 仓库\")\n return\n }\n\n // 检查是否有未提交的更改\n const status = await git.status()\n\n if (status.files.length > 0) {\n consola.error(\"当前 Git 仓库存在未提交的文件,请先提交或暂存这些文件\")\n return\n }\n\n // 预处理正则表达式,替换占位符\n const processedReg = preprocessRegex(reg)\n\n // 显示正则表达式和替换字符串\n consola.info(`正则表达式: /${processedReg}/${flags ?? \"\"}`)\n\n consola.info(`替换字符串: ${replace}`)\n\n // 询问用户是否继续\n const cont = await shouldContinue(\"是否继续?\")\n\n if (!cont) {\n consola.info(\"操作已取消\")\n return\n }\n\n // 获取所有 tag\n const tags = await git.tags()\n const allTags = tags.all\n\n if (allTags.length === 0) {\n consola.warn(\"当前仓库没有任何 tag\")\n return\n }\n\n consola.info(`找到 ${allTags.length} 个 tag`)\n\n const operations = []\n\n // 遍历所有 tag,准备操作\n for (const tag of allTags) {\n // 每次循环创建新的正则表达式,避免 g 标志可能带来的状态问题\n const regexp = new RegExp(processedReg, flags)\n\n const newTag = tag.replace(regexp, replace)\n\n // 如果替换后的 tag 名称没有变化,跳过\n if (newTag === tag) continue\n\n operations.push({ oldTag: tag, newTag })\n }\n\n if (operations.length === 0) {\n consola.warn(\"没有需要替换的 tag\")\n return\n }\n\n consola.info(`将要替换 ${operations.length} 个 tag`)\n\n // 执行替换操作\n for (const { oldTag, newTag } of operations) {\n try {\n // 获取旧 tag 指向的 commit\n const tagInfo = await git.raw([\"rev-list\", \"-n\", \"1\", oldTag])\n const commitHash = tagInfo.trim()\n\n // 创建新 tag\n await git.addTag(newTag)\n await git.raw([\"tag\", \"-f\", newTag, commitHash])\n\n // 删除旧 tag\n await git.tag([\"-d\", oldTag])\n\n consola.success(`本地: ${oldTag} -> ${newTag}`)\n\n // 如果需要推送到远程仓库\n if (push) {\n try {\n // 删除远程的旧 tag\n await git.push([remote, \"--delete\", oldTag])\n consola.success(`远程: 删除 ${oldTag}`)\n } catch (error) {\n // 如果远程没有这个 tag,忽略错误\n consola.warn(`远程可能不存在 ${oldTag},跳过删除`)\n }\n\n try {\n // 推送新 tag 到远程\n await git.push([remote, newTag])\n consola.success(`远程: 推送 ${newTag}`)\n } catch (error) {\n consola.error(`推送 ${newTag} 到远程失败:`, error)\n }\n }\n } catch (error) {\n consola.error(`替换 ${oldTag} 失败:`, error)\n }\n }\n\n consola.success(\"所有 tag 替换完成\")\n}\n","import { existsSync } from \"fs\"\nimport { writeFile } from \"fs/promises\"\n\nimport { addDependency } from \"./addDependency\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { readTsConfig } from \"./readTsConfig\"\nimport { Module, ModuleResolution, Target } from \"./setTsConfig\"\nimport { writePackageJson } from \"./writePackageJson\"\nimport { writeTsConfig } from \"./writeTsConfig\"\n\nconst rollupConfig = `import commonjs from \"@rollup/plugin-commonjs\"\nimport json from \"@rollup/plugin-json\"\nimport resolve from \"@rollup/plugin-node-resolve\"\nimport typescript from \"@rollup/plugin-typescript\"\nimport { RollupOptions } from \"rollup\"\n\nconst config: RollupOptions = {\n input: \"src/index.ts\",\n output: {\n file: \"dist/index.js\",\n format: \"cjs\"\n },\n plugins: [typescript(), resolve(), commonjs(), json()],\n external: [\"@resvg/resvg-js\", \"@types/cors\", \"@types/express\", \"@types/node\", \"cors\", \"dotenv\", \"express\", \"get-port-please\", \"next\", \"react\", \"react-dom\", \"soda-nodejs\"]\n}\n\nexport default config\n`\n\nconst tsconfig = `{\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"module\": \"EsNext\",\n \"moduleResolution\": \"Bundler\",\n \"strict\": true,\n \"skipLibCheck\": true\n }\n}\n`\n\nexport async function rollup() {\n await addDependency({\n package: [\"@rollup/plugin-commonjs\", \"@rollup/plugin-json\", \"@rollup/plugin-node-resolve\", \"@rollup/plugin-typescript\", \"rollup\", \"typescript\"],\n type: \"devDependencies\",\n })\n\n const packageJson = await readPackageJson()\n\n if (packageJson.scripts.build) packageJson.scripts[\"build:rollup\"] = \"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript\"\n else packageJson.scripts.build = \"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript\"\n\n await writePackageJson({ data: packageJson })\n await writeFile(\"rollup.config.ts\", rollupConfig, \"utf-8\")\n\n if (existsSync(\"tsconfig.json\")) {\n const tsconfig = await readTsConfig()\n tsconfig.compilerOptions ??= {}\n tsconfig.compilerOptions.target = Target.ESNext\n tsconfig.compilerOptions.module = Module.ESNext\n tsconfig.compilerOptions.moduleResolution = ModuleResolution.Bundler\n tsconfig.compilerOptions.strict = true\n tsconfig.compilerOptions.skipLibCheck = true\n await writeTsConfig({ data: tsconfig })\n } else await writeFile(\"tsconfig.json\", tsconfig, \"utf-8\")\n\n await installDependceny()\n}\n","import { writeFile } from \"fs/promises\"\n\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nconst rslibConfig = `import { defineConfig } from \"@rslib/core\"\n\nexport default defineConfig({\n source: {\n entry: {\n index: [\"./src/**\"],\n },\n },\n lib: [\n {\n bundle: false,\n dts: true,\n format: \"esm\",\n },\n {\n bundle: false,\n dts: true,\n format: \"cjs\",\n },\n ],\n output: {\n target: \"web\",\n },\n})\n`\n\nconst rslibConfigWithReact = `import { pluginReact } from \"@rsbuild/plugin-react\"\nimport { defineConfig } from \"@rslib/core\"\n\nexport default defineConfig({\n source: {\n entry: {\n index: [\"./src/**\"],\n },\n },\n lib: [\n {\n bundle: false,\n dts: true,\n format: \"esm\",\n },\n {\n bundle: false,\n dts: true,\n format: \"cjs\",\n },\n ],\n output: {\n target: \"web\",\n },\n plugins: [pluginReact()],\n})\n`\n\nconst tsconfig = `{\n \"compilerOptions\": {\n \"baseUrl\": \".\",\n \"strict\": true,\n \"declaration\": true,\n \"skipLibCheck\": true,\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Bundler\",\n \"paths\": {\n \"@/*\": [\"src/*\"]\n }\n },\n \"include\": [\"src\"]\n}\n`\n\nconst tsconfigWithReact = `{\n \"compilerOptions\": {\n \"baseUrl\": \".\",\n \"strict\": true,\n \"declaration\": true,\n \"skipLibCheck\": true,\n \"jsx\": \"react-jsx\",\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Bundler\",\n \"paths\": {\n \"@/*\": [\"src/*\"]\n }\n },\n \"include\": [\"src\"]\n}\n`\n\nexport async function rslib() {\n const { name, version, description, scripts, dependencies, devDependencies, peerDependencies } = await readPackageJson()\n\n const newPackageJson = {\n name,\n version,\n description,\n type: \"module\",\n exports: {\n \".\": {\n types: \"./dist/index.d.ts\",\n import: \"./dist/index.js\",\n require: \"./dist/index.cjs\",\n },\n },\n main: \"./dist/index.cjs\",\n module: \"./dist/index.js\",\n types: \"./dist/index.d.ts\",\n sideEffects: false,\n scripts,\n keywords: [],\n authors: [\"lurongv@qq.com\"],\n license: \"MIT\",\n files: [\"dist\", \"src\", \"tsconfig.json\"],\n publishConfig: {\n access: \"public\",\n registry: \"https://registry.npmjs.com/\",\n },\n repository: {\n type: \"git\",\n url: \"git+https://github.com/1adybug/deepsea.git\",\n },\n homepage: `https://github.com/1adybug/deepsea/tree/main/packages/${name}`,\n dependencies,\n devDependencies,\n peerDependencies,\n }\n\n await writePackageJson({ data: newPackageJson })\n const hasReact = !!dependencies?.[\"react\"] || !!devDependencies?.[\"react\"] || !!peerDependencies?.[\"react\"]\n await writeFile(\"rslib.config.ts\", hasReact ? rslibConfigWithReact : rslibConfig, \"utf-8\")\n await writeFile(\"tsconfig.json\", hasReact ? tsconfigWithReact : tsconfig, \"utf-8\")\n}\n","import { mkdir, readdir, readFile, rm, writeFile } from \"fs/promises\"\nimport { join } from \"path\"\n\nexport async function serverToAction() {\n const dir = await readdir(\"shared\")\n await rm(\"actions\", { recursive: true, force: true })\n const actions = dir.filter(item => item.toLowerCase().endsWith(\".ts\"))\n\n const actions2: string[] = []\n\n for (const item of actions) {\n const content = await readFile(join(\"shared\", item), \"utf-8\")\n if (/^\"no export\"$/m.test(content)) continue\n actions2.push(item)\n }\n\n await mkdir(\"actions\", { recursive: true })\n await Promise.all(\n actions2.map(async item => {\n const base = item.replace(/\\.ts$/i, \"\")\n await writeFile(\n join(\"actions\", item),\n `\"use server\"\n\nimport { ${base} } from \"@/shared/${base}\"\n\nimport { createResponseFn } from \"@/utils/createResponseFn\"\n\nexport async function ${base}Action(...args: Parameters<typeof ${base}>) {\n return await createResponseFn(${base}, ...args)\n}\n`,\n )\n }),\n )\n}\n","import { writeFile } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\nimport { JsonMap, stringify } from \"@iarna/toml\"\n\nexport async function writeBunConfig(config: JsonMap) {\n const path = join(homedir(), \".bunfig.toml\")\n await writeFile(path, stringify(config), \"utf-8\")\n}\n","import { readBunConfig } from \"./readBunConfig\"\nimport { writeBunConfig } from \"./writeBunConfig\"\n\nexport async function setBun() {\n const config = await readBunConfig()\n config.install ??= {}\n config.install.cache ??= {}\n config.install.cache.disable = true\n await writeBunConfig(config)\n}\n","import consola from \"consola\"\nimport { execAsync } from \"soda-nodejs\"\n\nexport async function setEnv(key: string, value?: string) {\n value = value?.trim() ?? \"\"\n\n // 检测操作系统类型\n const isWindows = process.platform === \"win32\"\n\n // Windows 系统\n if (isWindows) await execAsync(`[Environment]::SetEnvironmentVariable(\"${key}\", \"${value}\", \"User\")`, { shell: \"powershell\" })\n else {\n // Linux/Mac 系统修改配置文件\n // 对于 bash,添加到 ~/.bashrc\n // 对于 zsh,添加到 ~/.zshrc\n const shell = process.env.SHELL || \"/bin/bash\"\n const config = shell.includes(\"zsh\") ? \"~/.zshrc\" : \"~/.bashrc\"\n\n await execAsync(`echo \"export ${key}=${value}\" >> ${config}`)\n await execAsync(`source ${config}`)\n }\n\n consola.success(value ? `${key} 已设置为 ${value}` : `${key} 已删除`)\n}\n","import { rm, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\n\nimport { addGitignore } from \"./addGitignore\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { Module, ModuleResolution, setTsConfig, Target } from \"./setTsConfig\"\nimport { sortArrayOrObject } from \"./sortArrayOrObject\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nconst fatherrcCode = `import { defineConfig } from \"father\"\n\nexport default defineConfig({\n esm: {},\n cjs: {},\n targets: {\n node: 18,\n chrome: 100\n },\n sourcemap: true\n})\n`\n\nexport async function setFatherConfig() {\n consola.start(\"开始设置 father 配置\")\n let packageJson = await readPackageJson()\n packageJson.publishConfig ??= {}\n packageJson.publishConfig.access = \"public\"\n packageJson.publishConfig.registry = \"https://registry.npmjs.org/\"\n packageJson.publishConfig = sortArrayOrObject(packageJson.publishConfig)\n packageJson.files ??= []\n if (!packageJson.files.includes(\"src\")) packageJson.files.push(\"src\")\n packageJson.files = sortArrayOrObject(packageJson.files)\n const dependencies = packageJson.dependencies\n const devDependencies = packageJson.devDependencies\n const peerDependencies = packageJson.peerDependencies\n if (packageJson.repository?.url && !packageJson.repository.url.startsWith(\"git+\")) packageJson.repository.url = `git+${packageJson.repository.url}.git`\n packageJson.repository ??= {}\n packageJson.repository.type ??= \"git\"\n packageJson.repository.url ??= `git+https://github.com/1adybug/${packageJson.name}.git`\n\n if (!packageJson.types) {\n packageJson = Object.entries(packageJson).reduce((prev: Record<string, unknown>, [key, value]) => {\n prev[key] = value\n\n if (Object.hasOwn(packageJson, \"module\")) {\n if (key === \"module\") prev.types = value.replace(/\\.js$/, \".d.ts\")\n } else {\n if (Object.hasOwn(packageJson, \"main\")) {\n if (key === \"main\") prev.types = value.replace(/\\.js$/, \".d.ts\")\n }\n }\n\n return prev\n }, {})\n }\n\n delete packageJson.dependencies\n delete packageJson.devDependencies\n delete packageJson.peerDependencies\n packageJson.dependencies = sortArrayOrObject(dependencies)\n packageJson.devDependencies = sortArrayOrObject(devDependencies)\n packageJson.peerDependencies = sortArrayOrObject(peerDependencies)\n await addGitignore()\n await writePackageJson({ data: packageJson })\n await writeFile(\".fatherrc.ts\", fatherrcCode)\n await setTsConfig(\"target\", Target.ESNext)\n await setTsConfig(\"module\", Module.ESNext)\n await setTsConfig(\"moduleResolution\", ModuleResolution.Bundler)\n await rm(\"src/client\", { recursive: true, force: true })\n await rm(\"src/server\", { recursive: true, force: true })\n await writeFile(\"src/index.ts\", \"\")\n consola.success(\"设置 father 配置成功\")\n}\n","import inquirer from \"inquirer\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nexport async function setGitProxy() {\n const { global } = await inquirer.prompt({\n type: \"list\",\n name: \"global\",\n message: \"请选择\",\n choices: [\n {\n name: \"全局代理\",\n value: true,\n },\n {\n name: \"当前项目\",\n value: false,\n },\n ],\n })\n const { open } = await inquirer.prompt({\n type: \"list\",\n name: \"open\",\n message: \"请选择\",\n choices: [\n {\n name: \"打开代理\",\n value: true,\n },\n {\n name: \"关闭代理\",\n value: false,\n },\n ],\n })\n\n if (!open) {\n try {\n await spawnAsync(`git config${global ? \" --global\" : \"\"} --unset http.proxy`, { shell: true, stdio: \"inherit\" })\n } catch {\n /* empty */\n }\n\n try {\n await spawnAsync(`git config${global ? \" --global\" : \"\"} --unset https.proxy`, { shell: true, stdio: \"inherit\" })\n } catch {\n /* empty */\n }\n\n return\n }\n\n const { proxy } = await inquirer.prompt({\n type: \"input\",\n name: \"proxy\",\n message: \"请输入代理地址\",\n default: \"http://localhost:7890\",\n })\n await spawnAsync(`git config${global ? \" --global\" : \"\"} http.proxy ${proxy}`, { shell: true, stdio: \"inherit\" })\n await spawnAsync(`git config${global ? \" --global\" : \"\"} https.proxy ${proxy}`, { shell: true, stdio: \"inherit\" })\n}\n","import { Registry } from \"@/constant\"\n\ndeclare global {\n /** 全局 npm 镜像源配置地址 */\n var __ZIXULU_REGISTRY__: string | undefined\n /** 是否启用全局代理配置 */\n var __ZIXULU_PROXY__: boolean | undefined\n}\n\nexport type GlobalConfig = {\n /** npm 镜像源地址 */\n registry?: string\n /** 是否启用代理 */\n proxy?: boolean\n}\n\n/**\n * 设置全局配置参数\n * @param param 全局配置对象\n */\nexport function setGlobalConfig({ registry, proxy }: GlobalConfig) {\n if (Object.keys(Registry).includes(registry!)) global.__ZIXULU_REGISTRY__ = Registry[registry as keyof typeof Registry]\n else global.__ZIXULU_REGISTRY__ = registry\n\n global.__ZIXULU_PROXY__ = !!proxy\n}\n","import { getEnumKeys, getEnumValues } from \"deepsea-tools\"\nimport inquirer from \"inquirer\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nimport { PackageManager, Registry } from \"@/constant/index\"\n\nimport { readBunConfig } from \"./readBunConfig\"\nimport { writeBunConfig } from \"./writeBunConfig\"\n\nexport async function setRegistry() {\n const { manager } = await inquirer.prompt({\n type: \"list\",\n name: \"manager\",\n message: \"请选择包管理器\",\n choices: getEnumValues(PackageManager),\n })\n\n const { registry } = await inquirer.prompt({\n type: \"list\",\n name: \"registry\",\n message: \"请选择要更换的源\",\n choices: getEnumKeys(Registry),\n })\n\n if (manager === PackageManager.bun) {\n const config = await readBunConfig()\n config.install ??= {}\n config.install.registry = \"https://registry.npmmirror.com\"\n await writeBunConfig(config)\n return\n }\n\n await spawnAsync(`${manager} config set registry ${Registry[registry as keyof typeof Registry]}`, { shell: true, stdio: \"inherit\" })\n}\n","import { execAsync } from \"soda-nodejs\"\n\n/**\n * 检测是否开启了 Shell 代理\n */\nexport async function isShellProxy() {\n const result = await execAsync(\"netsh winhttp show proxy\", {\n encoding: \"buffer\",\n decode: { encoding: \"gbk\" },\n })\n return !result.includes(\"直接访问\")\n}\n","import inquirer from \"inquirer\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nimport { isShellProxy } from \"./isShellProxy\"\n\nexport async function setShellProxy() {\n const isOpen = await isShellProxy()\n\n if (isOpen) {\n const { open } = await inquirer.prompt({\n type: \"list\",\n name: \"open\",\n message: \"请选择\",\n choices: [\n {\n name: \"✏️ 更改地址\",\n value: true,\n },\n {\n name: \"🚫 关闭代理\",\n value: false,\n },\n ],\n })\n\n if (!open) {\n await spawnAsync(`netsh winhttp reset proxy`, {\n shell: true,\n stdio: \"inherit\",\n })\n return\n }\n }\n\n const { proxy } = await inquirer.prompt({\n type: \"input\",\n name: \"proxy\",\n message: \"请输入代理地址\",\n default: \"http://localhost:7890\",\n })\n await spawnAsync(`netsh winhttp set proxy \"${proxy}\" \"<local>\"`, {\n shell: true,\n stdio: \"inherit\",\n })\n}\n","import consola from \"consola\"\n\nimport { readPackageJson } from \"./readPackageJson\"\nimport { sortArrayOrObject } from \"./sortArrayOrObject\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport async function sortPackageJson() {\n consola.start(\"开始排序 package.json 中的依赖\")\n const packageJson = await readPackageJson()\n packageJson.dependencies = sortArrayOrObject(packageJson.dependencies)\n packageJson.devDependencies = sortArrayOrObject(packageJson.devDependencies)\n packageJson.peerDependencies = sortArrayOrObject(packageJson.peerDependencies)\n packageJson.peerDevDependencies = sortArrayOrObject(packageJson.peerDevDependencies)\n await writePackageJson({ data: packageJson })\n consola.success(\"排序 package.json 中的依赖成功\")\n}\n","import { existsSync } from \"fs\"\nimport { copyFile, mkdir, readdir, readFile, rm, writeFile } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport inquirer from \"inquirer\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport async function asyncAgentRules() {\n try {\n const packageJson = await readPackageJson()\n if (packageJson?.scripts?.ucr === \"npx zixulu acr\") packageJson.scripts.ucr = undefined\n await writePackageJson({ data: packageJson })\n } catch (error) {}\n\n await spawnAsync(`npx gitpick 1adybug/cursor-rule/tree/main/.cursor/rules .cursor-rules`)\n\n const source = join(\".cursor-rules\")\n\n const target = join(\".cursor\", \"rules\")\n\n let existed = existsSync(target)\n\n if (!existed) await mkdir(target, { recursive: true })\n\n try {\n const sourceDir = await readdir(source)\n const targetDir = await readdir(target)\n\n const map: Record<string, string> = {}\n\n for (const file of sourceDir) {\n if (!targetDir.includes(file)) {\n map[file] = \"new\"\n continue\n }\n\n const sourceContent = await readFile(join(source, file), \"utf-8\")\n const targetContent = await readFile(join(target, file), \"utf-8\")\n if (sourceContent === targetContent) continue\n map[file] = \"modified\"\n }\n\n if (Object.keys(map).length === 0) throw new Error(\"Cursor 规则已是最新\")\n\n interface Answer {\n files: string[]\n }\n\n const { files } = await inquirer.prompt<Answer>({\n type: \"checkbox\",\n name: \"files\",\n message: \"请选择要添加的文件\",\n choices: Object.entries(map).map(([key, value]) => ({\n name: `${key} (${value})`,\n value: key,\n })),\n default: Object.keys(map),\n })\n\n for (const file of files) await copyFile(join(source, file), join(target, file))\n\n await rm(source, { recursive: true })\n\n const dir = await readdir(\".cursor/rules\")\n\n await mkdir(\".agent/rules\", { recursive: true })\n\n const orders = [\"base.mdc\", \"react.mdc\", \"api.mdc\", \"next.mdc\"]\n\n dir.sort((a, b) => orders.indexOf(a) - orders.indexOf(b))\n\n let agentsRule = `# Agent Rules`\n\n for (const file of dir) {\n const source = await readFile(join(\".cursor/rules\", file), \"utf-8\")\n\n const content = source.replace(\n /^---\\nalwaysApply: (true|false)\\n---/,\n (match, p1) => `---\ntrigger: ${p1 === \"true\" ? \"always_on\" : \"model_decision\"}\nglob:\ndescription:\n---`,\n )\n\n const content2 = source.replace(/^---\\nalwaysApply: (true|false)\\n---/, \"\").replace(/^(#+ )/gm, \"#$1\")\n\n agentsRule = agentsRule + content2\n\n agentsRule = agentsRule.replace(/\\n+$/, \"\")\n\n await writeFile(join(\".agent/rules\", file.replace(/\\.mdc$/, \".md\")), content)\n }\n\n agentsRule = agentsRule + \"\\n\"\n\n await writeFile(\"AGENTS.md\", agentsRule)\n\n return getCommitMessage(CommitType.feature, `同步 Agent 规则`)\n } catch (error) {\n await rm(source, { recursive: true })\n throw error\n }\n}\n","import consola from \"consola\"\nimport { execAsync } from \"soda-nodejs\"\n\nexport async function syncCursorExtToCode() {\n const cursorOutput = await execAsync(\"cursor --list-extensions\")\n const cursorExts = new Set(cursorOutput.split(\"\\n\").filter(item => !!item && !item.startsWith(\"anysphere.\")))\n const vscodeOutput = await execAsync(\"code --list-extensions\")\n const vscodeExts = new Set(vscodeOutput.split(\"\\n\").filter(Boolean))\n const installExts = cursorExts.difference(vscodeExts)\n for (const ext of installExts) await execAsync(`code --install-extension ${ext}`)\n const uninstallExts = vscodeExts.difference(cursorExts)\n for (const ext of uninstallExts) await execAsync(`code --uninstall-extension ${ext}`)\n consola.success(\"同步完成\")\n}\n","import { execAsync } from \"soda-nodejs\"\n\nimport { SyncEditorSettingSource } from \"./syncEditorSetting\"\n\nexport interface GetEditorExtensionsParams {\n source: SyncEditorSettingSource\n}\n\nexport async function getEditorExtensions({ source }: GetEditorExtensionsParams) {\n let data: string[] = []\n\n if (source !== \"Online\") {\n const output = await execAsync(`${source} --list-extensions`)\n data = output\n .split(\"\\n\")\n .map(item => item.trim())\n .filter(Boolean)\n } else {\n const response = await fetch(\"https://luzixu.geskj.com/extensions.json\")\n data = await response.json()\n }\n\n data = data.filter(item => !item.startsWith(\"anysphere.\") && item !== \"github.copilot\" && item !== \"github.copilot-chat\")\n\n return new Set(data)\n}\n","import { existsSync } from \"fs\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\n/** 判断是否安装了 AntiGravity */\nexport function hasAntiGravity() {\n const userDir = homedir()\n const path = join(userDir, \"AppData/Roaming/Antigravity\")\n return existsSync(path)\n}\n","import { existsSync } from \"fs\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\n/** 判断是否安装了 VSCode */\nexport function hasCode() {\n const userDir = homedir()\n const path = join(userDir, \"AppData/Roaming/Code\")\n return existsSync(path)\n}\n","import { existsSync } from \"fs\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\n/** 判断是否安装了 Cursor */\nexport function hasCursor() {\n const userDir = homedir()\n const path = join(userDir, \"AppData/Roaming/Cursor\")\n return existsSync(path)\n}\n","import { applyEdits, JSONPath, ModificationOptions, modify } from \"jsonc-parser\"\n\nexport function modifyJsonc(text: string, path: JSONPath, value: any, options?: ModificationOptions) {\n options = { ...options }\n options.formattingOptions = { ...options.formattingOptions }\n options.formattingOptions.tabSize ??= 4\n options.formattingOptions.insertSpaces ??= true\n options.formattingOptions.insertFinalNewline ??= true\n options.formattingOptions.keepLines ??= true\n options.formattingOptions.eol ??= \"\\n\"\n\n const edits = modify(text, path, value, options)\n\n return applyEdits(text, edits)\n}\n","import { existsSync } from \"fs\"\nimport { mkdir, readFile, rename, writeFile } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join, parse } from \"path\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\nimport { execAsync } from \"soda-nodejs\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { addGitCommit } from \"./addGitCommit\"\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { getEditorExtensions } from \"./getEditorExtensions\"\nimport { hasAntiGravity } from \"./hasAntiGravity\"\nimport { hasChangeNoCommit } from \"./hasChangeNoCommit\"\nimport { hasCode } from \"./hasCode\"\nimport { hasCursor } from \"./hasCursor\"\nimport { modifyJsonc } from \"./modifyJsonc\"\nimport { readZixuluSetting } from \"./readZixuluSetting\"\nimport { writeZixuluSetting } from \"./writeZixuluSetting\"\n\nexport type Editor = \"Code\" | \"Cursor\" | \"Antigravity\"\n\nexport type SyncEditorSettingSource = Editor | \"Online\"\n\nexport type EditorFileType = \"settings\" | \"snippets\"\n\nexport type EditorConfigType = EditorFileType | \"extensions\"\n\nexport type EditorFileSourceMap = Record<EditorFileType, Record<SyncEditorSettingSource, string>>\n\nconst userDir = homedir()\n\nconst fileSourceMap: EditorFileSourceMap = {\n settings: {\n Code: join(userDir, \"AppData/Roaming/Code/User/settings.json\"),\n Cursor: join(userDir, \"AppData/Roaming/Cursor/User/settings.json\"),\n Antigravity: join(userDir, \"AppData/Roaming/Antigravity/User/settings.json\"),\n Online: \"https://luzixu.geskj.com/settings.json\",\n },\n snippets: {\n Code: join(userDir, \"AppData/Roaming/Code/User/snippets/global.code-snippets\"),\n Cursor: join(userDir, \"AppData/Roaming/Cursor/User/snippets/global.code-snippets\"),\n Antigravity: join(userDir, \"AppData/Roaming/Antigravity/User/snippets/global.code-snippets\"),\n Online: \"https://luzixu.geskj.com/global.code-snippets\",\n },\n}\n\nexport interface SyncEditorSettingParams {\n source: SyncEditorSettingSource\n target: Editor\n}\n\nexport interface SyncEditorFileItem {\n type: SyncEditorSettingSource\n value: string\n}\n\nexport interface SyncEditorFileParams {\n type: EditorFileType\n source: SyncEditorFileItem\n target: SyncEditorFileItem\n}\n\nasync function getFile(source: string) {\n if (source.startsWith(\"http\")) {\n const response = await fetch(source)\n return await response.text()\n }\n\n return await readFile(source, \"utf-8\")\n}\n\nexport async function syncEditorFile({\n type,\n source: { type: sourceType, value: sourceValue },\n target: { type: targetType, value: targetValue },\n}: SyncEditorFileParams) {\n const { dir, base } = parse(targetValue)\n await mkdir(dir, { recursive: true })\n const setting = await readZixuluSetting()\n let code = await getFile(sourceValue)\n\n if (type === \"settings\") {\n code = modifyJsonc(code, [\"extensions.gallery.serviceUrl\"], undefined)\n code = modifyJsonc(code, [\"antigravity.marketplaceExtensionGalleryServiceURL\"], undefined)\n code = modifyJsonc(code, [\"antigravity.marketplaceGalleryItemURL\"], undefined)\n\n if (targetType === \"Antigravity\") {\n code = modifyJsonc(code, [\"antigravity.marketplaceExtensionGalleryServiceURL\"], \"https://marketplace.visualstudio.com/_apis/public/gallery\")\n code = modifyJsonc(code, [\"antigravity.marketplaceGalleryItemURL\"], \"https://marketplace.visualstudio.com/items\")\n }\n }\n\n if (existsSync(targetValue)) {\n const text = await readFile(targetValue, \"utf-8\")\n\n if (text === code) {\n consola.success(`${targetValue} 已是最新`)\n return\n } else {\n type Answer = { backup: boolean }\n\n let backup = false\n\n if (targetType !== \"Online\") {\n const answer = await inquirer.prompt<Answer>({\n type: \"confirm\",\n name: \"backup\",\n message: `是否备份原文件(${targetValue})`,\n default: setting.syncEditor?.fileConfigs?.[targetValue]?.backup ?? true,\n })\n\n backup = answer.backup\n }\n\n setting.syncEditor ??= {}\n setting.syncEditor.fileConfigs ??= {}\n setting.syncEditor.fileConfigs[targetValue] ??= {}\n setting.syncEditor.fileConfigs[targetValue].backup = backup\n\n await writeZixuluSetting(setting)\n if (backup) await rename(targetValue, join(dir, `${base}.${Date.now()}.bak`))\n }\n }\n\n await writeFile(targetValue, code, \"utf-8\")\n consola.success(`${targetValue} 同步完成`)\n}\n\nexport async function syncEditorSetting() {\n const setting = await readZixuluSetting()\n\n interface Answer {\n source: SyncEditorSettingSource\n types: EditorConfigType[]\n targets: SyncEditorSettingSource[]\n }\n\n const sourceChoices = [\"Online\"]\n\n if (hasCode()) sourceChoices.unshift(\"Code\")\n if (hasCursor()) sourceChoices.unshift(\"Cursor\")\n if (hasAntiGravity()) sourceChoices.unshift(\"Antigravity\")\n\n const { source } = await inquirer.prompt<Answer>([\n {\n type: \"list\",\n name: \"source\",\n message: \"选择同步来源\",\n choices: sourceChoices,\n default: setting.syncEditor?.source ?? \"Cursor\",\n },\n ])\n\n setting.syncEditor ??= {}\n setting.syncEditor.source = source\n\n const targetChoices = sourceChoices.filter(v => v !== source)\n\n if (targetChoices.length === 0) return consola.info(\"没有可同步的目标\")\n\n const { targets, types } = await inquirer.prompt<Answer>([\n {\n type: \"checkbox\",\n name: \"targets\",\n message: \"选择同步目标\",\n choices: targetChoices,\n default: setting.syncEditor?.targets?.filter(item => targetChoices.includes(item)) ?? targetChoices,\n },\n {\n type: \"checkbox\",\n name: \"types\",\n message: \"选择的配置类型\",\n choices: [\"settings\", \"snippets\", \"extensions\"],\n default: setting.syncEditor?.types ?? [\"settings\", \"snippets\", \"extensions\"],\n },\n ])\n\n setting.syncEditor.targets = targets\n setting.syncEditor.types = types\n\n if (targets.includes(\"Online\")) {\n interface Answer {\n onlinePath: string\n }\n\n const { onlinePath } = await inquirer.prompt<Answer>({\n type: \"input\",\n name: \"onlinePath\",\n message: \"请输入 blog 文件夹的路径(留空则跳过)\",\n default: setting.syncEditor?.onlinePath,\n })\n\n setting.syncEditor.onlinePath = onlinePath.trim() ?? undefined\n }\n\n if (!setting.syncEditor.onlinePath) setting.syncEditor.targets = targets.filter(v => v !== \"Online\")\n\n const onlinePath = setting.syncEditor.onlinePath!\n\n const configs: SyncEditorFileParams[] = types\n .filter(item => item !== \"extensions\")\n .map(fileType =>\n targets.map(target => ({\n type: fileType,\n source: { type: source, value: fileSourceMap[fileType][source] },\n target: {\n type: target,\n value:\n target === \"Online\"\n ? join(onlinePath, \"static\", fileType === \"settings\" ? \"settings.json\" : \"global.code-snippets\")\n : fileSourceMap[fileType][target],\n },\n })))\n .flat()\n\n for (const config of configs) await syncEditorFile(config)\n\n if (types.includes(\"extensions\")) {\n const vscodeExtensions = await getEditorExtensions({ source: \"Code\" })\n const cursorExtensions = await getEditorExtensions({ source: \"Cursor\" })\n const antigravityExtensions = await getEditorExtensions({ source: \"Antigravity\" })\n const onlineExtensions = await getEditorExtensions({ source: \"Online\" })\n\n const sourceExtensions =\n source === \"Code\" ? vscodeExtensions : source === \"Cursor\" ? cursorExtensions : source === \"Antigravity\" ? antigravityExtensions : onlineExtensions\n\n if (targets.includes(\"Code\")) {\n const installExtensions = sourceExtensions.difference(vscodeExtensions)\n\n for (const ext of installExtensions) {\n try {\n console.log(`code --install-extension ${ext}`)\n await execAsync(`code --install-extension ${ext}`)\n } catch (error) {\n console.error(`${ext} 安装失败`)\n }\n }\n\n const uninstallExtensions = vscodeExtensions.difference(sourceExtensions)\n\n for (const ext of uninstallExtensions) {\n try {\n console.log(`code --uninstall-extension ${ext}`)\n await execAsync(`code --uninstall-extension ${ext}`)\n } catch (error) {\n console.error(`${ext} 卸载失败`)\n }\n }\n }\n\n if (targets.includes(\"Cursor\")) {\n const installExtensions = sourceExtensions.difference(cursorExtensions)\n\n for (const ext of installExtensions) {\n try {\n console.log(`cursor --install-extension ${ext}`)\n await execAsync(`cursor --install-extension ${ext}`)\n } catch (error) {\n console.error(`${ext} 安装失败`)\n }\n }\n\n const uninstallExtensions = cursorExtensions.difference(sourceExtensions)\n\n for (const ext of uninstallExtensions) {\n try {\n console.log(`cursor --uninstall-extension ${ext}`)\n await execAsync(`cursor --uninstall-extension ${ext}`)\n } catch (error) {\n console.error(`${ext} 卸载失败`)\n }\n }\n }\n\n if (targets.includes(\"Antigravity\")) {\n const installExtensions = sourceExtensions.difference(antigravityExtensions)\n\n for (const ext of installExtensions) {\n try {\n console.log(`antigravity --install-extension ${ext}`)\n await execAsync(`antigravity --install-extension ${ext}`)\n } catch (error) {\n console.error(`${ext} 安装失败`)\n }\n }\n\n const uninstallExtensions = antigravityExtensions.difference(sourceExtensions)\n\n for (const ext of uninstallExtensions) {\n try {\n console.log(`antigravity --uninstall-extension ${ext}`)\n await execAsync(`antigravity --uninstall-extension ${ext}`)\n } catch (error) {\n console.error(`${ext} 卸载失败`)\n }\n }\n }\n\n if (targets.includes(\"Online\")) await writeFile(join(onlinePath, \"static\", \"extensions.json\"), JSON.stringify(Array.from(sourceExtensions), null, 4))\n }\n\n if (targets.includes(\"Online\")) {\n await execAsync(\"npm run format\", { cwd: onlinePath })\n\n if (await hasChangeNoCommit(onlinePath)) {\n await addGitCommit({\n message: getCommitMessage(CommitType.feature, \"sync editor setting\"),\n cwd: onlinePath,\n })\n await execAsync(`git push`, {\n cwd: onlinePath,\n })\n }\n }\n\n await writeZixuluSetting(setting)\n}\n","import { mkdir } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\nimport fetch from \"node-fetch\"\nimport { execAsync } from \"soda-nodejs\"\n\nimport { agent } from \"@/constant/index\"\n\nimport { download } from \"./download\"\nimport { readZixuluSetting } from \"./readZixuluSetting\"\nimport { retry } from \"./retry\"\nimport { writeZixuluSetting } from \"./writeZixuluSetting\"\n\n/**\n * VSCode扩展信息接口\n */\nexport interface VscodeExt {\n id: string // 扩展ID\n name: string // 扩展显示名称\n version: string // 扩展版本\n url: string // 下载URL\n}\n\n/**\n * 获取指定VSCode扩展的详细信息\n * @param ext 扩展ID\n * @returns Promise<VscodeExt> 扩展详细信息\n */\nexport async function getVscodeExtInfo(ext: string): Promise<VscodeExt> {\n const response = await fetch(`https://marketplace.visualstudio.com/items?itemName=${ext}`, { agent })\n const html = await response.text()\n const reg = /^(.+?)\\.(.+?)$/\n const [, author, name] = ext.match(reg)!\n let version: string\n\n if (ext === \"ms-ceintl.vscode-language-pack-zh-hans\") {\n const reg2 = /\"Versions\":(\\[\\{\".+?\\])/\n const versions = JSON.parse(html.match(reg2)![1]) as {\n version: string\n }[]\n const output = await execAsync(\"code --version\")\n const codeVersions = output.split(\"\\n\")[0].split(\".\").map(Number)\n const item =\n versions.find(({ version }) =>\n version\n .split(\".\")\n .map(Number)\n .every((item, index) => index >= 2 || item <= codeVersions[index])) ?? versions[0]\n version = item.version\n } else {\n const reg2 = /\"Version\":\"(.+?)\"/\n version = html.match(reg2)![1]\n }\n\n const reg4 = /<span class=\"ux-item-name\">(.+?)<\\/span>/\n const displayName = html.match(reg4)![1]\n const url = `https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${author}/vsextensions/${name}/${version}/vspackage`\n return { id: ext, name: displayName, version, url }\n}\n\n/**\n * 下载选定的VSCode扩展\n * @param dir 下载目标目录\n */\nexport async function downloadVscodeExts(dir: string) {\n await mkdir(dir, { recursive: true })\n consola.start(\"正在获取 VS Code 扩展列表\")\n const extList = await execAsync(\"code --list-extensions\")\n const exts = await Promise.all(\n extList\n .split(/[\\n\\r]/)\n .filter(Boolean)\n .filter(item => !item.startsWith(\"anysphere.\"))\n .map(ext => getVscodeExtInfo(ext)),\n )\n const setting = await readZixuluSetting()\n const vscodeDownloadHistory = setting?.vscodeDownloadHistory as string[] | undefined\n const exts2 = await inquirer.prompt({\n type: \"checkbox\",\n name: \"exts\",\n message: \"选择需要下载的扩展\",\n choices: exts.map(ext => ({ name: ext.name, value: ext.id })),\n default: vscodeDownloadHistory?.filter(ext => exts.some(item => item.id === ext)) || exts.map(ext => ext.id),\n })\n setting.vscodeDownloadHistory = exts2.exts\n await writeZixuluSetting(setting)\n await Promise.all(exts.filter(ext => exts2.exts.includes(ext.id)).map(ext => retry(() => download(ext.url, dir, `${ext.id}-${ext.version}.vsix`), 4)))\n}\n","import { copyFile, mkdir, readdir, readFile, rm, writeFile } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\nimport consola from \"consola\"\nimport dayjs from \"dayjs\"\nimport { getEnumEntries, getEnumValues } from \"deepsea-tools\"\nimport inquirer from \"inquirer\"\n\nimport { download } from \"./download\"\nimport { downloadVscodeExts } from \"./downloadVscodeExts\"\n\nexport enum VscodeSyncOption {\n \"配置\" = \"SETTING\",\n \"插件\" = \"EXTENSION\",\n \"软件\" = \"SOFTWARE\",\n \"PowerShell\" = \"POWERSHELL\",\n}\n\nexport async function syncVscode() {\n const options: VscodeSyncOption[] = (\n await inquirer.prompt({\n type: \"checkbox\",\n name: \"options\",\n message: \"请选择要同步的内容\",\n choices: getEnumEntries(VscodeSyncOption).map(([name, value]) => ({\n name,\n value,\n })),\n default: getEnumValues(VscodeSyncOption),\n })\n ).options\n if (options.length === 0) return\n const userDir = homedir()\n const snippetSource = join(userDir, \"AppData/Roaming/Code/User/snippets\")\n const setting = (await readFile(join(userDir, \"AppData/Roaming/Code/User/settings.json\"), \"utf-8\")).replace(\n /}[ \\n\\r]*$/,\n ` \"chat.disableAIFeatures\": true,\\n}`,\n )\n const dir = `vscode-${dayjs().format(\"YYYYMMDDHHmmss\")}`\n\n try {\n await mkdir(dir, { recursive: true })\n\n if (options.includes(VscodeSyncOption.配置)) {\n const snippetTarget = join(dir, \"snippets\")\n await mkdir(snippetTarget, { recursive: true })\n consola.start(\"开始下载最新 VSCode 配置\")\n await writeFile(join(dir, \"settings.json\"), setting, \"utf-8\")\n const files = await readdir(snippetSource)\n for (const file of files) await copyFile(join(snippetSource, file), join(snippetTarget, file))\n consola.success(\"下载最新 VSCode 配置完成\")\n }\n\n if (options.includes(VscodeSyncOption.插件)) {\n await downloadVscodeExts(join(dir, \"extensions\"))\n consola.success(\"下载最新 VSCode 插件完成\")\n }\n\n if (options.includes(VscodeSyncOption.配置) || options.includes(VscodeSyncOption.插件)) {\n const script = `// @ts-check\n\nimport { spawn } from \"child_process\"\nimport { readdir, copyFile, rm } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\n/** \n * @param {string} command\n */\nfunction spawnAsync(command) {\n return new Promise((resolve, reject) => {\n const child = spawn(command, { shell: true, stdio: \"inherit\" })\n child.on(\"exit\", code => {\n if (code !== 0) return reject(new Error(\\`Command failed with code \\${code}\\`))\n resolve(0)\n })\n })\n}\n\nasync function main() {\n${\n options.includes(VscodeSyncOption.插件)\n ? ` const dir = await readdir(\"./extensions\")\n for (const ext of dir) {\n await spawnAsync(\\`code --install-extension \"./extensions/\\${ext}\"\\`)\n }\n`\n : \"\"\n}${\n options.includes(VscodeSyncOption.配置)\n ? ` const userDir = homedir()\n const setting = join(userDir, \"AppData/Roaming/Code/User/settings.json\")\n await rm(setting, { force: true })\n await copyFile(\"./settings.json\", setting)\n const snippetTarget = join(userDir, \"AppData/Roaming/Code/User/snippets\")\n const dir2 = await readdir(\"./snippets\")\n for (const file of dir2) {\n await rm(join(snippetTarget, file), { force: true })\n await copyFile(join(\"./snippets\", file), join(snippetTarget, file))\n }`\n : \"\"\n }${\n options.includes(VscodeSyncOption.PowerShell)\n ? `\n ${\n options.includes(VscodeSyncOption.配置)\n ? \"\"\n : `const userDir = homedir()\n`\n }const profile = join(userDir, \"Documents/PowerShell/Microsoft.PowerShell_profile.ps1\")\n await copyFile(\"./Microsoft.PowerShell_profile.ps1\", profile)`\n : \"\"\n }\n}\n\nmain()`\n\n await writeFile(join(dir, \"syncVscode.mjs\"), script, \"utf-8\")\n }\n\n if (options.includes(VscodeSyncOption.软件)) {\n consola.start(\"开始下载最新 VSCode\")\n await download(`https://code.visualstudio.com/sha/download?build=stable&os=win32-x64`, dir)\n consola.success(\"下载最新 VSCode 完成\")\n }\n\n if (options.includes(VscodeSyncOption.PowerShell)) {\n consola.start(\"开始同步 PowerShell 配置\")\n const userDir = homedir()\n const profile = join(userDir, \"Documents/PowerShell/Microsoft.PowerShell_profile.ps1\")\n const content = await readFile(profile, \"utf-8\")\n await writeFile(join(dir, \"Microsoft.PowerShell_profile.ps1\"), content.replace(/cursor|antigravity/g, \"code\"))\n consola.success(\"同步 PowerShell 配置成功\")\n }\n } catch (error) {\n type PromptResult = {\n clear: boolean\n }\n\n const { clear } = await inquirer.prompt<PromptResult>({\n type: \"confirm\",\n name: \"clear\",\n message: \"检测到错误,是否清理下载的文件\",\n default: true,\n })\n if (clear) await rm(dir, { force: true, recursive: true })\n throw error\n }\n}\n","import { readdir, rename } from \"fs/promises\"\n\nimport { getPackageVersionInDependcy } from \"./getPackageVersionInDependcy\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport async function tailwindPatch() {\n const version = await getPackageVersionInDependcy(\"tailwindcss\")\n if (!version) return\n const dir = await readdir(\"./patches\")\n const patch = dir.find(item => item.startsWith(\"tailwindcss\"))\n if (!patch || patch === `tailwindcss@${version}.patch`) return\n await rename(`./patches/${patch}`, `./patches/tailwindcss@${version}.patch`)\n const packageJson = await readPackageJson()\n packageJson.patchedDependencies ??= {}\n delete packageJson.patchedDependencies[patch.replace(/\\.patch$/, \"\")]\n packageJson.patchedDependencies[`tailwindcss@${version}`] = `patches/tailwindcss@${version}.patch`\n await writePackageJson({ data: packageJson })\n await installDependceny()\n}\n","import { existsSync } from \"fs\"\n\nimport inquirer from \"inquirer\"\nimport { compress } from \"soda-nodejs\"\n\nexport interface TarParams {\n input: string\n output?: string\n}\n\nexport async function tar({ input, output }: TarParams) {\n output = `${input}.tar.gz`\n\n if (existsSync(output)) {\n interface Answer {\n overwrite: boolean\n }\n\n const { overwrite } = await inquirer.prompt<Answer>({\n type: \"confirm\",\n name: \"overwrite\",\n message: \"文件已存在,是否覆盖\",\n })\n if (!overwrite) return\n }\n\n await compress({ input, output })\n}\n","import { isSudo } from \"@/constant\"\n\nexport async function test() {\n console.log(isSudo)\n console.log(process.argv)\n}\n","import { readdir, readFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport { spawnAsync } from \"soda-nodejs\"\nimport yaml from \"yaml\"\n\nexport interface Container {\n container_name: string\n image: string\n restart: string\n ports: string[]\n}\n\nexport interface DockerCompose {\n services: Record<string, Container>\n}\n\nexport async function updateDockerCompose() {\n const dir = await readdir(\".\")\n const file = dir.find(item => item === \"docker-compose.yml\" || item === \"docker-compose.yaml\")\n if (!file) throw new Error(\"docker-compose.yml 或 docker-compose.yaml 文件不存在\")\n const content = await readFile(file, \"utf-8\")\n const data = yaml.parse(content) as DockerCompose\n const images = Object.values(data.services).map(service => service.image) as string[]\n\n consola.start(\"开始更新镜像\")\n\n for (const image of images) {\n await spawnAsync(`docker pull ${image}`, {\n shell: true,\n stdio: \"inherit\",\n })\n }\n\n consola.success(\"更新镜像完成\")\n\n await spawnAsync(\"docker compose down\", {\n shell: true,\n stdio: \"inherit\",\n })\n\n await spawnAsync(\"docker compose up -d\", {\n shell: true,\n stdio: \"inherit\",\n })\n\n consola.success(\"启动容器完成\")\n}\n","/**\n * 获取版本号\n * @param requiredVersion - 版本号\n * @returns 版本号\n */\nexport function getPackageVersionFromRange(requiredVersion: string) {\n return requiredVersion.replace(/^\\D*/, \"\")\n}\n","import consola from \"consola\"\nimport semver from \"semver\"\n\nimport { getPackageRequiredVersion } from \"./getPackageRequiredVersion\"\nimport { getPackageVersionFromRange } from \"./getPackageVersionFromRange\"\nimport { UpgradeLevel } from \"./getUpgradeDependencyConfig\"\nimport { retry } from \"./retry\"\n\n/**\n * 包升级配置接口\n */\nexport type GetPackageUpgradeVersionConfig = {\n /** 包名 */\n packageName: string\n /** 当前版本 */\n version: string\n /** 升级级别:major/minor/patch */\n level: UpgradeLevel\n}\n\n/**\n * 获取包的推荐升级版本\n * @param config 升级配置\n * @returns 推荐的升级版本号,如果没有可用升级则返回 undefined\n * @description\n * 1. 获取所有可用版本\n * 2. 根据语义化版本规则过滤符合升级要求的版本\n * 3. 按版本号排序并返回最新的符合条件的版本\n */\nexport async function getPackageUpgradeVersion({ packageName, version, level }: GetPackageUpgradeVersionConfig) {\n version = getPackageVersionFromRange(version)\n const minorVersion = semver.inc(version, \"minor\")\n const majorVersion = semver.inc(version, \"major\")\n\n const versionRange = level === \"patch\" ? `>=${version} <${minorVersion}` : level === \"minor\" ? `>=${version} <${majorVersion}` : `>=${version}`\n\n const result = await retry({\n action: () => getPackageRequiredVersion(packageName, versionRange),\n count: 4,\n callback: (error, current) => consola.error(`获取 ${packageName} 版本失败,第 ${current} 次重试`),\n })\n return result\n}\n","import inquirer, { DistinctQuestion } from \"inquirer\"\n\nexport type UpgradeType = \"dependencies\" | \"devDependencies\"\n\nexport type UpgradeLevel = \"major\" | \"minor\" | \"patch\"\n\nexport type UpgradeDependencyConfig = {\n dir: string\n types: UpgradeType[]\n level: UpgradeLevel\n}\n\n/**\n * 获取升级配置\n */\nexport async function getUpgradeDependencyConfig<T extends keyof UpgradeDependencyConfig = keyof UpgradeDependencyConfig>(\n ...keys: T[]\n): Promise<Pick<UpgradeDependencyConfig, T> & Partial<Pick<UpgradeDependencyConfig, Exclude<keyof UpgradeDependencyConfig, T>>>> {\n const ks = keys.length === 0 ? [\"dir\", \"types\", \"level\"] : keys\n\n const questions: DistinctQuestion<UpgradeDependencyConfig>[] = []\n\n if (ks.includes(\"dir\")) {\n questions.push({\n type: \"input\",\n name: \"dir\",\n message: \"请输入升级的目录\",\n default: \".\",\n })\n }\n\n if (ks.includes(\"types\")) {\n questions.push({\n type: \"checkbox\",\n name: \"types\",\n message: \"请选择要升级的依赖类型\",\n choices: [\"dependencies\", \"devDependencies\"],\n default: [\"dependencies\", \"devDependencies\"],\n })\n }\n\n if (ks.includes(\"level\")) {\n questions.push({\n type: \"select\",\n name: \"level\",\n message: \"请选择升级的级别\",\n choices: [\"major\", \"minor\", \"patch\"],\n default: \"minor\",\n })\n }\n\n const config = await inquirer.prompt<UpgradeDependencyConfig>(questions)\n\n return config\n}\n","import inquirer from \"inquirer\"\n\nimport { CommitType } from \"@/constant/index\"\n\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { getPackageUpgradeVersion } from \"./getPackageUpgradeVersion\"\nimport { getPackageVersionFromRange } from \"./getPackageVersionFromRange\"\nimport { getUpgradeDependencyConfig, UpgradeDependencyConfig } from \"./getUpgradeDependencyConfig\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport type UpgradeInfo = {\n package: string\n oldVersion: string\n newVersion: string\n strVersion: string\n}\n\nexport async function upgradeDependency(config?: UpgradeDependencyConfig): Promise<string> {\n const { dir, types, level } = config ?? (await getUpgradeDependencyConfig(\"types\", \"level\"))\n const packageJson = await readPackageJson(dir)\n\n if (!packageJson.dependencies && !packageJson.devDependencies) return \"\"\n\n if (types.length === 0) return \"\"\n\n const upgradeLogs: string[] = []\n\n for (const type of types) {\n const upgrades: UpgradeInfo[] = []\n\n const allPkgs = Object.keys(packageJson[type] || {})\n\n for (let i = 0; i < allPkgs.length; i++) {\n try {\n const pkg = allPkgs[i]\n const rv = packageJson[type][pkg]\n const s = rv.match(/^\\D*/)![0]\n const cv = getPackageVersionFromRange(rv)\n\n const version = await getPackageUpgradeVersion({\n packageName: pkg,\n version: cv,\n level,\n })\n\n if (!version || version === cv) continue\n\n upgrades.push({\n package: pkg,\n oldVersion: cv,\n newVersion: version,\n strVersion: `${s}${version}`,\n })\n } catch {\n continue\n }\n }\n\n if (upgrades.length === 0) continue\n\n const choices = upgrades.map(upgrade => ({\n name: `${upgrade.package} ${upgrade.oldVersion} => ${upgrade.newVersion}`,\n value: upgrade.package,\n }))\n\n const { pkgs } = await inquirer.prompt({\n type: \"checkbox\",\n name: \"pkgs\",\n message: \"请选择要升级的包\",\n choices,\n default: upgrades.map(upgrade => upgrade.package),\n })\n\n pkgs.forEach((pkg: string) => {\n const upgrade = upgrades.find(upgrade => upgrade.package === pkg)!\n packageJson[type][pkg] = upgrade.strVersion\n upgradeLogs.push(`${pkg} ${upgrade.oldVersion} => ${upgrade.newVersion}`)\n })\n }\n\n if (upgradeLogs.length === 0) return \"\"\n\n await writePackageJson({ data: packageJson, dir })\n await installDependceny()\n\n return getCommitMessage(CommitType.feature, `upgrade dependencies: ${upgradeLogs.join(\", \")}`)\n}\n","import fetch from \"node-fetch\"\n\nimport { agent } from \"@/constant\"\n\nimport { getRegistry } from \"./getRegistry\"\n\n/**\n * 获取 npm 包的最新版本号\n * @param packageName 包名\n * @returns 最新版本号\n * @description\n * 通过 registry API 获取指定包的最新版本信息\n * 支持通过代理访问\n */\nexport async function getPackageLatestVersion(packageName: string) {\n const registry = await getRegistry()\n const url = new URL(`/${packageName}/latest`, registry)\n const response = await fetch(url, {\n agent: global.__ZIXULU_PROXY__ ? agent : undefined,\n })\n\n const data = (await response.json()) as any\n return data.version as string\n}\n","import consola from \"consola\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { getPackageLatestVersion } from \"./getPackageLatestVersion\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport async function upgradeRsbuild() {\n const packageJson = await readPackageJson()\n const rsbuildDependencies = Object.entries({\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n }).filter(([key]) => key.startsWith(\"@rsbuild/\")) as [string, string][]\n\n const upgradeLogs: string[] = []\n\n for (const [key, value] of rsbuildDependencies) {\n const version = await getPackageLatestVersion(key)\n const [, b, c] = Array.from(value.match(/^(\\D*)(\\d.*)$/)!)\n if (c === version) continue\n if (packageJson.dependencies?.[key]) packageJson.dependencies[key] = `${b}${version}`\n if (packageJson.devDependencies?.[key]) packageJson.devDependencies[key] = `${b}${version}`\n upgradeLogs.push(`${key} ${c} => ${version}`)\n }\n\n if (upgradeLogs.length === 0) return \"\"\n await writePackageJson({ data: packageJson })\n await installDependceny()\n const upgradeLog = `upgrade dependencies: ${upgradeLogs.join(\", \")}`\n consola.success(upgradeLog)\n return getCommitMessage(CommitType.feature, upgradeLog)\n}\n","import { rename } from \"fs/promises\"\n\nimport consola from \"consola\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { getPackageUpgradeVersion } from \"./getPackageUpgradeVersion\"\nimport { getPackageVersionInDependcy } from \"./getPackageVersionInDependcy\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport async function upgradeTailwind() {\n const version = await getPackageVersionInDependcy(\"tailwindcss\")\n if (!version) throw new Error(\"tailwindcss not found\")\n const newVersion = await getPackageUpgradeVersion({\n packageName: \"tailwindcss\",\n version,\n level: \"minor\",\n })\n if (newVersion === version) throw new Error(\"tailwindcss is already the latest version\")\n const packageJson = await readPackageJson()\n if (packageJson.dependencies?.tailwindcss) packageJson.dependencies.tailwindcss = `^${newVersion}`\n if (packageJson.devDependencies?.tailwindcss) packageJson.devDependencies.tailwindcss = `^${newVersion}`\n await rename(`patches/tailwindcss@${version}.patch`, `patches/tailwindcss@${newVersion}.patch`)\n delete packageJson.pnpm.patchedDependencies[`tailwindcss@${version}`]\n packageJson.pnpm.patchedDependencies[`tailwindcss@${newVersion}`] = `patches/tailwindcss@${newVersion}.patch`\n await writePackageJson({ data: packageJson })\n await installDependceny()\n const upgradeLog = `upgrade dependencies: tailwindcss ${version} => ${newVersion}`\n consola.success(upgradeLog)\n return getCommitMessage(CommitType.feature, upgradeLog)\n}\n","import { readdir, stat } from \"fs/promises\"\nimport { join, resolve } from \"path\"\nimport { chdir } from \"process\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\n\nimport { actionWithBackup } from \"./actionWithBackup\"\nimport { getUpgradeDependencyConfig } from \"./getUpgradeDependencyConfig\"\nimport { readZixuluSetting } from \"./readZixuluSetting\"\nimport { upgradeDependency } from \"./upgradeDependency\"\nimport { writeZixuluSetting } from \"./writeZixuluSetting\"\n\nexport async function upgradeWorkspaceDependceny() {\n const { dir, ...rest } = await getUpgradeDependencyConfig()\n const dir2 = resolve(dir)\n const packages = await readdir(dir2)\n\n const packages2: string[] = []\n\n for (const pkg of packages) {\n const stat2 = await stat(join(dir2, pkg))\n if (!stat2.isDirectory()) continue\n const dir3 = await readdir(join(dir2, pkg))\n if (dir3.includes(\"package.json\")) packages2.push(pkg)\n }\n\n const setting = await readZixuluSetting()\n\n type PromptResult = {\n packages3: string[]\n }\n\n const { packages3 } = await inquirer.prompt<PromptResult>([\n {\n type: \"checkbox\",\n name: \"packages3\",\n message: \"请选择要升级的包\",\n choices: packages2,\n default: setting.upgradeWorkspaceDependcenyHistory?.[dir2],\n },\n ])\n\n setting.upgradeWorkspaceDependcenyHistory ??= {}\n setting.upgradeWorkspaceDependcenyHistory[dir2] = packages3\n\n await writeZixuluSetting(setting)\n\n for (const pkg of packages3) {\n consola.start(`开始升级 ${pkg} 的依赖`)\n chdir(join(dir2, pkg))\n await actionWithBackup(() =>\n upgradeDependency({\n dir: \".\",\n ...rest,\n }))()\n }\n}\n","import { mkdir, readdir, stat, writeFile } from \"fs/promises\"\nimport { join, resolve } from \"path\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nimport { readZixuluSetting } from \"./readZixuluSetting\"\nimport { writeZixuluSetting } from \"./writeZixuluSetting\"\n\nconst script = `import { spawnSync } from \"child_process\"\nimport { rmSync } from \"fs\"\n\nspawnSync(\"docker compose down\", { cwd: \"verdaccio\", shell: true, stdio: \"inherit\" })\n\nspawnSync(\"rimraf verdaccio\", { shell: true, stdio: \"inherit\" })\n\nspawnSync(\"7z x verdaccio.zip\", { shell: true, stdio: \"inherit\" })\n\nspawnSync(\"docker compose up -d\", { cwd: \"verdaccio\", shell: true, stdio: \"inherit\" })\n\nspawnSync(\"rimraf verdaccio.zip\", { shell: true, stdio: \"inherit\" })\n\nrmSync(import.meta.filename)\n`\n\nexport async function verdaccio() {\n const dir = await readdir(\".\")\n\n if (dir.includes(\".verdaccio\")) {\n consola.warn(\".verdaccio 文件夹已存在\")\n process.exit(1)\n }\n\n await mkdir(\".verdaccio\", { recursive: true })\n\n const setting = await readZixuluSetting()\n\n interface Answer {\n verdaccioPath: string\n }\n\n let { verdaccioPath } = await inquirer.prompt<Answer>({\n type: \"input\",\n name: \"verdaccioPath\",\n message: \"请输入 verdaccio 文件夹的位置\",\n default: setting.verdaccioPath,\n })\n\n verdaccioPath = verdaccioPath.replace(/^\"|\"$/g, \"\")\n\n verdaccioPath = resolve(verdaccioPath)\n const stats = await stat(verdaccioPath)\n if (!stats.isDirectory()) throw new Error(\"verdaccio 文件夹不存在\")\n\n setting.verdaccioPath = verdaccioPath\n await writeZixuluSetting(setting)\n\n await spawnAsync(`7z a .verdaccio/verdaccio.zip ${verdaccioPath}`, { shell: true, stdio: \"inherit\" })\n\n await writeFile(join(\".verdaccio\", \"verdaccio.mjs\"), script, \"utf-8\")\n}\n","import { spawnAsync } from \"soda-nodejs\"\n\nexport async function winget() {\n const args = [\"update\", \"--accept-package-agreements\", \"--accept-source-agreements\", \"--all\"]\n\n if (global.__ZIXULU_PROXY__) args.push(\"--proxy\", \"http://127.0.0.1:7890\")\n spawnAsync(\"winget\", args)\n}\n","import { stat, writeFile } from \"fs/promises\"\nimport { parse, resolve } from \"path\"\n\nexport interface OpenWithOptions {\n file: boolean\n folder: boolean\n background: boolean\n}\n\nexport async function addOpenWith(path: string, { file, folder, background }: OpenWithOptions) {\n if (!file && !folder && !background) throw new Error(\"至少选择一个\")\n\n path = resolve(path)\n\n try {\n const status = await stat(path)\n if (!status.isFile()) throw new Error(\"路径不是文件\")\n } catch (error) {}\n\n const { name } = parse(path)\n\n const escapedPath = path.replace(/[\\\\\\/]/g, \"\\\\\\\\\")\n\n let reg = `\\ufeffWindows Registry Editor Version 5.00\n`\n\n if (file) {\n reg += `\n[HKEY_CLASSES_ROOT\\\\*\\\\shell\\\\${name}]\n@=\"使用 ${name} 打开\"\n\"Icon\"=\"\\\\\"${escapedPath}\\\\\"\"\n\n[HKEY_CLASSES_ROOT\\\\*\\\\shell\\\\${name}\\\\command]\n@=\"\\\\\"${escapedPath}\\\\\" \\\\\"%1\\\\\"\"`\n }\n\n if (folder) {\n reg += `\n[HKEY_CLASSES_ROOT\\\\Directory\\\\shell\\\\${name}]\n@=\"使用 ${name} 打开\"\n\"Icon\"=\"\\\\\"${escapedPath}\\\\\"\"\n\n[HKEY_CLASSES_ROOT\\\\Directory\\\\shell\\\\${name}\\\\command]\n@=\"\\\\\"${escapedPath}\\\\\" \\\\\"%V\\\\\"\"`\n }\n\n if (background) {\n reg += `\n[HKEY_CLASSES_ROOT\\\\Directory\\\\Background\\\\shell\\\\${name}]\n@=\"使用 ${name} 打开\"\n\"Icon\"=\"\\\\\"${escapedPath}\\\\\"\"\n\n[HKEY_CLASSES_ROOT\\\\Directory\\\\Background\\\\shell\\\\${name}\\\\command]\n@=\"\\\\\"${escapedPath}\\\\\" \\\\\"%V\\\\\"\"\n`\n }\n\n await writeFile(`add_open_with_${name}.reg`, reg, \"utf-16le\")\n}\n","import { copyFile, mkdir, readdir, rename, writeFile } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport consola from \"consola\"\nimport { execAsync, setDefaultOptions, spawnAsync } from \"soda-nodejs\"\n\nimport { readPackageJson } from \"./readPackageJson\"\nimport { verdaccio } from \"./verdaccio\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nconst script = `// @ts-check\n\nimport { spawnSync } from \"child_process\"\nimport { readdirSync, renameSync, rmSync } from \"fs\"\nimport { styleText } from \"util\"\n\nconst dir = readdirSync(\".\")\n\nif (!dir.includes(\".env.local\")) {\n console.log(styleText(\"redBright\", \".env.local 文件不存在\"))\n process.exit(1)\n}\n\nspawnSync(\"pm2 stop gdm\", { shell: true, stdio: \"inherit\" })\n\nspawnSync(\"rimraf geshu-docker-management\", { shell: true, stdio: \"inherit\" })\n\nspawnSync(\"7z x geshu-docker-management.zip\", { shell: true, stdio: \"inherit\" })\n\nrenameSync(\".env.local\", \"geshu-docker-management/.env.local\")\n\nspawnSync(\"npm install --registry http://localhost:4873\", { cwd: \"geshu-docker-management\", shell: true, stdio: \"inherit\" })\n\nspawnSync(\"npm run build\", { cwd: \"geshu-docker-management\", shell: true, stdio: \"inherit\" })\n\nspawnSync(\"pm2 restart gdm\", { cwd: \"geshu-docker-management\", shell: true, stdio: \"inherit\" })\n\nspawnSync(\"pm2 save\", { cwd: \"geshu-docker-management\", shell: true, stdio: \"inherit\" })\n\nspawnSync(\"rimraf geshu-docker-management.zip\", { shell: true, stdio: \"inherit\" })\n\nspawnSync(\"rimraf geshu-docker-management\", { shell: true, stdio: \"inherit\" })\n\nrmSync(import.meta.filename)\n\nconsole.log(styleText(\"greenBright\", \"更新完成\"))\n`\n\nexport async function gdm() {\n const dir = await readdir(\".\")\n\n if (dir.includes(\".gdm\")) {\n consola.warn(\".gdm 文件夹已存在\")\n process.exit(1)\n }\n\n setDefaultOptions(options => ({\n ...options,\n shell: true,\n stdio: \"inherit\",\n }))\n\n await spawnAsync(`gitpick 1adybug/geshu-docker-management .gdm`)\n\n const packageJson = await readPackageJson(\".gdm\")\n\n packageJson.overrides ??= {}\n\n packageJson.overrides.xlsx = \"npm:xlsx@0.20.3\"\n\n await writePackageJson({ data: packageJson, dir: \".gdm\" })\n\n await spawnAsync(\"rimraf package-lock.json\", { cwd: \".gdm\" })\n\n await mkdir(\".gdm/npm-cache\", { recursive: true })\n\n await spawnAsync(\"npm install --registry http://localhost:4873 --cache npm-cache\", { cwd: \".gdm\" })\n\n const version = (await execAsync(\"npx next --version\", { cwd: \".gdm\" })).replace(/^Next\\.js v/, \"\")\n\n const packages = [\"swc-linux-x64-gnu\", \"swc-linux-x64-musl\", \"swc-win32-x64-msvc\"]\n\n for (const pkg of packages) {\n const filename = (await execAsync(`npm pack @next/${pkg}@${version} --registry http://localhost:4873`, { cwd: \".gdm\" })).trim()\n await spawnAsync(`rimraf ${filename}`, { cwd: \".gdm\" })\n }\n\n await spawnAsync(\"rimraf npm-cache\", { cwd: \".gdm\" })\n\n await spawnAsync(\"npx prisma generate\", { cwd: \".gdm\" })\n\n const dir2 = await readdir(join(\".gdm\", \"prisma\", \"generated\"))\n\n for (const item of dir2) {\n if (item.endsWith(\".node\")) await copyFile(join(\".gdm\", \"prisma\", \"generated\", item), join(\".gdm\", \"prisma\", item))\n }\n\n await spawnAsync(\"rimraf node_modules\", { cwd: \".gdm\" })\n\n await spawnAsync(\"7z a geshu-docker-management.zip .gdm\")\n\n await spawnAsync(\"rimraf .gdm\")\n\n await mkdir(\".gdm\", { recursive: true })\n\n await rename(\"geshu-docker-management.zip\", \".gdm/geshu-docker-management.zip\")\n\n await writeFile(\".gdm/gdm.mjs\", script)\n\n await verdaccio()\n}\n","import { spawnAsync } from \"soda-nodejs\"\n\nexport interface PullDockerImageParams {\n image: string\n sha256?: string\n}\n\nexport async function pullDockerImage({ image, sha256 }: PullDockerImageParams) {\n const match = image.match(/^(.+):(.+)$/)\n image = match ? match[1] : image\n const tag = match ? match[2] : \"latest\"\n sha256 = sha256?.replace(/^@?sha256:/, \"\")\n\n if (sha256) {\n await spawnAsync(`docker pull ${image}@sha256:${sha256}`)\n await spawnAsync(`docker tag ${image}@sha256:${sha256} ${image}:${tag}`)\n } else await spawnAsync(`docker pull ${image}:${tag}`)\n}\n","import { writeFile } from \"fs/promises\"\n\nimport { OpenWithOptions } from \"./addOpenWith\"\n\nexport async function removeOpenWith(name: string, { file, folder, background }: OpenWithOptions) {\n if (!file && !folder && !background) throw new Error(\"至少选择一个\")\n\n let reg = `\\ufeffWindows Registry Editor Version 5.00\n`\n\n // 在注册表路径前加 \"-\" 表示删除该项及其所有子项(包括 command)\n if (file) {\n reg += `\n[-HKEY_CLASSES_ROOT\\\\*\\\\shell\\\\${name}]`\n }\n\n if (folder) {\n reg += `\n[-HKEY_CLASSES_ROOT\\\\Directory\\\\shell\\\\${name}]`\n }\n\n if (background) {\n reg += `\n[-HKEY_CLASSES_ROOT\\\\Directory\\\\Background\\\\shell\\\\${name}]`\n }\n\n // 生成一个以 remove_ 开头的文件,防止覆盖原有的生成文件\n await writeFile(`remove_open_with_${name}.reg`, reg, \"utf-16le\")\n}\n","#!/usr/bin/env node\n\nimport chalk from \"chalk\"\nimport { Command } from \"commander\"\nimport consola from \"consola\"\nimport { emailReg } from \"deepsea-tools\"\nimport { setDefaultOptions } from \"soda-nodejs\"\n\nimport { CommitType } from \"@/constant/index\"\n\nimport { actionWithBackup } from \"@/utils/actionWithBackup\"\nimport { addAntd } from \"@/utils/addAntd\"\nimport { addApi } from \"@/utils/addApi\"\nimport { addBuildDocker } from \"@/utils/addBuildDocker\"\nimport { addEslint } from \"@/utils/addEslint\"\nimport { addGitignore } from \"@/utils/addGitignore\"\nimport { addHusky } from \"@/utils/addHusky\"\nimport { addFolderPathAlias, replacePathAlias } from \"@/utils/addPathAlias\"\nimport { addPrettier } from \"@/utils/addPrettier\"\nimport { addPrisma } from \"@/utils/addPrisma\"\nimport { addStartScript } from \"@/utils/addStartScript\"\nimport { addSyncPackageScript } from \"@/utils/addSyncPackageScript\"\nimport { addTag } from \"@/utils/addTag\"\nimport { addTailwind } from \"@/utils/addTailwind\"\nimport { addZipDist } from \"@/utils/addZipDist\"\nimport { arrowToFunction } from \"@/utils/arrowToFunction\"\nimport { betaVersion } from \"@/utils/betaVersion\"\nimport { checkType } from \"@/utils/checkType\"\nimport { clearDockerImage } from \"@/utils/clearDockerImage\"\nimport { clearDockerLog } from \"@/utils/clearDockerLog\"\nimport { code2Snippet } from \"@/utils/code2Snippet\"\nimport { createBrowserlistrc } from \"@/utils/createBrowserlistrc\"\nimport { createPrismaDebugger } from \"@/utils/createPrismaDebugger\"\nimport { downloadLatestSoftware } from \"@/utils/downloadLatestSoftware\"\nimport { downloadNpm } from \"@/utils/downloadNpm\"\nimport { generatePrisma } from \"@/utils/generatePrisma\"\nimport { getCommitMessage } from \"@/utils/getCommitMessage\"\nimport { getHeaders } from \"@/utils/getHeaders\"\nimport { initNode } from \"@/utils/initNode\"\nimport { initProject } from \"@/utils/initProject\"\nimport { installDocker } from \"@/utils/installDocker\"\nimport { interfaceToType } from \"@/utils/interfaceToType\"\nimport { json2type } from \"@/utils/json2type\"\nimport { killProcessByPort } from \"@/utils/killProcessByPort\"\nimport { next } from \"@/utils/next\"\nimport { pnpm } from \"@/utils/pnpm\"\nimport { readPackageJsonSync } from \"@/utils/readPackageJsonSync\"\nimport { reinstall } from \"@/utils/reinstall\"\nimport { removeComment } from \"@/utils/removeComment\"\nimport { removeFileOrFolderFromGit } from \"@/utils/removeFileOrFolderFromGit\"\nimport { removeLock } from \"@/utils/removeLock\"\nimport { removeTag } from \"@/utils/removeTag\"\nimport { replaceAssets } from \"@/utils/replaceAssets\"\nimport { CommitAuthor, replaceCommitAuthor } from \"@/utils/replaceCommitAuthor\"\nimport { replaceCommitMessage } from \"@/utils/replaceCommitMessage\"\nimport { replaceTag } from \"@/utils/replaceTag\"\nimport { rollup } from \"@/utils/rollup\"\nimport { rsbuild } from \"@/utils/rsbuild\"\nimport { rslib } from \"@/utils/rslib\"\nimport { serverToAction } from \"@/utils/serverToAction\"\nimport { setBun } from \"@/utils/setBun\"\nimport { setDockerRegistry } from \"@/utils/setDockerRegistry\"\nimport { setEnv } from \"@/utils/setEnv\"\nimport { setFatherConfig } from \"@/utils/setFatherConfig\"\nimport { setGitProxy } from \"@/utils/setGitProxy\"\nimport { setGlobalConfig } from \"@/utils/setGlobalConfig\"\nimport { setRegistry } from \"@/utils/setRegistry\"\nimport { setShellProxy } from \"@/utils/setShellProxy\"\nimport { sortPackageJson } from \"@/utils/sortPackageJson\"\nimport { asyncAgentRules } from \"@/utils/syncAgentRules\"\nimport { syncCursorExtToCode } from \"@/utils/syncCursorExtToCode\"\nimport { syncEditorSetting } from \"@/utils/syncEditorSetting\"\nimport { syncVscode } from \"@/utils/syncVscode\"\nimport { tailwindPatch } from \"@/utils/tailwindPatch\"\nimport { tar } from \"@/utils/tar\"\nimport { test } from \"@/utils/test\"\nimport { updateDockerCompose } from \"@/utils/updateDockerCompose\"\nimport { upgradeDependency } from \"@/utils/upgradeDependency\"\nimport { upgradeRsbuild } from \"@/utils/upgradeRsbuild\"\nimport { upgradeTailwind } from \"@/utils/upgradeTailwind\"\nimport { upgradeWorkspaceDependceny } from \"@/utils/upgradeWorkspaceDependceny\"\nimport { verdaccio } from \"@/utils/verdaccio\"\nimport { vite } from \"@/utils/vite\"\nimport { winget } from \"@/utils/winget\"\n\nimport { addOpenWith } from \"./utils/addOpenWith\"\nimport { gdm } from \"./utils/gdm\"\nimport { pullDockerImage } from \"./utils/pullDockerImage\"\nimport { removeOpenWith } from \"./utils/removeOpenWith\"\n\nsetDefaultOptions({\n shell: true,\n stdio: \"inherit\",\n})\n\nconst program = new Command()\n\nconst pkg = readPackageJsonSync(\n process.platform === \"win32\" ? import.meta.resolve(\"../\").replace(/^file:\\/\\/\\//, \"\") : import.meta.resolve(\"../\").replace(/^file:\\/\\//, \"\"),\n)\n\nprogram.name(\"格数科技\").version(pkg.version)\n\nconsole.log(chalk.redBright.bold(`zixulu ${pkg.version}`))\n\nprogram\n .command(\"eslint\")\n .description(\"添加 ESLint 相关配置\")\n .action(actionWithBackup(addEslint, getCommitMessage(CommitType.feature, \"添加 ESLint 相关配置\")))\n\nprogram\n .command(\"prettier\")\n .description(\"添加 prettier 配置\")\n .action(actionWithBackup(addPrettier, getCommitMessage(CommitType.feature, \"添加 prettier 配置文件\")))\n\nprogram\n .command(\"husky\")\n .description(\"添加 husky 配置\")\n .action(actionWithBackup(addHusky, getCommitMessage(CommitType.feature, \"添加 husky 配置\")))\n\nprogram\n .command(\"vite\")\n .description(\"初始化 vite 配置\")\n .action(actionWithBackup(vite, getCommitMessage(CommitType.feature, \"初始化 vite 配置\")))\n\nprogram\n .command(\"rsbuild\")\n .description(\"初始化 rsbuild 配置\")\n .action(actionWithBackup(rsbuild, getCommitMessage(CommitType.feature, \"初始化 rsbuild 配置\")))\n\nprogram\n .command(\"next\")\n .description(\"初始化 next 配置\")\n .action(actionWithBackup(next, getCommitMessage(CommitType.feature, \"初始化 next 配置\")))\n\nprogram\n .command(\"tailwind\")\n .description(\"添加 tailwind 配置\")\n .action(actionWithBackup(addTailwind, getCommitMessage(CommitType.feature, \"添加 tailwind 配置\")))\n\nprogram\n .command(\"remove-comment\")\n .description(\"删除文件注释\")\n .argument(\"path\", \"文件路径\")\n .action(actionWithBackup(removeComment, getCommitMessage(CommitType.feature, \"删除文件注释\")))\n\nprogram\n .command(\"father\")\n .alias(\"fs\")\n .description(\"初始化 father 项目配置\")\n .action(actionWithBackup(setFatherConfig, getCommitMessage(CommitType.feature, \"初始化 father 项目配置\")))\n\nprogram\n .command(\"upgrade-dependency\")\n .alias(\"ud\")\n .description(\"升级项目依赖\")\n .option(\"-r, --registry <registry>\", \"npm 源地址,可以是 npm、taobao、tencent 或者自定义地址\")\n .option(\"-p, --proxy\", \"是否使用代理\")\n .action(async optios => {\n setGlobalConfig(optios)\n await actionWithBackup(() => upgradeDependency())()\n })\n\nprogram\n .command(\"upgrade-workspace-dependency\")\n .alias(\"uwd\")\n .description(\"升级工作区项目依赖\")\n .option(\"-r, --registry <registry>\", \"npm 源地址,可以是 npm、taobao、tencent 或者自定义地址\")\n .option(\"-p, --proxy\", \"是否使用代理\")\n .action(async options => {\n setGlobalConfig(options)\n await upgradeWorkspaceDependceny()\n })\n\nprogram.command(\"registry\").description(\"设置 npm registry\").action(setRegistry)\n\nprogram\n .command(\"sort-package-json\")\n .alias(\"spj\")\n .description(\"对 package.json 中的依赖进行排序\")\n .action(actionWithBackup(sortPackageJson, getCommitMessage(CommitType.feature, \"对 package.json 中的依赖进行排序\")))\n\nprogram\n .command(\"arrow-to-function\")\n .alias(\"a2f\")\n .description(\"将箭头函数组件转换为函数组件\")\n .action(actionWithBackup(arrowToFunction, getCommitMessage(CommitType.feature, \"将箭头函数组件转换为函数组件\")))\n\nprogram\n .command(\"interface-to-type\")\n .alias(\"i2t\")\n .description(\"将 interface 转换为 type\")\n .action(actionWithBackup(interfaceToType, getCommitMessage(CommitType.feature, \"将 interface 转换为 type\")))\n\nprogram.command(\"gitignore\").description(\"添加 .gitignore 配置\").action(actionWithBackup(addGitignore))\n\nprogram.command(\"git-proxy\").alias(\"gp\").description(\"设置 git 代理\").action(setGitProxy)\n\nprogram.command(\"shell-proxy\").alias(\"sp\").description(\"设置 Shell 代理\").action(setShellProxy)\n\nprogram.command(\"download-software\").alias(\"ds\").description(\"下载最新版软件\").action(downloadLatestSoftware)\n\nprogram.command(\"vscode\").alias(\"vsc\").description(\"同步 VS Code 配置\").action(syncVscode)\n\nprogram.command(\"kill-port\").description(\"根据端口号杀死进程\").argument(\"port\", \"端口号\").action(killProcessByPort)\n\nprogram.command(\"rm-git\").argument(\"path\", \"要移除的文件或文件夹\").action(removeFileOrFolderFromGit)\n\nprogram.command(\"npm-download\").alias(\"nd\").description(\"下载 npm 包\").argument(\"name\", \"包名\").action(downloadNpm)\n\nprogram\n .command(\"prisma\")\n .description(\"添加 prisma 配置\")\n .action(actionWithBackup(() => addPrisma(), getCommitMessage(CommitType.feature, \"添加 prisma 配置\")))\n\nprogram.command(\"prisma-generate\").alias(\"pg\").description(\"生成 prisma client\").action(generatePrisma)\n\nprogram\n .command(\"antd\")\n .description(\"添加 antd 配置\")\n .action(actionWithBackup(addAntd, getCommitMessage(CommitType.feature, \"添加 antd 配置\")))\n\nprogram\n .command(\"init\")\n .description(\"初始化项目\")\n .action(actionWithBackup(initProject, getCommitMessage(CommitType.feature, \"初始化项目\")))\n\nprogram.command(\"tsc\").description(\"类型检查\").action(checkType)\n\nprogram.command(\"beta-version\").alias(\"bv\").description(\"设置版本号\").action(betaVersion)\n\nprogram\n .command(\"reinstall\")\n .alias(\"ri\")\n .description(\"重新安装依赖\")\n .option(\"-r, --registry <registry>\", \"npm 源地址,可以是 npm、taobao、tencent 或者自定义地址\")\n .action(async options => {\n setGlobalConfig(options)\n reinstall()\n })\n\nprogram.command(\"snippet\").alias(\"sn\").description(\"生成 vscode snippet\").argument(\"path\", \"文件路径\").action(code2Snippet)\n\nprogram.command(\"add-alias\").alias(\"aa\").description(\"添加路径别名\").action(actionWithBackup(addFolderPathAlias))\n\nprogram.command(\"replace-alias\").alias(\"ra\").description(\"替换路径别名\").action(actionWithBackup(replacePathAlias))\n\nprogram.command(\"pnpm\").description(\"设置 pnpm 配置\").action(pnpm)\n\nprogram.command(\"rollup\").description(\"rollup 打包\").action(rollup)\n\nprogram.command(\"browserlistrc\").alias(\"blr\").description(\"添加 browserlistrc 配置\").action(createBrowserlistrc)\n\nprogram\n .command(\"asset\")\n .description(\"替换文件中的资源地址\")\n .argument(\"input\", \"静态文件夹路径\")\n .option(\"-b, --base <base>\", \"资源地址 BaseUrl\")\n .option(\"-o, --output <output>\", \"输出文件夹\")\n .option(\"-p, --proxy\", \"是否使用代理\")\n .action((input, { proxy, base, output }) => replaceAssets({ base, input, proxy, output }))\n\nprogram\n .command(\"upgrade-rsbuild\")\n .alias(\"ur\")\n .description(\"升级 rsbuild\")\n .option(\"-r, --registry <registry>\", \"npm 源地址,可以是 npm、taobao、tencent 或者自定义地址\")\n .option(\"-p, --proxy\", \"是否使用代理\")\n .action(async options => {\n setGlobalConfig(options)\n await actionWithBackup(() => upgradeRsbuild())()\n })\n\nprogram\n .command(\"add-start-script\")\n .alias(\"ass\")\n .argument(\"type\", \"启动脚本类型:express、next\")\n .option(\"-p, --port <port>\", \"端口地址\")\n .option(\"-c, --core <core>\", \"实例数\")\n .option(\"-h, --hostname <hostname>\", \"主机名\")\n .option(\"--pem <pemPath>\", \"证书目录\")\n .description(\"添加 express 启动脚本\")\n .action(async (type, { port, core, pemPath }) => actionWithBackup(addStartScript)({ type, port, core, pemPath }))\n\nprogram.command(\"headers\").description(\"将浏览器中直接复制的 headers 转换为对象\").action(getHeaders)\n\nprogram\n .command(\"add-zip-dist\")\n .alias(\"azd\")\n .description(\"添加将 dist 压缩的脚本\")\n .action(actionWithBackup(() => addZipDist({ install: true })))\n\nprogram\n .command(\"upgrade-tailwind\")\n .alias(\"ut\")\n .description(\"升级 tailwind\")\n .option(\"-r, --registry <registry>\", \"npm 源地址,可以是 npm、taobao、tencent 或者自定义地址\")\n .option(\"-p, --proxy\", \"是否使用代理\")\n .action(async options => {\n setGlobalConfig(options)\n await actionWithBackup(() => upgradeTailwind())()\n })\n\nprogram.command(\"bun\").description(\"设置 bun\").action(setBun)\n\nprogram.command(\"tailwind-patch\").alias(\"tp\").description(\"tailwind 补丁\").action(tailwindPatch)\n\nprogram\n .command(\"remove-lock\")\n .alias(\"rl\")\n .description(\"删除 lock 文件\")\n .action(actionWithBackup(() => removeLock()))\n\nprogram\n .command(\"rename-commit-author\")\n .alias(\"rca\")\n .description(\"重写 Git 提交历史的作者信息\")\n .arguments(\"[infos...]\")\n .action(async (infos: string[]) => {\n let prev: CommitAuthor | undefined\n let next: CommitAuthor | undefined\n infos = infos.slice(0, 2)\n\n function getUsernameAndEmail(info: string): CommitAuthor {\n const index = info.indexOf(\":\")\n\n if (index === -1) {\n if (emailReg.test(info)) return { email: info }\n return { name: info }\n }\n\n return {\n name: info.slice(0, index),\n email: info.slice(index + 1),\n }\n }\n\n if (infos.length === 0) throw new Error(\"请输入作者信息!\")\n else {\n if (infos.length === 1) next = getUsernameAndEmail(infos[0])\n else {\n prev = getUsernameAndEmail(infos[0])\n next = getUsernameAndEmail(infos[1])\n }\n }\n\n await replaceCommitAuthor({ prev, next })\n })\n\nprogram.command(\"install-docker\").alias(\"id\").description(\"安装 Docker\").action(installDocker)\n\nprogram.command(\"set-docker-registry\").alias(\"sdr\").description(\"设置 Docker 镜像地址\").action(setDockerRegistry)\n\nprogram\n .command(\"add-sync\")\n .alias(\"asp\")\n .option(\"-m, --monorepo\", \"是否是 monorepo\")\n .description(\"添加同步包脚本\")\n .action(actionWithBackup(addSyncPackageScript))\n\nprogram\n .command(\"winget\")\n .option(\"-p, --proxy\", \"是否使用代理\")\n .description(\"使用 winget 更新软件\")\n .action(async options => {\n setGlobalConfig(options)\n await winget()\n })\n\nprogram\n .command(\"test\")\n .description(\"这是一个测试命令,生产环境中使用,非开发人员请勿使用!\")\n .action(async () => {\n consola.warn(\"这是一个测试命令,生产环境中使用,非开发人员请勿使用!\")\n consola.warn(\"这是一个测试命令,生产环境中使用,非开发人员请勿使用!\")\n consola.warn(\"这是一个测试命令,生产环境中使用,非开发人员请勿使用!\")\n await test()\n })\n\nprogram.command(\"sync-editor\").alias(\"se\").description(\"同步编辑器配置\").action(syncEditorSetting)\n\nprogram.command(\"server-to-action\").alias(\"sta\").description(\"将 server 文件夹下的文件转换为 action\").action(serverToAction)\n\nprogram\n .command(\"tar\")\n .description(\"压缩文件\")\n .argument(\"input\", \"输入文件夹\")\n .option(\"-o, --output <output>\", \"输出文件\")\n .action(async (input, { output }) => tar({ input, output }))\n\nprogram\n .command(\"set-env\")\n .description(\"设置环境变量\")\n .argument(\"key\", \"环境变量 key\")\n .argument(\"[value]\", \"环境变量 value\")\n .action(async (key, value) => {\n await setEnv(key, value)\n consola.success(\"设置环境变量成功\")\n })\n\nprogram\n .command(\"add-api\")\n .description(\"添加 api 文件\")\n .argument(\"type\", \"api 类型\")\n .option(\"-a, --api <api>\", \"api 文件夹路径\")\n .option(\"-h, --hook <hook>\", \"hook 文件夹路径\")\n .action(async (type, { api, hook }) => addApi({ type, api, hook }))\n\nprogram.command(\"rslib\").description(\"rslib 配置\").action(rslib)\n\nprogram.command(\"init-node\").description(\"初始化 node 项目\").action(initNode)\n\nprogram.command(\"add-build-docker\").alias(\"abd\").description(\"添加构建 docker 镜像的脚本\").action(addBuildDocker)\n\nprogram.command(\"json2type\").alias(\"j2t\").argument(\"[path]\", \"json 文件路径\").description(\"将 json 转换为 type\").action(json2type)\n\nprogram.command(\"clear-docker-image\").alias(\"cdi\").description(\"清除 docker 悬挂镜像\").argument(\"[name]\", \"镜像名称\").action(clearDockerImage)\n\nprogram.command(\"clear-docker-log\").alias(\"cdl\").description(\"清除 docker 容器日志\").argument(\"name\", \"容器名称或者 ID\").action(clearDockerLog)\n\nprogram.command(\"update-docker-compose\").alias(\"udc\").description(\"更新 docker compose 镜像\").action(updateDockerCompose)\n\nprogram.command(\"sync-cursor-ext-to-code\").alias(\"sce2c\").description(\"同步 cursor 扩展到 vscode\").action(syncCursorExtToCode)\n\nprogram.command(\"create-prisma-debugger\").alias(\"cpd\").description(\"创建 prisma 调试器\").action(createPrismaDebugger)\n\nprogram.command(\"verdaccio\").description(\"同步 verdaccio 配置\").action(verdaccio)\n\nprogram.command(\"sync-agent-rules\").alias(\"sar\").description(\"同步 Agent 规则\").action(actionWithBackup(asyncAgentRules))\n\nprogram\n .command(\"replace-tag\")\n .alias(\"rt\")\n .description(\"替换所有 git tag (正则中可用 {{CARET}} 代替 ^)\")\n .argument(\"regexp\", \"正则表达式字符串\")\n .argument(\"[replace]\", \"替换字符串,默认为空字符串\")\n .option(\"-f, --flags <flags>\", \"正则表达式标志,如 i、g、m 等\")\n .option(\"-p, --push\", \"是否推送到远程仓库\")\n .option(\"-r, --remote <remote>\", \"远程仓库名称,默认为 origin\")\n .action(async (regexp, replace, options) => {\n await replaceTag({ reg: regexp, replace: replace ?? \"\", flags: options.flags, push: options.push, remote: options.remote })\n })\n\nprogram\n .command(\"remove-tag\")\n .alias(\"rmt\")\n .description(\"删除匹配的 git tag (正则中可用 {{CARET}} 代替 ^)\")\n .argument(\"regexp\", \"正则表达式字符串\")\n .option(\"-f, --flags <flags>\", \"正则表达式标志,如 i、g、m 等\")\n .option(\"-p, --push\", \"是否同时删除远程仓库的 tag\")\n .option(\"-r, --remote <remote>\", \"远程仓库名称,默认为 origin\")\n .action(async (regexp, options) => {\n await removeTag({ reg: regexp, flags: options.flags, push: options.push, remote: options.remote })\n })\n\nprogram\n .command(\"add-tag\")\n .alias(\"adt\")\n .description(\"为匹配的 commit 添加 git tag (正则中可用 {{CARET}} 代替 ^)\")\n .argument(\"regexp\", \"用于匹配 commit message 的正则表达式字符串\")\n .argument(\"replacement\", \"用于生成 tag 名称的替换字符串\")\n .option(\"-f, --flags <flags>\", \"正则表达式标志,如 i、g、m 等\")\n .option(\"-p, --push\", \"是否推送到远程仓库\")\n .option(\"-r, --remote <remote>\", \"远程仓库名称,默认为 origin\")\n .option(\"--force\", \"是否覆盖已存在的 tag\")\n .action(async (regexp, replacement, options) => {\n await addTag({ reg: regexp, replacement, flags: options.flags, push: options.push, remote: options.remote, force: options.force })\n })\n\nprogram\n .command(\"replace-commit-message\")\n .alias(\"rcm\")\n .description(\"替换所有提交消息(⚠️ 会重写 Git 历史,正则中可用 {{CARET}} 代替 ^)\")\n .argument(\"regexp\", \"正则表达式字符串\")\n .argument(\"[replace]\", \"替换字符串,默认为空字符串\")\n .option(\"-f, --flags <flags>\", \"正则表达式标志,如 g、i 等(注意:sed 语法)\")\n .option(\"-p, --push\", \"是否强制推送到远程仓库\")\n .option(\"-r, --remote <remote>\", \"远程仓库名称,默认为 origin\")\n .option(\"-b, --branch <branch>\", \"分支名称,默认为当前分支\")\n .action(async (regexp, replace, options) => {\n await replaceCommitMessage({\n reg: regexp,\n replace: replace ?? \"\",\n flags: options.flags,\n push: options.push,\n remote: options.remote,\n branch: options.branch,\n })\n })\n\nprogram.command(\"gdm\").description(\"同步 geshu-docker-management\").action(gdm)\n\nprogram\n .command(\"add-open-with\")\n .alias(\"aow\")\n .description(\"添加打开文件的脚本\")\n .argument(\"path\", \"程序路径\")\n .option(\"--no-file\", \"是否不添加文件关联\")\n .option(\"--no-folder\", \"是否不添加文件夹关联\")\n .option(\"--no-background\", \"是否不添加文件夹空白处关联\")\n .action(addOpenWith)\n\nprogram\n .command(\"remove-open-with\")\n .alias(\"row\")\n .description(\"删除打开文件的脚本\")\n .argument(\"name\", \"脚本名称\")\n .option(\"--no-file\", \"是否不删除文件关联\")\n .option(\"--no-folder\", \"是否不删除文件夹关联\")\n .option(\"--no-background\", \"是否不删除文件夹空白处关联\")\n .action(removeOpenWith)\n\nprogram\n .command(\"pull-docker-image\")\n .alias(\"pd\")\n .description(\"拉取 docker 镜像\")\n .argument(\"image\", \"镜像名称\")\n .argument(\"[sha256]\", \"镜像 sha256\")\n .action((image: string, sha256?: string) => pullDockerImage({ image, sha256 }))\n\nprogram.parse()\n"],"names":["addGitCommit","messageOrParams","message","cwd","consola","execAsync","hasChangeNoCommit","status","isRepository","shouldContinue","cont","inquirer","backupFirst","forceRepo","Error","exit","actionWithBackup","action","args","skip","msg","commit","commitMessage","PackageManager","Registry","Software","CommitTypeMap","agent","HttpsProxyAgent","addedRules","isSudo","process","getPackageManager","dir","globalThis","dir2","readdir","manager","getEnumValues","readBunConfig","path","join","homedir","existsSync","str","readFile","parse","getRegistry","global","packageManager","config","registry","isStableVersion","version","getPackageRequiredVersion","packageName","versionRange","url","URL","response","fetch","undefined","data","result","Object","item","semver","getPackageJsonPath","readPackageJson","JSON","error","retry","actionOrConfig","countNumber","current","count","callback","_retry","writeJson","output","writeFile","writePackageJson","addDependency","packages","Array","type","packageJson","addedPackages","keys","sortedDependencies","key","addAntd","componentDir","mkdir","isPathLike","override","_writeFile","addApi","api","hook","capitalize","type2","_","c","items","query","add","update","_delete","get","useQuery","useGet","useAdd","useUpdate","useDelete","getCommitMessage","addRuleToGitIgnore","rules","CommitType","gitignore","rules2","v","rule","hasDependency","dependency","dependencies","devDependencies","peerDependencies","total","insertWhen","condition","params","breakBefore","breakAfter","strs","ApplicationType","addBuildDocker","json","isFullStack","isBackend","defaultType","defaultManager","defaultBuild","name","local","versions","value","port","versionSource","versionSource2","docker","docker2","format","format2","build","defaultDist","dist","buildLatest","buildCustom","script","dockerFile","nginxFile","created","useGitignore","copyFile","sortArrayOrObject","_data","addScript","scripts","replace","installDependceny","silent","install","spawnAsync","getEslintConfig","isReact","eslintConfig","addEslint","addGitAttributes","addGitignore","addHusky","options","git","simpleGit","isRepo","shouldSetupHooks","huskyConfig","preCommitHook","getFiles","match","depth","exclude","e","Symbol","_getFiles","files","file","filePath","parsedPath","stats","stat","length","getRelativePath","getTsFile","ext","path2","path3","path4","path5","getTsConfigJsonPath","readTsConfig","JSON5","writeTsConfig","addPathAlias","nameOrAlias","tsConfig","replacePathAlias","oldPaths","paths","reg","code","arg","arg2","arg3","pathToReplace","tsFile","f","matchedKey","matchedPath","newPath","finalPath","addFolderPathAlias","folder","names","ignoreConfig","prettierConfig","addPrettier","config2","packageJson2","prismaFile","addPrisma","expressScript","nextScript","addStartScript","pemPath","core","hostname","env","addSyncPackageScript","monorepo","syncPackageScript","answer","preprocessRegex","addTag","flags","replacement","push","remote","force","processedReg","log","commits","existingTags","allExistingTags","Set","tagsToAdd","regexp","RegExp","tagName","hash","pushArgs","postcssConfig","addPostCSSConfig","rm","tailwindConfig","tailwindConfigWithHeroUi","addTailwindConfig","hasHeroUi","getEntryCssDir","createEntryCss","hasIndex","hasApp","cssPath","addTailwindToCss","base","css","console","addTailwind","zipDistContent","addZipDist","getTypeInGenerics","start","index","i","w","arrowToFunction","auto","warnFiles","modifiedFiles","exportDefaultReg","hasExport","edReg","hasExportDefault","typeIndex","matches","choices","prev","funName","choice","first","indexs","getBetaVersion","major","minor","patch","beta","newVersion","dayjs","level","newBaseVersion","parseInt","betaVersion","publish","checkType","clearDockerImage","outputs","Boolean","images","images2","image","next","clearDockerLog","code2Snippet","placeholders","placeholder","lines","reg2","trim","Math","line","Infinity","line2Snippet","body","snippet","clipboard","createBrowserlistrc","schema","createPrismaDebugger","zip","getFilename","headers","disposition","download","filename","writeable","createWriteStream","Promise","resolve","reject","Readable","sleep","ms","setTimeout","downloadFromWinget","id","filter","firstLetter","stables","a","b","avs","bvs","max","av","bv","response2","yaml","pkg","YAML","installers","InstallerUrl","Architecture","architecture","rename","download7Zip","downloadAnydesk","getLatestRelease","owner","repo","downloadBun","release","asset","unzip","downloadChrome","downloadFromPCQQ","cmdid","soft_id_list","URLSearchParams","Headers","downloadDeskGo","downloadFirefox","downloadGeekUninstaller","text","downloadGit","downloadHoneyview","downloadNodeJS","downloadPeaZip","downloadPotPlayer","downloadPowerShell","downloadPowerToys","downloadVscode","readZixuluSetting","userDir","settingPath","setting","writeZixuluSetting","SoftwareDownloadMap","downloadLatestSoftware","softwareDownloadHistory","softwares","software","getPackageVersionInDependcy","downloadNpm","generatePrisma","getHeaders","match2","initNode","getDependcy","checkTailwind","writeRsbuildConfig","title","description","mountId","rsbuildConfig","rsbuild","Target","Module","ModuleResolution","setTsConfig","tsconfig","t","m","mr","vite","initProject","allDependcies","ProjectType","modules","added","installed","isUrl","readZixuluCache","removeZixuluCache","cachePath","writeZixuluCache","cache","sudoCommand","unique","setDockerRegistry","daemon","mirrors","installDocker","info","distributorId","codename","dom","JSDOM","hrefs","href","deb","deb2","deb3","deb4","deb5","debs","addMirrors","splitExtendsType","types","interfaceToType","reg1","newCode","$2","extendsTypes","json2type","isNonNullable","j2t","getProcessInfoFromPid","pid","stdout","getPidInfoFromPort","killProcessByPort","Number","pidInfos","chosenPids","exec","pnpm","content","readPackageJsonSync","readFileSync","reinstall","removeComment","newText","removeFileOrFolderFromGit","input","recursive","removeLock","removeTag","tags","allTags","tagsToRemove","tag","isAsset","lower","getReg","getReg2","reg3","reg4","replaceAssets","proxy","downloadMap","Map","errors","md5","url2","getReplaceUrl","source","newUrl","replaceUrl","urlsToReplace","newData","replaceCommitAuthor","prevName","prevEmail","nextName","nextEmail","committerName","committerEmail","authorName","authorEmail","committerCondition","authorCondition","replaceCommitMessage","branch","currentBranch","logResult","commitCount","tempScriptPath","tmpdir","Date","scriptContent","scriptPathForCommand","filterCommand","unlink","replaceTag","operations","newTag","oldTag","tagInfo","commitHash","rollupConfig","rollup","rslibConfig","rslibConfigWithReact","tsconfigWithReact","rslib","newPackageJson","hasReact","serverToAction","actions","actions2","writeBunConfig","stringify","setBun","setEnv","isWindows","shell","fatherrcCode","setFatherConfig","setGitProxy","open","setGlobalConfig","setRegistry","getEnumKeys","isShellProxy","setShellProxy","isOpen","sortPackageJson","asyncAgentRules","target","existed","sourceDir","targetDir","map","sourceContent","targetContent","orders","agentsRule","p1","content2","syncCursorExtToCode","cursorOutput","cursorExts","vscodeOutput","vscodeExts","installExts","uninstallExts","getEditorExtensions","hasAntiGravity","hasCode","hasCursor","modifyJsonc","edits","modify","applyEdits","fileSourceMap","getFile","syncEditorFile","sourceType","sourceValue","targetType","targetValue","backup","syncEditorSetting","sourceChoices","targetChoices","targets","onlinePath","configs","fileType","vscodeExtensions","cursorExtensions","antigravityExtensions","onlineExtensions","sourceExtensions","installExtensions","uninstallExtensions","getVscodeExtInfo","html","author","codeVersions","displayName","downloadVscodeExts","extList","exts","vscodeDownloadHistory","exts2","VscodeSyncOption","syncVscode","getEnumEntries","snippetSource","snippetTarget","profile","clear","tailwindPatch","tar","overwrite","compress","test","updateDockerCompose","service","getPackageVersionFromRange","requiredVersion","getPackageUpgradeVersion","minorVersion","majorVersion","getUpgradeDependencyConfig","ks","questions","upgradeDependency","upgradeLogs","upgrades","allPkgs","rv","s","cv","upgrade","pkgs","getPackageLatestVersion","upgradeRsbuild","rsbuildDependencies","upgradeLog","upgradeTailwind","upgradeWorkspaceDependceny","rest","packages2","stat2","dir3","packages3","chdir","verdaccio","verdaccioPath","winget","addOpenWith","background","escapedPath","gdm","setDefaultOptions","pullDockerImage","sha256","removeOpenWith","program","Command","chalk","optios","infos","getUsernameAndEmail","emailReg"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/utils/addGitCommit.ts","../src/utils/hasChangeNoCommit.ts","../src/utils/isRepository.ts","../src/utils/shouldContinue.ts","../src/utils/backupFirst.ts","../src/utils/actionWithBackup.ts","../src/constant/index.ts","../src/utils/getPackageManager.ts","../src/utils/readBunConfig.ts","../src/utils/getRegistry.ts","../src/utils/isStableVersion.ts","../src/utils/getPackageRequiredVersion.ts","../src/utils/getPackageJsonPath.ts","../src/utils/readPackageJson.ts","../src/utils/retry.ts","../src/utils/writeJson.ts","../src/utils/writePackageJson.ts","../src/utils/addDependency.ts","../src/utils/addAntd.ts","../src/utils/addApi.ts","../src/utils/getCommitMessage.ts","../src/utils/addRuleToGitIgnore.ts","../src/utils/hasDependency.ts","../src/utils/insertWhen.ts","../src/utils/addBuildDocker.ts","../src/utils/sortArrayOrObject.ts","../src/utils/addScript.ts","../src/utils/installDependceny.ts","../src/utils/addEslint.ts","../src/utils/addGitAttributes.ts","../src/utils/addGitignore.ts","../src/utils/addHusky.ts","../src/utils/getFiles.ts","../src/utils/getRelativePath.ts","../src/utils/getTsFile.ts","../src/utils/getTsConfigPath.ts","../src/utils/readTsConfig.ts","../src/utils/writeTsConfig.ts","../src/utils/addPathAlias.ts","../src/utils/addPrettier.ts","../src/utils/addPrisma.ts","../src/utils/addStartScript.ts","../src/utils/addSyncPackageScript.ts","../src/utils/preprocessRegex.ts","../src/utils/addTag.ts","../src/utils/addPostCSSConfig.ts","../src/utils/addTailwindConfig.ts","../src/utils/getEntryCssDir.ts","../src/utils/createEntryCss.ts","../src/utils/addTailwindToCss.ts","../src/utils/addTailwind.ts","../src/utils/addZipDist.ts","../src/utils/getTypeInGenerics.ts","../src/utils/arrowToFunction.ts","../src/utils/betaVersion.ts","../src/utils/checkType.ts","../src/utils/clearDockerImage.ts","../src/utils/clearDockerLog.ts","../src/utils/code2Snippet.ts","../src/utils/createBrowserlistrc.ts","../src/utils/createPrismaDebugger.ts","../src/utils/getFilename.ts","../src/utils/download.ts","../src/utils/sleep.ts","../src/utils/downloadFromWinget.ts","../src/utils/download7Zip.ts","../src/utils/downloadAnydesk.ts","../src/utils/getLatestRelease.ts","../src/utils/downloadBun.ts","../src/utils/downloadChrome.ts","../src/utils/downloadFromPCQQ.ts","../src/utils/downloadDeskGo.ts","../src/utils/downloadFirefox.ts","../src/utils/downloadGeekUninstaller.ts","../src/utils/downloadGit.ts","../src/utils/downloadHoneyview.ts","../src/utils/downloadNodeJS.ts","../src/utils/downloadPeazip.ts","../src/utils/downloadPotPlayer.ts","../src/utils/downloadPowerShell.ts","../src/utils/downloadPowerToys.ts","../src/utils/downloadVscode.ts","../src/utils/readZixuluSetting.ts","../src/utils/writeZixuluSetting.ts","../src/utils/downloadLatestSoftware.ts","../src/utils/getPackageVersionInDependcy.ts","../src/utils/downloadNpm.ts","../src/utils/generatePrisma.ts","../src/utils/getHeaders.ts","../src/utils/initNode.ts","../src/utils/next.ts","../src/utils/getDependcy.ts","../src/utils/checkTailwind.ts","../src/utils/writeRsbuildConfig.ts","../src/utils/rsbuild.ts","../src/utils/setTsConfig.ts","../src/utils/vite.ts","../src/utils/initProject.ts","../src/utils/isUrl.ts","../src/utils/readZixuluCache.ts","../src/utils/removeZixuluCache.ts","../src/utils/writeZixuluCache.ts","../src/utils/sudoCommand.ts","../src/utils/unique.ts","../src/utils/setDockerRegistry.ts","../src/utils/installDocker.ts","../src/utils/splitExtendsType.ts","../src/utils/interfaceToType.ts","../src/utils/json2type.ts","../src/utils/processInfo.ts","../src/utils/killProcessByPort.ts","../src/utils/pnpm.ts","../src/utils/readPackageJsonSync.ts","../src/utils/reinstall.ts","../src/utils/removeComment.ts","../src/utils/removeFileOrFolderFromGit.ts","../src/utils/removeLock.ts","../src/utils/removeTag.ts","../src/utils/isAsset.ts","../src/utils/replaceAssets.ts","../src/utils/replaceCommitAuthor.ts","../src/utils/replaceCommitMessage.ts","../src/utils/replaceTag.ts","../src/utils/rollup.ts","../src/utils/rslib.ts","../src/utils/serverToAction.ts","../src/utils/writeBunConfig.ts","../src/utils/setBun.ts","../src/utils/setEnv.ts","../src/utils/setFatherConfig.ts","../src/utils/setGitProxy.ts","../src/utils/setGlobalConfig.ts","../src/utils/setRegistry.ts","../src/utils/isShellProxy.ts","../src/utils/setShellProxy.ts","../src/utils/sortPackageJson.ts","../src/utils/syncAgentRules.ts","../src/utils/syncCursorExtToCode.ts","../src/utils/getEditorExtensions.ts","../src/utils/hasAntiGravity.ts","../src/utils/hasCode.ts","../src/utils/hasCursor.ts","../src/utils/modifyJsonc.ts","../src/utils/syncEditorSetting.ts","../src/utils/downloadVscodeExts.ts","../src/utils/syncVscode.ts","../src/utils/tailwindPatch.ts","../src/utils/tar.ts","../src/utils/test.ts","../src/utils/pullDockerImage.ts","../src/utils/updateDockerCompose.ts","../src/utils/getPackageVersionFromRange.ts","../src/utils/getPackageUpgradeVersion.ts","../src/utils/getUpgradeDependencyConfig.ts","../src/utils/upgradeDependency.ts","../src/utils/getPackageLatestVersion.ts","../src/utils/upgradeRsbuild.ts","../src/utils/upgradeTailwind.ts","../src/utils/upgradeWorkspaceDependceny.ts","../src/utils/verdaccio.ts","../src/utils/winget.ts","../src/utils/addOpenWith.ts","../src/utils/gdm.ts","../src/utils/removeOpenWith.ts","../src/index.ts"],"sourcesContent":["import consola from \"consola\"\nimport { execAsync } from \"soda-nodejs\"\n\nexport interface AddGitCommitParams {\n message: string\n cwd?: string\n}\n\n/**\n * 添加 git 提交\n * @param message 提交信息\n */\nexport async function addGitCommit(messageOrParams: string | AddGitCommitParams) {\n const { message, cwd } = typeof messageOrParams === \"string\" ? { message: messageOrParams } : messageOrParams\n consola.start(\"提交代码\")\n await execAsync(\"git add .\", { cwd })\n await execAsync(`git commit -m \"${message}\"`, { cwd })\n}\n","import { execAsync } from \"soda-nodejs\"\n\nexport async function hasChangeNoCommit(cwd?: string) {\n const status = await execAsync(\"git status\", { cwd })\n return !status.includes(\"nothing to commit, working tree clean\")\n}\n","import { execAsync } from \"soda-nodejs\"\n\nexport async function isRepository() {\n try {\n await execAsync(\"git status\")\n return true\n } catch {\n return false\n }\n}\n","import inquirer from \"inquirer\"\n\n/**\n * 询问是否继续\n * @param message 询问信息\n * @returns 是否继续\n */\nexport async function shouldContinue(message = \"是否继续\"): Promise<boolean> {\n const { continue: cont } = await inquirer.prompt({\n type: \"confirm\",\n name: \"continue\",\n message,\n })\n return cont\n}\n","import { exit } from \"process\"\n\nimport consola from \"consola\"\n\nimport { hasChangeNoCommit } from \"./hasChangeNoCommit\"\nimport { isRepository } from \"./isRepository\"\nimport { shouldContinue } from \"./shouldContinue\"\n\n/**\n * 检查当前项目是否需要备份\n * 如果是 git 仓库且有未提交的更改,提示用户是否继续\n * 如果不是 git 仓库,建议用户备份代码\n *\n * @param forceRepo 是否强制要求是 git 仓库\n * @returns 如果是 git 仓库且检测到未提交的更改,选择继续则返回 true\n */\nexport async function backupFirst(forceRepo = false): Promise<true | void> {\n if (!(await isRepository())) {\n if (forceRepo) {\n consola.error(\"git 不可用\")\n throw new Error(\"git 不可用\")\n }\n\n consola.warn(\"建议使用前备份代码\")\n const cont = await shouldContinue()\n if (!cont) exit()\n return\n }\n\n if (await hasChangeNoCommit()) {\n consola.warn(\"建议使用前提交代码\")\n const cont = await shouldContinue()\n if (!cont) exit()\n return true\n }\n}\n","import consola from \"consola\"\nimport inquirer from \"inquirer\"\n\nimport { addGitCommit } from \"./addGitCommit\"\nimport { backupFirst } from \"./backupFirst\"\nimport { hasChangeNoCommit } from \"./hasChangeNoCommit\"\nimport { isRepository } from \"./isRepository\"\n\n/**\n * 包装一个操作,在执行前进行备份\n * @param action 要执行的操作\n * @param message 提交信息\n * @returns 包装后的函数\n */\nexport function actionWithBackup<T extends (...args: any[]) => Promise<string>>(action: T, message?: string): (...args: Parameters<T>) => Promise<void>\nexport function actionWithBackup<T extends (...args: any[]) => Promise<void>>(action: T, message: string): (...args: Parameters<T>) => Promise<void>\nexport function actionWithBackup(action: (...args: any[]) => Promise<string | void>, message?: string) {\n return async (...args: any[]) => {\n const skip = await backupFirst()\n const msg = await action(...args)\n if (!(await isRepository()) || skip || !(await hasChangeNoCommit())) return\n const { commit } = await inquirer.prompt({\n type: \"confirm\",\n name: \"commit\",\n message: \"是否自动提交代码\",\n default: true,\n })\n if (!commit) return\n let commitMessage: string\n\n if (typeof message === \"string\") commitMessage = message\n else {\n if (typeof msg === \"string\") commitMessage = msg\n else {\n consola.warn(\"请提供提交信息\")\n throw new Error(\"请提供提交信息\")\n }\n }\n\n await addGitCommit(commitMessage)\n }\n}\n","import { Agent } from \"http\"\n\nimport { HttpsProxyAgent } from \"https-proxy-agent\"\n\nexport enum PackageManager {\n npm = \"npm\",\n yarn = \"yarn\",\n pnpm = \"pnpm\",\n bun = \"bun\",\n}\n\nexport enum Registry {\n npm = \"https://registry.npmjs.com/\",\n taobao = \"https://registry.npmmirror.com/\",\n tencent = \"https://mirrors.cloud.tencent.com/npm/\",\n}\n\nexport enum Software {\n \"VS Code\" = \"VS Code\",\n \"Chrome\" = \"Chrome\",\n \"7zip\" = \"7zip\",\n \"PeaZip\" = \"PeaZip\",\n \"Git\" = \"Git\",\n \"NodeJS\" = \"NodeJS\",\n \"Geek Uninstaller\" = \"Geek Uninstaller\",\n \"DeskGo\" = \"DeskGo\",\n \"PowerToys\" = \"PowerToys\",\n \"Honeyview\" = \"Honeyview\",\n \"AnyDesk\" = \"AnyDesk\",\n \"Firefox\" = \"Firefox\",\n \"PotPlayer\" = \"PotPlayer\",\n \"Bun\" = \"Bun\",\n \"PowerShell\" = \"PowerShell\",\n}\n\nexport enum ProjectType {\n next = \"next\",\n remix = \"remix\",\n vite = \"vite\",\n rsbuild = \"rsbuild\",\n}\n\nexport enum CommitType {\n feature = \"feature\",\n fix = \"fix\",\n docs = \"docs\",\n wip = \"wip\",\n perfs = \"perfs\",\n rollback = \"rollback\",\n other = \"other\",\n}\n\nexport const CommitTypeMap = {\n [CommitType.feature]: \"✨feature: \",\n [CommitType.fix]: \"🐞 fix: \",\n [CommitType.docs]: \"📄 docs: \",\n [CommitType.wip]: \"🖥️ wip: \",\n [CommitType.perfs]: \"🚅 perfs: \",\n [CommitType.rollback]: \"⏪ rollback: \",\n [CommitType.other]: \"🔵 other: \",\n}\n\nexport const SpawnOptions = {\n shell: true,\n stdio: \"inherit\",\n}\n\nexport const agent = new HttpsProxyAgent(\"http://localhost:7890\") as Agent\n\nexport const addedRules = [\n \"package-lock.json\",\n \"pnpm-lock.yaml\",\n \"node_modules\",\n \"bun.lockb\",\n \"bun.lock\",\n \"dist*\",\n \"build\",\n \"yarn.lock\",\n \"yarn-error.log\",\n \".yarnrc.yml\",\n \".yarn\",\n \"test*\",\n]\n\nexport const isSudo = !!process.env.SUDO_USER\n","import { readdir } from \"fs/promises\"\n\nimport { getEnumValues } from \"deepsea-tools\"\nimport inquirer from \"inquirer\"\n\nimport { PackageManager } from \"@/constant\"\n\ndeclare global {\n var __ZIXULU_PACKAGE_MANAGER__: PackageManager | undefined\n}\n\n/**\n * 获取项目使用的包管理器\n * @param dir 项目目录,默认为当前目录\n * @returns 包管理器类型\n * @description\n * 1. 优先使用缓存的包管理器\n * 2. 通过锁文件判断使用的包管理器类型\n * 3. 如果无法判断,则提示用户选择\n */\nexport async function getPackageManager(dir = \".\"): Promise<PackageManager> {\n if (globalThis.__ZIXULU_PACKAGE_MANAGER__) return globalThis.__ZIXULU_PACKAGE_MANAGER__\n const dir2 = await readdir(dir)\n if (dir2.includes(\"yarn.lock\")) return PackageManager.yarn\n if (dir2.includes(\"package-lock.json\")) return PackageManager.npm\n if (dir2.includes(\"pnpm-lock.yaml\")) return PackageManager.pnpm\n if (dir2.includes(\"bun.lockb\") || dir2.includes(\"bun.lock\")) return PackageManager.bun\n\n type PromptResult = {\n manager: PackageManager\n }\n\n const { manager } = await inquirer.prompt<PromptResult>({\n type: \"list\",\n name: \"manager\",\n message: \"请选择包管理器\",\n choices: getEnumValues(PackageManager),\n })\n globalThis.__ZIXULU_PACKAGE_MANAGER__ = manager\n return manager\n}\n","import { existsSync } from \"fs\"\nimport { readFile } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\nimport { parse } from \"@iarna/toml\"\n\nexport async function readBunConfig() {\n const path = join(homedir(), \".bunfig.toml\")\n if (existsSync(path) === false) return {}\n const str = await readFile(join(homedir(), \".bunfig.toml\"), \"utf-8\")\n\n return parse(str) as any\n}\n","import { execAsync } from \"soda-nodejs\"\n\nimport { PackageManager } from \"@/constant\"\n\nimport { getPackageManager } from \"./getPackageManager\"\nimport { readBunConfig } from \"./readBunConfig\"\n\n/**\n * 获取当前包管理器使用的 registry 源地址\n * @returns registry URL\n * @description\n * 1. 优先使用缓存的 registry\n * 2. 如果使用 bun,尝试从 bun 配置中获取\n * 3. 否则通过命令行获取对应包管理器的 registry 配置\n */\nexport async function getRegistry() {\n if (global.__ZIXULU_REGISTRY__) return global.__ZIXULU_REGISTRY__\n const packageManager = await getPackageManager()\n\n if (packageManager === PackageManager.bun) {\n const config = await readBunConfig()\n if (config.install?.registry) return config.install.registry\n }\n\n const registry = await execAsync(\n `${packageManager === PackageManager.yarn || packageManager === PackageManager.pnpm ? packageManager : \"npm\"} config get registry`,\n )\n return registry\n}\n","export function isStableVersion(version: string) {\n return /^\\D*\\d+(\\.\\d+)*$/.test(version)\n}\n","import fetch from \"node-fetch\"\nimport semver from \"semver\"\n\nimport { agent } from \"@/constant\"\n\nimport { getRegistry } from \"./getRegistry\"\nimport { isStableVersion } from \"./isStableVersion\"\n\nexport interface Registry {\n _id: string\n _rev: string\n \"dist-tags\": Record<string, string>\n name: string\n time: Time\n versions: Record<string, Version>\n description: string\n license: string\n maintainers: NpmUser[]\n readme: string\n _source_registry_name: string\n keywords: string[]\n bugs: Bugs\n homepage: string\n repository: Repository\n}\n\nexport interface Repository {\n type: string\n url: string\n}\n\nexport interface Bugs {\n url: string\n}\n\nexport interface Version {\n name: string\n version: string\n main: string\n license: string\n type: string\n bin?: Record<string, string>\n scripts?: Record<string, string>\n devDependencies?: Record<string, string>\n dependencies?: Record<string, string>\n _id: string\n _nodeVersion: string\n _npmVersion: string\n dist: Dist\n _npmUser: NpmUser\n directories?: Record<string, string>\n maintainers: NpmUser[]\n _npmOperationalInternal: NpmOperationalInternal\n _hasShrinkwrap: boolean\n _cnpmcore_publish_time: string\n publish_time: number\n _source_registry_name: string\n}\n\nexport interface NpmOperationalInternal {\n host: string\n tmp: string\n}\n\nexport interface NpmUser {\n name: string\n email: string\n}\n\nexport interface Dist {\n integrity: string\n shasum: string\n tarball: string\n fileCount: number\n unpackedSize: number\n signatures: Signature[]\n size: number\n}\n\nexport interface Signature {\n keyid: string\n sig: string\n}\n\nexport type Time = {\n created: string\n modified: string\n [key: string]: string\n}\n\n/**\n * 获取 npm 包所有可用版本号列表\n * @param packageName npm 包名\n * @returns 版本号数组\n * @description\n * 通过 registry API 获取指定包的所有历史版本信息\n * 支持通过代理访问\n */\nexport async function getPackageRequiredVersion(packageName: string, versionRange?: string) {\n const registry = await getRegistry()\n const url = new URL(`/${packageName}`, registry)\n const response = await fetch(url, {\n agent: global.__ZIXULU_PROXY__ ? agent : undefined,\n })\n const data = (await response.json()) as Registry\n\n if (versionRange?.startsWith(\"@\")) {\n const version = versionRange.slice(1)\n\n // 先精确匹配版本\n let result = Object.keys(data.versions).find(item => item === version)\n\n if (result) return result\n // 再匹配 dist-tags 中的版本\n result = data[\"dist-tags\"][version]\n if (result) return result\n // 再匹配版本号开头匹配的版本\n result = Object.keys(data.versions)\n .filter(item => item.startsWith(version) && isStableVersion(item))\n .at(-1)\n if (result) return result\n throw new Error(`${packageName} 没有符合条件的版本`)\n }\n\n const result = Object.keys(data.versions)\n .filter(version => isStableVersion(version) && (!versionRange || semver.satisfies(version, versionRange)))\n .at(-1) as string | undefined\n if (!result) throw new Error(`${packageName} 没有符合条件的版本`)\n return result\n}\n","import { join } from \"path\"\n\n/**\n * 获取 package.json 的完整路径\n * @param dir 项目目录,默认为当前目录\n * @returns package.json 的完整路径\n */\nexport function getPackageJsonPath(dir = \".\") {\n return join(dir, \"package.json\")\n}\n","import { readFile } from \"fs/promises\"\n\nimport consola from \"consola\"\n\nimport { getPackageJsonPath } from \"./getPackageJsonPath\"\n\n/**\n * 读取 package.json\n * @param dir 目录\n * @returns package.json\n */\n\nexport async function readPackageJson(dir?: string): Promise<Record<string, any>> {\n try {\n const result = JSON.parse(await readFile(getPackageJsonPath(dir), \"utf-8\"))\n return result\n } catch (error) {\n consola.error(error)\n consola.fail(`读取 ${getPackageJsonPath(dir)} 失败`)\n throw new Error(\"读取 package.json 失败\")\n }\n}\n","export type RetryConfig<T> = {\n action: () => Promise<T>\n count?: number\n callback?: (error: unknown, current: number) => void\n}\n\nexport async function retry<T>(config: RetryConfig<T>): Promise<T>\nexport async function retry<T>(action: () => Promise<T>, count?: number): Promise<T>\nexport async function retry<T>(actionOrConfig: RetryConfig<T> | (() => Promise<T>), countNumber?: number) {\n let current = 1\n let {\n action,\n count = 2,\n\n callback,\n } = typeof actionOrConfig === \"function\" ? ({ action: actionOrConfig, count: countNumber } as RetryConfig<T>) : actionOrConfig\n\n async function _retry() {\n try {\n return await action()\n } catch (error) {\n callback?.(error, current)\n if (count === 1) throw error\n current++\n count--\n return await _retry()\n }\n }\n\n return await _retry()\n}\n","import { writeFile } from \"fs/promises\"\n\nexport type WriteJsonConfig = {\n data: Record<string, unknown> | unknown[]\n output: string\n}\n\nexport async function writeJson({ data, output }: WriteJsonConfig): Promise<void> {\n await writeFile(output, JSON.stringify(data, undefined, 4) + \"\\n\", \"utf-8\")\n}\n","import consola from \"consola\"\n\nimport { getPackageJsonPath } from \"./getPackageJsonPath\"\nimport { writeJson } from \"./writeJson\"\n\nexport type WritePackageJsonConfig = {\n data: Record<string, unknown>\n dir?: string\n}\n\n/** 写回 package.json */\nexport async function writePackageJson({ data, dir }: WritePackageJsonConfig): Promise<void> {\n try {\n await writeJson({ data, output: getPackageJsonPath(dir) })\n consola.success(\"修改 package.json 成功\")\n } catch (error) {\n consola.fail(\"修改 package.json 失败\")\n throw error\n }\n}\n","import consola from \"consola\"\n\nimport { getPackageRequiredVersion } from \"./getPackageRequiredVersion\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { retry } from \"./retry\"\nimport { writePackageJson } from \"./writePackageJson\"\n\n/** 依赖类型 */\nexport type DependencyType = \"dependencies\" | \"devDependencies\" | \"peerDependencies\" | \"optionalDependencies\"\n\nexport interface PackageVersion {\n packageName: string\n versionRange?: string\n}\n\n/** 添加依赖配置 */\nexport type AddDependenciesConfig = {\n /** 包名或包名列表 */\n package: string | PackageVersion | (string | PackageVersion)[]\n /** 依赖类型 */\n type?: DependencyType\n /** 项目目录 */\n dir?: string\n}\n\n/**\n * 写入依赖到 package.json\n * @param config 配置项\n * @returns 添加的包及其版本号\n */\nexport async function addDependency(config: AddDependenciesConfig): Promise<Record<string, string>> {\n try {\n const packages = (Array.isArray(config.package) ? config.package : [config.package]).map(item =>\n typeof item === \"string\" ? { packageName: item } : item)\n const { type = \"dependencies\", dir } = config\n const packageJson = await readPackageJson(dir)\n packageJson[type] ??= {}\n\n const addedPackages: Record<string, string> = {}\n\n for (const { packageName, versionRange } of packages) {\n if (\n packageJson.dependencies?.[packageName] ||\n packageJson.devDependencies?.[packageName] ||\n packageJson.peerDependencies?.[packageName] ||\n packageJson.optionalDependencies?.[packageName]\n ) {\n consola.warn(`${packageName} 已存在于依赖中`)\n continue\n }\n\n const version = await retry({\n action: () => getPackageRequiredVersion(packageName, versionRange),\n count: 4,\n callback: (error, current) => consola.error(`获取 ${packageName} 版本失败,第 ${current} 次重试`),\n })\n addedPackages[packageName] = version\n packageJson[type][packageName] ??= `^${version}`\n consola.success(`添加 ${packageName} 至依赖成功`)\n }\n\n const keys = Object.keys(packageJson[type])\n keys.sort()\n\n const sortedDependencies: Record<string, string> = {}\n\n for (const key of keys) sortedDependencies[key] = packageJson[type][key]\n\n packageJson[type] = sortedDependencies\n await writePackageJson({ data: packageJson, dir })\n return addedPackages\n } catch (error) {\n consola.error(error)\n throw error\n }\n}\n","import { mkdir, readdir, writeFile } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport consola from \"consola\"\n\nimport { addDependency } from \"./addDependency\"\nimport { readPackageJson } from \"./readPackageJson\"\n\n/**\n * 添加 antd 相关配置\n * 包括安装依赖、创建必要组件等\n */\nexport async function addAntd() {\n consola.start(\"开始添加 antd 配置\")\n await addDependency({\n package: [\"@ant-design/icons\", \"antd\"],\n })\n const dir = await readdir(\".\")\n const componentDir = dir.includes(\"src\") ? \"src/components\" : \"components\"\n await mkdir(componentDir, { recursive: true })\n const packageJson = await readPackageJson()\n\n if (packageJson.dependencies.next) await addDependency({ package: \"@ant-design/nextjs-registry\" })\n else await addDependency({ package: \"@ant-design/cssinjs\" })\n\n if (packageJson.dependencies.next) {\n await addDependency({ package: \"@ant-design/nextjs-registry\" })\n await writeFile(\n join(componentDir, \"Registry.tsx\"),\n `\"use client\"\n\nimport { FC, ReactNode } from \"react\"\nimport { AntdRegistry } from \"@ant-design/nextjs-registry\"\nimport { ConfigProvider } from \"antd\"\nimport zhCN from \"antd/locale/zh_CN\"\n\nexport interface RegistryProps {\n children?: ReactNode\n}\n\nconst Registry: FC<RegistryProps> = ({ children }) => {\n\n return (\n <AntdRegistry layer>\n <ConfigProvider locale={zhCN}>{children}</ConfigProvider>\n </AntdRegistry>\n )\n}\n\nexport default Registry\n`,\n )\n } else {\n await writeFile(\n join(componentDir, \"Registry.tsx\"),\n `import { StyleProvider } from \"@ant-design/cssinjs\"\nimport { ConfigProvider } from \"antd\"\nimport zhCN from \"antd/locale/zh_CN\"\nimport { FC, ReactNode } from \"react\"\n\nexport interface RegistryProps {\n children?: ReactNode\n}\n\nconst Registry: FC<RegistryProps> = ({ children }) => {\n\n return (\n <StyleProvider layer>\n <ConfigProvider locale={zhCN}>{children}</ConfigProvider>\n </StyleProvider>\n )\n}\n\nexport default Registry\n`,\n )\n }\n\n consola.success(\"添加 antd 配置成功\")\n}\n","import { existsSync } from \"fs\"\nimport { writeFile as _writeFile, mkdir } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport { capitalize } from \"deepsea-tools\"\nimport inquirer from \"inquirer\"\nimport { isPathLike } from \"soda-nodejs\"\n\nexport interface AddApiParams {\n type: string\n api?: string\n hook?: string\n}\n\nasync function writeFile(...args: Parameters<typeof _writeFile>) {\n const [path] = args\n\n if (isPathLike(path) && existsSync(path)) {\n interface Answer {\n override: boolean\n }\n\n const { override } = await inquirer.prompt<Answer>({\n type: \"confirm\",\n name: \"override\",\n message: `文件 ${path} 已存在,是否覆盖?`,\n })\n\n if (!override) return\n }\n\n return await _writeFile(...args)\n}\n\nexport async function addApi({ type, api, hook }: AddApiParams) {\n type = capitalize(type)\n api ??= \"apis\"\n hook ??= \"hooks\"\n\n await mkdir(api, { recursive: true })\n await mkdir(hook, { recursive: true })\n\n const type2 = type.replace(/([A-Z])/g, (_, c) => `-${c.toLowerCase()}`).replace(/^-/, \"\")\n\n interface Answer {\n items: string[]\n }\n\n const { items } = await inquirer.prompt<Answer>({\n type: \"checkbox\",\n name: \"items\",\n message: `请选择需要添加的${type}字段`,\n choices: [\"query\", \"get\", \"add\", \"update\", \"delete\"],\n })\n\n const query = `import { Page } from \"deepsea-tools\"\n\nimport { request } from \"@/utils/request\"\n\nexport interface Query${type}Params {\n pageSize?: number\n pageNum?: number\n}\n\nexport interface ${type} {\n id: string\n name: string\n}\n\nexport type ${type}Id = ${type}[\"id\"]\n\nexport const ${type}Name = \"${type}\"\n\nexport async function query${type}(params: Query${type}Params) {\n const response = await request<Page<${type}>>(\"/${type2}/query\", {\n method: \"POST\",\n body: params,\n })\n return response\n}\n`\n\n if (items.includes(\"query\")) await writeFile(join(api, `query${type}.ts`), query)\n\n const add = `import { request } from \"@/utils/request\"\n\nimport { ${type} } from \"./query${type}\"\n\nexport interface Add${type}Params extends Pick<${type}, \"name\"> {}\n\nexport async function add${type}(params: Add${type}Params) {\n const response = await request<${type}>(\"/${type2}/add\", {\n method: \"POST\",\n body: params,\n })\n return response\n}\n`\n\n if (items.includes(\"add\")) await writeFile(join(api, `add${type}.ts`), add)\n\n const update = `import { request } from \"@/utils/request\"\n\nimport { ${type} } from \"./query${type}\"\n\nexport interface Update${type}Params extends Pick<${type}, \"id\" | \"name\"> {}\n\nexport async function update${type}(params: Update${type}Params) {\n const response = await request<${type}>(\"/${type2}/update\", {\n method: \"POST\",\n body: params,\n })\n return response\n}\n`\n\n if (items.includes(\"update\")) await writeFile(join(api, `update${type}.ts`), update)\n\n const _delete = `import { request } from \"@/utils/request\"\n\nimport { ${type}, ${type}Id } from \"./query${type}\"\n\nexport type Delete${type}Params = ${type}Id\n\nexport async function delete${type}(id: Delete${type}Params) {\n const response = await request<${type}>(\\`/${type2}/delete/\\${id}\\`, {\n method: \"DELETE\",\n })\n return response\n}\n`\n\n if (items.includes(\"delete\")) await writeFile(join(api, `delete${type}.ts`), _delete)\n\n const get = `import { request } from \"@/utils/request\"\n\nimport { ${type}, ${type}Id } from \"./query${type}\"\n\nexport type Get${type}Params = ${type}Id\n\nexport async function get${type}(id: Get${type}Params) {\n const response = await request<${type}>(\\`/${type2}/get/\\${id}\\`, {\n method: \"POST\",\n })\n return response\n}\n`\n\n if (items.includes(\"get\")) await writeFile(join(api, `get${type}.ts`), get)\n\n const useQuery = `import { useQuery } from \"@tanstack/react-query\"\n\nimport { Query${type}Params, query${type} } from \"@/apis/query${type}\"\n\nexport function useQuery${type}(params: Query${type}Params) {\n return useQuery({\n queryKey: [\"query-${type2}\", params],\n queryFn: () => query${type}(params),\n })\n}\n`\n\n if (items.includes(\"query\")) await writeFile(join(hook, `useQuery${type}.ts`), useQuery)\n\n const useGet = `import { useQuery } from \"@tanstack/react-query\"\nimport { isNonNullable, resolveNull } from \"deepsea-tools\"\n\nimport { Get${type}Params, get${type} } from \"@/apis/get${type}\"\n\nexport interface UseGet${type}Params {\n id?: Get${type}Params | undefined\n enabled?: boolean\n}\n\nexport function useGet${type}(idOrParams?: UseGet${type}Params | Get${type}Params | undefined) {\n const { id, enabled = true } = typeof idOrParams === \"object\" ? idOrParams : { id: idOrParams, enabled: true }\n\n return useQuery({\n queryKey: [\"get-${type2}\", id],\n queryFn: isNonNullable(id) ? () => get${type}(id) : resolveNull,\n enabled,\n })\n}\n`\n\n if (items.includes(\"get\")) await writeFile(join(hook, `useGet${type}.ts`), useGet)\n\n const useAdd = `import { useId } from \"react\"\nimport { UseMutationOptions, useMutation, useQueryClient } from \"@tanstack/react-query\"\n\nimport { Add${type}Params, add${type} } from \"@/apis/add${type}\"\nimport { ${type}, ${type}Name } from \"@/apis/query${type}\"\n\nexport interface UseAdd${type}Params<TContext = never>\n extends Omit<UseMutationOptions<${type}, Error, Add${type}Params, TContext>, \"mutationFn\"> {}\n\nexport function useAdd${type}<TContext = never>({ onMutate, onSuccess, onError, onSettled, ...rest }: UseAdd${type}Params<TContext> = {}) {\n const key = useId()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: add${type},\n onMutate(variables) {\n message.open({\n key,\n type: \"loading\",\n content: \\`新增\\${${type}Name}中...\\`,\n duration: 0,\n })\n return onMutate?.(variables)\n },\n onSuccess(data, variables, context) {\n message.open({\n key,\n type: \"success\",\n content: \\`新增\\${${type}Name}成功\\`,\n })\n return onSuccess?.(data, variables, context)\n },\n onError(error, variables, context) {\n message.open({\n key,\n type: \"error\",\n content: \\`新增\\${${type}Name}失败\\`,\n })\n return onError?.(error, variables, context)\n },\n onSettled(data, error, variables, context) {\n queryClient.invalidateQueries({ queryKey: [\"query-${type2}\"] })\n return onSettled?.(data, error, variables, context)\n },\n ...rest,\n })\n}\n`\n\n if (items.includes(\"add\")) await writeFile(join(hook, `useAdd${type}.ts`), useAdd)\n\n const useUpdate = `import { useId } from \"react\"\nimport { UseMutationOptions, useMutation, useQueryClient } from \"@tanstack/react-query\"\n\nimport { ${type}, ${type}Name } from \"@/apis/query${type}\"\nimport { Update${type}Params, update${type} } from \"@/apis/update${type}\"\n\nexport interface UseUpdate${type}Params<TContext = never>\n extends Omit<UseMutationOptions<${type}, Error, Update${type}Params, TContext>, \"mutationFn\"> {}\n\nexport function useUpdate${type}<TContext = never>({ onMutate, onSuccess, onError, onSettled, ...rest }: UseUpdate${type}Params<TContext> = {}) {\n const key = useId()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: update${type},\n onMutate(variables) {\n message.open({\n key,\n type: \"loading\",\n content: \\`更新\\${${type}Name}中...\\`,\n duration: 0,\n })\n return onMutate?.(variables)\n },\n onSuccess(data, variables, context) {\n message.open({\n key,\n type: \"success\",\n content: \\`更新\\${${type}Name}成功\\`,\n })\n return onSuccess?.(data, variables, context)\n },\n onError(error, variables, context) {\n message.open({\n key,\n type: \"error\",\n content: \\`更新\\${${type}Name}失败\\`,\n })\n return onError?.(error, variables, context)\n },\n onSettled(data, error, variables, context) {\n queryClient.invalidateQueries({ queryKey: [\"get-${type2}\", variables.id] })\n queryClient.invalidateQueries({ queryKey: [\"query-${type2}\"] })\n return onSettled?.(data, error, variables, context)\n },\n ...rest,\n })\n}\n`\n\n if (items.includes(\"update\")) await writeFile(join(hook, `useUpdate${type}.ts`), useUpdate)\n\n const useDelete = `import { useId } from \"react\"\nimport { UseMutationOptions, useMutation, useQueryClient } from \"@tanstack/react-query\"\n\nimport { Delete${type}Params, delete${type} } from \"@/apis/delete${type}\"\nimport { ${type}, ${type}Name } from \"@/apis/query${type}\"\n\nexport interface UseDelete${type}Params<TContext = never>\n extends Omit<UseMutationOptions<${type}, Error, Delete${type}Params, TContext>, \"mutationFn\"> {}\n\nexport function useDelete${type}<TContext = never>({ onMutate, onSuccess, onError, onSettled, ...rest }: UseDelete${type}Params<TContext> = {}) {\n const key = useId()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: delete${type},\n onMutate(variables) {\n message.open({\n key,\n type: \"loading\",\n content: \\`删除\\${${type}Name}中...\\`,\n duration: 0,\n })\n return onMutate?.(variables)\n },\n onSuccess(data, variables, context) {\n message.open({\n key,\n type: \"success\",\n content: \\`删除\\${${type}Name}成功\\`,\n })\n return onSuccess?.(data, variables, context)\n },\n onError(error, variables, context) {\n message.open({\n key,\n type: \"error\",\n content: \\`删除\\${${type}Name}失败\\`,\n })\n return onError?.(error, variables, context)\n },\n onSettled(data, error, variables, context) {\n queryClient.invalidateQueries({ queryKey: [\"query-${type2}\"] })\n return onSettled?.(data, error, variables, context)\n },\n ...rest,\n })\n}\n`\n\n if (items.includes(\"delete\")) await writeFile(join(hook, `useDelete${type}.ts`), useDelete)\n}\n","import { CommitType, CommitTypeMap } from \"@/constant\"\n\n/**\n * 获取提交信息\n * @param type 类型\n * @param message 信息\n * @returns 提交信息\n */\nexport function getCommitMessage(type: CommitType, message: string) {\n return `${CommitTypeMap[type]}${message}`\n}\n","import { readdir, readFile, writeFile } from \"fs/promises\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { getCommitMessage } from \"./getCommitMessage\"\n\n/**\n * 向 .gitignore 文件添加规则\n * @param rules 要添加的规则列表\n * @returns commit message\n */\nexport async function addRuleToGitIgnore(...rules: string[]) {\n const dir = await readdir(\".\")\n const message = getCommitMessage(CommitType.feature, `添加 .gitignore 规则 ${rules.join(\", \")}`)\n\n if (!dir.includes(\".gitignore\")) {\n await writeFile(\".gitignore\", rules.join(\"\\n\"), \"utf-8\")\n return message\n }\n\n const gitignore = await readFile(\".gitignore\", \"utf-8\")\n const rules2 = gitignore.split(\"\\n\").map(v => v.trim())\n\n for (const rule of rules) {\n if (rules2.includes(rule)) continue\n rules2.push(rule)\n }\n\n await writeFile(\".gitignore\", rules2.join(\"\\n\"), \"utf-8\")\n return message\n}\n","import { readPackageJson } from \"./readPackageJson\"\n\nexport async function hasDependency(dependency: string | RegExp, dir?: string) {\n const packageJson = await readPackageJson(dir)\n const dependencies = packageJson.dependencies ?? {}\n const devDependencies = packageJson.devDependencies ?? {}\n const peerDependencies = packageJson.peerDependencies ?? {}\n\n const total = Object.keys({\n ...dependencies,\n ...devDependencies,\n ...peerDependencies,\n })\n\n return total.some(item => (typeof dependency === \"string\" ? item === dependency : dependency.test(item)))\n}\n","export interface InsertWhenParams {\n breakBefore?: boolean\n breakAfter?: boolean\n}\n\nexport function insertWhen(condition: unknown, str: string | string[], params: InsertWhenParams = {}) {\n const { breakBefore, breakAfter } = params\n const strs = Array.isArray(str) ? str : [str]\n if (breakBefore) strs.unshift(\"\")\n if (breakAfter) strs.push(\"\")\n return condition ? strs.join(\"\\n\") : \"\"\n}\n","import { copyFile, mkdir, readdir, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport { getEnumValues } from \"deepsea-tools\"\nimport inquirer from \"inquirer\"\n\nimport { PackageManager } from \"@/constant\"\n\nimport { addDependency } from \"./addDependency\"\nimport { addRuleToGitIgnore } from \"./addRuleToGitIgnore\"\nimport { backupFirst } from \"./backupFirst\"\nimport { getPackageManager } from \"./getPackageManager\"\nimport { hasDependency } from \"./hasDependency\"\nimport { insertWhen } from \"./insertWhen\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport const ApplicationType = {\n Frontend: \"Frontend\",\n Backend: \"Backend\",\n FullStack: \"FullStack\",\n} as const\n\nexport type ApplicationType = (typeof ApplicationType)[keyof typeof ApplicationType]\n\nexport async function addBuildDocker() {\n await backupFirst()\n\n interface Answer {\n type: ApplicationType\n manager: PackageManager\n name: string\n versions: string[]\n versionSource: string\n local: boolean\n docker: string\n format: string\n build: string\n dist: string\n useGitignore: string\n rules: string[]\n runtime: string\n port: string\n }\n\n const json = await readPackageJson()\n\n const isFullStack = await hasDependency(/^(next|@remix-run\\/|@react-router\\/|@tanstack\\/react-start$)/)\n\n const isBackend = await hasDependency(/^(express$|hono$|@nestjs\\/|koa$)/)\n\n const defaultType = isFullStack ? ApplicationType.FullStack : isBackend ? ApplicationType.Backend : ApplicationType.Frontend\n\n const defaultManager = await getPackageManager()\n\n const defaultBuild = json.scripts?.build ? \"build\" : (Object.keys(json.scripts ?? {}).find(item => /\\bbuild\\b/i.test(item)) ?? \"build\")\n\n const { type, name, local, versions } = await inquirer.prompt<Answer>([\n {\n type: \"list\",\n name: \"type\",\n message: \"Please select the application type\",\n choices: Object.entries(ApplicationType).map(([name, value]) => ({\n name,\n value,\n })),\n default: defaultType,\n },\n {\n type: \"input\",\n name: \"name\",\n message: \"Please enter the application name\",\n default: json.name?.trim(),\n },\n {\n type: \"confirm\",\n name: \"local\",\n message: \"Do you want to save the docker image locally?\",\n default: false,\n },\n {\n type: \"checkbox\",\n name: \"versions\",\n message: \"Please select the image versions\",\n choices: [\"latest\", \"custom\"],\n default: [\"latest\", \"custom\"],\n },\n ])\n\n if (versions.length === 0) {\n consola.error(\"Please select at least one image version\")\n process.exit(1)\n }\n\n const { port } = await inquirer.prompt<Answer>({\n type: \"input\",\n name: \"port\",\n message: \"Please enter the application port\",\n default: type === ApplicationType.Frontend ? \"80\" : \"3000\",\n })\n\n let versionSource: string | undefined\n\n if (versions.includes(\"custom\")) {\n const { versionSource: versionSource2 } = await inquirer.prompt<Answer>({\n type: \"list\",\n name: \"versionSource\",\n message: \"Please select the custom image version source\",\n choices: [\"Day.js version\", \"package.json version\", \"input\"],\n default: \"Day.js version\",\n })\n\n versionSource = versionSource2\n }\n\n let docker: string | undefined\n\n if (local) {\n const { docker: docker2 } = await inquirer.prompt<Answer>({\n type: \"input\",\n name: \"docker\",\n message: \"Please enter the directory to save images\",\n default: \"docker\",\n })\n\n docker = docker2\n }\n\n let format: string | undefined\n\n if (versionSource === \"Day.js version\") {\n const { format: format2 } = await inquirer.prompt<Answer>({\n type: \"input\",\n name: \"format\",\n message: \"Please enter the format\",\n default: \"YYMMDDHHmm\",\n })\n\n format = format2\n }\n\n const dir = await readdir(\".\")\n\n if (type === ApplicationType.Frontend) {\n const { manager } = await inquirer.prompt<Answer>({\n type: \"list\",\n name: \"manager\",\n message: \"Please select the package manager\",\n choices: getEnumValues(PackageManager),\n default: defaultManager,\n })\n\n const { build } = await inquirer.prompt<Answer>({\n type: \"input\",\n name: \"build\",\n message: \"Please enter the build command\",\n default: `${manager} run ${defaultBuild}`,\n })\n\n const defaultDist = dir.includes(\"build\") ? \"build\" : \"dist\"\n\n const { dist } = await inquirer.prompt<Answer>({\n type: \"input\",\n name: \"dist\",\n message: \"Please enter the dist directory\",\n default: defaultDist,\n })\n\n const buildLatest = versions.includes(\"latest\")\n const buildCustom = versions.includes(\"custom\")\n\n const script = `// @ts-check\n${insertWhen(versions.includes(\"custom\"), `import consola from \"consola\"`, { breakBefore: true })}${insertWhen(\n versionSource === \"Day.js version\",\n `import dayjs from \"dayjs\"`,\n { breakBefore: true },\n )}${insertWhen(versionSource === \"package.json version\", `import { readFile } from \"fs/promises\"`, {\n breakBefore: true,\n })}${insertWhen(local, `import { join } from \"path\"`, { breakBefore: true })}\nimport { spawnAsync } from \"soda-nodejs\"\n${insertWhen(\n versionSource === \"package.json version\",\n `\nconst str = await readFile(\"package.json\", \"utf-8\")\nconst json = JSON.parse(str)\n`,\n)}\nconst name = \"${name}\"\n\n${insertWhen(\n buildCustom,\n `let customTag = ${insertWhen(versionSource === \"package.json version\", \"json.version\")}${insertWhen(versionSource === \"Day.js version\", `dayjs().format(\"${format}\")`)}${insertWhen(\n versionSource === \"input\",\n `await consola.prompt(\"Please enter the image tag\", { type: \"text\" })`,\n )}`,\n)}\n\nconsole.log()\n\n/** @type {import(\"child_process\").SpawnOptions} */\nconst options = {\n shell: true,\n stdio: \"inherit\",\n}\n\nawait spawnAsync(\"${build}\", options)\n\nconsole.log()\n\nawait spawnAsync(\\`docker build${insertWhen(buildCustom, ` -t \\${name}:\\${customTag}`)}${insertWhen(buildLatest, ` -t \\${name}:latest`)} .\\`, options)\n${insertWhen(\n local,\n `${insertWhen(\n buildCustom,\n `\nconsole.log()\n\nawait spawnAsync(\\`docker save \\${name}:\\${customTag} > \\${join(\"${docker ?? \"docker\"}\", \\`\\${name}-\\${customTag}.tar\\`)}\\`, options)`,\n )}\n${insertWhen(\n buildLatest,\n `\nconsole.log()\nawait spawnAsync(\\`docker save \\${name}:latest > \\${join(\"${docker ?? \"docker\"}\", \\`\\${name}-latest.tar\\`)}\\`, options)`,\n)}`,\n)}`\n\n const dockerFile = `# 使用官方 nginx 镜像作为基础镜像\nFROM nginx:alpine\n\n# 设置工作目录\nWORKDIR /usr/share/nginx/html\n\n# 删除默认的 nginx 静态资源\nRUN rm -rf ./*\n\n# 将 dist 文件夹中的内容复制到 nginx 的 html 目录下\nCOPY ${dist} .\n\n# 可选:复制自定义的 nginx 配置\nCOPY nginx.conf /etc/nginx/nginx.conf\n\n# 暴露端口\nEXPOSE ${port}\n\n# 启动 nginx\nCMD [\"nginx\", \"-g\", \"daemon off;\"]\n`\n\n const nginxFile = `worker_processes 1;\n\nevents {\n worker_connections 1024;\n}\n\nhttp {\n include mime.types;\n # default_type application/octet-stream;\n\n sendfile on;\n keepalive_timeout 65;\n\n server {\n listen ${port};\n server_name localhost;\n\n root /usr/share/nginx/html;\n index index.html index.htm;\n location / {\n try_files $uri $uri/ /index.html; # 对于 SPA 应用的路由支持\n }\n }\n}\n`\n\n if (local) await mkdir(docker!, { recursive: true })\n await mkdir(\"scripts\", { recursive: true })\n await writeFile(\"scripts/build-docker.mjs\", script)\n await writeFile(\"Dockerfile\", dockerFile)\n await writeFile(\"nginx.conf\", nginxFile)\n await writePackageJson({\n data: {\n ...json,\n scripts: {\n ...json.scripts,\n \"build:docker\": `cross-env NODE_ENV=production ${manager === \"bun\" ? \"bun\" : \"node\"} scripts/build-docker.mjs`,\n },\n },\n })\n } else {\n let created = false\n\n if (dir.includes(\".gitignore\")) {\n const { useGitignore } = await inquirer.prompt<Answer>({\n type: \"confirm\",\n name: \"useGitignore\",\n message: \"Do you want to use the .gitignore as the dockerignore file?\",\n default: true,\n })\n\n if (useGitignore) {\n await copyFile(\".gitignore\", \".dockerignore\")\n created = true\n }\n }\n\n if (!created) {\n const { rules } = await inquirer.prompt<Answer>({\n type: \"checkbox\",\n name: \"rules\",\n message: \"Please select the rules\",\n choices: dir,\n default: dir.filter(item => ![\"node_modules\", \"dist\", \"build\", docker?.split(\"/\").at(0)].includes(item)),\n })\n\n await writeFile(\".dockerignore\", rules.join(\"\\n\"))\n }\n\n if (type === ApplicationType.Backend) {\n const dockerFile = `# 使用 bun 的 alpine 版本作为基础镜像\nFROM oven/bun:alpine\n\n# 设置工作目录\nWORKDIR /app\n\n# 复制源代码\nCOPY . .\n\n# 安装依赖\nRUN bun install --registry=https://registry.npmmirror.com\n\n# 暴露端口(根据你的应用需要调整)\nEXPOSE ${port}\n\n# 运行应用\nCMD [\"bun\", \"run\", \"index.ts\"]\n`\n\n await writeFile(\"Dockerfile\", dockerFile)\n } else {\n const dockerFile = `FROM oven/bun:alpine AS deps\nWORKDIR /app\nCOPY . .\nRUN bun install --registry=https://registry.npmmirror.com\n\nFROM oven/bun:alpine AS builder\nWORKDIR /app\nCOPY . .\nCOPY --from=deps /app/node_modules ./node_modules\nRUN bun run build\n\nFROM oven/bun:alpine AS runner\nWORKDIR /app\nCOPY --from=builder /app/node_modules ./node_modules\nCOPY --from=builder /app/package.json ./package.json\n\nEXPOSE ${port}\n\nCMD [\"bun\", \"run\", \"start\"]\n`\n\n await writeFile(\"Dockerfile\", dockerFile)\n }\n\n consola.warn(\"Please confirm the Dockerfile is correct\")\n }\n\n if (docker) await addRuleToGitIgnore(docker)\n\n const packages = [\"soda-nodejs\", \"cross-env\"]\n\n if (versionSource === \"Day.js version\") packages.push(\"dayjs\")\n\n if (versions.includes(\"custom\")) packages.push(\"consola\")\n\n await addDependency({\n package: packages,\n type: \"devDependencies\",\n })\n}\n","/**\n * 将数组或对象中的元素按字典序排序\n * @param data 要排序的数组或对象\n * @returns 排序后的数组或对象\n */\nexport function sortArrayOrObject(data: Record<string, unknown> | unknown[]) {\n if (typeof data !== \"object\" || data === null) return data\n\n if (Array.isArray(data)) {\n const _data = [...data]\n\n _data.sort()\n return _data\n }\n\n if (Object.getPrototypeOf(data) === Object.prototype) {\n const keys = Object.keys(data)\n keys.sort()\n\n const _data: Record<string, unknown> = {}\n\n for (const key of keys) _data[key] = data[key]\n\n return _data\n }\n\n return data\n}\n","import inquirer from \"inquirer\"\n\nimport { readPackageJson } from \"./readPackageJson\"\nimport { sortArrayOrObject } from \"./sortArrayOrObject\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport type Scripts = Record<string, string>\n\nexport async function addScript(scripts: Scripts) {\n const packageJson = await readPackageJson()\n\n interface Answer {\n replace: boolean\n }\n\n const keys: string[] = []\n\n for (const key of Object.keys(scripts)) {\n if (packageJson.scripts[key]) {\n if (scripts[key] === packageJson.scripts[key]) continue\n const { replace } = await inquirer.prompt<Answer>([\n {\n type: \"confirm\",\n name: \"replace\",\n message: `${key} 命令已存在 \\`${packageJson.scripts[key]}\\`,是否替换为 \\`${scripts[key]}\\``,\n },\n ])\n if (!replace) continue\n }\n\n keys.push(key)\n }\n\n keys.forEach(key => (packageJson.scripts[key] = scripts[key]))\n\n sortArrayOrObject(packageJson.scripts)\n\n await writePackageJson({ data: packageJson })\n}\n","import inquirer from \"inquirer\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nimport { PackageManager } from \"@/constant\"\n\nimport { getPackageManager } from \"@/utils/getPackageManager\"\n\nexport type InstallDependcenyConfig = {\n /**\n * 是否静默安装\n */\n silent?: boolean\n /**\n * 包管理器\n */\n manager?: PackageManager\n /**\n * 目录\n */\n dir?: string\n}\n\nexport async function installDependceny(config?: InstallDependcenyConfig): Promise<boolean> {\n let { silent, manager, dir } = config ?? {}\n\n if (!silent) {\n const { install } = await inquirer.prompt({\n type: \"confirm\",\n name: \"install\",\n message: \"安装依赖\",\n })\n\n if (install === false) return false\n }\n\n manager ??= await getPackageManager(dir)\n\n try {\n await spawnAsync(\n `${manager} install${global.__ZIXULU_REGISTRY__ ? ` --registry ${global.__ZIXULU_REGISTRY__}` : \"\"}${manager !== PackageManager.bun && global.__ZIXULU_PROXY__ ? ` --proxy http://localhost:7890 --https-proxy http://localhost:7890` : \"\"}`,\n { shell: true, stdio: \"inherit\", cwd: dir },\n )\n } catch (error) {\n await spawnAsync(\n `${manager} install${global.__ZIXULU_REGISTRY__ ? ` --registry ${global.__ZIXULU_REGISTRY__}` : \"\"}${manager !== PackageManager.bun && global.__ZIXULU_PROXY__ ? ` --proxy http://localhost:7890 --https-proxy http://localhost:7890` : \"\"}`,\n { shell: true, stdio: \"inherit\", cwd: dir },\n )\n }\n\n return true\n}\n","import { writeFile } from \"node:fs/promises\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { addDependency, PackageVersion } from \"./addDependency\"\nimport { addScript } from \"./addScript\"\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { hasDependency } from \"./hasDependency\"\nimport { installDependceny } from \"./installDependceny\"\n\ninterface GetEslintConfigParams {\n isReact: boolean\n}\n\nfunction getEslintConfig({ isReact }: GetEslintConfigParams) {\n const eslintConfig = `// @ts-check\n\nimport js from \"@eslint/js\"${\n isReact\n ? `\nimport reactHooks from \"eslint-plugin-react-hooks\"\nimport reactRefresh from \"eslint-plugin-react-refresh\"`\n : \"\"\n }\nimport { defineConfig, globalIgnores } from \"eslint/config\"\nimport globals from \"globals\"\nimport tseslint from \"typescript-eslint\"\n\nexport default defineConfig([\n globalIgnores([\"node_modules\", \"dist\", \"build\", \"public\"]),${\n isReact\n ? `\n reactHooks.configs.flat.recommended,`\n : \"\"\n }\n {\n files: [\"**/*.{js,mjs,ts${isReact ? \",tsx\" : \"\"}}\"],\n extends: [js.configs.recommended, tseslint.configs.recommended${isReact ? `, reactRefresh.configs.vite` : \"\"}],\n languageOptions: {\n ecmaVersion: \"latest\",\n globals: globals.browser,\n },\n rules: {\n \"@typescript-eslint/no-explicit-any\": \"off\",\n \"@typescript-eslint/no-empty-object-type\": \"off\",\n \"@typescript-eslint/no-non-null-asserted-optional-chain\": \"off\",\n \"no-empty\": \"off\",\n \"no-extra-boolean-cast\": \"off\",\n \"no-unused-vars\": \"off\",${\n isReact\n ? `\n \"react-refresh/only-export-components\": \"off\",`\n : \"\"\n }\n \"@typescript-eslint/no-unused-vars\": [\n \"warn\",\n {\n args: \"none\",\n caughtErrors: \"none\",\n ignoreRestSiblings: true,\n },\n ],\n \"prefer-const\": [\n \"off\",\n {\n destructuring: \"any\",\n },\n ],\n },\n },\n])\n`\n\n return eslintConfig\n}\n\nexport async function addEslint() {\n const isReact = await hasDependency(\"react\")\n const config = getEslintConfig({ isReact })\n await writeFile(\"eslint.config.mjs\", config)\n\n const packages: (string | PackageVersion)[] = [\"@eslint/js\", \"eslint\", \"typescript-eslint\", \"globals\"]\n\n if (isReact) packages.push(\"eslint-plugin-react-hooks\", \"eslint-plugin-react-refresh\")\n await addDependency({\n package: packages,\n type: \"devDependencies\",\n })\n await installDependceny()\n await addScript({ lint: \"eslint .\" })\n return getCommitMessage(CommitType.feature, \"add eslint\")\n}\n","import { writeFile } from \"fs/promises\"\n\nexport async function addGitAttributes() {\n await writeFile(\n \".gitattributes\",\n `# 将所有文本文件在提交到 Git 仓库时,自动转换为 LF 换行符\n* text=auto eol=lf`,\n \"utf-8\",\n )\n}\n","import { addedRules } from \"@/constant/index\"\n\nimport { addGitAttributes } from \"./addGitAttributes\"\nimport { addRuleToGitIgnore } from \"./addRuleToGitIgnore\"\n\n/**\n * 添加预设的 gitignore 规则\n */\nexport async function addGitignore() {\n await addGitAttributes()\n const message = await addRuleToGitIgnore(...addedRules)\n return message\n}\n","import { writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport simpleGit from \"simple-git\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nimport { AddDependenciesConfig, addDependency } from \"./addDependency\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { shouldContinue } from \"./shouldContinue\"\nimport { writePackageJson } from \"./writePackageJson\"\n\n/**\n * addHusky 参数\n */\nexport interface AddHuskyParams {\n /** 是否跳过用户交互确认 */\n skipConfirm?: boolean\n}\n\n/**\n * 添加 husky 及 lint-staged 配置\n */\nexport async function addHusky(params?: AddHuskyParams) {\n const options = params ?? {}\n\n const git = simpleGit()\n const isRepo = await git.checkIsRepo()\n\n if (!isRepo) {\n consola.info(\"当前目录不是 git 仓库,跳过 husky 配置\")\n return\n }\n\n if (!options.skipConfirm) {\n const shouldSetupHooks = await shouldContinue(\"是否配置 husky hooks,在每次 commit 前自动格式化修改的文件?\")\n\n if (!shouldSetupHooks) {\n consola.info(\"已取消 husky 配置\")\n return\n }\n } else consola.info(\"已根据外部指令跳过 husky 配置确认\")\n\n consola.start(\"开始配置 husky\")\n\n const huskyConfig: AddDependenciesConfig = {\n package: [\"husky\", \"lint-staged\"],\n type: \"devDependencies\",\n }\n\n await addDependency(huskyConfig)\n await installDependceny()\n\n try {\n consola.start(\"初始化 husky\")\n await spawnAsync(\"bunx husky init\")\n consola.success(\"husky 初始化成功\")\n } catch (error) {\n consola.error(\"husky 初始化失败\", error)\n }\n\n try {\n consola.start(\"配置 pre-commit hook\")\n const preCommitHook = \"npx lint-staged\"\n await writeFile(\".husky/pre-commit\", preCommitHook, \"utf-8\")\n consola.success(\"pre-commit hook 配置成功\")\n } catch (error) {\n consola.error(\"pre-commit hook 配置失败\", error)\n }\n\n const packageJson = await readPackageJson()\n packageJson[\"lint-staged\"] = {\n \"**/*\": \"prettier --write --ignore-unknown\",\n }\n await writePackageJson({ data: packageJson })\n consola.success(\"lint-staged 配置成功\")\n\n consola.success(\"husky 配置完成\")\n}\n","import { Stats } from \"fs\"\nimport { readdir, stat } from \"fs/promises\"\nimport { join, parse, ParsedPath } from \"path\"\n\nexport interface GetFilesOptions {\n /**\n * 目录\n */\n dir?: string\n /**\n * 匹配\n */\n match: (path: ParsedPath, stats: Stats) => boolean\n /**\n * 数量\n */\n count?: number\n /**\n * 深度\n */\n depth?: number\n /**\n * 排除\n */\n exclude?: (path: ParsedPath, stats: Stats) => boolean\n}\n\n/**\n * 递归获取指定目录下的文件\n * @param options 配置选项\n * @returns 符合条件的文件路径数组\n */\nexport async function getFiles(options: GetFilesOptions) {\n const { dir = \".\", match, count, depth, exclude } = options\n\n const result: string[] = []\n\n const e = Symbol() // 用于控制递归终止的特殊标记\n\n /**\n * 递归遍历目录的内部函数\n * @param path 当前处理的路径\n * @param depth 剩余遍历深度\n */\n async function _getFiles(path: string, depth: number | undefined) {\n const files = await readdir(path)\n\n for (const file of files) {\n const filePath = join(path, file)\n const parsedPath = parse(filePath)\n const stats = await stat(filePath)\n\n if (match(parsedPath, stats)) {\n const length = result.push(filePath)\n if (count !== undefined && length >= count) throw e\n }\n\n if (!stats.isDirectory()) continue\n if (exclude && exclude(parsedPath, stats)) continue\n if (depth === 1) continue\n await _getFiles(filePath, depth && depth - 1)\n }\n }\n\n try {\n await _getFiles(dir, depth)\n } catch (error) {\n if (error !== e) throw error\n }\n\n return result\n}\n","/**\n * 将路径转换为相对路径格式\n * @param path 需要转换的路径\n * @returns 转换后的相对路径,以 './' 开头\n */\nexport function getRelativePath(path: string) {\n path = path.replace(/\\\\/g, \"/\")\n if (path.startsWith(\"./\")) return path\n if (path.startsWith(\"../\")) return path\n return `./${path}`\n}\n","import { existsSync } from \"fs\"\nimport { join, parse } from \"path\"\n\nexport type TsFile = {\n depth: 0 | 1\n ext: \".ts\" | \".tsx\"\n path: string\n}\n\nexport function getTsFile(path: string): TsFile {\n const { ext } = parse(path)\n if (ext !== \"\" && ext !== \".ts\" && ext !== \".tsx\") throw new Error(\"请传入 ts 或 tsx 文件\")\n\n if (ext === \".ts\" || ext === \".tsx\") {\n return {\n depth: 0,\n ext: ext,\n path,\n }\n }\n\n const path2 = path + \".ts\"\n\n if (existsSync(path2)) {\n return {\n depth: 0,\n ext: \".ts\",\n path: path2,\n }\n }\n\n const path3 = path + \".tsx\"\n\n if (existsSync(path3)) {\n return {\n depth: 0,\n ext: \".tsx\",\n path: path3,\n }\n }\n\n const path4 = join(path, \"index.ts\")\n\n if (existsSync(path4)) {\n return {\n depth: 1,\n ext: \".ts\",\n path: path4,\n }\n }\n\n const path5 = join(path, \"index.tsx\")\n\n if (existsSync(path5)) {\n return {\n depth: 1,\n ext: \".tsx\",\n path: path5,\n }\n }\n\n throw new Error(`找不到 ${path} 对应的 ts 或 tsx 文件`)\n}\n","import { join } from \"path\"\nimport { cwd } from \"process\"\n\n/**\n * 获取 tsconfig.json 的完整路径\n * @param path 可选的基础路径,默认使用当前工作目录\n * @returns tsconfig.json 的完整路径\n */\nexport function getTsConfigJsonPath(path?: string) {\n return join(path ?? cwd(), \"tsconfig.json\")\n}\n","import { readFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport JSON5 from \"json5\"\n\nimport { getTsConfigJsonPath } from \"./getTsConfigPath\"\n\n/** 读取 tsconfig.json */\n\nexport async function readTsConfig(path?: string): Promise<Record<string, any>> {\n try {\n const result = JSON5.parse(await readFile(getTsConfigJsonPath(path), \"utf-8\"))\n return result\n } catch (error) {\n consola.fail(\"读取 tsconfig.json 失败\")\n throw error\n }\n}\n","import { writeFile } from \"fs/promises\"\n\nimport { getTsConfigJsonPath } from \"./getTsConfigPath\"\n\nexport async function writeTsConfig(config: Record<string, unknown>) {\n return await writeFile(getTsConfigJsonPath(), JSON.stringify(config, undefined, 4), \"utf-8\")\n}\n","import { readFile, writeFile } from \"fs/promises\"\nimport { join, parse } from \"path\"\n\nimport inquirer from \"inquirer\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { getFiles } from \"./getFiles\"\nimport { getRelativePath } from \"./getRelativePath\"\nimport { getTsFile } from \"./getTsFile\"\nimport { readTsConfig } from \"./readTsConfig\"\nimport { writeTsConfig } from \"./writeTsConfig\"\n\n/**\n * 获取路径别名配置\n * @param name 别名名称\n */\nexport async function getPathAlias(name: string) {\n const folder = await getFiles({\n match(path, stats) {\n return stats.isDirectory() && path.base === name\n },\n exclude(path, stats) {\n return (\n stats.isDirectory() &&\n (path.base === \"node_modules\" || path.base === \".git\" || path.base === \".vscode\" || path.base === \"dist\" || path.base === \"build\")\n )\n },\n count: 1,\n })\n const defaultPath = folder[0] ? getRelativePath(folder[0]) : undefined\n const { path } = await inquirer.prompt({\n type: \"input\",\n name: \"path\",\n message: `请输入你的 @${name}/ 的路径`,\n default: defaultPath,\n })\n return path\n}\n\n/** 路径别名配置项 */\nexport type PathAlias = {\n name: string\n path: string\n}\n\n/**\n * 添加路径别名配置到 tsconfig.json\n */\nexport async function addPathAlias(name: string, path: string): Promise<void>\nexport async function addPathAlias(alias: PathAlias[]): Promise<void>\nexport async function addPathAlias(nameOrAlias: string | PathAlias[], path?: string) {\n nameOrAlias = Array.isArray(nameOrAlias) ? nameOrAlias : [{ name: nameOrAlias, path: path! }]\n const tsConfig = await readTsConfig()\n tsConfig.compilerOptions ??= {}\n tsConfig.compilerOptions.paths ??= {}\n\n nameOrAlias.forEach(({ name, path }) => {\n tsConfig.compilerOptions.paths[`@${name}/*`] ??= []\n path = `${getRelativePath(path)}/*`\n if (!tsConfig.compilerOptions.paths[`@${name}/*`].includes(path)) tsConfig.compilerOptions.paths[`@${name}/*`].push(path)\n })\n\n await writeTsConfig(tsConfig)\n}\n\n/**\n * 替换所有文件中的相对路径为路径别名\n */\nexport async function replacePathAlias() {\n const tsConfig = await readTsConfig()\n const oldPaths: Record<string, string[]> = tsConfig.compilerOptions?.paths ?? {}\n\n const paths: Record<string, string[]> = {}\n\n Object.entries(oldPaths).forEach(([key, value]) => {\n paths[key.replace(/\\/?\\*?$/, \"\")] = value.map(item => item.replace(/\\/?\\*?$/, \"\"))\n })\n\n const files = await getFiles({\n match(path, stats) {\n return (path.ext === \".ts\" || path.ext === \".tsx\") && stats.isFile()\n },\n exclude(path, stats) {\n return (\n stats.isDirectory() &&\n (path.base === \"node_modules\" || path.base === \".git\" || path.base === \".vscode\" || path.base === \"dist\" || path.base === \"build\")\n )\n },\n })\n const reg = /(import [\\d\\D]*?\")(.+?)(\")/gm\n\n for (const file of files) {\n let code = await readFile(file, \"utf-8\")\n code = code.replace(reg, (match: string, arg: string, arg2: string, arg3: string) => {\n // 如果不是相对路径,直接返回\n if (!arg2.startsWith(\"./\") && !arg2.startsWith(\"../\")) return match\n\n /** 获取最终的 ts 文件地址 */\n let pathToReplace: string\n let depth: 0 | 1\n\n try {\n const tsFile = getTsFile(getRelativePath(join(file, \"../\", arg2)))\n pathToReplace = tsFile.path\n depth = tsFile.depth\n } catch {\n return match\n }\n\n pathToReplace = getRelativePath(pathToReplace)\n\n // 如果就是本目录的文件,直接返回\n if (arg2.startsWith(\"./\")) {\n const f = arg2.slice(2)\n if (parse(f).base === f && depth === 0) return match\n }\n\n let matchedKey = \"\"\n let matchedPath = \"\"\n\n Object.entries(paths).forEach(([key, value]) => {\n value.forEach(item => {\n /** 必须等于路径或者以路径开头 */\n if (pathToReplace === item || pathToReplace.startsWith(`${item}/`)) {\n if (!matchedPath || item.length > matchedPath.length) {\n matchedKey = key\n matchedPath = item\n }\n }\n })\n })\n\n if (matchedKey && matchedPath) {\n const newPath = `${matchedKey}${pathToReplace.slice(matchedPath.length)}`.replace(/\\/$/, \"\").replace(/\\.tsx?$/, \"\")\n const finalPath = `${arg}${newPath}${arg3}`\n return finalPath\n }\n\n return match\n })\n await writeFile(file, code, \"utf-8\")\n }\n\n return getCommitMessage(CommitType.feature, \"replace path alias\")\n}\n\n/**\n * 为文件夹添加路径别名\n */\nexport async function addFolderPathAlias() {\n const { folder } = await inquirer.prompt({\n type: \"input\",\n name: \"folder\",\n message: \"请输入文件夹路径\",\n default: \".\",\n })\n const dir = await getFiles({\n match(path, stats) {\n return stats.isDirectory()\n },\n depth: 1,\n dir: folder,\n })\n const names = dir.map(item => parse(item).name)\n const { result } = await inquirer.prompt({\n type: \"checkbox\",\n name: \"result\",\n message: \"请选择要添加的文件夹\",\n choices: names,\n default: names.filter(item => item !== \"node_modules\" && item !== \".git\" && item !== \".vscode\" && item !== \"dist\" && item !== \"build\"),\n })\n await addPathAlias(\n result.map((item: string) => ({\n name: item,\n path: getRelativePath(join(folder, item)),\n })),\n )\n return getCommitMessage(CommitType.feature, `add path alias: ${result.join(\", \")}`)\n}\n","import { writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport simpleGit from \"simple-git\"\n\nimport { AddDependenciesConfig, addDependency } from \"./addDependency\"\nimport { addHusky } from \"./addHusky\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { shouldContinue } from \"./shouldContinue\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nconst ignoreConfig = `node_modules\npublic\ndist\nbuild\ngenerated\n.next\n.vscode\n.generated\n**/components/ui/**\n`\n\nconst prettierConfig = `// @ts-check\n\n/**\n * @type {import(\"@1adybug/prettier\").Options}\n */\nconst config = {\n semi: false,\n tabWidth: 4,\n arrowParens: \"avoid\",\n endOfLine: \"lf\",\n printWidth: 160,\n plugins: [\"@1adybug/prettier\"],\n controlStatementBraces: \"add\",\n multiLineBraces: \"add\",\n nodeProtocol: true,\n}\n\nexport default config\n`\n\n/**\n * prettier 配置生成器参数\n */\nexport interface GetPluginConfigParams {\n /** 是否使用 tailwind */\n isTailwind: boolean\n /** 是否是 react 项目 */\n isReact: boolean\n}\n\n/**\n * 添加 prettier 相关配置\n * 包括安装依赖、创建配置文件等\n */\nexport async function addPrettier() {\n consola.start(\"开始添加 prettier 配置\")\n await writeFile(\"prettier.config.mjs\", prettierConfig, \"utf-8\")\n await writeFile(\".prettierignore\", ignoreConfig, \"utf-8\")\n\n const config2: AddDependenciesConfig = {\n package: [\"prettier\", \"@1adybug/prettier\"],\n type: \"devDependencies\",\n }\n\n await addDependency(config2)\n const packageJson2 = await readPackageJson()\n packageJson2.scripts ??= {}\n packageJson2.scripts.format = \"prettier --write .\"\n packageJson2.scripts.fg = 'npm run format && git add . && git commit -m \"✨feature: format\"'\n await writePackageJson({ data: packageJson2 })\n await installDependceny()\n\n const git = simpleGit()\n const isRepo = await git.checkIsRepo()\n\n if (!isRepo) {\n consola.info(\"当前目录不是 git 仓库,跳过 git hooks 配置\")\n consola.success(\"添加 prettier 配置成功\")\n return\n }\n\n consola.info(\"检测到 git 仓库\")\n const shouldSetupHooks = await shouldContinue(\"是否配置 git hooks,在每次 commit 前自动格式化修改的文件?\")\n\n if (!shouldSetupHooks) {\n consola.info(\"跳过 git hooks 配置\")\n consola.success(\"添加 prettier 配置成功\")\n return\n }\n\n await addHusky({ skipConfirm: true })\n\n consola.success(\"添加 prettier 配置成功\")\n}\n","import { readdir, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nimport { PackageManager } from \"@/constant\"\n\nimport { addDependency } from \"./addDependency\"\nimport { installDependceny } from \"./installDependceny\"\n\nconst prismaFile = `import { PrismaClient } from \"@prisma/client\"\n\ndeclare global {\n var __PRISMA__: PrismaClient\n}\n\nglobalThis.__PRISMA__ ??= new PrismaClient()\n\nexport const prisma = globalThis.__PRISMA__\n`\n\n/**\n * 添加 Prisma 相关配置\n * 包括安装依赖、初始化配置等\n * @param manager 包管理器类型\n */\nexport async function addPrisma(manager?: PackageManager) {\n consola.start(\"开始添加 Prisma 配置\")\n await addDependency({\n package: \"@prisma/client\",\n })\n await addDependency({\n package: [\"prisma\", \"ts-node\", \"@types/node\", \"typescript\"],\n type: \"devDependencies\",\n })\n const dir = await readdir(\".\")\n await installDependceny({ silent: true, manager })\n if (!dir.includes(\"tsconfig.json\")) await spawnAsync(\"npx tsc --init\", { shell: true, stdio: \"inherit\" })\n await spawnAsync(\"npx prisma init --datasource-provider sqlite\", {\n shell: true,\n stdio: \"inherit\",\n })\n await writeFile(\"prisma/index.ts\", prismaFile, \"utf-8\")\n consola.success(\"添加 Prisma 配置成功\")\n}\n","import { mkdir, readFile, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { addDependency } from \"./addDependency\"\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nconst script = `// @ts-check\nimport { spawn } from \"child_process\"\nimport { config } from \"dotenv\"\nimport { readFile } from \"fs/promises\"\nimport { cpus } from \"os\"\n\nconfig()\n\nasync function main() {\n let core = parseInt(process.env.CORE || \"1\")\n if (!Number.isInteger(core)) core = 1\n if (core < 1) core = 1\n if (core > cpus().length) core = cpus().length\n const packageJson = JSON.parse(await readFile(\"package.json\", \"utf-8\"))\n\n spawn(\\`pm2 start scripts/server.mjs --name \\${packageJson.name} -i \\${core}\\`, { shell: true, stdio: \"inherit\" })\n}\n\nmain()\n`\n\nconst expressScript = `// @ts-check\nimport compression from \"compression\"\nimport cors from \"cors\"\nimport { config } from \"dotenv\"\nimport express from \"express\"\nimport { readFileSync } from \"fs\"\nimport { createServer as createHttpServer } from \"http\"\nimport { createServer as createHttpsServer } from \"https\"\nimport morgan from \"morgan\"\nimport { join, resolve } from \"path\"\n\nconfig()\n\nfunction createServer() {\n const app = express()\n app.disable(\"x-powered-by\")\n app.use(compression())\n app.use(cors())\n app.use(morgan(\"tiny\"))\n\n const PEM_PATH = process.env.PEM_PATH\n const HTTPS = !!PEM_PATH\n const PORT = process.env.PORT ? Number(process.env.PORT) : HTTPS ? 443 : 80\n const HOSTNAME = process.env.HOSTNAME?.trim() || undefined\n\n if (!HTTPS) {\n createHttpServer(app).listen(PORT, HOSTNAME)\n } else {\n const key = readFileSync(join(PEM_PATH, \"privkey.pem\"), \"utf8\")\n const cert = readFileSync(join(PEM_PATH, \"cert.pem\"), \"utf8\")\n const ca = readFileSync(join(PEM_PATH, \"chain.pem\"), \"utf8\")\n createHttpsServer({ key, cert, ca }, app).listen(PORT, HOSTNAME)\n }\n\n return app\n}\n\nasync function main() {\n const ROOT = process.env.ROOT || \"dist\"\n if (!!process.env.BASE && !process.env.BASE.startsWith(\"/\")) throw new Error(\"BASE 必须以 / 开头\")\n const BASE = process.env.BASE || \"/\"\n\n const server = createServer()\n\n server.use(\\`\\${BASE.replace(/\\\\/+$/, \"\")}/\\`, express.static(ROOT))\n\n server.get(\\`\\${BASE.replace(/\\\\/+$/, \"\")}/*\\`, async (request, response) => response.sendFile(resolve(ROOT, \"index.html\")))\n\n if (BASE !== \"/\") server.get(\"/\", async (request, response) => response.redirect(BASE))\n}\n\nmain()\n`\n\nconst nextScript = `// @ts-check\nimport compression from \"compression\"\nimport cors from \"cors\"\nimport { config } from \"dotenv\"\nimport express from \"express\"\nimport { readFileSync } from \"fs\"\nimport { createServer as createHttpServer } from \"http\"\nimport { createServer as createHttpsServer } from \"https\"\nimport morgan from \"morgan\"\nimport next from \"next\"\nimport { join } from \"path\"\n\nconfig()\n\nfunction createServer() {\n const app = express()\n app.disable(\"x-powered-by\")\n app.use(compression())\n app.use(cors())\n app.use(morgan(\"tiny\"))\n\n const PEM_PATH = process.env.PEM_PATH\n const HTTPS = !!PEM_PATH\n const PORT = process.env.PORT ? Number(process.env.PORT) : HTTPS ? 443 : 80\n const HOSTNAME = process.env.HOSTNAME?.trim() || undefined\n\n if (!HTTPS) {\n createHttpServer(app).listen(PORT, HOSTNAME)\n } else {\n const key = readFileSync(join(PEM_PATH, \"privkey.pem\"), \"utf8\")\n const cert = readFileSync(join(PEM_PATH, \"cert.pem\"), \"utf8\")\n const ca = readFileSync(join(PEM_PATH, \"chain.pem\"), \"utf8\")\n createHttpsServer({ key, cert, ca }, app).listen(PORT, HOSTNAME)\n }\n\n return app\n}\n\nasync function main() {\n const PEM_PATH = process.env.PEM_PATH\n const HTTPS = !!PEM_PATH\n\n const app = next({ experimentalHttpsServer: HTTPS })\n const handle = app.getRequestHandler()\n await app.prepare()\n\n const server = createServer()\n server.all(\"*\", (request, response) => handle(request, response))\n}\n\nmain()\n`\n\nconst scripts = {\n express: expressScript,\n next: nextScript,\n}\n\n/**\n * 添加启动脚本配置选项\n */\nexport type AddStartScriptOptions = {\n /** 服务器类型:express 或 next */\n type: keyof typeof scripts\n /** SSL 证书路径 */\n pemPath?: string\n /** 服务器端口 */\n port?: string\n /** PM2 实例数量 */\n core?: string\n /** 服务器主机名 */\n hostname?: string\n}\n\n/**\n * 添加生产环境启动脚本\n * 支持 Express 和 Next.js 服务器\n * 配置 PM2 多进程管理\n * 支持 HTTPS\n *\n * @param options 配置选项\n * @returns commit message\n */\nexport async function addStartScript({ type, pemPath, port, core, hostname }: AddStartScriptOptions) {\n await addDependency({\n package: [\"@types/compression\", \"@types/cors\", \"@types/express\", \"@types/morgan\", \"@types/node\", \"compression\", \"cors\", \"dotenv\", \"express\", \"morgan\"],\n type: \"devDependencies\",\n })\n await mkdir(\"scripts\", { recursive: true })\n await writeFile(\"scripts/start.mjs\", script, \"utf-8\")\n consola.success(\"已添加 scripts/start.js\")\n await writeFile(\"scripts/server.mjs\", scripts[type], \"utf-8\")\n consola.success(\"已添加 scripts/server.js\")\n let env = \"\"\n\n try {\n env = await readFile(\".env\", \"utf-8\")\n } catch {\n /* empty */\n }\n\n // 添加证书目录\n if (/^ *PEM_PATH=/m.test(env)) env = env.replace(/^ *PEM_PATH=.*$/m, `PEM_PATH=\"${pemPath ?? \"\"}\"`)\n else env += `\\nPEM_PATH=\"${pemPath ?? \"\"}\"`\n\n // 添加端口号\n if (/^ *PORT=/m.test(env)) env = env.replace(/^ *PORT=.*$/m, `PORT=\"${port ?? \"\"}\"`)\n else env += `\\nPORT=\"${port ?? \"\"}\"`\n\n // 添加实例数\n if (/^ *CORE=/m.test(env)) env = env.replace(/^ *CORE=.*$/m, `CORE=\"${core ?? \"\"}\"`)\n else env += `\\nCORE=\"${core ?? \"\"}\"`\n\n // 添加主机\n if (/^ *HOSTNAME=/m.test(env)) env = env.replace(/^ *HOSTNAME=.*$/m, `HOSTNAME=\"${hostname || \"\"}\"`)\n else env += `\\nHOSTNAME=\"${hostname || \"\"}\"`\n\n await writeFile(\".env\", env, \"utf-8\")\n const packageJson = await readPackageJson()\n packageJson.scripts ??= {}\n packageJson.scripts.start = \"node scripts/start.mjs\"\n await writePackageJson({ data: packageJson })\n consola.success(\"已添加启动命令 start\")\n await installDependceny()\n return getCommitMessage(CommitType.feature, \"添加启动命令\")\n}\n","import { mkdir, writeFile } from \"fs/promises\"\n\nimport inquirer from \"inquirer\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\n/**\n * 同步包脚本配置选项\n */\nexport type AddSyncPackageScriptParams = {\n /** 是否是 monorepo 项目 */\n monorepo?: boolean\n}\n\n/**\n * 添加同步包脚本\n * 用于同步 npm 包到国内镜像源\n * 支持单包项目和 monorepo 项目\n *\n * @param params 配置选项\n * @returns commit message\n */\nexport async function addSyncPackageScript({ monorepo }: AddSyncPackageScriptParams = {}) {\n let dir: string | undefined\n\n if (monorepo) {\n type Answer = {\n dir: string\n }\n\n const result = await inquirer.prompt<Answer>([\n {\n type: \"input\",\n name: \"dir\",\n message: \"请输入包目录\",\n default: \"packages\",\n },\n ])\n dir = result.dir\n }\n\n const syncPackageScript = `// @ts-check\n\n/**\n * 同步包\n * @param {string} packageName 包名\n */\nfunction syncPackage(packageName) {\n return fetch(\\`https://registry-direct.npmmirror.com/-/package/\\${packageName}/syncs\\`, {\n referrer: \"https://npmmirror.com/\",\n referrerPolicy: \"strict-origin-when-cross-origin\",\n method: \"PUT\",\n mode: \"cors\",\n credentials: \"omit\",\n })\n}\n\n${\n monorepo\n ? `async function main() {\n const { readdir, readFile, stat } = await import(\"fs/promises\")\n const { join } = await import(\"path\")\n const dir = \"${dir}\"\n const dir2 = await readdir(dir)\n /** @type {string[]} */\n const packages2 = []\n for (const item of dir2) {\n const stat2 = await stat(join(dir, item))\n if (!stat2.isDirectory()) continue\n const dir3 = await readdir(join(dir, item))\n if (!dir3.includes(\"package.json\")) continue\n const packageJson = JSON.parse(await readFile(join(dir, item, \"package.json\"), \"utf-8\"))\n if (packageJson.private) continue\n packages2.push(packageJson.name)\n }\n await Promise.all(packages2.map(syncPackage))\n}`\n : `async function main() {\n const { readFile } = await import(\"fs/promises\")\n const packageJson = JSON.parse(await readFile(\"package.json\", \"utf-8\"))\n await syncPackage(packageJson.name)\n}`\n}\n\nmain()\n`\n\n await mkdir(\"scripts\", { recursive: true })\n await writeFile(\"scripts/syncPackage.mjs\", syncPackageScript)\n const packageJson = await readPackageJson()\n packageJson.scripts ??= {}\n let name = \"sync\"\n\n if (packageJson.scripts.sync) {\n type Answer = {\n override: boolean\n }\n\n const { override } = await inquirer.prompt<Answer>([\n {\n type: \"confirm\",\n name: \"override\",\n message: \"sync 命令已存在,是否覆盖\",\n default: false,\n },\n ])\n\n if (!override) {\n type Answer = {\n name: string\n }\n\n const answer = await inquirer.prompt<Answer>([\n {\n type: \"input\",\n name: \"name\",\n message: \"请输入同步包脚本名称\",\n default: \"syncPackage\",\n },\n ])\n name = answer.name\n }\n }\n\n packageJson.scripts[name] = \"node scripts/syncPackage.mjs\"\n\n if (packageJson.scripts.postpublish) packageJson.scripts.postpublish += ` && npm run ${name}`\n else packageJson.scripts.postpublish = `npm run ${name}`\n\n await writePackageJson({ data: packageJson })\n return getCommitMessage(CommitType.feature, \"添加同步包脚本\")\n}\n","/**\n * 预处理正则表达式字符串,将易于输入的占位符替换为特殊字符\n * 支持的占位符:\n * - {{CARET}} -> ^ (匹配字符串开头)\n */\nexport function preprocessRegex(reg: string): string {\n return reg.replace(/\\{\\{CARET\\}\\}/g, \"^\")\n}\n","import { consola } from \"consola\"\nimport { simpleGit } from \"simple-git\"\n\nimport { preprocessRegex } from \"./preprocessRegex\"\nimport { shouldContinue } from \"./shouldContinue\"\n\nexport interface AddTagParams {\n /** 用于匹配 commit message 的正则表达式字符串 */\n reg: string\n /** 正则表达式标志,如 i、g、m 等 */\n flags?: string\n /** 用于替换的字符串模板,生成 tag 名称 */\n replacement: string\n /** 是否同时推送到远程仓库 */\n push?: boolean\n /** 远程仓库名称,默认为 origin */\n remote?: string\n /** 是否覆盖已存在的 tag */\n force?: boolean\n}\n\n/**\n * 为匹配的 commit 添加 git tag\n */\nexport async function addTag({ reg, flags, replacement, push, remote = \"origin\", force }: AddTagParams) {\n const git = simpleGit()\n\n // 检查是否是 git 仓库\n const isRepo = await git.checkIsRepo()\n\n if (!isRepo) {\n consola.error(\"当前目录不是 git 仓库\")\n return\n }\n\n // 检查是否有未提交的更改\n const status = await git.status()\n\n if (status.files.length > 0) {\n consola.error(\"当前 Git 仓库存在未提交的文件,请先提交或暂存这些文件\")\n return\n }\n\n // 预处理正则表达式,替换占位符\n const processedReg = preprocessRegex(reg)\n\n // 显示正则表达式和替换字符串\n consola.info(`正则表达式: /${processedReg}/${flags ?? \"\"}`)\n\n consola.info(`替换字符串: ${replacement}`)\n\n // 询问用户是否继续\n const cont = await shouldContinue(\"是否继续?\")\n\n if (!cont) {\n consola.info(\"操作已取消\")\n return\n }\n\n // 获取所有 commit 日志\n const log = await git.log()\n const commits = log.all\n\n if (commits.length === 0) {\n consola.warn(\"当前仓库没有任何 commit\")\n return\n }\n\n consola.info(`找到 ${commits.length} 个 commit`)\n\n // 获取所有已存在的 tag\n const existingTags = await git.tags()\n const allExistingTags = new Set(existingTags.all)\n\n const tagsToAdd = []\n\n // 遍历所有 commit,查找匹配的 commit message\n for (const commit of commits) {\n // 每次循环创建新的正则表达式,避免 g 标志可能带来的状态问题\n const regexp = new RegExp(processedReg, flags)\n\n // 如果 commit message 匹配正则表达式\n if (regexp.test(commit.message)) {\n // 使用正则替换生成 tag 名称\n const tagName = commit.message.replace(new RegExp(processedReg, flags), replacement)\n\n // 检查 tag 名称是否有效\n if (tagName && tagName.trim()) {\n tagsToAdd.push({\n hash: commit.hash,\n message: commit.message,\n tagName: tagName.trim(),\n })\n }\n }\n }\n\n if (tagsToAdd.length === 0) {\n consola.warn(\"没有匹配的 commit 需要添加 tag\")\n return\n }\n\n consola.info(`将要为 ${tagsToAdd.length} 个 commit 添加 tag`)\n\n // 执行添加操作\n for (const { hash, message, tagName } of tagsToAdd) {\n try {\n // 检查 tag 是否已存在\n if (allExistingTags.has(tagName)) {\n if (force) {\n // 如果强制覆盖,先删除已存在的 tag\n await git.tag([\"-d\", tagName])\n consola.info(`删除已存在的 tag: ${tagName}`)\n } else {\n consola.warn(`tag ${tagName} 已存在,跳过 (使用 force 选项可覆盖)`)\n continue\n }\n }\n\n // 为指定的 commit 添加 tag\n await git.tag([tagName, hash])\n consola.success(`本地: 为 commit ${hash.substring(0, 7)} (${message.substring(0, 50)}...) 添加 tag ${tagName}`)\n\n // 如果需要推送到远程仓库\n if (push) {\n try {\n // 推送 tag 到远程\n const pushArgs = force ? [remote, tagName, \"--force\"] : [remote, tagName]\n await git.push(pushArgs)\n consola.success(`远程: 推送 tag ${tagName}`)\n } catch (error) {\n consola.error(`推送 tag ${tagName} 到远程失败:`, error)\n }\n }\n } catch (error) {\n consola.error(`为 commit ${hash} 添加 tag ${tagName} 失败:`, error)\n }\n }\n\n consola.success(\"所有匹配的 tag 添加完成\")\n}\n","import { rm, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\n\n/** PostCSS 配置文件内容 */\nconst postcssConfig = `// @ts-check\n\n/** @type {import(\"postcss-load-config\").Config} */\nconst config = {\n plugins: {\n tailwindcss: {},\n autoprefixer: {},\n },\n}\n\nexport default config\n`\n\n/**\n * 添加 postcss.config.js 配置\n * 会先删除已存在的配置文件,然后创建新的\n */\nexport async function addPostCSSConfig() {\n try {\n await rm(\"postcss.config.js\", { force: true })\n await rm(\"postcss.config.mjs\", { force: true })\n await rm(\"postcss.config.cjs\", { force: true })\n await writeFile(\"postcss.config.mjs\", postcssConfig, \"utf-8\")\n consola.success(\"添加 postcss.config.mjs 配置成功\")\n } catch {\n consola.fail(\"添加 postcss.config.mjs 配置失败\")\n }\n}\n","import { writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\n\nimport { hasDependency } from \"./hasDependency\"\n\n/** Tailwind 默认配置内容 */\nexport const tailwindConfig = `import { Config } from \"tailwindcss\"\n\nconst config: Config = {\n content: [\n \"./*.{js,ts,jsx,tsx,html}\",\n \"./public/index.html\",\n \"./src/**/*.{js,ts,jsx,tsx}\",\n \"./app/**/*.{js,ts,jsx,tsx}\",\n \"./components/**/*.{js,ts,jsx,tsx}\",\n \"./pages/**/*.{js,ts,jsx,tsx}\",\n \"./routes/**/*.{js,ts,jsx,tsx}\",\n \"./utils/**/*.{js,ts,jsx,tsx}\"\n ],\n theme: {\n extend: {},\n },\n plugins: [],\n}\n\nexport default config\n`\n\nexport const tailwindConfigWithHeroUi = `import { heroui } from \"@heroui/react\"\nimport { Config } from \"tailwindcss\"\n\nconst config: Config = {\n content: [\n \"./*.{js,ts,jsx,tsx,html}\",\n \"./public/index.html\",\n \"./src/**/*.{js,ts,jsx,tsx}\",\n \"./app/**/*.{js,ts,jsx,tsx}\",\n \"./components/**/*.{js,ts,jsx,tsx}\",\n \"./pages/**/*.{js,ts,jsx,tsx}\",\n \"./routes/**/*.{js,ts,jsx,tsx}\",\n \"./utils/**/*.{js,ts,jsx,tsx}\",\n \"./node_modules/@heroui/theme/dist/**/*.{js,ts,jsx,tsx}\",\n ],\n theme: {\n extend: {},\n },\n darkMode: \"class\",\n plugins: [heroui()],\n}\n\nexport default config\n`\n\n/**\n * 添加 Tailwind 配置文件\n * 创建 tailwind.config.ts 文件并写入默认配置\n */\nexport async function addTailwindConfig() {\n try {\n const hasHeroUi = await hasDependency(/^@heroui\\//)\n const config = hasHeroUi ? tailwindConfigWithHeroUi : tailwindConfig\n await writeFile(\"tailwind.config.ts\", config, \"utf-8\")\n consola.success(\"添加 tailwind.config.ts 配置成功\")\n } catch {\n consola.fail(\"添加 tailwind.config.ts 配置失败\")\n }\n}\n","import { readdir, stat } from \"fs/promises\"\nimport { join } from \"path\"\n\n/**\n * 获取入口 CSS 路径\n * @param dir 目录\n * @returns 入口 CSS 目录\n */\nexport async function getEntryCssDir(dir: string): Promise<string> {\n const dir2 = await readdir(dir)\n\n if (dir2.includes(\"app\")) {\n const stats = await stat(join(dir, \"app\"))\n if (stats.isDirectory()) return getEntryCssDir(join(dir, \"app\"))\n }\n\n if (dir2.includes(\"src\")) {\n const stats = await stat(join(dir, \"src\"))\n if (stats.isDirectory()) return getEntryCssDir(join(dir, \"src\"))\n }\n\n return dir\n}\n","import { readdir, writeFile } from \"fs/promises\"\nimport { join, parse } from \"path\"\n\nimport { getEntryCssDir } from \"./getEntryCssDir\"\n\n/**\n * 创建项目的入口 CSS 文件\n * 根据目录中是否存在 index/main 或 app 文件来决定 CSS 文件名\n * @param dir 目标目录\n * @returns CSS 文件的完整路径\n */\nexport async function createEntryCss(dir = \".\") {\n const path = await getEntryCssDir(dir)\n const dir2 = await readdir(path)\n let hasIndex = false\n let hasApp = false\n\n for (const item of dir2) {\n const parsedPath = parse(item)\n if (!(parsedPath.ext === \"ts\" || parsedPath.ext === \"tsx\" || parsedPath.ext === \"js\" || parsedPath.ext === \"jsx\")) continue\n if (parsedPath.name.toLowerCase() === \"index\" || parsedPath.name.toLowerCase() === \"main\") hasIndex = true\n if (parsedPath.name.toLowerCase() === \"app\") hasApp = true\n if (hasIndex && hasApp) break\n }\n\n const cssPath = hasIndex || !hasApp ? join(path, \"index.css\") : join(path, \"app.css\")\n await writeFile(cssPath, \"\")\n return cssPath\n}\n","import { readFile, writeFile } from \"fs/promises\"\nimport { parse } from \"path\"\n\nimport consola from \"consola\"\n\nimport { createEntryCss } from \"./createEntryCss\"\nimport { getFiles } from \"./getFiles\"\n\n/**\n * 向项目中添加 Tailwind CSS 配置\n * 会在 index.css/app.css/globals.css 中添加 Tailwind 引用\n * 如果没有找到这些文件,会创建一个新的 index.css\n */\nexport async function addTailwindToCss() {\n try {\n const files = await getFiles({\n match: (path, stats) =>\n (path.base.toLowerCase() === \"index.css\" || path.base.toLowerCase() === \"app.css\" || path.base.toLowerCase() === \"globals.css\") &&\n stats.isFile(),\n count: 1,\n exclude: (path, stats) => path.base === \"node_modules\" && stats.isDirectory(),\n })\n if (files.length === 0) files.push(await createEntryCss())\n const file = files[0]\n const { base } = parse(file)\n const css = await readFile(file, \"utf-8\")\n\n if (css.includes(\"@tailwind\")) {\n consola.warn(`${base} 已经包含 tailwind`)\n return\n }\n\n await writeFile(\n file,\n `@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n${css}`,\n \"utf-8\",\n )\n consola.success(`添加 tailwind 成功`)\n } catch (error) {\n console.log(error)\n consola.fail(`添加 tailwind 失败`)\n }\n}\n","import consola from \"consola\"\n\nimport { addDependency } from \"./addDependency\"\nimport { addPostCSSConfig } from \"./addPostCSSConfig\"\nimport { addPrettier } from \"./addPrettier\"\nimport { addTailwindConfig } from \"./addTailwindConfig\"\nimport { addTailwindToCss } from \"./addTailwindToCss\"\n\n/** 添加 tailwind */\nexport async function addTailwind() {\n consola.start(\"开始添加 tailwind 配置\")\n await addDependency({\n package: [{ packageName: \"tailwindcss\", versionRange: \"^3\" }, \"autoprefixer\", \"postcss\", \"prettier\", \"prettier-plugin-tailwindcss\"],\n type: \"devDependencies\",\n })\n await addTailwindConfig()\n await addPostCSSConfig()\n await addTailwindToCss()\n await addPrettier()\n consola.success(\"添加 tailwind 配置成功\")\n}\n","import { mkdir, writeFile } from \"fs/promises\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { addDependency } from \"./addDependency\"\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nconst zipDistContent = `// @ts-check\nimport { rm } from \"fs/promises\"\nimport { zip } from \"soda-nodejs\"\n\nconst filename = process.env.FILENAME || \"dist.zip\"\n\nasync function main() {\n await rm(filename, { force: true })\n await zip({\n input: \"dist\",\n output: filename,\n })\n}\n\nmain()\n`\n\n/**\n * 压缩脚本的配置选项\n */\ntype AddZipDistConfig = {\n /** 是否自动安装依赖 */\n install?: boolean\n}\n\n/**\n * 添加构建产物压缩脚本\n * 1. 添加必要的依赖\n * 2. 创建压缩脚本\n * 3. 修改构建命令\n *\n * @param config 配置选项\n * @returns commit message\n */\nexport async function addZipDist({ install }: AddZipDistConfig = {}) {\n await addDependency({\n package: [\"soda-nodejs\"],\n type: \"devDependencies\",\n })\n await mkdir(\"scripts\", { recursive: true })\n await writeFile(\"scripts/zipDist.mjs\", zipDistContent, \"utf-8\")\n const packageJson = await readPackageJson()\n packageJson.scripts.build = `${packageJson.scripts.build} && node scripts/zipDist.mjs`\n await writePackageJson({ data: packageJson })\n if (install) await installDependceny()\n return getCommitMessage(CommitType.feature, \"添加压缩脚本\")\n}\n","export function getTypeInGenerics(str: string, start = 0) {\n if (str[start] !== \"<\") throw new Error(\"无效的泛型\")\n let count = 1\n let index: number | undefined = undefined\n\n for (let i = start + 1; i < str.length; i++) {\n const w = str[i]\n\n if (w === \"<\") {\n count++\n continue\n }\n\n if (w === \">\") {\n count--\n\n if (count === 0) {\n index = i\n break\n }\n }\n }\n\n if (index === undefined) throw new Error(\"无效的泛型\")\n return str.slice(start + 1, index)\n}\n","import { readFile, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\n\nimport { getFiles } from \"./getFiles\"\nimport { getTypeInGenerics } from \"./getTypeInGenerics\"\n\n/**\n * 表示箭头函数转换选项的类型\n */\nexport type ArrowToFunctionChoice = {\n /** 选项值 */\n value: string\n /** 简短显示名 */\n short: string\n /** 完整显示名 */\n name: string\n /** 是否默认选中 */\n checked: boolean\n}\n\n/**\n * 将 React 箭头函数组件转换为普通函数组件\n * 支持自动模式和手动选择模式\n * 自动跳过包含 memo 和 forwardRef 的组件\n */\nexport async function arrowToFunction() {\n consola.start(\"开始将转换箭头函数组件为函数组件\")\n const files = await getFiles({\n dir: \"src\",\n match: (path, stats) => path.ext === \".tsx\" && stats.isFile(),\n })\n const reg = /^(export )?const \\w+?: FC.+?$/gm\n const { auto } = await inquirer.prompt({\n type: \"confirm\",\n name: \"auto\",\n message: \"是否自动选择要转换的组件\",\n })\n\n const warnFiles: Set<string> = new Set()\n const modifiedFiles: Set<string> = new Set()\n\n if (auto) {\n for (const file of files) {\n let code = await readFile(file, \"utf-8\")\n let exportDefaultReg: RegExp | undefined = undefined\n code = code.replace(reg, match => {\n if (match.includes(\"memo(\") || match.includes(\"forwardRef(\")) {\n warnFiles.add(file)\n return match\n }\n\n modifiedFiles.add(file)\n const hasExport = match.startsWith(\"export \")\n const name = match.match(/const (\\w+?):/)![1]\n const edReg = new RegExp(`^export default ${name}$`, \"m\")\n let hasExportDefault = false\n\n if (!exportDefaultReg && !hasExport && edReg.test(code)) {\n exportDefaultReg = edReg\n hasExportDefault = true\n }\n\n const typeIndex = match.indexOf(\"FC<\")\n\n if (typeIndex > 0) {\n const type = getTypeInGenerics(match, typeIndex + 2)\n return `${hasExport ? \"export \" : \"\"}${hasExportDefault ? \"export default \" : \"\"}function ${name}(props: ${type}) {`\n }\n\n return `${hasExport ? \"export \" : \"\"}${hasExportDefault ? \"export default \" : \"\"}function ${name}() {`\n })\n if (exportDefaultReg) code = code.replace(exportDefaultReg, \"\")\n await writeFile(file, code, \"utf-8\")\n }\n } else {\n for (const file of files) {\n let code = await readFile(file, \"utf-8\")\n const matches = code.match(reg)\n if (!matches) continue\n consola.start(file)\n\n const choices = Array.from(matches).reduce((prev: ArrowToFunctionChoice[], match, index) => {\n if (match.includes(\"memo(\") || match.includes(\"forwardRef(\")) {\n warnFiles.add(file)\n return prev\n }\n\n modifiedFiles.add(file)\n const hasExport = match.startsWith(\"export \")\n const funName = match.match(/const (\\w+?):/)![1]\n const typeIndex = match.indexOf(\"FC<\")\n\n if (typeIndex > 0) {\n const type = getTypeInGenerics(match, typeIndex + 2)\n\n const name = `◆ ${match}\n ◆ ${hasExport ? \"export \" : \"\"}function ${funName}(props: ${type}) {`\n\n prev.push({\n value: index.toString(),\n short: funName,\n name,\n checked: true,\n })\n } else {\n const name = `◆ ${match}\n ◆ ${hasExport ? \"export \" : \"\"}function ${funName}() {`\n\n prev.push({\n value: index.toString(),\n short: funName,\n name,\n checked: true,\n })\n }\n\n return prev\n }, [])\n\n const length = choices.length.toString().length\n\n choices.forEach((choice, index) => {\n let first = true\n choice.name = choice.name.replace(/◆/g, () => {\n if (first) {\n first = false\n return `◆ ${(index + 1).toString().padStart(length, \"0\")}.`\n }\n\n return \"\".padStart(length + 3, \" \")\n })\n })\n\n const { indexs } = await inquirer.prompt({\n type: \"checkbox\",\n name: \"indexs\",\n message: `total ${choices.length} component${choices.length > 1 ? \"s\" : \"\"}`,\n choices,\n })\n\n const index = 0\n\n let exportDefaultReg: RegExp | undefined = undefined\n\n code = code.replace(reg, match => {\n if (!indexs.includes(index.toString())) return match\n const hasExport = match.startsWith(\"export \")\n const name = match.match(/const (\\w+?):/)![1]\n const edReg = new RegExp(`^export default ${name}$`, \"m\")\n let hasExportDefault = false\n\n if (!exportDefaultReg && !hasExport && edReg.test(code)) {\n exportDefaultReg = edReg\n hasExportDefault = true\n }\n\n const typeIndex = match.indexOf(\"FC<\")\n\n if (typeIndex > 0) {\n const type = getTypeInGenerics(match, typeIndex + 2)\n return `${hasExport ? \"export \" : \"\"}${hasExportDefault ? \"export default \" : \"\"}function ${name}(props: ${type}) {`\n }\n\n return `${hasExport ? \"export \" : \"\"}${hasExportDefault ? \"export default \" : \"\"}function ${name}() {`\n })\n\n if (exportDefaultReg) code = code.replace(exportDefaultReg, \"\")\n\n console.log()\n\n await writeFile(file, code, \"utf-8\")\n }\n }\n\n if (modifiedFiles.size > 0) consola.success(`以下文件中的箭头函数组件已经转换为函数组件:\\n\\n${Array.from(modifiedFiles).join(\"\\n\")}`)\n\n if (warnFiles.size > 0) consola.warn(`以下文件中存在 memo 或 forwardRef,请手动转换:\\n\\n${Array.from(warnFiles).join(\"\\n\")}`)\n}\n","import consola from \"consola\"\nimport dayjs from \"dayjs\"\nimport inquirer from \"inquirer\"\nimport { execAsync, spawnAsync } from \"soda-nodejs\"\n\nimport { backupFirst } from \"./backupFirst\"\nimport { isRepository } from \"./isRepository\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\n/**\n * 获取新的测试版本号\n * 如果当前是测试版本,则生成新的测试版本号\n * 如果当前是正式版本,则提示选择升级级别后生成测试版本号\n * @returns 新的测试版本号\n */\nexport async function getBetaVersion() {\n const packageJson = await readPackageJson()\n const { version } = packageJson\n const reg = /^(\\d+)\\.(\\d+)\\.(\\d+)(-beta\\.(\\d+))?$/\n const match = version.match(reg)\n\n if (!match) {\n consola.error(\"版本号不符合规范\")\n throw new Error(\"版本号不符合规范\")\n }\n\n const [, major, minor, patch, , beta] = match\n\n if (beta) {\n const newVersion = `${major}.${minor}.${patch}-beta.${dayjs().format(\"YYYYMMDDHHmmss\")}`\n packageJson.version = newVersion\n return newVersion\n }\n\n const { level } = await inquirer.prompt({\n type: \"list\",\n name: \"level\",\n message: \"请选择升级的级别\",\n choices: [\"major\", \"minor\", \"patch\", \"none\"],\n })\n let newBaseVersion = \"\"\n\n switch (level) {\n case \"major\":\n newBaseVersion = `${parseInt(major) + 1}.0.0`\n break\n case \"minor\":\n newBaseVersion = `${major}.${parseInt(minor) + 1}.0`\n break\n case \"patch\":\n newBaseVersion = `${major}.${minor}.${parseInt(patch) + 1}`\n break\n case \"none\":\n newBaseVersion = `${major}.${minor}.${patch}`\n break\n }\n\n const newVersion = `${newBaseVersion}-beta.${dayjs().format(\"YYYYMMDDHHmmss\")}`\n packageJson.version = newVersion\n return newVersion\n}\n\n/**\n * 发布测试版本\n * 1. 备份当前代码\n * 2. 更新版本号\n * 3. 提交代码并打标签\n * 4. 可选发布到 npm\n */\nexport async function betaVersion() {\n await backupFirst()\n const version = await getBetaVersion()\n const packageJson = await readPackageJson()\n packageJson.version = version\n await writePackageJson({ data: packageJson })\n\n if (await isRepository()) {\n await execAsync(\"git add .\")\n await execAsync(`git commit -m \"${version}\"`)\n await execAsync(`git tag ${version}`)\n }\n\n const { publish } = await inquirer.prompt({\n type: \"confirm\",\n name: \"publish\",\n message: \"是否现在发布\",\n })\n\n if (publish) {\n await spawnAsync(\"npm publish --tag beta\", {\n shell: true,\n stdio: \"inherit\",\n })\n }\n}\n","import { spawnAsync } from \"soda-nodejs\"\n\n/**\n * 执行 TypeScript 类型检查\n * 使用 tsc --noEmit 命令检查项目中的类型错误\n */\nexport async function checkType() {\n await spawnAsync(\"npx tsc --noEmit\", { shell: true, stdio: \"inherit\" })\n}\n","import consola from \"consola\"\nimport inquirer from \"inquirer\"\nimport { execAsync, spawnAsync } from \"soda-nodejs\"\n\nexport async function clearDockerImage(name?: string) {\n name = name?.trim()\n const output = await execAsync(`docker images -f \"dangling=true\"${name ? ` -f \"reference=*${name}*\"` : \"\"}`)\n const outputs = output.split(\"\\n\").filter(Boolean)\n\n if (outputs.length === 1) {\n consola.warn(\"没有找到需要删除的镜像\")\n return\n }\n\n const images = outputs.slice(1).map(item => item.match(/<none> +([0-9a-f]{12}) +/)![1])\n\n interface Answer {\n images: string[]\n }\n\n const { images: images2 } = await inquirer.prompt<Answer>({\n type: \"checkbox\",\n name: \"images\",\n message: \"选择要删除的镜像\",\n choices: outputs.map((item, index) => ({\n name: item,\n value: index === 0 ? \"\" : images[index - 1],\n disabled: index === 0,\n checked: index !== 0, // 默认选中除第一项外的所有项\n })),\n })\n\n for (let i = 0; i < images2.length; i++) {\n const image = images2[i]\n\n try {\n consola.ready(`正在删除 ${image}`)\n await spawnAsync(`docker rmi ${image}`, {\n shell: true,\n stdio: \"inherit\",\n })\n consola.success(`删除 ${image} 成功`)\n } catch {\n consola.error(`删除 ${image} 失败`)\n if (i === images2.length - 1) break\n\n interface Answer2 {\n next: boolean\n }\n\n const { next } = await inquirer.prompt<Answer2>({\n type: \"confirm\",\n name: \"next\",\n message: \"是否继续删除下一个镜像\",\n default: true,\n })\n if (!next) break\n }\n }\n}\n","import { spawnAsync } from \"soda-nodejs\"\n\nexport async function clearDockerLog(name: string) {\n await spawnAsync(`truncate -s 0 $(docker inspect --format='{{.LogPath}}' ${name})`, {\n shell: true,\n stdio: \"inherit\",\n })\n}\n","/**\n * 将代码文件转换为 VS Code 代码片段格式\n * 支持自定义占位符替换\n * @param path 源代码文件路径\n */\nimport { readFile } from \"fs/promises\"\nimport { parse } from \"path\"\n\nimport clipboard from \"clipboardy\"\nimport inquirer from \"inquirer\"\n\nexport async function code2Snippet(path: string) {\n const { name } = parse(path)\n const code = await readFile(path, \"utf-8\")\n\n const placeholders: string[] = []\n\n while (true) {\n let { placeholder } = await inquirer.prompt({\n type: \"input\",\n name: \"placeholder\",\n message: \"请输入需要替换的占位符,输入空字符串结束\",\n })\n placeholder = placeholder.trim()\n if (!placeholder) break\n placeholders.push(placeholder)\n }\n\n const lines = code.split(\"\\n\")\n const reg = /^ *$/\n const reg2 = /^ */\n const trim = Math.min(...lines.map(line => (reg.test(line) ? Infinity : reg2.exec(line)![0].length)))\n\n function line2Snippet(line: string) {\n line = line.slice(trim).trimEnd().replace(/\\\\/g, `\\\\\\\\`).replace(/\"/g, `\\\\\"`).replace(/\\$/g, `\\\\\\\\$`)\n\n placeholders.forEach((placeholder, index) => {\n const reg = new RegExp(placeholder, \"g\")\n line = line.replace(reg, `\\${${index + 1}:${placeholder}}`)\n })\n\n return ` \"${line}\"`\n }\n\n const body = lines.map(line2Snippet).join(\",\\n\")\n\n const snippet = `,\n \"${name}\": {\n \"scope\": \"javascript,javascriptreact,typescript,typescriptreact\",\n \"prefix\": \"${name.toLowerCase().replace(/\\W/, \"\")}\",\n \"body\": [\n${body}\n ]\n }`\n\n await clipboard.write(snippet)\n}\n","import { writeFile } from \"fs/promises\"\n\n/**\n * 创建 .browserslistrc 配置文件\n * 用于指定项目支持的浏览器版本范围\n */\nexport async function createBrowserlistrc() {\n await writeFile(\n \".browserslistrc\",\n `chrome >= 87\nedge >= 88\nfirefox >= 78\nsafari >= 14`,\n \"utf-8\",\n )\n}\n","import { copyFile, mkdir, readdir, rm, writeFile } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport { spawnAsync, zip } from \"soda-nodejs\"\n\nconst json = {\n name: \"prisma-debugger\",\n version: \"1.0.0\",\n main: \"index.ts\",\n type: \"module\",\n dependencies: {},\n devDependencies: {},\n}\n\nconst schema = `// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"generated\"\n runtime = \"nodejs\"\n moduleFormat = \"esm\"\n generatedFileExtension = \"ts\"\n importFileExtension = \"\"\n binaryTargets = [\"windows\", \"debian-openssl-1.0.x\", \"debian-openssl-1.1.x\", \"debian-openssl-3.0.x\", \"rhel-openssl-1.0.x\", \"rhel-openssl-1.1.x\", \"rhel-openssl-3.0.x\"]\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel User {\n id String @id @default(uuid()) // 主键ID\n name String\n}\n`\n\nconst index = `import { PrismaClient } from \"./prisma/generated/client\"\n\nconst prisma = new PrismaClient()\n`\n\nconst env = `DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres`\n\nexport async function createPrismaDebugger() {\n try {\n await mkdir(\"prisma-debugger/prisma\", { recursive: true })\n await writeFile(\"prisma-debugger/package.json\", JSON.stringify(json, null, 4), \"utf-8\")\n\n await spawnAsync(\"npm i @prisma/client\", {\n cwd: \"prisma-debugger\",\n stdio: \"inherit\",\n shell: true,\n })\n\n await spawnAsync(\"npm i @types/node cross-env prisma tsx typescript --save-dev\", {\n cwd: \"prisma-debugger\",\n stdio: \"inherit\",\n shell: true,\n })\n\n await writeFile(\"prisma-debugger/prisma/schema.prisma\", schema, \"utf-8\")\n\n await spawnAsync(\"npx prisma generate\", {\n cwd: \"prisma-debugger\",\n stdio: \"inherit\",\n shell: true,\n })\n\n const dir = await readdir(\"prisma-debugger/prisma/generated\")\n\n for (const item of dir) {\n if (item.endsWith(\".node\")) await copyFile(join(\"prisma-debugger/prisma/generated\", item), join(\"prisma-debugger/node_modules/prisma\", item))\n }\n\n await writeFile(\"prisma-debugger/index.ts\", index, \"utf-8\")\n await writeFile(\"prisma-debugger/.env\", env, \"utf-8\")\n\n await zip({\n input: \"prisma-debugger\",\n output: \"prisma-debugger.zip\",\n })\n } catch (error) {\n await rm(\"prisma-debugger\", { recursive: true })\n }\n\n await rm(\"prisma-debugger\", { recursive: true })\n}\n","import type { Headers as NodeFetchHeaders } from \"node-fetch\"\n\n/**\n * 从 HTTP headers 中提取文件名\n * @param headers HTTP headers对象\n * @returns 文件名,如果未找到则返回 undefined\n */\nexport function getFilename(headers: Headers | NodeFetchHeaders) {\n const disposition = headers.get(\"content-disposition\")\n if (!disposition) return undefined\n const reg = /filename=(.+?);/\n const result = disposition.match(reg)\n if (!result) return undefined\n return result[1]\n}\n","import { createWriteStream } from \"fs\"\nimport { join } from \"path\"\nimport { Readable } from \"stream\"\n\nimport fetch from \"node-fetch\"\n\nimport { agent } from \"@/constant/index\"\n\nimport { getFilename } from \"./getFilename\"\n\n/**\n * 通用文件下载函数\n * @param url 下载地址\n * @param dir 下载目标目录\n * @param filename 可选的文件名\n * @returns 实际保存的文件名\n */\nexport async function download(url: string, dir: string, filename?: string) {\n const response = await fetch(url, { agent })\n filename = getFilename(response.headers) || filename || new URL(url).pathname.split(\"/\").at(-1)!\n filename = filename.replace(/^\"(.+?)\"$/, \"$1\")\n const writeable = createWriteStream(join(dir, filename))\n await new Promise<0>((resolve, reject) =>\n Readable.from(response.body!)\n .pipe(writeable)\n .on(\"finish\", () => resolve(0))\n .on(\"error\", reject))\n return filename\n}\n","export async function sleep(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n","import { rename } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport consola from \"consola\"\nimport fetch from \"node-fetch\"\nimport YAML from \"yaml\"\n\nimport { agent } from \"@/constant/index\"\n\nimport { download } from \"./download\"\nimport { sleep } from \"./sleep\"\n\n/**\n * Winget 包管理器相关类型定义\n */\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Winget {\n export interface Package {\n PackageIdentifier: string\n PackageVersion: string\n InstallerType: string\n InstallModes: string[]\n InstallerSwitches: InstallerSwitches\n ExpectedReturnCodes: ExpectedReturnCode[]\n UpgradeBehavior: string\n Protocols: string[]\n FileExtensions: string[]\n AppsAndFeaturesEntries: AppsAndFeaturesEntry[]\n Installers: Installer[]\n ManifestType: string\n ManifestVersion: string\n }\n\n export interface Installer {\n Architecture: string\n Scope?: string\n InstallerUrl: string\n InstallerSha256: string\n InstallerLocale?: string\n InstallerType?: string\n }\n\n export interface InstallerSwitches2 {\n Custom: string\n }\n\n export interface AppsAndFeaturesEntry {\n UpgradeCode: string\n InstallerType: string\n }\n\n export interface ExpectedReturnCode {\n InstallerReturnCode: number\n ReturnResponse: string\n }\n\n export interface InstallerSwitches {\n Log: string\n }\n}\n\nexport interface GithubContent {\n name: string\n path: string\n sha: string\n size: number\n url: string\n html_url: string\n git_url: string\n download_url?: string | null\n type: string\n _links: Links\n}\n\nexport interface Links {\n self: string\n git: string\n html: string\n}\n\n/**\n * 从 Winget 仓库下载软件\n * 1. 获取软件最新版本信息\n * 2. 解析安装包配置\n * 3. 下载并重命名安装包\n * @param param0 下载配置\n * @param param0.name 软件名称\n * @param param0.id Winget ID\n * @param param0.dir 下载目录\n * @param param0.filter 安装包筛选函数\n */\nexport async function downloadFromWinget({ name, id, dir, filter }: WingetDownloadInfo) {\n const firstLetter = id[0].toLowerCase()\n const path = id.replace(/\\./g, \"/\")\n const response = await fetch(`https://api.github.com/repos/microsoft/winget-pkgs/contents/manifests/${firstLetter}/${path}`, { agent })\n\n const data: GithubContent[] = (await response.json()) as any\n\n if (!Array.isArray(data)) throw new Error((data as any).message)\n\n const reg2 = /^\\d+(\\.\\d+?)*$/\n const stables = data.filter(item => reg2.test(item.name))\n\n stables.sort((a, b) => {\n const avs = a.name.split(\".\")\n const bvs = b.name.split(\".\")\n const max = Math.max(avs.length, bvs.length)\n\n for (let i = 0; i < max; i++) {\n const av = avs[i] ? parseInt(avs[i]) : 0\n const bv = bvs[i] ? parseInt(bvs[i]) : 0\n if (av < bv) return 1\n if (av > bv) return -1\n }\n\n return 0\n })\n\n const response2 = await fetch(\n `https://raw.githubusercontent.com/microsoft/winget-pkgs/master/manifests/${firstLetter}/${path}/${stables[0].name}/${id}.installer.yaml`,\n { agent },\n )\n const yaml = await response2.text()\n const pkg: Winget.Package = YAML.parse(yaml)\n\n const installers = filter ? pkg.Installers.filter(filter) : pkg.Installers\n\n if (installers.length === 0) {\n consola.warn(`未找到 ${name} 的安装程序`)\n return\n }\n\n const result: WingetItem[] = []\n\n for (const { InstallerUrl, Architecture } of installers) {\n const filename = await download(InstallerUrl, dir)\n\n result.push({\n filename,\n version: pkg.PackageVersion,\n ext: new URL(InstallerUrl).pathname.endsWith(\".exe\") ? \"exe\" : \"msi\",\n architecture: Architecture,\n })\n }\n\n for (const { version, filename, architecture, ext } of result) {\n await sleep(100)\n await rename(join(dir, filename), join(dir, `${name}-${version}-${architecture}.${ext}`))\n }\n}\n\nexport type WingetItem = {\n filename: string\n version: string\n ext: string\n architecture: string\n}\n\nexport type WingetDownloadInfo = {\n name: string\n id: string\n dir: string\n filter: (item: Winget.Installer, index: number, arr: Winget.Installer[]) => boolean\n}\n","/**\n * 从 Winget 下载 7Zip 压缩软件\n * @param dir 下载目标目录\n */\nimport { downloadFromWinget } from \"./downloadFromWinget\"\n\nexport async function download7Zip(dir: string) {\n await downloadFromWinget({\n name: \"7Zip\",\n id: \"7zip.7zip\",\n dir,\n filter: item => item.Architecture === \"x64\" && item.InstallerType === \"exe\",\n })\n}\n","import { downloadFromWinget } from \"./downloadFromWinget\"\n\n/**\n * 从 Winget 下载 AnyDesk 远程控制软件\n * @param dir 下载目标目录\n */\nexport async function downloadAnydesk(dir: string) {\n await downloadFromWinget({\n name: \"AnyDesk\",\n id: \"AnyDeskSoftwareGmbH.AnyDesk\",\n dir,\n filter: item => item.InstallerType === \"exe\",\n })\n}\n","import fetch from \"node-fetch\"\n\nimport { agent } from \"@/constant\"\n\n/**\n * GitHub Release 信息接口\n */\nexport interface Release {\n url: string\n assets_url: string\n upload_url: string\n html_url: string\n id: number\n author: Author\n node_id: string\n tag_name: string\n target_commitish: string\n name: string\n draft: boolean\n prerelease: boolean\n created_at: string\n published_at: string\n assets: Asset[]\n tarball_url: string\n zipball_url: string\n body: string\n discussion_url: string\n reactions: Reactions\n}\n\nexport interface Reactions {\n url: string\n total_count: number\n \"+1\": number\n \"-1\": number\n laugh: number\n hooray: number\n confused: number\n heart: number\n rocket: number\n eyes: number\n}\n\nexport interface Asset {\n url: string\n id: number\n node_id: string\n name: string\n label?: string\n uploader: Author\n content_type: string\n state: string\n size: number\n download_count: number\n created_at: string\n updated_at: string\n browser_download_url: string\n}\n\nexport interface Author {\n login: string\n id: number\n node_id: string\n avatar_url: string\n gravatar_id: string\n url: string\n html_url: string\n followers_url: string\n following_url: string\n gists_url: string\n starred_url: string\n subscriptions_url: string\n organizations_url: string\n repos_url: string\n events_url: string\n received_events_url: string\n type: string\n site_admin: boolean\n}\n\n/**\n * 获取 GitHub 仓库的最新发布版本信息\n * @param owner 仓库所有者\n * @param repo 仓库名称\n * @returns Release 信息\n * @description 通过 GitHub API 获取仓库的最新发布信息\n */\nexport async function getLatestRelease(owner: string, repo: string): Promise<Release> {\n const url = `https://api.github.com/repos/${owner}/${repo}/releases/latest`\n const response = await fetch(url, { agent })\n const data = await response.json()\n return data as Release\n}\n","import { rename, rm } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport { unzip } from \"soda-nodejs\"\n\nimport { download } from \"./download\"\nimport { getLatestRelease } from \"./getLatestRelease\"\n\n/**\n * 从 GitHub 下载 Bun 运行时并解压安装\n * @param dir 下载目标目录\n * @throws 如果找不到对应的下载文件\n */\nexport async function downloadBun(dir: string) {\n const release = await getLatestRelease(\"oven-sh\", \"bun\")\n const url = release.assets.find(asset => asset.name === \"bun-windows-x64.zip\")?.browser_download_url\n if (!url) throw new Error(\"未找到 bun-windows-x64.zip\")\n await download(url, dir)\n await unzip({\n input: \"bun-windows-x64.zip\",\n output: \".\",\n cwd: dir,\n })\n await rename(join(dir, \"bun-windows-x64\", \"bun.exe\"), join(dir, \"bun.exe\"))\n await rm(join(dir, \"bun-windows-x64.zip\"), { force: true })\n await rm(join(dir, \"bun-windows-x64\"), { force: true, recursive: true })\n}\n","import { downloadFromWinget } from \"./downloadFromWinget\"\n\n/**\n * 从 Winget 下载 Chrome 浏览器\n * @param dir 下载目标目录\n */\nexport async function downloadChrome(dir: string) {\n await downloadFromWinget({\n name: \"Chrome\",\n id: \"Google.Chrome\",\n dir,\n filter: item => item.Architecture === \"x64\",\n })\n}\n","import { download } from \"./download\"\n\n/**\n * PCQQ 下载接口返回数据类型\n */\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace PCQQ {\n export interface Result {\n resp: Resp\n }\n\n export interface Resp {\n soft_list: Softlist[]\n retCode: number\n }\n\n export interface Softlist {\n soft_id: number\n os_type: number\n os_bit: number\n display_name: string\n nick_ver: string\n ver_name: string\n file_size: string\n file_name: string\n publish_date: string\n download_url: string\n download_https_url: string\n }\n}\n\n/**\n * 从腾讯电脑管家下载软件\n * @param dir 下载目录\n * @param cmdid 命令ID\n * @param soft_id_list 软件ID列表\n */\nexport async function downloadFromPCQQ(dir: string, cmdid: number, soft_id_list: number) {\n const data = new URLSearchParams()\n data.set(\"cmdid\", cmdid.toString())\n data.set(\"jprxReq[req][soft_id_list][]\", soft_id_list.toString())\n const headers = new Headers()\n headers.set(\"Content-Type\", \"application/x-www-form-urlencoded\")\n const response = await fetch(`https://luban.m.qq.com/api/public/software-manager/softwareProxy`, {\n method: \"POST\",\n headers,\n body: data.toString(),\n })\n const result: PCQQ.Result = await response.json()\n await download(result.resp.soft_list[0].download_https_url, dir, result.resp.soft_list[0].file_name)\n}\n","import { readdir, rename } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport { downloadFromPCQQ } from \"./downloadFromPCQQ\"\n\n/**\n * 下载 DeskGo 工具并重命名文件\n * @param dir 下载目标目录\n */\nexport async function downloadDeskGo(dir: string) {\n await downloadFromPCQQ(dir, 3318, 23125)\n const dir2 = await readdir(dir)\n const file = dir2.find(item => item.startsWith(\"DeskGo\"))!\n await rename(\n join(dir, file),\n join(\n dir,\n file.replace(/^DeskGo_(.+)_full\\.exe$/, (match, arg) => `DeskGo-${arg.replace(/_/g, \".\")}-x64.exe`),\n ),\n )\n}\n","import { downloadFromWinget } from \"./downloadFromWinget\"\n\n/**\n * 下载 Firefox 浏览器中文版\n * @param dir 下载目录\n */\nexport async function downloadFirefox(dir: string) {\n await downloadFromWinget({\n name: \"Firefox\",\n id: \"Mozilla.Firefox.zh-CN\",\n dir,\n filter: item => item.Architecture === \"x64\",\n })\n}\n","import { rename, rm } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport { unzip } from \"soda-nodejs\"\n\nimport { download } from \"./download\"\n\n/**\n * 下载 Geek Uninstaller 卸载工具\n * 1. 下载 zip 文件\n * 2. 解压并获取版本号\n * 3. 重命名为带版本号的文件名\n * @param dir 下载目录\n */\nexport async function downloadGeekUninstaller(dir: string) {\n await download(`https://geekuninstaller.com/geek.zip`, dir)\n await unzip({\n input: join(dir, \"geek.zip\"),\n output: dir,\n })\n await rm(join(dir, \"geek.zip\"), { force: true })\n const response = await fetch(\"https://geekuninstaller.com/download\")\n const text = await response.text()\n const version = text.match(/<b>(.+?)<\\/b>/)![1]\n await rename(join(dir, \"geek.exe\"), join(dir, `Geek-${version}-x64.exe`))\n}\n","import { downloadFromWinget } from \"./downloadFromWinget\"\n\n/**\n * 下载 Git 版本控制工具\n * @param dir 下载目录\n */\nexport async function downloadGit(dir: string) {\n await downloadFromWinget({\n name: \"Git\",\n id: \"Git.Git\",\n dir,\n filter: item => item.Architecture === \"x64\" && item.Scope === \"machine\",\n })\n}\n","import { download } from \"./download\"\n\n/**\n * 下载 Honeyview 图片查看器\n * @param dir 下载目录\n */\nexport async function downloadHoneyview(dir: string) {\n await download(\"https://www.bandisoft.com/honeyview/dl.php?web\", dir, \"Honeyview-5.53-neutral.exe\")\n}\n","import { downloadFromWinget } from \"./downloadFromWinget\"\n\n/**\n * 下载 NodeJS LTS 版本\n * @param dir 下载目录\n */\nexport async function downloadNodeJS(dir: string) {\n await downloadFromWinget({\n name: \"NodeJS\",\n id: \"OpenJS.NodeJS.LTS\",\n dir,\n filter: item => item.Architecture === \"x64\",\n })\n}\n","import { downloadFromWinget } from \"./downloadFromWinget\"\n\n/**\n * 下载 peazip 压缩软件\n * @param dir 下载目录\n */\nexport async function downloadPeaZip(dir: string) {\n await downloadFromWinget({\n name: \"PeaZip\",\n id: \"Giorgiotani.Peazip\",\n dir,\n filter: item => item.Architecture === \"x64\",\n })\n}\n","import { downloadFromWinget } from \"./downloadFromWinget\"\n\n/**\n * 下载 PotPlayer 播放器\n * @param dir 下载目录\n */\nexport async function downloadPotPlayer(dir: string) {\n await downloadFromWinget({\n name: \"PotPlayer\",\n id: \"Daum.PotPlayer\",\n dir,\n filter: item => item.Architecture === \"x64\",\n })\n}\n","import { downloadFromWinget } from \"./downloadFromWinget\"\n\n/**\n * 下载 PowerShell\n * @param dir 下载目录\n */\nexport async function downloadPowerShell(dir: string) {\n await downloadFromWinget({\n name: \"PowerShell\",\n id: \"Microsoft.PowerShell\",\n dir,\n filter: item => item.Architecture === \"x64\",\n })\n}\n","/**\n * 通过 winget 下载 PowerToys\n * @param dir 下载目标目录\n */\nimport { downloadFromWinget } from \"./downloadFromWinget\"\n\nexport async function downloadPowerToys(dir: string) {\n await downloadFromWinget({\n name: \"PowerToys\",\n id: \"Microsoft.PowerToys\",\n dir,\n filter: item => item.Architecture === \"x64\" && item.Scope === \"machine\",\n })\n}\n","import { downloadFromWinget } from \"./downloadFromWinget\"\n\n/**\n * 通过 winget 下载 VSCode\n * @param dir 下载目标目录\n */\nexport async function downloadVscode(dir: string) {\n await downloadFromWinget({\n name: \"VSCode\",\n id: \"Microsoft.VisualStudioCode\",\n dir,\n filter: item => item.Architecture === \"x64\" && item.Scope === \"machine\",\n })\n}\n","import { existsSync } from \"fs\"\nimport { readFile } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\nimport { EditorConfigType, SyncEditorSettingSource } from \"./syncEditorSetting\"\n\nexport interface SyncEditorFileConfig {\n backup?: boolean\n}\n\nexport interface SyncEditorConfig {\n fileConfigs?: Record<string, SyncEditorFileConfig>\n types?: EditorConfigType[]\n source?: SyncEditorSettingSource\n targets?: SyncEditorSettingSource[]\n onlinePath?: string\n}\n\nexport interface ZixuluSetting {\n vscodeDownloadHistory?: string[]\n softwareDownloadHistory?: string[]\n upgradeWorkspaceDependcenyHistory?: Record<string, string[]>\n syncEditor?: SyncEditorConfig\n verdaccioPath?: string\n}\n\nexport async function readZixuluSetting(): Promise<ZixuluSetting> {\n const userDir = homedir()\n const settingPath = join(userDir, \".zixulu.json\")\n\n if (existsSync(settingPath)) {\n const setting = JSON.parse(await readFile(settingPath, \"utf-8\"))\n return setting\n }\n\n return {}\n}\n","import { writeFile } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\nimport { ZixuluSetting } from \"./readZixuluSetting\"\n\nexport async function writeZixuluSetting(setting: ZixuluSetting) {\n const userDir = homedir()\n const settingPath = join(userDir, \".zixulu.json\")\n await writeFile(settingPath, JSON.stringify(setting, undefined, 4), \"utf-8\")\n}\n","import { mkdir } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport dayjs from \"dayjs\"\nimport inquirer from \"inquirer\"\n\nimport { Software } from \"@/constant/index\"\n\nimport { download7Zip } from \"./download7Zip\"\nimport { downloadAnydesk } from \"./downloadAnydesk\"\nimport { downloadBun } from \"./downloadBun\"\nimport { downloadChrome } from \"./downloadChrome\"\nimport { downloadDeskGo } from \"./downloadDeskGo\"\nimport { downloadFirefox } from \"./downloadFirefox\"\nimport { downloadGeekUninstaller } from \"./downloadGeekUninstaller\"\nimport { downloadGit } from \"./downloadGit\"\nimport { downloadHoneyview } from \"./downloadHoneyview\"\nimport { downloadNodeJS } from \"./downloadNodeJS\"\nimport { downloadPeaZip } from \"./downloadPeazip\"\nimport { downloadPotPlayer } from \"./downloadPotPlayer\"\nimport { downloadPowerShell } from \"./downloadPowerShell\"\nimport { downloadPowerToys } from \"./downloadPowerToys\"\nimport { downloadVscode } from \"./downloadVscode\"\nimport { readZixuluSetting } from \"./readZixuluSetting\"\nimport { writeZixuluSetting } from \"./writeZixuluSetting\"\n\n/**\n * 软件下载函数映射表\n * 键为软件名称,值为对应的下载函数\n */\nexport const SoftwareDownloadMap: Record<Software, (dir: string) => Promise<void>> = {\n [Software.Chrome]: downloadChrome,\n [Software.NodeJS]: downloadNodeJS,\n [Software[\"7zip\"]]: download7Zip,\n [Software[\"PeaZip\"]]: downloadPeaZip,\n [Software.Git]: downloadGit,\n [Software.DeskGo]: downloadDeskGo,\n [Software[\"Geek Uninstaller\"]]: downloadGeekUninstaller,\n [Software[\"VS Code\"]]: downloadVscode,\n [Software.PowerToys]: downloadPowerToys,\n [Software.Honeyview]: downloadHoneyview,\n [Software.AnyDesk]: downloadAnydesk,\n [Software.Firefox]: downloadFirefox,\n [Software.PotPlayer]: downloadPotPlayer,\n [Software.Bun]: downloadBun,\n [Software.PowerShell]: downloadPowerShell,\n}\n\n/**\n * 交互式下载最新版本的软件\n * 1. 提示用户选择要下载的软件\n * 2. 创建下载目录\n * 3. 依次下载选中的软件\n */\nexport async function downloadLatestSoftware() {\n consola.start(\"开始下载软件\")\n const dir = `softwares-${dayjs().format(\"YYYYMMDDHHmmss\")}`\n const setting = await readZixuluSetting()\n const softwareDownloadHistory = setting?.softwareDownloadHistory as Software[] | undefined\n const { softwares } = await inquirer.prompt({\n type: \"checkbox\",\n name: \"softwares\",\n message: \"请选择要下载的软件\",\n choices: Object.values(Software),\n default: softwareDownloadHistory?.filter(software => Object.values(Software).includes(software)) ?? Object.values(Software),\n })\n setting.softwareDownloadHistory = softwares\n await writeZixuluSetting(setting)\n if (softwares.length === 0) return\n await mkdir(dir, { recursive: true })\n\n for (const software of softwares) {\n consola.start(`正在下载 ${software}`)\n await SoftwareDownloadMap[software as Software](dir)\n }\n\n consola.success(\"软件下载完成\")\n}\n","import { readPackageJson } from \"./readPackageJson\"\n\n/**\n * 获取指定包在 package.json 中的版本号\n * @param packageName 包名\n * @param dir 项目目录,默认为当前目录\n * @returns 版本号,如果未找到则返回 undefined\n * @description 依次检查 dependencies、devDependencies、peerDependencies 和 optionalDependencies\n */\nexport async function getPackageVersionInDependcy(packageName: string, dir = \".\"): Promise<string | undefined> {\n const packageJson = await readPackageJson(dir)\n const version =\n packageJson.dependencies?.[packageName] ??\n packageJson.devDependencies?.[packageName] ??\n packageJson.peerDependencies?.[packageName] ??\n packageJson.optionalDependencies?.[packageName]\n if (!version) return undefined\n return version.replace(/^\\D+/, \"\")\n}\n","import { mkdir, readdir, rename, rm } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport consola from \"consola\"\nimport { execAsync, zip } from \"soda-nodejs\"\n\nimport { getPackageVersionInDependcy } from \"./getPackageVersionInDependcy\"\n\n/**\n * 下载 NPM 包并打包成 zip\n * @param name NPM 包名\n * @throws {Error} 如果目标文件夹已存在\n */\nexport async function downloadNpm(name: string) {\n consola.start(`开始下载 ${name}`)\n const folder = `${name}-cache`\n const dir = await readdir(\".\")\n\n if (dir.includes(folder)) {\n consola.warn(\"文件夹已存在\")\n throw new Error(\"文件夹已存在\")\n }\n\n await mkdir(folder, { recursive: true })\n await execAsync(`npm init -y`, { cwd: folder })\n await execAsync(`npm install ${name}`, { cwd: folder })\n const version = await getPackageVersionInDependcy(name, folder)\n const file = `${name}@${version}.zip`\n await mkdir(join(folder, \"node_modules\", name, \"node_modules\"))\n const dir2 = await readdir(join(folder, \"node_modules\"))\n\n for (const item of dir2) {\n if (item === name) continue\n\n if (item.startsWith(\".\")) {\n await rm(join(folder, \"node_modules\", item), { recursive: true })\n continue\n }\n\n await rename(join(folder, \"node_modules\", item), join(folder, \"node_modules\", name, \"node_modules\", item))\n }\n\n await zip({\n input: name,\n output: file,\n cwd: join(folder, \"node_modules\"),\n })\n await rename(join(folder, \"node_modules\", file), join(file))\n await rm(folder, { recursive: true })\n consola.success(`下载 ${name} 完成`)\n}\n","import { spawnAsync } from \"soda-nodejs\"\n\n/**\n * 执行 Prisma 数据库推送和客户端生成命令\n * 运行 'npx prisma db push' 和 'npx prisma generate'\n */\nexport async function generatePrisma() {\n await spawnAsync(\"npx prisma db push && npx prisma generate\", {\n shell: true,\n stdio: \"inherit\",\n })\n}\n","import clipboard from \"clipboardy\"\n\n/**\n * 将浏览器中直接复制的 headers 转换为对象\n * 此函数从剪贴板读取 headers 文本,并转换为 Headers 对象的初始化代码\n * @returns void - 将生成的代码写入剪贴板\n * @throws Error 当 headers 格式不正确时抛出错误\n */\nexport async function getHeaders() {\n const str = await clipboard.read()\n const reg = /^(.+?):$[\\n\\r]*^(.+?)$/gm\n const reg2 = new RegExp(reg.source, \"m\")\n\n const result = [`const headers = new Headers()`]\n\n const match = str.match(reg)\n if (!match) throw new Error(\"headers 格式错误\")\n\n Array.from(match).forEach(item => {\n const match2 = item.match(reg2)\n result.push(`headers.set(\"${match2![1].trim()}\", \\`${match2![2].trim()}\\`)`)\n })\n\n await clipboard.write(result.join(\"\\n\"))\n}\n","import { writeFile } from \"fs/promises\"\nimport { parse, resolve } from \"path\"\n\nconst { name } = parse(resolve(\".\"))\n\nconst packageJson = `{\n \"name\": \"${name}\",\n \"version\": \"1.0.0\",\n \"description\": \"\",\n \"main\": \"index.ts\",\n \"scripts\": {},\n \"keywords\": [],\n \"author\": \"\",\n \"license\": \"ISC\",\n \"type\": \"module\",\n \"dependencies\": {},\n \"devDependencies\": {\n \"@types/node\": \"^22.14.1\",\n \"typescript\": \"^5.8.3\"\n }\n}\n`\n\nconst config = `{\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"esModuleInterop\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"strict\": true,\n \"skipLibCheck\": true\n }\n}\n`\n\nexport async function initNode() {\n await writeFile(\"index.ts\", \"\", \"utf-8\")\n await writeFile(\"package.json\", packageJson, \"utf-8\")\n await writeFile(\"tsconfig.json\", config, \"utf-8\")\n}\n","import consola from \"consola\"\n\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport async function next() {\n consola.start(\"开始设置 next 配置\")\n const pkg = await readPackageJson()\n pkg.scripts.dev += \" --hostname 0.0.0.0 --port 5173\"\n await writePackageJson({ data: pkg })\n consola.success(\"设置 next 配置成功\")\n}\n","import { readPackageJson } from \"./readPackageJson\"\n\n/**\n * 从 package.json 中获取指定依赖的版本\n * @param name 依赖包名称\n * @returns 依赖版本号,如果未找到则返回 undefined\n */\nexport async function getDependcy(name: string): Promise<string | undefined> {\n const packageJson = await readPackageJson()\n return (\n packageJson.dependencies?.[name] ||\n packageJson.devDependencies?.[name] ||\n packageJson.peerDependencies?.[name] ||\n packageJson.optionalDependencies?.[name]\n )\n}\n","import { getDependcy } from \"./getDependcy\"\n\n/**\n * 检查项目是否安装了 Tailwind CSS\n * @returns 返回 true 表示已安装 Tailwind CSS,false 表示未安装\n */\nexport async function checkTailwind() {\n return !!(await getDependcy(\"tailwindcss\"))\n}\n","import { writeFile } from \"fs/promises\"\n\nexport interface WriteRsbuildConfigParams {\n /** 项目标题 */\n title: string\n /** 项目描述 */\n description: string\n /** 挂载 id */\n mountId: string\n}\n\nexport async function writeRsbuildConfig({ title, description, mountId }: WriteRsbuildConfigParams) {\n const rsbuildConfig = `import { defineConfig } from \"@rsbuild/core\"\nimport { pluginBabel } from \"@rsbuild/plugin-babel\"\nimport { pluginReact } from \"@rsbuild/plugin-react\"\nimport { pluginSvgr } from \"@rsbuild/plugin-svgr\"\n\nexport default defineConfig({\n html: {\n title: \"${title}\",\n meta: {\n description: \"${description}\",\n },\n mountId: \"${mountId}\",\n },\n plugins: [\n pluginReact(),\n pluginBabel({\n include: /\\\\.(?:jsx|tsx)$/,\n babelLoaderOptions(config) {\n config.plugins ??= []\n config.plugins?.unshift(\"babel-plugin-react-compiler\")\n },\n }),\n pluginSvgr({\n svgrOptions: {\n exportType: \"default\",\n svgoConfig: {\n plugins: [\n {\n name: \"prefixIds\",\n params: {\n prefixIds: false,\n prefixClassNames: false,\n },\n },\n ],\n },\n },\n }),\n ],\n server: {\n port: 5173,\n },\n output: {\n polyfill: \"entry\",\n },\n})\n`\n\n await writeFile(\"rsbuild.config.ts\", rsbuildConfig, \"utf-8\")\n}\n","import { rm, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\n\nimport { addDependency } from \"./addDependency\"\nimport { checkTailwind } from \"./checkTailwind\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { readTsConfig } from \"./readTsConfig\"\nimport { writeRsbuildConfig, WriteRsbuildConfigParams } from \"./writeRsbuildConfig\"\nimport { writeTsConfig } from \"./writeTsConfig\"\n\nexport async function rsbuild() {\n consola.start(\"开始设置 rsbuild 配置\")\n await addDependency({\n package: [\"@rsbuild/plugin-svgr\", \"@rsbuild/plugin-babel\", \"babel-plugin-react-compiler\"],\n type: \"devDependencies\",\n })\n const packageJson = await readPackageJson()\n const tsConfig = await readTsConfig()\n tsConfig.compilerOptions.lib = tsConfig.compilerOptions.lib.map((item: string) => (item === tsConfig.compilerOptions.target ? \"ESNext\" : item))\n tsConfig.compilerOptions.target = \"ESNext\"\n await writeTsConfig(tsConfig)\n const { description, title, mountId } = await inquirer.prompt<WriteRsbuildConfigParams>([\n {\n type: \"input\",\n name: \"description\",\n message: \"项目描述\",\n default: \"designed by someone\",\n },\n {\n type: \"input\",\n name: \"title\",\n message: \"项目标题\",\n default: packageJson.name,\n },\n {\n type: \"input\",\n name: \"mountId\",\n message: \"入口 id\",\n default: \"root\",\n },\n ])\n await writeRsbuildConfig({ description, title, mountId })\n await rm(`src/App.css`, { force: true })\n\n await writeFile(\n `src/index.css`,\n (await checkTailwind())\n ? `@tailwind base; \n@tailwind components;\n@tailwind utilities;\n`\n : ``,\n \"utf-8\",\n )\n\n await writeFile(\n `src/App.tsx`,\n `import { FC } from \"react\"\n\nconst App: FC = () => {\n return <div>Hello, World!</div>\n}\n\nexport default App`,\n \"utf-8\",\n )\n\n await writeFile(\n `src/index.tsx`,\n `import { StrictMode } from \"react\"\nimport { createRoot } from \"react-dom/client\"\n\nimport App from \"./App\"\n\nimport \"./index.css\"\n\nconst root = createRoot(document.getElementById(\"${mountId}\") as HTMLDivElement)\n\nroot.render(\n <StrictMode>\n <App />\n </StrictMode>\n)`,\n \"utf-8\",\n )\n consola.success(\"设置 rsbuild 配置成功\")\n}\n","import { exit } from \"process\"\n\nimport consola from \"consola\"\n\nimport { readTsConfig } from \"./readTsConfig\"\nimport { writeTsConfig } from \"./writeTsConfig\"\n\nexport enum Target {\n ES2015 = \"ES2015\",\n ES2016 = \"ES2016\",\n ES2017 = \"ES2017\",\n ES2018 = \"ES2018\",\n ES2019 = \"ES2019\",\n ES2020 = \"ES2020\",\n ES2021 = \"ES2021\",\n ES2022 = \"ES2022\",\n ES2023 = \"ES2023\",\n ES3 = \"ES3\",\n ES5 = \"ES5\",\n ES6 = \"ES6\",\n ESNext = \"ESNext\",\n}\n\nexport enum Module {\n AMD = \"AMD\",\n CommonJS = \"CommonJS\",\n ES2015 = \"ES2015\",\n ES2020 = \"ES2020\",\n ES2022 = \"ES2022\",\n ES6 = \"ES6\",\n ESNext = \"ESNext\",\n Node16 = \"Node16\",\n NodeNext = \"NodeNext\",\n None = \"None\",\n System = \"System\",\n UMD = \"UMD\",\n}\n\nexport enum ModuleResolution {\n Bundler = \"Bundler\",\n Classic = \"Classic\",\n Node = \"Node\",\n Node10 = \"Node10\",\n Node16 = \"Node16\",\n NodeNext = \"NodeNext\",\n}\n\nexport async function setTsConfig(key: string, value?: any) {\n const tsconfig = await readTsConfig()\n\n if (value === undefined) delete tsconfig.compilerOptions[key]\n else {\n switch (key) {\n case \"target\": {\n const t = Object.values(Target).find(t => t.toLowerCase() === value.trim().toLowerCase())\n\n if (!t) {\n consola.fail(\"无效的 target 选项\")\n exit()\n }\n\n tsconfig.compilerOptions.target = t\n break\n }\n case \"module\": {\n const m = Object.values(Module).find(m => m.toLowerCase() === value.trim().toLowerCase())\n\n if (!m) {\n consola.fail(\"无效的 module 选项\")\n exit()\n }\n\n tsconfig.compilerOptions.module = m\n break\n }\n case \"moduleResolution\": {\n const mr = Object.values(ModuleResolution).find(mr => mr.toLowerCase() === value.trim().toLowerCase())\n\n if (!mr) {\n consola.fail(\"无效的 moduleResolution 选项\")\n exit()\n }\n\n tsconfig.compilerOptions.moduleResolution = mr\n break\n }\n case \"noEmit\":\n tsconfig.compilerOptions.noEmit = !!value\n break\n default:\n consola.fail(`暂不支持 ${key} 项`)\n exit()\n }\n }\n\n await writeTsConfig(tsconfig)\n consola.success(`修改 ${key} 成功`)\n}\n","import consola from \"consola\"\n\nimport { readPackageJson } from \"./readPackageJson\"\nimport { setTsConfig } from \"./setTsConfig\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport async function vite() {\n consola.start(\"开始设置 vite 配置\")\n await setTsConfig(\"noUnusedLocals\")\n await setTsConfig(\"noUnusedParameters\")\n const pkg = await readPackageJson()\n pkg.scripts.dev += \" --host\"\n await writePackageJson({ data: pkg })\n consola.success(\"设置 vite 配置成功\")\n}\n","import consola from \"consola\"\nimport inquirer from \"inquirer\"\n\nimport { ProjectType } from \"@/constant/index\"\n\nimport { addAntd } from \"./addAntd\"\nimport { addDependency } from \"./addDependency\"\nimport { addEslint } from \"./addEslint\"\nimport { addGitignore } from \"./addGitignore\"\nimport { addPrettier } from \"./addPrettier\"\nimport { addPrisma } from \"./addPrisma\"\nimport { addTailwind } from \"./addTailwind\"\nimport { createBrowserlistrc } from \"./createBrowserlistrc\"\nimport { getPackageManager } from \"./getPackageManager\"\nimport { installDependceny } from \"./installDependceny\"\nimport { next } from \"./next\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { rsbuild } from \"./rsbuild\"\nimport { setTsConfig } from \"./setTsConfig\"\nimport { vite } from \"./vite\"\n\nexport async function initProject() {\n consola.start(\"开始初始化项目\")\n await createBrowserlistrc()\n await addEslint()\n const packageJson = await readPackageJson()\n const allDependcies = Object.keys(packageJson.dependencies || {}).concat(Object.keys(packageJson.devDependencies || {}))\n\n if (!allDependcies.includes(\"react\") || !allDependcies.includes(\"react-dom\")) {\n consola.error(\"仅支持 React 项目\")\n return\n }\n\n let type: ProjectType\n\n if (allDependcies.some(item => item === \"next\")) type = ProjectType.next\n else {\n if (allDependcies.some(item => item === \"@remix-run/react\")) type = ProjectType.remix\n else {\n if (allDependcies.some(item => item === \"vite\")) type = ProjectType.vite\n else {\n if (allDependcies.some(item => item === \"@rsbuild/core\")) type = ProjectType.rsbuild\n else {\n consola.error(\"仅支持 Next、Remix、Vite、Rsbuild 项目\")\n return\n }\n }\n }\n }\n\n await addGitignore()\n await addDependency({\n package: [\"@types/node\"],\n type: \"devDependencies\",\n })\n const manager = await getPackageManager()\n const isFullStack = type === ProjectType.next || type === ProjectType.remix\n const choices = isFullStack\n ? [\n \"antd\",\n \"@heroui/react\",\n \"@tanstack/react-form\",\n \"@tanstack/react-query\",\n \"dayjs\",\n \"deepsea-components\",\n \"deepsea-tools\",\n \"prisma\",\n \"tailwind\",\n \"zod\",\n ]\n : [\"antd\", \"@heroui/react\", \"@tanstack/react-form\", \"@tanstack/react-query\", \"dayjs\", \"deepsea-components\", \"deepsea-tools\", \"tailwind\", \"react-router\"]\n\n const { modules } = await inquirer.prompt({\n type: \"checkbox\",\n name: \"modules\",\n message: \"请选择要添加的模块\",\n choices,\n default: choices,\n })\n\n const added: string[] = []\n\n if (modules.includes(\"antd\")) await addAntd()\n\n if (modules.includes(\"tailwind\")) await addTailwind()\n else await addPrettier()\n\n if (modules.includes(\"@heroui/react\")) added.push(\"@heroui/react\", \"soda-heroui\")\n if (modules.includes(\"@tanstack/react-query\")) added.push(\"@tanstack/react-query\")\n if (modules.includes(\"@tanstack/react-form\")) added.push(\"@tanstack/react-form\", \"soda-tanstack-form\")\n if (modules.includes(\"dayjs\")) added.push(\"dayjs\")\n if (modules.includes(\"deepsea-components\")) added.push(\"deepsea-components\")\n if (modules.includes(\"deepsea-tools\")) added.push(\"deepsea-tools\")\n if (modules.includes(\"stable-hash\")) added.push(\"stable-hash\")\n if (modules.includes(\"zod\")) added.push(\"zod\")\n if (modules.includes(\"react-router\")) added.push(\"react-router\")\n if (modules.includes(\"stable-hash\")) added.push(\"stable-hash\")\n\n await addDependency({\n package: added,\n type: \"dependencies\",\n })\n\n switch (type) {\n case ProjectType.next:\n await next()\n break\n\n case ProjectType.remix:\n await vite()\n break\n\n case ProjectType.vite:\n await vite()\n break\n\n case ProjectType.rsbuild:\n await rsbuild()\n break\n }\n\n let installed = false\n\n if (modules.includes(\"prisma\")) {\n await addPrisma(manager)\n installed = true\n }\n\n if (!installed) await installDependceny({ silent: true, manager })\n await setTsConfig(\"noEmit\", true)\n consola.success(\"项目初始化完成\")\n}\n","const reg = /^(((ht|f)tps?):\\/\\/)?([^!@#$%^&*?.\\s-]([^!@#$%^&*?.\\s]{0,63}[^!@#$%^&*?.\\s])?\\.)+[a-z]{2,6}\\/?/\n\nexport function isUrl(url: string) {\n return reg.test(url)\n}\n","import { existsSync } from \"fs\"\nimport { readFile } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\nexport type ZixuluCache = {\n sudoRequested?: boolean\n}\n\nexport async function readZixuluCache(): Promise<ZixuluCache> {\n const userDir = homedir()\n const settingPath = join(userDir, \".zixulu.cache\")\n\n if (existsSync(settingPath)) {\n const setting = JSON.parse(await readFile(settingPath, \"utf-8\"))\n return setting\n }\n\n return {}\n}\n","import { rm } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\nexport async function removeZixuluCache() {\n const userDir = homedir()\n const cachePath = join(userDir, \".zixulu.cache\")\n await rm(cachePath, { recursive: true, force: true })\n}\n","import { writeFile } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\nimport { ZixuluCache } from \"./readZixuluCache\"\n\nexport async function writeZixuluCache(cache: ZixuluCache) {\n const userDir = homedir()\n const cachePath = join(userDir, \".zixulu.json\")\n await writeFile(cachePath, JSON.stringify(cache, undefined, 4), \"utf-8\")\n}\n","import { spawnAsync } from \"soda-nodejs\"\n\nimport { readZixuluCache } from \"./readZixuluCache\"\nimport { removeZixuluCache } from \"./removeZixuluCache\"\nimport { writeZixuluCache } from \"./writeZixuluCache\"\n\nexport async function sudoCommand() {\n try {\n const cache = await readZixuluCache()\n if (cache.sudoRequested) throw new Error(\"请在 sudo 下运行\")\n cache.sudoRequested = true\n await writeZixuluCache(cache)\n await spawnAsync(\"sudo\", [\"env\", `\"PATH=$PATH\"`, \"npx\", \"zixulu\", ...process.argv.slice(2)])\n } finally {\n await removeZixuluCache()\n }\n}\n","export function unique<T>(data: T[]): T[] {\n return Array.from(new Set(data))\n}\n","import { readFile, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\nimport { execAsync } from \"soda-nodejs\"\n\nimport { isSudo } from \"@/constant\"\n\nimport { isUrl } from \"./isUrl\"\nimport { sudoCommand } from \"./sudoCommand\"\nimport { unique } from \"./unique\"\n\nexport async function setDockerRegistry() {\n if (!isSudo) return sudoCommand()\n await execAsync(`mkdir -p /etc/docker`)\n\n let daemon: any = {}\n\n try {\n daemon = JSON.parse(await readFile(\"/etc/docker/daemon.json\", \"utf-8\"))\n } catch {\n /* empty */\n }\n\n daemon[\"registry-mirrors\"] ??= []\n daemon[\"registry-mirrors\"].push(\"https://docker.sunzishaokao.com\", \"https://hub.hxui.site\", \"https://docker.1ms.run\")\n daemon[\"registry-mirrors\"] = unique(daemon[\"registry-mirrors\"])\n daemon[\"exec-opts\"] ??= []\n daemon[\"exec-opts\"].push(\"native.cgroupdriver=systemd\")\n daemon[\"exec-opts\"] = unique(daemon[\"exec-opts\"])\n\n type Answer = {\n mirrors: string\n }\n\n const { mirrors } = await inquirer.prompt<Answer>([\n {\n type: \"input\",\n name: \"mirrors\",\n message: \"请输入镜像地址,多个用逗号分隔,留空则跳过\",\n },\n ])\n daemon[\"registry-mirrors\"].push(...mirrors.split(/[,,]/).filter(isUrl))\n await writeFile(\"/etc/docker/daemon.json\", JSON.stringify(daemon, undefined, 4), \"utf-8\")\n consola.success(\"镜像地址设置成功\")\n consola.info(\"建议重启docker服务:\")\n consola.info(\"sudo systemctl daemon-reload\")\n consola.info(\"sudo systemctl restart docker\")\n}\n","import { readdir, rm } from \"fs/promises\"\n\nimport inquirer from \"inquirer\"\nimport { JSDOM } from \"jsdom\"\nimport { execAsync } from \"soda-nodejs\"\n\nimport { isSudo } from \"@/constant\"\n\nimport { setDockerRegistry } from \"./setDockerRegistry\"\nimport { sudoCommand } from \"./sudoCommand\"\n\nexport async function installDocker() {\n if (!isSudo) return sudoCommand()\n const info = await execAsync(\"lsb_release -a\")\n const distributorId = info.match(/Distributor ID:\\s+(.+)/)?.[1]\n if (distributorId !== \"Ubuntu\") throw new Error(\"暂不支持 Ubuntu 以外的系统\")\n const codename = info.trim().match(/Codename:\\s+(.+)/)?.[1]\n if (!codename) throw new Error(\"无法获取 codename\")\n const response = await fetch(`https://download.docker.com/linux/ubuntu/dists/${codename}/pool/stable/amd64/`)\n const data = await response.text()\n const dom = new JSDOM(data)\n const hrefs = Array.from(dom.window.document.querySelectorAll(\"a\")).map(({ href }) => href)\n const deb = hrefs.findLast(item => item.startsWith(\"containerd.io_\"))!\n const deb2 = hrefs.findLast(item => item.startsWith(\"docker-ce_\"))!\n const deb3 = hrefs.findLast(item => item.startsWith(\"docker-ce-cli_\"))!\n const deb4 = hrefs.findLast(item => item.startsWith(\"docker-buildx-plugin_\"))!\n const deb5 = hrefs.findLast(item => item.startsWith(\"docker-compose-plugin_\"))!\n\n const debs = [deb, deb2, deb3, deb4, deb5]\n\n const dir = await readdir(\".\")\n await Promise.all(\n debs\n .filter(deb => !dir.includes(deb))\n .map(deb => execAsync(`wget -q https://download.docker.com/linux/ubuntu/dists/${codename}/pool/stable/amd64/${deb}`)),\n )\n await execAsync(`dpkg -i ${debs.join(\" \")}`)\n for (const deb of debs) await rm(deb, { force: true, recursive: true })\n\n type Answer = {\n addMirrors?: boolean\n }\n\n const { addMirrors } = await inquirer.prompt<Answer>([\n {\n type: \"confirm\",\n name: \"addMirrors\",\n message: \"是否添加镜像地址\",\n default: true,\n },\n ])\n if (!addMirrors) return\n setDockerRegistry()\n}\n","import { getTypeInGenerics } from \"./getTypeInGenerics\"\n\nexport function splitExtendsType(str: string) {\n const types: string[] = []\n\n let index = 0\n\n for (let i = 0; i < str.length; i++) {\n const w = str[i]\n\n if (w === \"<\") {\n const type = getTypeInGenerics(str, i)\n i += type.length + 1\n continue\n }\n\n if (w === \",\") {\n types.push(str.slice(index, i))\n index = i + 1\n }\n }\n\n types.push(str.slice(index))\n return types.map(v => v.trim()).filter(v => v)\n}\n","import { readFile, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\n\nimport { checkType } from \"./checkType\"\nimport { getFiles } from \"./getFiles\"\nimport { splitExtendsType } from \"./splitExtendsType\"\n\n/**\n * 将项目中的 interface 转换为 type\n */\nexport async function interfaceToType() {\n consola.start(\"开始将项目中的 interface 转换为 type\")\n\n const files = await getFiles({\n match: (path, stats) => (path.ext === \".tsx\" || path.ext === \".ts\") && !path.base.endsWith(\".d.ts\") && stats.isFile(),\n exclude: (path, stats) => stats.isDirectory() && path.base === \"node_modules\",\n })\n\n const { cont } = await inquirer.prompt({\n type: \"confirm\",\n name: \"cont\",\n message: \"是否继续\",\n })\n\n if (!cont) return\n\n const reg = /(export )?interface (.+?) {/gm\n const reg1 = /\\bexport\\b/\n const reg2 = /(\\w+?) extends (.+)/\n const modifiedFiles: Set<string> = new Set()\n\n for (const file of files) {\n const code = await readFile(file, \"utf-8\")\n\n const newCode = code.replace(reg, match => {\n modifiedFiles.add(file)\n const hasExport = reg1.test(match)\n const $2 = match.replace(reg, \"$2\")\n const matches = $2.match(reg2)\n\n if (matches) {\n const name = matches[1]\n const extendsTypes = splitExtendsType(matches[2]).join(\" & \")\n\n return `${hasExport ? \"export \" : \"\"}type ${name} = ${extendsTypes} & {`\n }\n\n return `${hasExport ? \"export \" : \"\"}type ${$2} = {`\n })\n\n await writeFile(file, newCode, \"utf-8\")\n }\n\n if (modifiedFiles.size > 0) consola.success(`以下文件中的 interface 已经转换为 type:\\n\\n${Array.from(modifiedFiles).join(\"\\n\")}`)\n\n consola.start(\"检查项目是否存在 TypeScript 错误\")\n\n await checkType()\n\n consola.success(\"interface 转换为 type 完成\")\n}\n","import { readFile } from \"fs/promises\"\n\nimport clipboard from \"clipboardy\"\nimport consola from \"consola\"\nimport { isNonNullable, json2type as j2t } from \"deepsea-tools\"\n\nexport async function json2type(path?: string) {\n const json = isNonNullable(path) ? await readFile(path, \"utf-8\") : await clipboard.read()\n\n try {\n JSON.parse(json)\n } catch {\n consola.error(`请输入有效的 json 文件路径或复制有效的 json 文本`)\n }\n\n const type = j2t(json)\n await clipboard.write(type)\n consola.success(\"类型已复制到剪贴板\")\n}\n","import { execAsync } from \"soda-nodejs\"\n\nexport type PidInfo = {\n pid: number\n info: string\n}\n\nexport async function getProcessInfoFromPid(pid: number) {\n try {\n const stdout = await execAsync(`tasklist | findstr ${pid}`)\n const reg = new RegExp(`( +)${pid}( (Services|Console) +)`)\n return stdout\n .split(/[\\n\\r]/)\n .find(line => reg.test(line))\n ?.replace(reg, \"$1$2\")\n ?.replace(/ +/g, \" \")\n } catch {\n return undefined\n }\n}\n\nexport async function getPidInfoFromPort(port: number) {\n try {\n const stdout = await execAsync(`netstat -ano | findstr :${port}`)\n const reg = new RegExp(` (\\\\[::\\\\]|(\\\\d{1,3}\\\\.){3}\\\\d{1,3}):${port} `)\n\n const result = Array.from(\n new Set(\n stdout\n .split(/[\\n\\r]/)\n .filter(line => reg.test(line))\n .map(line => ({\n pid: parseInt(line.match(reg)![1]),\n info: line,\n })),\n ),\n )\n\n for (let i = 0; ; ) {\n if (result.some(({ info }) => info[i] === undefined)) break\n\n if (result.some(({ info }) => info[i] !== \" \" || info[i + 1] !== \" \")) {\n i++\n continue\n }\n\n result.forEach(item => (item.info = `${item.info.slice(0, i)}${item.info.slice(i + 1)}`))\n }\n\n return result\n } catch {\n return []\n }\n}\n","import { exec } from \"child_process\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\n\nimport { getPidInfoFromPort, getProcessInfoFromPid } from \"./processInfo\"\n\nexport async function killProcessByPort(port: string | number) {\n port = typeof port === \"string\" ? parseInt(port) : port\n\n if (!Number.isInteger(port)) {\n consola.error(\"无效的端口号\")\n throw new Error(\"无效的端口号\")\n }\n\n const pidInfos = await getPidInfoFromPort(port)\n\n const choices: { name: string; value: number }[] = []\n\n for (const { pid, info } of pidInfos) {\n const name = await getProcessInfoFromPid(pid)\n if (name) choices.push({ name: `${info} ${name}`, value: pid })\n }\n\n if (choices.length === 0) {\n consola.warn(\"没有找到对应的进程\")\n return\n }\n\n const { chosenPids } = await inquirer.prompt({\n type: \"checkbox\",\n name: \"chosenPids\",\n message: \"请选择要结束的进程\",\n choices,\n default: choices.map(choice => choice.value),\n })\n\n for (const pid of chosenPids) exec(`taskkill /f /pid ${pid}`)\n}\n","import { existsSync } from \"fs\"\nimport { readFile, writeFile } from \"fs/promises\"\n\nexport async function pnpm() {\n let content = ``\n if (existsSync(\".npmrc\")) content = await readFile(\".npmrc\", \"utf-8\")\n\n const lines = content\n .split(\"\\n\")\n .map(line => line.trim())\n .filter(Boolean)\n\n lines.push(`node-linker=hoisted`)\n lines.push(`shamefully-hoist=true`)\n writeFile(\".npmrc\", lines.join(\"\\n\"))\n}\n","import { readFileSync } from \"fs\"\n\nimport consola from \"consola\"\n\nimport { getPackageJsonPath } from \"./getPackageJsonPath\"\n\n/**\n * 读取 package.json\n * @param dir 目录\n * @returns package.json\n */\n\nexport function readPackageJsonSync(dir?: string): Record<string, any> {\n try {\n const result = JSON.parse(readFileSync(getPackageJsonPath(dir), \"utf-8\"))\n return result\n } catch (error) {\n consola.error(error)\n consola.fail(\"读取 package.json 失败\")\n throw new Error(\"读取 package.json 失败\")\n }\n}\n","import { rm } from \"fs/promises\"\n\nimport { getPackageManager } from \"./getPackageManager\"\nimport { installDependceny } from \"./installDependceny\"\n\nexport async function reinstall() {\n const manager = await getPackageManager()\n await rm(\"node_modules\", { recursive: true, force: true })\n await rm(\"pnpm-lock.yaml\", { force: true })\n await rm(\"yarn.lock\", { force: true })\n await rm(\"package-lock.json\", { force: true })\n await installDependceny({ manager, silent: true })\n}\n","import { readFile, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\n\nexport async function removeComment(path: string) {\n consola.start(\"开始删除注释\")\n const text = await readFile(path, \"utf-8\")\n const newText = text.replace(/^ *?\\/\\/.*?$/gm, \"\")\n await writeFile(path, newText, \"utf-8\")\n consola.success(\"删除注释成功\")\n}\n","import { stat } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nimport { backupFirst } from \"./backupFirst\"\n\n/**\n * 从 git 中删除文件或文件夹\n * @param input 文件或文件夹路径\n */\nexport async function removeFileOrFolderFromGit(input: string) {\n input = input.replace(/\\\\/g, \"/\")\n let recursive = false\n\n try {\n const stats = await stat(input)\n recursive = stats.isDirectory()\n } catch {\n type Answer = {\n recursive: boolean\n }\n\n const answer = await inquirer.prompt<Answer>({\n type: \"confirm\",\n name: \"recursive\",\n message: \"是否是文件夹\",\n default: false,\n })\n recursive = answer.recursive\n }\n\n await backupFirst(true)\n consola.start(`开始从 git 中删除 ${input}`)\n await spawnAsync(\n `git filter-branch --force --index-filter \"git rm${recursive ? \" -r\" : \"\"} --cached --ignore-unmatch ${input}\" --prune-empty --tag-name-filter cat -- --all`,\n )\n consola.success(`从 git 中删除 ${input} 成功`)\n}\n","import { rm } from \"fs/promises\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { addRuleToGitIgnore } from \"./addRuleToGitIgnore\"\nimport { getCommitMessage } from \"./getCommitMessage\"\n\nexport async function removeLock() {\n await rm(\"package-lock.json\", { force: true, recursive: true })\n await rm(\"yarn.lock\", { force: true, recursive: true })\n await rm(\"pnpm-lock.yaml\", { force: true, recursive: true })\n await rm(\"bun.lockb\", { force: true, recursive: true })\n await rm(\"bun.lock\", { force: true, recursive: true })\n await addRuleToGitIgnore(\"package-lock.json\", \"yarn.lock\", \"pnpm-lock.yaml\", \"bun.lockb\", \"bun.lock\")\n return getCommitMessage(CommitType.feature, \"删除包管理 lock 文件\")\n}\n","import { consola } from \"consola\"\nimport { simpleGit } from \"simple-git\"\n\nimport { preprocessRegex } from \"./preprocessRegex\"\nimport { shouldContinue } from \"./shouldContinue\"\n\nexport interface RemoveTagParams {\n /** 正则表达式字符串 */\n reg: string\n /** 正则表达式标志,如 i、g、m 等 */\n flags?: string\n /** 是否同时删除远程仓库的 tag */\n push?: boolean\n /** 远程仓库名称,默认为 origin */\n remote?: string\n}\n\n/**\n * 移除匹配的 git tag\n */\nexport async function removeTag({ reg, flags, push, remote = \"origin\" }: RemoveTagParams) {\n const git = simpleGit()\n\n // 检查是否是 git 仓库\n const isRepo = await git.checkIsRepo()\n\n if (!isRepo) {\n consola.error(\"当前目录不是 git 仓库\")\n return\n }\n\n // 检查是否有未提交的更改\n const status = await git.status()\n\n if (status.files.length > 0) {\n consola.error(\"当前 Git 仓库存在未提交的文件,请先提交或暂存这些文件\")\n return\n }\n\n // 预处理正则表达式,替换占位符\n const processedReg = preprocessRegex(reg)\n\n // 显示正则表达式\n consola.info(`正则表达式: /${processedReg}/${flags ?? \"\"}`)\n\n // 询问用户是否继续\n const cont = await shouldContinue(\"是否继续?\")\n\n if (!cont) {\n consola.info(\"操作已取消\")\n return\n }\n\n // 获取所有 tag\n const tags = await git.tags()\n const allTags = tags.all\n\n if (allTags.length === 0) {\n consola.warn(\"当前仓库没有任何 tag\")\n return\n }\n\n consola.info(`找到 ${allTags.length} 个 tag`)\n\n const tagsToRemove = []\n\n // 遍历所有 tag,查找匹配的 tag\n for (const tag of allTags) {\n // 每次循环创建新的正则表达式,避免 g 标志可能带来的状态问题\n const regexp = new RegExp(processedReg, flags)\n\n // 如果 tag 匹配正则表达式,加入待删除列表\n if (regexp.test(tag)) tagsToRemove.push(tag)\n }\n\n if (tagsToRemove.length === 0) {\n consola.warn(\"没有匹配的 tag 需要删除\")\n return\n }\n\n consola.info(`将要删除 ${tagsToRemove.length} 个 tag`)\n\n // 执行删除操作\n for (const tag of tagsToRemove) {\n try {\n // 删除本地 tag\n await git.tag([\"-d\", tag])\n consola.success(`本地: 删除 ${tag}`)\n\n // 如果需要删除远程仓库的 tag\n if (push) {\n try {\n // 删除远程的 tag\n await git.push([remote, \"--delete\", tag])\n consola.success(`远程: 删除 ${tag}`)\n } catch (error) {\n // 如果远程没有这个 tag,忽略错误\n consola.warn(`远程可能不存在 ${tag},跳过删除`)\n }\n }\n } catch (error) {\n consola.error(`删除 ${tag} 失败:`, error)\n }\n }\n\n consola.success(\"所有匹配的 tag 删除完成\")\n}\n","/**\n * 判断一个 url 是否是资源链接\n * @param url 链接\n * @returns 是否是资源链接\n */\nexport function isAsset(url: string) {\n const lower = url.toLowerCase()\n return (\n lower.endsWith(\".svg\") ||\n lower.endsWith(\".png\") ||\n lower.endsWith(\".jpg\") ||\n lower.endsWith(\".jpeg\") ||\n lower.endsWith(\".gif\") ||\n lower.endsWith(\".webp\") ||\n lower.endsWith(\".ico\") ||\n lower.endsWith(\".ttf\") ||\n lower.endsWith(\".woff\") ||\n lower.endsWith(\".woff2\") ||\n lower.endsWith(\".css\") ||\n lower.endsWith(\".js\") ||\n lower.endsWith(\".json\") ||\n lower.includes(\"/img/\") ||\n lower.includes(\"/file/\") ||\n lower.includes(\"/assets/\")\n )\n}\n","import { createWriteStream } from \"fs\"\nimport { mkdir, readdir, readFile, stat, writeFile } from \"fs/promises\"\nimport { join, parse } from \"path\"\nimport { Readable } from \"stream\"\n\nimport consola from \"consola\"\nimport md5 from \"md5\"\nimport fetch, { Headers, Response } from \"node-fetch\"\n\nimport { agent } from \"@/constant\"\n\nimport { isAsset } from \"./isAsset\"\nimport { retry } from \"./retry\"\n\nfunction getReg() {\n return /(https?:|href=\")\\/\\/[a-zA-Z0-9.\\-*_/&=:,%@]+/gm\n}\n\nfunction getReg2() {\n return /((from|import) *?[\"'])([a-zA-Z0-9.\\-*_/&=:,%@]+\\.js)([\"'])/gm\n}\n\nconst reg3 = /([\"'])([a-zA-Z0-9.\\-*_/&=:,%@]+\\.js)([\"'])/\n\nconst reg4 = /[a-z0-9]{32}\\.js/\n\nexport type ReplaceAssetsOptions = {\n base?: string\n input: string\n output?: string\n proxy?: boolean\n}\n\nexport async function replaceAssets(options: ReplaceAssetsOptions) {\n const { base, input, output = \"assets\", proxy } = options\n\n await mkdir(output, { recursive: true })\n\n const headers = new Headers()\n headers.set(\n \"accept\",\n `text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7`,\n )\n headers.set(\"accept-encoding\", `gzip, deflate, br, zstd`)\n headers.set(\"accept-language\", `en,zh-CN;q=0.9,zh;q=0.8`)\n headers.set(\"cache-control\", `no-cache`)\n headers.set(\"dnt\", `1`)\n headers.set(\"pragma\", `no-cache`)\n headers.set(\"priority\", `u=0, i`)\n headers.set(\"sec-ch-ua\", `\"Not)A;Brand\";v=\"99\", \"Google Chrome\";v=\"127\", \"Chromium\";v=\"127\"`)\n headers.set(\"sec-ch-ua-mobile\", `?0`)\n headers.set(\"sec-ch-ua-platform\", `\"Windows\"`)\n headers.set(\"sec-fetch-dest\", `document`)\n headers.set(\"sec-fetch-mode\", `navigate`)\n headers.set(\"sec-fetch-site\", `none`)\n headers.set(\"sec-fetch-user\", `?1`)\n headers.set(\"upgrade-insecure-requests\", `1`)\n headers.set(\"user-agent\", `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36`)\n\n const downloadMap: Map<string, string> = new Map()\n\n const errors: Set<string> = new Set()\n\n async function download(url: string) {\n try {\n if (downloadMap.has(url)) return downloadMap.get(url)!\n consola.start(`download ${url}`)\n const { ext } = parse(new URL(url).pathname)\n let response: Response\n let filename: string\n\n if (ext) filename = `${md5(url)}${ext}`\n else {\n response = await fetch(url, {\n agent: proxy ? agent : undefined,\n headers,\n })\n filename = `${md5(url)}.${response.headers.get(\"content-type\")?.split(\"/\")[1].split(\"+\")[0]}`\n }\n\n const dir = await readdir(output)\n\n if (!dir.includes(filename)) {\n response ??= await fetch(url, {\n agent: proxy ? agent : undefined,\n headers,\n })\n const file = createWriteStream(join(output, filename))\n await new Promise<0>((resolve, reject) =>\n Readable.from(response.body!)\n .pipe(file)\n .on(\"finish\", () => resolve(0))\n .on(\"error\", reject))\n }\n\n const url2 = `${base ? (base.endsWith(\"/\") ? base.slice(0, -1) : base) : \"\"}/${filename}`\n\n // consola.success(`${url} -> ${url2}`)\n downloadMap.set(url, url2)\n\n errors.delete(url)\n\n if (filename.endsWith(\".js\")) await replace(join(output, filename), url)\n\n return url2\n } catch (error) {\n consola.error(error)\n errors.add(url)\n throw error\n }\n }\n\n async function getReplaceUrl(url: string, source?: string) {\n if (url.startsWith(`href=\"`)) {\n try {\n const newUrl = url.replace(/^href=\"/, \"http:\")\n const replaceUrl = await retry(() => download(newUrl), 4)\n return `href=\"${replaceUrl}`\n } catch {\n /* empty */\n }\n\n try {\n const newUrl = url.replace(/^href=\"/, \"https:\")\n const replaceUrl = await retry(() => download(newUrl), 4)\n return `href=\"${replaceUrl}`\n } catch {\n /* empty */\n }\n\n return url\n }\n\n if (url.startsWith(\"from\") || url.startsWith(\"import\")) {\n const match = url.match(reg3)\n if (!match) return url\n let url2 = match[2].trim()\n\n if (!url2.startsWith(\"http\")) {\n if (url2.startsWith(\"/\")) url2 = new URL(url2, source).toString()\n else {\n if (url2.startsWith(\"./\")) url2 = parse(source!).dir + url2.slice(1)\n else {\n if (url2.startsWith(\"../\")) url2 = parse(parse(source!).dir).dir + url2.slice(2)\n else return url\n }\n }\n }\n\n const replaceUrl = await retry(() => download(url2), 4)\n if (replaceUrl === url2) return url\n return url.replace(reg3, `$1${replaceUrl.startsWith(\"/\") ? \".\" : \"\"}${replaceUrl}$3`)\n }\n\n try {\n const replaceUrl = await retry(() => download(url), 4)\n return replaceUrl\n } catch {\n return url\n }\n }\n\n async function replace(input: string, source?: string) {\n consola.start(`scanning ${input.replace(/\\\\/g, \"/\")}`)\n const status = await stat(input)\n\n if (status.isFile()) {\n const path = parse(input)\n\n if (path.ext === \".js\" || path.ext === \".html\" || path.ext === \".css\" || path.ext === \".json\") {\n const data = await readFile(input, \"utf-8\")\n const match = data.match(source ? getReg2() : getReg())\n if (!match) return\n\n const urlsToReplace: string[] = []\n\n let index = 0\n\n for (const url of match) {\n if (isAsset(url) || getReg2().test(url)) {\n const url2 = await getReplaceUrl(url, source)\n urlsToReplace.push(url2)\n } else urlsToReplace.push(url)\n }\n\n const newData = data.replace(source ? getReg2() : getReg(), () => urlsToReplace[index++])\n\n if (source) {\n urlsToReplace.forEach(url => {\n if (!reg4.test(url)) console.log(url)\n })\n }\n\n await writeFile(input, newData, \"utf-8\")\n }\n\n return\n }\n\n if (status.isDirectory()) {\n const dir2 = await readdir(input)\n\n for (const item of dir2) await replace(join(input, item))\n }\n }\n\n await replace(input)\n\n consola.success(errors.size > 0 ? \"替换完成,以下文件下载失败:\" : \"替换完成\")\n\n errors.forEach(url => consola.error(url))\n}\n","import consola from \"consola\"\nimport simpleGit from \"simple-git\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nconst git = simpleGit()\n\nexport type CommitAuthor = {\n name?: string\n email?: string\n}\n\nexport type ReplaceCommitAuthorParams = {\n prev?: CommitAuthor\n next?: CommitAuthor\n}\n\n// 执行 Git 历史重写的函数\nexport async function replaceCommitAuthor({\n prev: { name: prevName, email: prevEmail } = {},\n next: { name: nextName, email: nextEmail } = {},\n}: ReplaceCommitAuthorParams) {\n if (!nextName && !nextEmail) throw new Error(\"新的作者信息不能为空。请提供新的作者名称或邮箱。\")\n const isRepo = await git.checkIsRepo()\n if (!isRepo) throw new Error(\"当前目录不是一个 Git 仓库。请在一个有效的 Git 仓库中运行此命令。\")\n const status = await git.status()\n if (status.files.length) throw new Error(\"当前 Git 仓库存在未提交的文件。请提交或暂存这些文件后再试。\")\n consola.start(\"开始修改 Git 提交历史...\")\n console.log()\n const committerName = nextName ? ` export GIT_COMMITTER_NAME=\\\\\"${nextName}\\\\\"` : \"\"\n const committerEmail = nextEmail ? ` export GIT_COMMITTER_EMAIL=\\\\\"${nextEmail}\\\\\"` : \"\"\n const authorName = nextName ? ` export GIT_AUTHOR_NAME=\\\\\"${nextName}\\\\\"` : \"\"\n const authorEmail = nextEmail ? ` export GIT_AUTHOR_EMAIL=\\\\\"${nextEmail}\\\\\"` : \"\"\n const committerCondition =\n prevName && prevEmail\n ? `[ \\\\\"$GIT_COMMITTER_NAME\\\\\" = \\\\\"${prevName}\\\\\" ] && [ \\\\\"$GIT_COMMITTER_EMAIL\\\\\" = \\\\\"${prevEmail}\\\\\" ]`\n : prevName\n ? `[ \\\\\"$GIT_COMMITTER_NAME\\\\\" = \\\\\"${prevName}\\\\\" ]`\n : prevEmail\n ? `[ \\\\\"$GIT_COMMITTER_EMAIL\\\\\" = \\\\\"${prevEmail}\\\\\" ]`\n : `[ \\\\\"true\\\\\" = \\\\\"true\\\\\" ]`\n const authorCondition =\n prevName && prevEmail\n ? `[ \\\\\"$GIT_AUTHOR_NAME\\\\\" = \\\\\"${prevName}\\\\\" ] && [ \\\\\"$GIT_AUTHOR_EMAIL\\\\\" = \\\\\"${prevEmail}\\\\\" ]`\n : prevName\n ? `[ \\\\\"$GIT_AUTHOR_NAME\\\\\" = \\\\\"${prevName}\\\\\" ]`\n : prevEmail\n ? `[ \\\\\"$GIT_AUTHOR_EMAIL\\\\\" = \\\\\"${prevEmail}\\\\\" ]`\n : `[ \\\\\"true\\\\\" = \\\\\"true\\\\\" ]`\n\n await spawnAsync(\n `git filter-branch -f --env-filter \"if ${committerCondition}; then export ${[committerName, committerEmail].filter(Boolean).join(\" && \")}; fi && if ${authorCondition}; then ${[authorName, authorEmail].filter(Boolean).join(\" && \")}; fi\" --tag-name-filter cat -- --branches --tags`,\n )\n\n console.log()\n consola.success(\"Git 提交历史修改完成!\")\n consola.warn(\"请强制推送以覆盖远程仓库:git push -f\")\n}\n","import { unlink, writeFile } from \"fs/promises\"\nimport { tmpdir } from \"os\"\nimport { join } from \"path\"\n\nimport { consola } from \"consola\"\nimport { simpleGit } from \"simple-git\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nimport { preprocessRegex } from \"./preprocessRegex\"\nimport { shouldContinue } from \"./shouldContinue\"\n\nexport interface ReplaceCommitMessageParams {\n /** 正则表达式字符串 */\n reg: string\n /** 替换字符串 */\n replace: string\n /** 正则表达式标志,如 i、g、m 等 */\n flags?: string\n /** 是否强制推送到远程仓库 */\n push?: boolean\n /** 远程仓库名称,默认为 origin */\n remote?: string\n /** 分支名称,默认为当前分支 */\n branch?: string\n}\n\n/**\n * 替换所有提交消息\n * ⚠️ 警告:此操作会重写 Git 历史,请谨慎使用\n */\nexport async function replaceCommitMessage({ reg, replace, flags, push, remote = \"origin\", branch }: ReplaceCommitMessageParams) {\n const git = simpleGit()\n\n // 检查是否是 git 仓库\n const isRepo = await git.checkIsRepo()\n\n if (!isRepo) {\n consola.error(\"当前目录不是 git 仓库\")\n return\n }\n\n // 检查是否有未提交的更改\n const status = await git.status()\n\n if (status.files.length > 0) {\n consola.error(\"当前 Git 仓库存在未提交的文件,请先提交或暂存这些文件\")\n return\n }\n\n // 获取当前分支\n const currentBranch = branch ?? (await git.revparse([\"--abbrev-ref\", \"HEAD\"]))\n\n // 预处理正则表达式,替换占位符\n const processedReg = preprocessRegex(reg)\n\n consola.warn(\"⚠️ 警告:此操作将重写 Git 历史,建议先备份\")\n consola.info(`目标分支: ${currentBranch}`)\n\n // 显示正则表达式和替换字符串\n consola.info(`正则表达式: /${processedReg}/${flags ?? \"\"}`)\n\n consola.info(`替换字符串: ${replace}`)\n\n // 询问用户是否继续\n const cont = await shouldContinue(\"⚠️ 是否继续?此操作将重写 Git 历史\")\n\n if (!cont) {\n consola.info(\"操作已取消\")\n return\n }\n\n // 获取提交数量\n const logResult = await git.log([currentBranch])\n const commitCount = logResult.total\n\n consola.info(`找到 ${commitCount} 个提交`)\n\n // 创建临时脚本文件,避免转义问题\n const tempScriptPath = join(tmpdir(), `git-msg-filter-${Date.now()}.js`)\n\n // 生成 Node.js 脚本内容\n const scriptContent = `\nconst reg = ${JSON.stringify(processedReg)}\nconst replace = ${JSON.stringify(replace)}\nconst flags = ${JSON.stringify(flags ?? \"\")}\n\nlet input = \"\"\n\nprocess.stdin.on(\"data\", chunk => {\n input += chunk.toString()\n})\n\nprocess.stdin.on(\"end\", () => {\n const regexp = new RegExp(reg, flags)\n const result = input.replace(regexp, replace)\n process.stdout.write(result)\n})\n`\n\n // 清理之前可能存在的 filter-branch 引用\n try {\n await git.raw([\"update-ref\", \"-d\", `refs/original/refs/heads/${currentBranch}`])\n consola.info(\"清理了之前的 filter-branch 引用\")\n } catch {\n // 如果不存在引用,忽略错误\n }\n\n consola.start(\"开始替换提交消息...\")\n\n try {\n // 写入临时脚本文件\n await writeFile(tempScriptPath, scriptContent, \"utf-8\")\n\n // 使用 filter-branch 重写提交消息\n // 在 Windows 上,路径需要使用正斜杠或双引号包裹\n // 将反斜杠转换为正斜杠,Node.js 在 Windows 上也支持这种格式\n const scriptPathForCommand = tempScriptPath.replace(/\\\\/g, \"/\")\n\n const filterCommand = `git filter-branch -f --msg-filter \"node \\\\\"${scriptPathForCommand}\\\\\"\" -- ${currentBranch}`\n\n await spawnAsync(filterCommand)\n\n // 删除临时脚本文件\n await unlink(tempScriptPath)\n\n consola.success(\"提交消息替换完成\")\n\n // 如果需要推送到远程仓库\n if (push) {\n consola.start(`强制推送到远程仓库 ${remote}...`)\n\n try {\n await git.push([remote, currentBranch, \"--force\"])\n consola.success(`已强制推送到 ${remote}/${currentBranch}`)\n } catch (error) {\n consola.error(`推送到远程失败:`, error)\n consola.warn(`你可以手动执行: git push ${remote} ${currentBranch} --force`)\n }\n } else consola.warn(`如需推送到远程,请执行: git push ${remote} ${currentBranch} --force`)\n } catch (error) {\n consola.error(\"替换提交消息失败:\", error)\n consola.info(\"如果出现错误,可以使用以下命令恢复:\")\n consola.info(\"git reset --hard refs/original/refs/heads/\" + currentBranch)\n\n // 确保删除临时脚本文件\n try {\n await unlink(tempScriptPath)\n } catch {\n // 忽略删除失败的错误\n }\n }\n}\n","import { consola } from \"consola\"\nimport { simpleGit } from \"simple-git\"\n\nimport { preprocessRegex } from \"./preprocessRegex\"\nimport { shouldContinue } from \"./shouldContinue\"\n\nexport interface ReplaceTagParams {\n /** 正则表达式字符串 */\n reg: string\n /** 替换字符串 */\n replace: string\n /** 正则表达式标志,如 i、g、m 等 */\n flags?: string\n /** 是否推送到远程仓库 */\n push?: boolean\n /** 远程仓库名称,默认为 origin */\n remote?: string\n}\n\n/**\n * 替换所有 git tag\n */\nexport async function replaceTag({ reg, replace, flags, push, remote = \"origin\" }: ReplaceTagParams) {\n const git = simpleGit()\n\n // 检查是否是 git 仓库\n const isRepo = await git.checkIsRepo()\n\n if (!isRepo) {\n consola.error(\"当前目录不是 git 仓库\")\n return\n }\n\n // 检查是否有未提交的更改\n const status = await git.status()\n\n if (status.files.length > 0) {\n consola.error(\"当前 Git 仓库存在未提交的文件,请先提交或暂存这些文件\")\n return\n }\n\n // 预处理正则表达式,替换占位符\n const processedReg = preprocessRegex(reg)\n\n // 显示正则表达式和替换字符串\n consola.info(`正则表达式: /${processedReg}/${flags ?? \"\"}`)\n\n consola.info(`替换字符串: ${replace}`)\n\n // 询问用户是否继续\n const cont = await shouldContinue(\"是否继续?\")\n\n if (!cont) {\n consola.info(\"操作已取消\")\n return\n }\n\n // 获取所有 tag\n const tags = await git.tags()\n const allTags = tags.all\n\n if (allTags.length === 0) {\n consola.warn(\"当前仓库没有任何 tag\")\n return\n }\n\n consola.info(`找到 ${allTags.length} 个 tag`)\n\n const operations = []\n\n // 遍历所有 tag,准备操作\n for (const tag of allTags) {\n // 每次循环创建新的正则表达式,避免 g 标志可能带来的状态问题\n const regexp = new RegExp(processedReg, flags)\n\n const newTag = tag.replace(regexp, replace)\n\n // 如果替换后的 tag 名称没有变化,跳过\n if (newTag === tag) continue\n\n operations.push({ oldTag: tag, newTag })\n }\n\n if (operations.length === 0) {\n consola.warn(\"没有需要替换的 tag\")\n return\n }\n\n consola.info(`将要替换 ${operations.length} 个 tag`)\n\n // 执行替换操作\n for (const { oldTag, newTag } of operations) {\n try {\n // 获取旧 tag 指向的 commit\n const tagInfo = await git.raw([\"rev-list\", \"-n\", \"1\", oldTag])\n const commitHash = tagInfo.trim()\n\n // 创建新 tag\n await git.addTag(newTag)\n await git.raw([\"tag\", \"-f\", newTag, commitHash])\n\n // 删除旧 tag\n await git.tag([\"-d\", oldTag])\n\n consola.success(`本地: ${oldTag} -> ${newTag}`)\n\n // 如果需要推送到远程仓库\n if (push) {\n try {\n // 删除远程的旧 tag\n await git.push([remote, \"--delete\", oldTag])\n consola.success(`远程: 删除 ${oldTag}`)\n } catch (error) {\n // 如果远程没有这个 tag,忽略错误\n consola.warn(`远程可能不存在 ${oldTag},跳过删除`)\n }\n\n try {\n // 推送新 tag 到远程\n await git.push([remote, newTag])\n consola.success(`远程: 推送 ${newTag}`)\n } catch (error) {\n consola.error(`推送 ${newTag} 到远程失败:`, error)\n }\n }\n } catch (error) {\n consola.error(`替换 ${oldTag} 失败:`, error)\n }\n }\n\n consola.success(\"所有 tag 替换完成\")\n}\n","import { existsSync } from \"fs\"\nimport { writeFile } from \"fs/promises\"\n\nimport { addDependency } from \"./addDependency\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { readTsConfig } from \"./readTsConfig\"\nimport { Module, ModuleResolution, Target } from \"./setTsConfig\"\nimport { writePackageJson } from \"./writePackageJson\"\nimport { writeTsConfig } from \"./writeTsConfig\"\n\nconst rollupConfig = `import commonjs from \"@rollup/plugin-commonjs\"\nimport json from \"@rollup/plugin-json\"\nimport resolve from \"@rollup/plugin-node-resolve\"\nimport typescript from \"@rollup/plugin-typescript\"\nimport { RollupOptions } from \"rollup\"\n\nconst config: RollupOptions = {\n input: \"src/index.ts\",\n output: {\n file: \"dist/index.js\",\n format: \"cjs\"\n },\n plugins: [typescript(), resolve(), commonjs(), json()],\n external: [\"@resvg/resvg-js\", \"@types/cors\", \"@types/express\", \"@types/node\", \"cors\", \"dotenv\", \"express\", \"get-port-please\", \"next\", \"react\", \"react-dom\", \"soda-nodejs\"]\n}\n\nexport default config\n`\n\nconst tsconfig = `{\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"module\": \"EsNext\",\n \"moduleResolution\": \"Bundler\",\n \"strict\": true,\n \"skipLibCheck\": true\n }\n}\n`\n\nexport async function rollup() {\n await addDependency({\n package: [\"@rollup/plugin-commonjs\", \"@rollup/plugin-json\", \"@rollup/plugin-node-resolve\", \"@rollup/plugin-typescript\", \"rollup\", \"typescript\"],\n type: \"devDependencies\",\n })\n\n const packageJson = await readPackageJson()\n\n if (packageJson.scripts.build) packageJson.scripts[\"build:rollup\"] = \"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript\"\n else packageJson.scripts.build = \"rollup -c rollup.config.ts --configPlugin @rollup/plugin-typescript\"\n\n await writePackageJson({ data: packageJson })\n await writeFile(\"rollup.config.ts\", rollupConfig, \"utf-8\")\n\n if (existsSync(\"tsconfig.json\")) {\n const tsconfig = await readTsConfig()\n tsconfig.compilerOptions ??= {}\n tsconfig.compilerOptions.target = Target.ESNext\n tsconfig.compilerOptions.module = Module.ESNext\n tsconfig.compilerOptions.moduleResolution = ModuleResolution.Bundler\n tsconfig.compilerOptions.strict = true\n tsconfig.compilerOptions.skipLibCheck = true\n await writeTsConfig({ data: tsconfig })\n } else await writeFile(\"tsconfig.json\", tsconfig, \"utf-8\")\n\n await installDependceny()\n}\n","import { writeFile } from \"fs/promises\"\n\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nconst rslibConfig = `import { defineConfig } from \"@rslib/core\"\n\nexport default defineConfig({\n source: {\n entry: {\n index: [\"./src/**\"],\n },\n },\n lib: [\n {\n bundle: false,\n dts: true,\n format: \"esm\",\n },\n {\n bundle: false,\n dts: true,\n format: \"cjs\",\n },\n ],\n output: {\n target: \"web\",\n },\n})\n`\n\nconst rslibConfigWithReact = `import { pluginReact } from \"@rsbuild/plugin-react\"\nimport { defineConfig } from \"@rslib/core\"\n\nexport default defineConfig({\n source: {\n entry: {\n index: [\"./src/**\"],\n },\n },\n lib: [\n {\n bundle: false,\n dts: true,\n format: \"esm\",\n },\n {\n bundle: false,\n dts: true,\n format: \"cjs\",\n },\n ],\n output: {\n target: \"web\",\n },\n plugins: [pluginReact()],\n})\n`\n\nconst tsconfig = `{\n \"compilerOptions\": {\n \"baseUrl\": \".\",\n \"strict\": true,\n \"declaration\": true,\n \"skipLibCheck\": true,\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Bundler\",\n \"paths\": {\n \"@/*\": [\"src/*\"]\n }\n },\n \"include\": [\"src\"]\n}\n`\n\nconst tsconfigWithReact = `{\n \"compilerOptions\": {\n \"baseUrl\": \".\",\n \"strict\": true,\n \"declaration\": true,\n \"skipLibCheck\": true,\n \"jsx\": \"react-jsx\",\n \"target\": \"ESNext\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Bundler\",\n \"paths\": {\n \"@/*\": [\"src/*\"]\n }\n },\n \"include\": [\"src\"]\n}\n`\n\nexport async function rslib() {\n const { name, version, description, scripts, dependencies, devDependencies, peerDependencies } = await readPackageJson()\n\n const newPackageJson = {\n name,\n version,\n description,\n type: \"module\",\n exports: {\n \".\": {\n types: \"./dist/index.d.ts\",\n import: \"./dist/index.js\",\n require: \"./dist/index.cjs\",\n },\n },\n main: \"./dist/index.cjs\",\n module: \"./dist/index.js\",\n types: \"./dist/index.d.ts\",\n sideEffects: false,\n scripts,\n keywords: [],\n authors: [\"lurongv@qq.com\"],\n license: \"MIT\",\n files: [\"dist\", \"src\", \"tsconfig.json\"],\n publishConfig: {\n access: \"public\",\n registry: \"https://registry.npmjs.com/\",\n },\n repository: {\n type: \"git\",\n url: \"git+https://github.com/1adybug/deepsea.git\",\n },\n homepage: `https://github.com/1adybug/deepsea/tree/main/packages/${name}`,\n dependencies,\n devDependencies,\n peerDependencies,\n }\n\n await writePackageJson({ data: newPackageJson })\n const hasReact = !!dependencies?.[\"react\"] || !!devDependencies?.[\"react\"] || !!peerDependencies?.[\"react\"]\n await writeFile(\"rslib.config.ts\", hasReact ? rslibConfigWithReact : rslibConfig, \"utf-8\")\n await writeFile(\"tsconfig.json\", hasReact ? tsconfigWithReact : tsconfig, \"utf-8\")\n}\n","import { mkdir, readdir, readFile, rm, writeFile } from \"fs/promises\"\nimport { join } from \"path\"\n\nexport async function serverToAction() {\n const dir = await readdir(\"shared\")\n await rm(\"actions\", { recursive: true, force: true })\n const actions = dir.filter(item => item.toLowerCase().endsWith(\".ts\"))\n\n const actions2: string[] = []\n\n for (const item of actions) {\n const content = await readFile(join(\"shared\", item), \"utf-8\")\n if (/^\"no export\"$/m.test(content)) continue\n actions2.push(item)\n }\n\n await mkdir(\"actions\", { recursive: true })\n await Promise.all(\n actions2.map(async item => {\n const base = item.replace(/\\.ts$/i, \"\")\n await writeFile(\n join(\"actions\", item),\n `\"use server\"\n\nimport { ${base} } from \"@/shared/${base}\"\n\nimport { createResponseFn } from \"@/utils/createResponseFn\"\n\nexport async function ${base}Action(...args: Parameters<typeof ${base}>) {\n return await createResponseFn(${base}, ...args)\n}\n`,\n )\n }),\n )\n}\n","import { writeFile } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\nimport { JsonMap, stringify } from \"@iarna/toml\"\n\nexport async function writeBunConfig(config: JsonMap) {\n const path = join(homedir(), \".bunfig.toml\")\n await writeFile(path, stringify(config), \"utf-8\")\n}\n","import { readBunConfig } from \"./readBunConfig\"\nimport { writeBunConfig } from \"./writeBunConfig\"\n\nexport async function setBun() {\n const config = await readBunConfig()\n config.install ??= {}\n config.install.cache ??= {}\n config.install.cache.disable = true\n await writeBunConfig(config)\n}\n","import consola from \"consola\"\nimport { execAsync } from \"soda-nodejs\"\n\nexport async function setEnv(key: string, value?: string) {\n value = value?.trim() ?? \"\"\n\n // 检测操作系统类型\n const isWindows = process.platform === \"win32\"\n\n // Windows 系统\n if (isWindows) await execAsync(`[Environment]::SetEnvironmentVariable(\"${key}\", \"${value}\", \"User\")`, { shell: \"powershell\" })\n else {\n // Linux/Mac 系统修改配置文件\n // 对于 bash,添加到 ~/.bashrc\n // 对于 zsh,添加到 ~/.zshrc\n const shell = process.env.SHELL || \"/bin/bash\"\n const config = shell.includes(\"zsh\") ? \"~/.zshrc\" : \"~/.bashrc\"\n\n await execAsync(`echo \"export ${key}=${value}\" >> ${config}`)\n await execAsync(`source ${config}`)\n }\n\n consola.success(value ? `${key} 已设置为 ${value}` : `${key} 已删除`)\n}\n","import { rm, writeFile } from \"fs/promises\"\n\nimport consola from \"consola\"\n\nimport { addGitignore } from \"./addGitignore\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { Module, ModuleResolution, setTsConfig, Target } from \"./setTsConfig\"\nimport { sortArrayOrObject } from \"./sortArrayOrObject\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nconst fatherrcCode = `import { defineConfig } from \"father\"\n\nexport default defineConfig({\n esm: {},\n cjs: {},\n targets: {\n node: 18,\n chrome: 100\n },\n sourcemap: true\n})\n`\n\nexport async function setFatherConfig() {\n consola.start(\"开始设置 father 配置\")\n let packageJson = await readPackageJson()\n packageJson.publishConfig ??= {}\n packageJson.publishConfig.access = \"public\"\n packageJson.publishConfig.registry = \"https://registry.npmjs.org/\"\n packageJson.publishConfig = sortArrayOrObject(packageJson.publishConfig)\n packageJson.files ??= []\n if (!packageJson.files.includes(\"src\")) packageJson.files.push(\"src\")\n packageJson.files = sortArrayOrObject(packageJson.files)\n const dependencies = packageJson.dependencies\n const devDependencies = packageJson.devDependencies\n const peerDependencies = packageJson.peerDependencies\n if (packageJson.repository?.url && !packageJson.repository.url.startsWith(\"git+\")) packageJson.repository.url = `git+${packageJson.repository.url}.git`\n packageJson.repository ??= {}\n packageJson.repository.type ??= \"git\"\n packageJson.repository.url ??= `git+https://github.com/1adybug/${packageJson.name}.git`\n\n if (!packageJson.types) {\n packageJson = Object.entries(packageJson).reduce((prev: Record<string, unknown>, [key, value]) => {\n prev[key] = value\n\n if (Object.hasOwn(packageJson, \"module\")) {\n if (key === \"module\") prev.types = value.replace(/\\.js$/, \".d.ts\")\n } else {\n if (Object.hasOwn(packageJson, \"main\")) {\n if (key === \"main\") prev.types = value.replace(/\\.js$/, \".d.ts\")\n }\n }\n\n return prev\n }, {})\n }\n\n delete packageJson.dependencies\n delete packageJson.devDependencies\n delete packageJson.peerDependencies\n packageJson.dependencies = sortArrayOrObject(dependencies)\n packageJson.devDependencies = sortArrayOrObject(devDependencies)\n packageJson.peerDependencies = sortArrayOrObject(peerDependencies)\n await addGitignore()\n await writePackageJson({ data: packageJson })\n await writeFile(\".fatherrc.ts\", fatherrcCode)\n await setTsConfig(\"target\", Target.ESNext)\n await setTsConfig(\"module\", Module.ESNext)\n await setTsConfig(\"moduleResolution\", ModuleResolution.Bundler)\n await rm(\"src/client\", { recursive: true, force: true })\n await rm(\"src/server\", { recursive: true, force: true })\n await writeFile(\"src/index.ts\", \"\")\n consola.success(\"设置 father 配置成功\")\n}\n","import inquirer from \"inquirer\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nexport async function setGitProxy() {\n const { global } = await inquirer.prompt({\n type: \"list\",\n name: \"global\",\n message: \"请选择\",\n choices: [\n {\n name: \"全局代理\",\n value: true,\n },\n {\n name: \"当前项目\",\n value: false,\n },\n ],\n })\n const { open } = await inquirer.prompt({\n type: \"list\",\n name: \"open\",\n message: \"请选择\",\n choices: [\n {\n name: \"打开代理\",\n value: true,\n },\n {\n name: \"关闭代理\",\n value: false,\n },\n ],\n })\n\n if (!open) {\n try {\n await spawnAsync(`git config${global ? \" --global\" : \"\"} --unset http.proxy`, { shell: true, stdio: \"inherit\" })\n } catch {\n /* empty */\n }\n\n try {\n await spawnAsync(`git config${global ? \" --global\" : \"\"} --unset https.proxy`, { shell: true, stdio: \"inherit\" })\n } catch {\n /* empty */\n }\n\n return\n }\n\n const { proxy } = await inquirer.prompt({\n type: \"input\",\n name: \"proxy\",\n message: \"请输入代理地址\",\n default: \"http://localhost:7890\",\n })\n await spawnAsync(`git config${global ? \" --global\" : \"\"} http.proxy ${proxy}`, { shell: true, stdio: \"inherit\" })\n await spawnAsync(`git config${global ? \" --global\" : \"\"} https.proxy ${proxy}`, { shell: true, stdio: \"inherit\" })\n}\n","import { Registry } from \"@/constant\"\n\ndeclare global {\n /** 全局 npm 镜像源配置地址 */\n var __ZIXULU_REGISTRY__: string | undefined\n /** 是否启用全局代理配置 */\n var __ZIXULU_PROXY__: boolean | undefined\n}\n\nexport type GlobalConfig = {\n /** npm 镜像源地址 */\n registry?: string\n /** 是否启用代理 */\n proxy?: boolean\n}\n\n/**\n * 设置全局配置参数\n * @param param 全局配置对象\n */\nexport function setGlobalConfig({ registry, proxy }: GlobalConfig) {\n if (Object.keys(Registry).includes(registry!)) global.__ZIXULU_REGISTRY__ = Registry[registry as keyof typeof Registry]\n else global.__ZIXULU_REGISTRY__ = registry\n\n global.__ZIXULU_PROXY__ = !!proxy\n}\n","import { getEnumKeys, getEnumValues } from \"deepsea-tools\"\nimport inquirer from \"inquirer\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nimport { PackageManager, Registry } from \"@/constant/index\"\n\nimport { readBunConfig } from \"./readBunConfig\"\nimport { writeBunConfig } from \"./writeBunConfig\"\n\nexport async function setRegistry() {\n const { manager } = await inquirer.prompt({\n type: \"list\",\n name: \"manager\",\n message: \"请选择包管理器\",\n choices: getEnumValues(PackageManager),\n })\n\n const { registry } = await inquirer.prompt({\n type: \"list\",\n name: \"registry\",\n message: \"请选择要更换的源\",\n choices: getEnumKeys(Registry),\n })\n\n if (manager === PackageManager.bun) {\n const config = await readBunConfig()\n config.install ??= {}\n config.install.registry = \"https://registry.npmmirror.com\"\n await writeBunConfig(config)\n return\n }\n\n await spawnAsync(`${manager} config set registry ${Registry[registry as keyof typeof Registry]}`, { shell: true, stdio: \"inherit\" })\n}\n","import { execAsync } from \"soda-nodejs\"\n\n/**\n * 检测是否开启了 Shell 代理\n */\nexport async function isShellProxy() {\n const result = await execAsync(\"netsh winhttp show proxy\", {\n encoding: \"buffer\",\n decode: { encoding: \"gbk\" },\n })\n return !result.includes(\"直接访问\")\n}\n","import inquirer from \"inquirer\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nimport { isShellProxy } from \"./isShellProxy\"\n\nexport async function setShellProxy() {\n const isOpen = await isShellProxy()\n\n if (isOpen) {\n const { open } = await inquirer.prompt({\n type: \"list\",\n name: \"open\",\n message: \"请选择\",\n choices: [\n {\n name: \"✏️ 更改地址\",\n value: true,\n },\n {\n name: \"🚫 关闭代理\",\n value: false,\n },\n ],\n })\n\n if (!open) {\n await spawnAsync(`netsh winhttp reset proxy`, {\n shell: true,\n stdio: \"inherit\",\n })\n return\n }\n }\n\n const { proxy } = await inquirer.prompt({\n type: \"input\",\n name: \"proxy\",\n message: \"请输入代理地址\",\n default: \"http://localhost:7890\",\n })\n await spawnAsync(`netsh winhttp set proxy \"${proxy}\" \"<local>\"`, {\n shell: true,\n stdio: \"inherit\",\n })\n}\n","import consola from \"consola\"\n\nimport { readPackageJson } from \"./readPackageJson\"\nimport { sortArrayOrObject } from \"./sortArrayOrObject\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport async function sortPackageJson() {\n consola.start(\"开始排序 package.json 中的依赖\")\n const packageJson = await readPackageJson()\n packageJson.dependencies = sortArrayOrObject(packageJson.dependencies)\n packageJson.devDependencies = sortArrayOrObject(packageJson.devDependencies)\n packageJson.peerDependencies = sortArrayOrObject(packageJson.peerDependencies)\n packageJson.peerDevDependencies = sortArrayOrObject(packageJson.peerDevDependencies)\n await writePackageJson({ data: packageJson })\n consola.success(\"排序 package.json 中的依赖成功\")\n}\n","import { existsSync } from \"fs\"\nimport { copyFile, mkdir, readdir, readFile, rm, writeFile } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport inquirer from \"inquirer\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport async function asyncAgentRules() {\n try {\n const packageJson = await readPackageJson()\n if (packageJson?.scripts?.ucr === \"npx zixulu acr\") packageJson.scripts.ucr = undefined\n await writePackageJson({ data: packageJson })\n } catch (error) {}\n\n await spawnAsync(`npx gitpick 1adybug/cursor-rule/tree/main/.cursor/rules .cursor-rules`)\n\n const source = join(\".cursor-rules\")\n\n const target = join(\".cursor\", \"rules\")\n\n let existed = existsSync(target)\n\n if (!existed) await mkdir(target, { recursive: true })\n\n try {\n const sourceDir = await readdir(source)\n const targetDir = await readdir(target)\n\n const map: Record<string, string> = {}\n\n for (const file of sourceDir) {\n if (!targetDir.includes(file)) {\n map[file] = \"new\"\n continue\n }\n\n const sourceContent = await readFile(join(source, file), \"utf-8\")\n const targetContent = await readFile(join(target, file), \"utf-8\")\n if (sourceContent === targetContent) continue\n map[file] = \"modified\"\n }\n\n if (Object.keys(map).length === 0) throw new Error(\"Cursor 规则已是最新\")\n\n interface Answer {\n files: string[]\n }\n\n const { files } = await inquirer.prompt<Answer>({\n type: \"checkbox\",\n name: \"files\",\n message: \"请选择要添加的文件\",\n choices: Object.entries(map).map(([key, value]) => ({\n name: `${key} (${value})`,\n value: key,\n })),\n default: Object.keys(map),\n })\n\n for (const file of files) await copyFile(join(source, file), join(target, file))\n\n await rm(source, { recursive: true })\n\n const dir = await readdir(\".cursor/rules\")\n\n await mkdir(\".agent/rules\", { recursive: true })\n\n const orders = [\"base.mdc\", \"react.mdc\", \"api.mdc\", \"next.mdc\"]\n\n dir.sort((a, b) => orders.indexOf(a) - orders.indexOf(b))\n\n let agentsRule = `# Agent Rules`\n\n for (const file of dir) {\n const source = await readFile(join(\".cursor/rules\", file), \"utf-8\")\n\n const content = source.replace(\n /^---\\nalwaysApply: (true|false)\\n---/,\n (match, p1) => `---\ntrigger: ${p1 === \"true\" ? \"always_on\" : \"model_decision\"}\nglob:\ndescription:\n---`,\n )\n\n const content2 = source.replace(/^---\\nalwaysApply: (true|false)\\n---/, \"\").replace(/^(#+ )/gm, \"#$1\")\n\n agentsRule = agentsRule + content2\n\n agentsRule = agentsRule.replace(/\\n+$/, \"\")\n\n await writeFile(join(\".agent/rules\", file.replace(/\\.mdc$/, \".md\")), content)\n }\n\n agentsRule = agentsRule + \"\\n\"\n\n await writeFile(\"AGENTS.md\", agentsRule)\n\n return getCommitMessage(CommitType.feature, `同步 Agent 规则`)\n } catch (error) {\n await rm(source, { recursive: true })\n throw error\n }\n}\n","import consola from \"consola\"\nimport { execAsync } from \"soda-nodejs\"\n\nexport async function syncCursorExtToCode() {\n const cursorOutput = await execAsync(\"cursor --list-extensions\")\n const cursorExts = new Set(cursorOutput.split(\"\\n\").filter(item => !!item && !item.startsWith(\"anysphere.\")))\n const vscodeOutput = await execAsync(\"code --list-extensions\")\n const vscodeExts = new Set(vscodeOutput.split(\"\\n\").filter(Boolean))\n const installExts = cursorExts.difference(vscodeExts)\n for (const ext of installExts) await execAsync(`code --install-extension ${ext}`)\n const uninstallExts = vscodeExts.difference(cursorExts)\n for (const ext of uninstallExts) await execAsync(`code --uninstall-extension ${ext}`)\n consola.success(\"同步完成\")\n}\n","import { execAsync } from \"soda-nodejs\"\n\nimport { SyncEditorSettingSource } from \"./syncEditorSetting\"\n\nexport interface GetEditorExtensionsParams {\n source: SyncEditorSettingSource\n}\n\nexport async function getEditorExtensions({ source }: GetEditorExtensionsParams) {\n let data: string[] = []\n\n if (source !== \"Online\") {\n const output = await execAsync(`${source} --list-extensions`)\n data = output\n .split(\"\\n\")\n .map(item => item.trim())\n .filter(Boolean)\n } else {\n const response = await fetch(\"https://luzixu.geskj.com/extensions.json\")\n data = await response.json()\n }\n\n data = data.filter(item => !item.startsWith(\"anysphere.\") && item !== \"github.copilot\" && item !== \"github.copilot-chat\")\n\n return new Set(data)\n}\n","import { existsSync } from \"fs\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\n/** 判断是否安装了 AntiGravity */\nexport function hasAntiGravity() {\n const userDir = homedir()\n const path = join(userDir, \"AppData/Roaming/Antigravity\")\n return existsSync(path)\n}\n","import { existsSync } from \"fs\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\n/** 判断是否安装了 VSCode */\nexport function hasCode() {\n const userDir = homedir()\n const path = join(userDir, \"AppData/Roaming/Code\")\n return existsSync(path)\n}\n","import { existsSync } from \"fs\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\n/** 判断是否安装了 Cursor */\nexport function hasCursor() {\n const userDir = homedir()\n const path = join(userDir, \"AppData/Roaming/Cursor\")\n return existsSync(path)\n}\n","import { applyEdits, JSONPath, ModificationOptions, modify } from \"jsonc-parser\"\n\nexport function modifyJsonc(text: string, path: JSONPath, value: any, options?: ModificationOptions) {\n options = { ...options }\n options.formattingOptions = { ...options.formattingOptions }\n options.formattingOptions.tabSize ??= 4\n options.formattingOptions.insertSpaces ??= true\n options.formattingOptions.insertFinalNewline ??= true\n options.formattingOptions.keepLines ??= true\n options.formattingOptions.eol ??= \"\\n\"\n\n const edits = modify(text, path, value, options)\n\n return applyEdits(text, edits)\n}\n","import { existsSync } from \"fs\"\nimport { mkdir, readFile, rename, writeFile } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join, parse } from \"path\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\nimport { execAsync } from \"soda-nodejs\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { addGitCommit } from \"./addGitCommit\"\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { getEditorExtensions } from \"./getEditorExtensions\"\nimport { hasAntiGravity } from \"./hasAntiGravity\"\nimport { hasChangeNoCommit } from \"./hasChangeNoCommit\"\nimport { hasCode } from \"./hasCode\"\nimport { hasCursor } from \"./hasCursor\"\nimport { modifyJsonc } from \"./modifyJsonc\"\nimport { readZixuluSetting } from \"./readZixuluSetting\"\nimport { writeZixuluSetting } from \"./writeZixuluSetting\"\n\nexport type Editor = \"Code\" | \"Cursor\" | \"Antigravity\"\n\nexport type SyncEditorSettingSource = Editor | \"Online\"\n\nexport type EditorFileType = \"settings\" | \"snippets\"\n\nexport type EditorConfigType = EditorFileType | \"extensions\"\n\nexport type EditorFileSourceMap = Record<EditorFileType, Record<SyncEditorSettingSource, string>>\n\nconst userDir = homedir()\n\nconst fileSourceMap: EditorFileSourceMap = {\n settings: {\n Code: join(userDir, \"AppData/Roaming/Code/User/settings.json\"),\n Cursor: join(userDir, \"AppData/Roaming/Cursor/User/settings.json\"),\n Antigravity: join(userDir, \"AppData/Roaming/Antigravity/User/settings.json\"),\n Online: \"https://luzixu.geskj.com/settings.json\",\n },\n snippets: {\n Code: join(userDir, \"AppData/Roaming/Code/User/snippets/global.code-snippets\"),\n Cursor: join(userDir, \"AppData/Roaming/Cursor/User/snippets/global.code-snippets\"),\n Antigravity: join(userDir, \"AppData/Roaming/Antigravity/User/snippets/global.code-snippets\"),\n Online: \"https://luzixu.geskj.com/global.code-snippets\",\n },\n}\n\nexport interface SyncEditorSettingParams {\n source: SyncEditorSettingSource\n target: Editor\n}\n\nexport interface SyncEditorFileItem {\n type: SyncEditorSettingSource\n value: string\n}\n\nexport interface SyncEditorFileParams {\n type: EditorFileType\n source: SyncEditorFileItem\n target: SyncEditorFileItem\n}\n\nasync function getFile(source: string) {\n if (source.startsWith(\"http\")) {\n const response = await fetch(source)\n return await response.text()\n }\n\n return await readFile(source, \"utf-8\")\n}\n\nexport async function syncEditorFile({\n type,\n source: { type: sourceType, value: sourceValue },\n target: { type: targetType, value: targetValue },\n}: SyncEditorFileParams) {\n const { dir, base } = parse(targetValue)\n await mkdir(dir, { recursive: true })\n const setting = await readZixuluSetting()\n let code = await getFile(sourceValue)\n\n if (type === \"settings\") {\n code = modifyJsonc(code, [\"extensions.gallery.serviceUrl\"], undefined)\n code = modifyJsonc(code, [\"antigravity.marketplaceExtensionGalleryServiceURL\"], undefined)\n code = modifyJsonc(code, [\"antigravity.marketplaceGalleryItemURL\"], undefined)\n\n if (targetType === \"Antigravity\") {\n code = modifyJsonc(code, [\"antigravity.marketplaceExtensionGalleryServiceURL\"], \"https://marketplace.visualstudio.com/_apis/public/gallery\")\n code = modifyJsonc(code, [\"antigravity.marketplaceGalleryItemURL\"], \"https://marketplace.visualstudio.com/items\")\n }\n }\n\n if (existsSync(targetValue)) {\n const text = await readFile(targetValue, \"utf-8\")\n\n if (text === code) {\n consola.success(`${targetValue} 已是最新`)\n return\n } else {\n type Answer = { backup: boolean }\n\n let backup = false\n\n if (targetType !== \"Online\") {\n const answer = await inquirer.prompt<Answer>({\n type: \"confirm\",\n name: \"backup\",\n message: `是否备份原文件(${targetValue})`,\n default: setting.syncEditor?.fileConfigs?.[targetValue]?.backup ?? true,\n })\n\n backup = answer.backup\n }\n\n setting.syncEditor ??= {}\n setting.syncEditor.fileConfigs ??= {}\n setting.syncEditor.fileConfigs[targetValue] ??= {}\n setting.syncEditor.fileConfigs[targetValue].backup = backup\n\n await writeZixuluSetting(setting)\n if (backup) await rename(targetValue, join(dir, `${base}.${Date.now()}.bak`))\n }\n }\n\n await writeFile(targetValue, code, \"utf-8\")\n consola.success(`${targetValue} 同步完成`)\n}\n\nexport async function syncEditorSetting() {\n const setting = await readZixuluSetting()\n\n interface Answer {\n source: SyncEditorSettingSource\n types: EditorConfigType[]\n targets: SyncEditorSettingSource[]\n }\n\n const sourceChoices = [\"Online\"]\n\n if (hasCode()) sourceChoices.unshift(\"Code\")\n if (hasCursor()) sourceChoices.unshift(\"Cursor\")\n if (hasAntiGravity()) sourceChoices.unshift(\"Antigravity\")\n\n const { source } = await inquirer.prompt<Answer>([\n {\n type: \"list\",\n name: \"source\",\n message: \"选择同步来源\",\n choices: sourceChoices,\n default: setting.syncEditor?.source ?? \"Cursor\",\n },\n ])\n\n setting.syncEditor ??= {}\n setting.syncEditor.source = source\n\n const targetChoices = sourceChoices.filter(v => v !== source)\n\n if (targetChoices.length === 0) return consola.info(\"没有可同步的目标\")\n\n const { targets, types } = await inquirer.prompt<Answer>([\n {\n type: \"checkbox\",\n name: \"targets\",\n message: \"选择同步目标\",\n choices: targetChoices,\n default: setting.syncEditor?.targets?.filter(item => targetChoices.includes(item)) ?? targetChoices,\n },\n {\n type: \"checkbox\",\n name: \"types\",\n message: \"选择的配置类型\",\n choices: [\"settings\", \"snippets\", \"extensions\"],\n default: setting.syncEditor?.types ?? [\"settings\", \"snippets\", \"extensions\"],\n },\n ])\n\n setting.syncEditor.targets = targets\n setting.syncEditor.types = types\n\n if (targets.includes(\"Online\")) {\n interface Answer {\n onlinePath: string\n }\n\n const { onlinePath } = await inquirer.prompt<Answer>({\n type: \"input\",\n name: \"onlinePath\",\n message: \"请输入 blog 文件夹的路径(留空则跳过)\",\n default: setting.syncEditor?.onlinePath,\n })\n\n setting.syncEditor.onlinePath = onlinePath.trim() ?? undefined\n }\n\n if (!setting.syncEditor.onlinePath) setting.syncEditor.targets = targets.filter(v => v !== \"Online\")\n\n const onlinePath = setting.syncEditor.onlinePath!\n\n const configs: SyncEditorFileParams[] = types\n .filter(item => item !== \"extensions\")\n .map(fileType =>\n targets.map(target => ({\n type: fileType,\n source: { type: source, value: fileSourceMap[fileType][source] },\n target: {\n type: target,\n value:\n target === \"Online\"\n ? join(onlinePath, \"static\", fileType === \"settings\" ? \"settings.json\" : \"global.code-snippets\")\n : fileSourceMap[fileType][target],\n },\n })))\n .flat()\n\n for (const config of configs) await syncEditorFile(config)\n\n if (types.includes(\"extensions\")) {\n const vscodeExtensions = await getEditorExtensions({ source: \"Code\" })\n const cursorExtensions = await getEditorExtensions({ source: \"Cursor\" })\n const antigravityExtensions = await getEditorExtensions({ source: \"Antigravity\" })\n const onlineExtensions = await getEditorExtensions({ source: \"Online\" })\n\n const sourceExtensions =\n source === \"Code\" ? vscodeExtensions : source === \"Cursor\" ? cursorExtensions : source === \"Antigravity\" ? antigravityExtensions : onlineExtensions\n\n if (targets.includes(\"Code\")) {\n const installExtensions = sourceExtensions.difference(vscodeExtensions)\n\n for (const ext of installExtensions) {\n try {\n console.log(`code --install-extension ${ext}`)\n await execAsync(`code --install-extension ${ext}`)\n } catch (error) {\n console.error(`${ext} 安装失败`)\n }\n }\n\n const uninstallExtensions = vscodeExtensions.difference(sourceExtensions)\n\n for (const ext of uninstallExtensions) {\n try {\n console.log(`code --uninstall-extension ${ext}`)\n await execAsync(`code --uninstall-extension ${ext}`)\n } catch (error) {\n console.error(`${ext} 卸载失败`)\n }\n }\n }\n\n if (targets.includes(\"Cursor\")) {\n const installExtensions = sourceExtensions.difference(cursorExtensions)\n\n for (const ext of installExtensions) {\n try {\n console.log(`cursor --install-extension ${ext}`)\n await execAsync(`cursor --install-extension ${ext}`)\n } catch (error) {\n console.error(`${ext} 安装失败`)\n }\n }\n\n const uninstallExtensions = cursorExtensions.difference(sourceExtensions)\n\n for (const ext of uninstallExtensions) {\n try {\n console.log(`cursor --uninstall-extension ${ext}`)\n await execAsync(`cursor --uninstall-extension ${ext}`)\n } catch (error) {\n console.error(`${ext} 卸载失败`)\n }\n }\n }\n\n if (targets.includes(\"Antigravity\")) {\n const installExtensions = sourceExtensions.difference(antigravityExtensions)\n\n for (const ext of installExtensions) {\n try {\n console.log(`antigravity --install-extension ${ext}`)\n await execAsync(`antigravity --install-extension ${ext}`)\n } catch (error) {\n console.error(`${ext} 安装失败`)\n }\n }\n\n const uninstallExtensions = antigravityExtensions.difference(sourceExtensions)\n\n for (const ext of uninstallExtensions) {\n try {\n console.log(`antigravity --uninstall-extension ${ext}`)\n await execAsync(`antigravity --uninstall-extension ${ext}`)\n } catch (error) {\n console.error(`${ext} 卸载失败`)\n }\n }\n }\n\n if (targets.includes(\"Online\")) await writeFile(join(onlinePath, \"static\", \"extensions.json\"), JSON.stringify(Array.from(sourceExtensions), null, 4))\n }\n\n if (targets.includes(\"Online\")) {\n await execAsync(\"npm run format\", { cwd: onlinePath })\n\n if (await hasChangeNoCommit(onlinePath)) {\n await addGitCommit({\n message: getCommitMessage(CommitType.feature, \"sync editor setting\"),\n cwd: onlinePath,\n })\n await execAsync(`git push`, {\n cwd: onlinePath,\n })\n }\n }\n\n await writeZixuluSetting(setting)\n}\n","import { mkdir } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\nimport fetch from \"node-fetch\"\nimport { execAsync } from \"soda-nodejs\"\n\nimport { agent } from \"@/constant/index\"\n\nimport { download } from \"./download\"\nimport { readZixuluSetting } from \"./readZixuluSetting\"\nimport { retry } from \"./retry\"\nimport { writeZixuluSetting } from \"./writeZixuluSetting\"\n\n/**\n * VSCode扩展信息接口\n */\nexport interface VscodeExt {\n id: string // 扩展ID\n name: string // 扩展显示名称\n version: string // 扩展版本\n url: string // 下载URL\n}\n\n/**\n * 获取指定VSCode扩展的详细信息\n * @param ext 扩展ID\n * @returns Promise<VscodeExt> 扩展详细信息\n */\nexport async function getVscodeExtInfo(ext: string): Promise<VscodeExt> {\n const response = await fetch(`https://marketplace.visualstudio.com/items?itemName=${ext}`, { agent })\n const html = await response.text()\n const reg = /^(.+?)\\.(.+?)$/\n const [, author, name] = ext.match(reg)!\n let version: string\n\n if (ext === \"ms-ceintl.vscode-language-pack-zh-hans\") {\n const reg2 = /\"Versions\":(\\[\\{\".+?\\])/\n const versions = JSON.parse(html.match(reg2)![1]) as {\n version: string\n }[]\n const output = await execAsync(\"code --version\")\n const codeVersions = output.split(\"\\n\")[0].split(\".\").map(Number)\n const item =\n versions.find(({ version }) =>\n version\n .split(\".\")\n .map(Number)\n .every((item, index) => index >= 2 || item <= codeVersions[index])) ?? versions[0]\n version = item.version\n } else {\n const reg2 = /\"Version\":\"(.+?)\"/\n version = html.match(reg2)![1]\n }\n\n const reg4 = /<span class=\"ux-item-name\">(.+?)<\\/span>/\n const displayName = html.match(reg4)![1]\n const url = `https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${author}/vsextensions/${name}/${version}/vspackage`\n return { id: ext, name: displayName, version, url }\n}\n\n/**\n * 下载选定的VSCode扩展\n * @param dir 下载目标目录\n */\nexport async function downloadVscodeExts(dir: string) {\n await mkdir(dir, { recursive: true })\n consola.start(\"正在获取 VS Code 扩展列表\")\n const extList = await execAsync(\"code --list-extensions\")\n const exts = await Promise.all(\n extList\n .split(/[\\n\\r]/)\n .filter(Boolean)\n .filter(item => !item.startsWith(\"anysphere.\"))\n .map(ext => getVscodeExtInfo(ext)),\n )\n const setting = await readZixuluSetting()\n const vscodeDownloadHistory = setting?.vscodeDownloadHistory as string[] | undefined\n const exts2 = await inquirer.prompt({\n type: \"checkbox\",\n name: \"exts\",\n message: \"选择需要下载的扩展\",\n choices: exts.map(ext => ({ name: ext.name, value: ext.id })),\n default: vscodeDownloadHistory?.filter(ext => exts.some(item => item.id === ext)) || exts.map(ext => ext.id),\n })\n setting.vscodeDownloadHistory = exts2.exts\n await writeZixuluSetting(setting)\n await Promise.all(exts.filter(ext => exts2.exts.includes(ext.id)).map(ext => retry(() => download(ext.url, dir, `${ext.id}-${ext.version}.vsix`), 4)))\n}\n","import { copyFile, mkdir, readdir, readFile, rm, writeFile } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\nimport consola from \"consola\"\nimport dayjs from \"dayjs\"\nimport { getEnumEntries, getEnumValues } from \"deepsea-tools\"\nimport inquirer from \"inquirer\"\n\nimport { download } from \"./download\"\nimport { downloadVscodeExts } from \"./downloadVscodeExts\"\n\nexport enum VscodeSyncOption {\n \"配置\" = \"SETTING\",\n \"插件\" = \"EXTENSION\",\n \"软件\" = \"SOFTWARE\",\n \"PowerShell\" = \"POWERSHELL\",\n}\n\nexport async function syncVscode() {\n const options: VscodeSyncOption[] = (\n await inquirer.prompt({\n type: \"checkbox\",\n name: \"options\",\n message: \"请选择要同步的内容\",\n choices: getEnumEntries(VscodeSyncOption).map(([name, value]) => ({\n name,\n value,\n })),\n default: getEnumValues(VscodeSyncOption),\n })\n ).options\n if (options.length === 0) return\n const userDir = homedir()\n const snippetSource = join(userDir, \"AppData/Roaming/Code/User/snippets\")\n const setting = (await readFile(join(userDir, \"AppData/Roaming/Code/User/settings.json\"), \"utf-8\")).replace(\n /}[ \\n\\r]*$/,\n ` \"chat.disableAIFeatures\": true,\\n}`,\n )\n const dir = `vscode-${dayjs().format(\"YYYYMMDDHHmmss\")}`\n\n try {\n await mkdir(dir, { recursive: true })\n\n if (options.includes(VscodeSyncOption.配置)) {\n const snippetTarget = join(dir, \"snippets\")\n await mkdir(snippetTarget, { recursive: true })\n consola.start(\"开始下载最新 VSCode 配置\")\n await writeFile(join(dir, \"settings.json\"), setting, \"utf-8\")\n const files = await readdir(snippetSource)\n for (const file of files) await copyFile(join(snippetSource, file), join(snippetTarget, file))\n consola.success(\"下载最新 VSCode 配置完成\")\n }\n\n if (options.includes(VscodeSyncOption.插件)) {\n await downloadVscodeExts(join(dir, \"extensions\"))\n consola.success(\"下载最新 VSCode 插件完成\")\n }\n\n if (options.includes(VscodeSyncOption.配置) || options.includes(VscodeSyncOption.插件)) {\n const script = `// @ts-check\n\nimport { spawn } from \"child_process\"\nimport { readdir, copyFile, rm } from \"fs/promises\"\nimport { homedir } from \"os\"\nimport { join } from \"path\"\n\n/** \n * @param {string} command\n */\nfunction spawnAsync(command) {\n return new Promise((resolve, reject) => {\n const child = spawn(command, { shell: true, stdio: \"inherit\" })\n child.on(\"exit\", code => {\n if (code !== 0) return reject(new Error(\\`Command failed with code \\${code}\\`))\n resolve(0)\n })\n })\n}\n\nasync function main() {\n${\n options.includes(VscodeSyncOption.插件)\n ? ` const dir = await readdir(\"./extensions\")\n for (const ext of dir) {\n await spawnAsync(\\`code --install-extension \"./extensions/\\${ext}\"\\`)\n }\n`\n : \"\"\n}${\n options.includes(VscodeSyncOption.配置)\n ? ` const userDir = homedir()\n const setting = join(userDir, \"AppData/Roaming/Code/User/settings.json\")\n await rm(setting, { force: true })\n await copyFile(\"./settings.json\", setting)\n const snippetTarget = join(userDir, \"AppData/Roaming/Code/User/snippets\")\n const dir2 = await readdir(\"./snippets\")\n for (const file of dir2) {\n await rm(join(snippetTarget, file), { force: true })\n await copyFile(join(\"./snippets\", file), join(snippetTarget, file))\n }`\n : \"\"\n }${\n options.includes(VscodeSyncOption.PowerShell)\n ? `\n ${\n options.includes(VscodeSyncOption.配置)\n ? \"\"\n : `const userDir = homedir()\n`\n }const profile = join(userDir, \"Documents/PowerShell/Microsoft.PowerShell_profile.ps1\")\n await copyFile(\"./Microsoft.PowerShell_profile.ps1\", profile)`\n : \"\"\n }\n}\n\nmain()`\n\n await writeFile(join(dir, \"syncVscode.mjs\"), script, \"utf-8\")\n }\n\n if (options.includes(VscodeSyncOption.软件)) {\n consola.start(\"开始下载最新 VSCode\")\n await download(`https://code.visualstudio.com/sha/download?build=stable&os=win32-x64`, dir)\n consola.success(\"下载最新 VSCode 完成\")\n }\n\n if (options.includes(VscodeSyncOption.PowerShell)) {\n consola.start(\"开始同步 PowerShell 配置\")\n const userDir = homedir()\n const profile = join(userDir, \"Documents/PowerShell/Microsoft.PowerShell_profile.ps1\")\n const content = await readFile(profile, \"utf-8\")\n await writeFile(join(dir, \"Microsoft.PowerShell_profile.ps1\"), content.replace(/cursor|antigravity/g, \"code\"))\n consola.success(\"同步 PowerShell 配置成功\")\n }\n } catch (error) {\n type PromptResult = {\n clear: boolean\n }\n\n const { clear } = await inquirer.prompt<PromptResult>({\n type: \"confirm\",\n name: \"clear\",\n message: \"检测到错误,是否清理下载的文件\",\n default: true,\n })\n if (clear) await rm(dir, { force: true, recursive: true })\n throw error\n }\n}\n","import { readdir, rename } from \"fs/promises\"\n\nimport { getPackageVersionInDependcy } from \"./getPackageVersionInDependcy\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport async function tailwindPatch() {\n const version = await getPackageVersionInDependcy(\"tailwindcss\")\n if (!version) return\n const dir = await readdir(\"./patches\")\n const patch = dir.find(item => item.startsWith(\"tailwindcss\"))\n if (!patch || patch === `tailwindcss@${version}.patch`) return\n await rename(`./patches/${patch}`, `./patches/tailwindcss@${version}.patch`)\n const packageJson = await readPackageJson()\n packageJson.patchedDependencies ??= {}\n delete packageJson.patchedDependencies[patch.replace(/\\.patch$/, \"\")]\n packageJson.patchedDependencies[`tailwindcss@${version}`] = `patches/tailwindcss@${version}.patch`\n await writePackageJson({ data: packageJson })\n await installDependceny()\n}\n","import { existsSync } from \"fs\"\n\nimport inquirer from \"inquirer\"\nimport { compress } from \"soda-nodejs\"\n\nexport interface TarParams {\n input: string\n output?: string\n}\n\nexport async function tar({ input, output }: TarParams) {\n output = `${input}.tar.gz`\n\n if (existsSync(output)) {\n interface Answer {\n overwrite: boolean\n }\n\n const { overwrite } = await inquirer.prompt<Answer>({\n type: \"confirm\",\n name: \"overwrite\",\n message: \"文件已存在,是否覆盖\",\n })\n if (!overwrite) return\n }\n\n await compress({ input, output })\n}\n","import { isSudo } from \"@/constant\"\n\nexport async function test() {\n console.log(isSudo)\n console.log(process.argv)\n}\n","import { spawnAsync } from \"soda-nodejs\"\n\nexport interface PullDockerImageParams {\n image: string\n sha256: string\n}\n\nexport async function pullDockerImage({ image, sha256 }: PullDockerImageParams) {\n const match = image.match(/^(.+):(.+)$/)\n image = match ? match[1] : image\n const tag = match ? match[2] : \"latest\"\n sha256 = sha256?.replace(/^@?sha256:/, \"\")\n await spawnAsync(`docker pull ${image}@sha256:${sha256}`, {\n shell: true,\n stdio: \"inherit\",\n })\n await spawnAsync(`docker tag ${image}@sha256:${sha256} ${image}:${tag}`, {\n shell: true,\n stdio: \"inherit\",\n })\n}\n","import { readdir, readFile } from \"fs/promises\"\n\nimport consola from \"consola\"\nimport fetch from \"node-fetch\"\nimport { spawnAsync } from \"soda-nodejs\"\nimport yaml from \"yaml\"\n\nimport { agent } from \"@/constant\"\n\nimport { pullDockerImage } from \"./pullDockerImage\"\n\nexport interface Container {\n container_name: string\n image: string\n restart: string\n ports: string[]\n}\n\nexport interface DockerCompose {\n services: Record<string, Container>\n}\n\nexport interface DockerImageDto {\n creator: number\n id: number\n images: DockerImageInfo[]\n last_updated: string\n last_updater: number\n last_updater_username: string\n name: string\n repository: number\n full_size: number\n v2: boolean\n tag_status: string\n tag_last_pulled: string\n tag_last_pushed: string\n media_type: string\n content_type: string\n digest: string\n}\n\nexport interface DockerImageInfo {\n architecture: string\n features: string\n variant?: string\n digest: string\n os: string\n os_features: string\n os_version?: string\n size: number\n status: string\n last_pulled: string\n last_pushed: string\n}\n\nexport async function updateDockerCompose() {\n const dir = await readdir(\".\")\n const file = dir.find(item => item === \"docker-compose.yml\" || item === \"docker-compose.yaml\")\n if (!file) throw new Error(\"docker-compose.yml 或 docker-compose.yaml 文件不存在\")\n const content = await readFile(file, \"utf-8\")\n const data = yaml.parse(content) as DockerCompose\n const images = Object.values(data.services).map(service => service.image) as string[]\n\n for (const image of images) {\n consola.start(`开始更新镜像 ${image}`)\n const match = image.match(/^(.+):(.+)$/)\n const name = match ? match[1] : image\n const tag = match ? match[2] : \"latest\"\n const response = await fetch(`https://hub.docker.com/v2/repositories/${name}/tags/${tag}`, { agent })\n const data = (await response.json()) as DockerImageDto\n const sha256 = data.digest\n await pullDockerImage({ image, sha256 })\n consola.info(`更新镜像 ${image} 完成`)\n }\n\n await spawnAsync(\"docker compose down\", {\n shell: true,\n stdio: \"inherit\",\n })\n\n await spawnAsync(\"docker compose up -d\", {\n shell: true,\n stdio: \"inherit\",\n })\n\n consola.success(\"启动容器完成\")\n}\n","/**\n * 获取版本号\n * @param requiredVersion - 版本号\n * @returns 版本号\n */\nexport function getPackageVersionFromRange(requiredVersion: string) {\n return requiredVersion.replace(/^\\D*/, \"\")\n}\n","import consola from \"consola\"\nimport semver from \"semver\"\n\nimport { getPackageRequiredVersion } from \"./getPackageRequiredVersion\"\nimport { getPackageVersionFromRange } from \"./getPackageVersionFromRange\"\nimport { UpgradeLevel } from \"./getUpgradeDependencyConfig\"\nimport { retry } from \"./retry\"\n\n/**\n * 包升级配置接口\n */\nexport type GetPackageUpgradeVersionConfig = {\n /** 包名 */\n packageName: string\n /** 当前版本 */\n version: string\n /** 升级级别:major/minor/patch */\n level: UpgradeLevel\n}\n\n/**\n * 获取包的推荐升级版本\n * @param config 升级配置\n * @returns 推荐的升级版本号,如果没有可用升级则返回 undefined\n * @description\n * 1. 获取所有可用版本\n * 2. 根据语义化版本规则过滤符合升级要求的版本\n * 3. 按版本号排序并返回最新的符合条件的版本\n */\nexport async function getPackageUpgradeVersion({ packageName, version, level }: GetPackageUpgradeVersionConfig) {\n version = getPackageVersionFromRange(version)\n const minorVersion = semver.inc(version, \"minor\")\n const majorVersion = semver.inc(version, \"major\")\n\n const versionRange = level === \"patch\" ? `>=${version} <${minorVersion}` : level === \"minor\" ? `>=${version} <${majorVersion}` : `>=${version}`\n\n const result = await retry({\n action: () => getPackageRequiredVersion(packageName, versionRange),\n count: 4,\n callback: (error, current) => consola.error(`获取 ${packageName} 版本失败,第 ${current} 次重试`),\n })\n return result\n}\n","import inquirer, { DistinctQuestion } from \"inquirer\"\n\nexport type UpgradeType = \"dependencies\" | \"devDependencies\"\n\nexport type UpgradeLevel = \"major\" | \"minor\" | \"patch\"\n\nexport type UpgradeDependencyConfig = {\n dir: string\n types: UpgradeType[]\n level: UpgradeLevel\n}\n\n/**\n * 获取升级配置\n */\nexport async function getUpgradeDependencyConfig<T extends keyof UpgradeDependencyConfig = keyof UpgradeDependencyConfig>(\n ...keys: T[]\n): Promise<Pick<UpgradeDependencyConfig, T> & Partial<Pick<UpgradeDependencyConfig, Exclude<keyof UpgradeDependencyConfig, T>>>> {\n const ks = keys.length === 0 ? [\"dir\", \"types\", \"level\"] : keys\n\n const questions: DistinctQuestion<UpgradeDependencyConfig>[] = []\n\n if (ks.includes(\"dir\")) {\n questions.push({\n type: \"input\",\n name: \"dir\",\n message: \"请输入升级的目录\",\n default: \".\",\n })\n }\n\n if (ks.includes(\"types\")) {\n questions.push({\n type: \"checkbox\",\n name: \"types\",\n message: \"请选择要升级的依赖类型\",\n choices: [\"dependencies\", \"devDependencies\"],\n default: [\"dependencies\", \"devDependencies\"],\n })\n }\n\n if (ks.includes(\"level\")) {\n questions.push({\n type: \"select\",\n name: \"level\",\n message: \"请选择升级的级别\",\n choices: [\"major\", \"minor\", \"patch\"],\n default: \"minor\",\n })\n }\n\n const config = await inquirer.prompt<UpgradeDependencyConfig>(questions)\n\n return config\n}\n","import inquirer from \"inquirer\"\n\nimport { CommitType } from \"@/constant/index\"\n\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { getPackageUpgradeVersion } from \"./getPackageUpgradeVersion\"\nimport { getPackageVersionFromRange } from \"./getPackageVersionFromRange\"\nimport { getUpgradeDependencyConfig, UpgradeDependencyConfig } from \"./getUpgradeDependencyConfig\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport type UpgradeInfo = {\n package: string\n oldVersion: string\n newVersion: string\n strVersion: string\n}\n\nexport async function upgradeDependency(config?: UpgradeDependencyConfig): Promise<string> {\n const { dir, types, level } = config ?? (await getUpgradeDependencyConfig(\"types\", \"level\"))\n const packageJson = await readPackageJson(dir)\n\n if (!packageJson.dependencies && !packageJson.devDependencies) return \"\"\n\n if (types.length === 0) return \"\"\n\n const upgradeLogs: string[] = []\n\n for (const type of types) {\n const upgrades: UpgradeInfo[] = []\n\n const allPkgs = Object.keys(packageJson[type] || {})\n\n for (let i = 0; i < allPkgs.length; i++) {\n try {\n const pkg = allPkgs[i]\n const rv = packageJson[type][pkg]\n const s = rv.match(/^\\D*/)![0]\n const cv = getPackageVersionFromRange(rv)\n\n const version = await getPackageUpgradeVersion({\n packageName: pkg,\n version: cv,\n level,\n })\n\n if (!version || version === cv) continue\n\n upgrades.push({\n package: pkg,\n oldVersion: cv,\n newVersion: version,\n strVersion: `${s}${version}`,\n })\n } catch {\n continue\n }\n }\n\n if (upgrades.length === 0) continue\n\n const choices = upgrades.map(upgrade => ({\n name: `${upgrade.package} ${upgrade.oldVersion} => ${upgrade.newVersion}`,\n value: upgrade.package,\n }))\n\n const { pkgs } = await inquirer.prompt({\n type: \"checkbox\",\n name: \"pkgs\",\n message: \"请选择要升级的包\",\n choices,\n default: upgrades.map(upgrade => upgrade.package),\n })\n\n pkgs.forEach((pkg: string) => {\n const upgrade = upgrades.find(upgrade => upgrade.package === pkg)!\n packageJson[type][pkg] = upgrade.strVersion\n upgradeLogs.push(`${pkg} ${upgrade.oldVersion} => ${upgrade.newVersion}`)\n })\n }\n\n if (upgradeLogs.length === 0) return \"\"\n\n await writePackageJson({ data: packageJson, dir })\n await installDependceny()\n\n return getCommitMessage(CommitType.feature, `upgrade dependencies: ${upgradeLogs.join(\", \")}`)\n}\n","import fetch from \"node-fetch\"\n\nimport { agent } from \"@/constant\"\n\nimport { getRegistry } from \"./getRegistry\"\n\n/**\n * 获取 npm 包的最新版本号\n * @param packageName 包名\n * @returns 最新版本号\n * @description\n * 通过 registry API 获取指定包的最新版本信息\n * 支持通过代理访问\n */\nexport async function getPackageLatestVersion(packageName: string) {\n const registry = await getRegistry()\n const url = new URL(`/${packageName}/latest`, registry)\n const response = await fetch(url, {\n agent: global.__ZIXULU_PROXY__ ? agent : undefined,\n })\n\n const data = (await response.json()) as any\n return data.version as string\n}\n","import consola from \"consola\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { getPackageLatestVersion } from \"./getPackageLatestVersion\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport async function upgradeRsbuild() {\n const packageJson = await readPackageJson()\n const rsbuildDependencies = Object.entries({\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n }).filter(([key]) => key.startsWith(\"@rsbuild/\")) as [string, string][]\n\n const upgradeLogs: string[] = []\n\n for (const [key, value] of rsbuildDependencies) {\n const version = await getPackageLatestVersion(key)\n const [, b, c] = Array.from(value.match(/^(\\D*)(\\d.*)$/)!)\n if (c === version) continue\n if (packageJson.dependencies?.[key]) packageJson.dependencies[key] = `${b}${version}`\n if (packageJson.devDependencies?.[key]) packageJson.devDependencies[key] = `${b}${version}`\n upgradeLogs.push(`${key} ${c} => ${version}`)\n }\n\n if (upgradeLogs.length === 0) return \"\"\n await writePackageJson({ data: packageJson })\n await installDependceny()\n const upgradeLog = `upgrade dependencies: ${upgradeLogs.join(\", \")}`\n consola.success(upgradeLog)\n return getCommitMessage(CommitType.feature, upgradeLog)\n}\n","import { rename } from \"fs/promises\"\n\nimport consola from \"consola\"\n\nimport { CommitType } from \"@/constant\"\n\nimport { getCommitMessage } from \"./getCommitMessage\"\nimport { getPackageUpgradeVersion } from \"./getPackageUpgradeVersion\"\nimport { getPackageVersionInDependcy } from \"./getPackageVersionInDependcy\"\nimport { installDependceny } from \"./installDependceny\"\nimport { readPackageJson } from \"./readPackageJson\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nexport async function upgradeTailwind() {\n const version = await getPackageVersionInDependcy(\"tailwindcss\")\n if (!version) throw new Error(\"tailwindcss not found\")\n const newVersion = await getPackageUpgradeVersion({\n packageName: \"tailwindcss\",\n version,\n level: \"minor\",\n })\n if (newVersion === version) throw new Error(\"tailwindcss is already the latest version\")\n const packageJson = await readPackageJson()\n if (packageJson.dependencies?.tailwindcss) packageJson.dependencies.tailwindcss = `^${newVersion}`\n if (packageJson.devDependencies?.tailwindcss) packageJson.devDependencies.tailwindcss = `^${newVersion}`\n await rename(`patches/tailwindcss@${version}.patch`, `patches/tailwindcss@${newVersion}.patch`)\n delete packageJson.pnpm.patchedDependencies[`tailwindcss@${version}`]\n packageJson.pnpm.patchedDependencies[`tailwindcss@${newVersion}`] = `patches/tailwindcss@${newVersion}.patch`\n await writePackageJson({ data: packageJson })\n await installDependceny()\n const upgradeLog = `upgrade dependencies: tailwindcss ${version} => ${newVersion}`\n consola.success(upgradeLog)\n return getCommitMessage(CommitType.feature, upgradeLog)\n}\n","import { readdir, stat } from \"fs/promises\"\nimport { join, resolve } from \"path\"\nimport { chdir } from \"process\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\n\nimport { actionWithBackup } from \"./actionWithBackup\"\nimport { getUpgradeDependencyConfig } from \"./getUpgradeDependencyConfig\"\nimport { readZixuluSetting } from \"./readZixuluSetting\"\nimport { upgradeDependency } from \"./upgradeDependency\"\nimport { writeZixuluSetting } from \"./writeZixuluSetting\"\n\nexport async function upgradeWorkspaceDependceny() {\n const { dir, ...rest } = await getUpgradeDependencyConfig()\n const dir2 = resolve(dir)\n const packages = await readdir(dir2)\n\n const packages2: string[] = []\n\n for (const pkg of packages) {\n const stat2 = await stat(join(dir2, pkg))\n if (!stat2.isDirectory()) continue\n const dir3 = await readdir(join(dir2, pkg))\n if (dir3.includes(\"package.json\")) packages2.push(pkg)\n }\n\n const setting = await readZixuluSetting()\n\n type PromptResult = {\n packages3: string[]\n }\n\n const { packages3 } = await inquirer.prompt<PromptResult>([\n {\n type: \"checkbox\",\n name: \"packages3\",\n message: \"请选择要升级的包\",\n choices: packages2,\n default: setting.upgradeWorkspaceDependcenyHistory?.[dir2],\n },\n ])\n\n setting.upgradeWorkspaceDependcenyHistory ??= {}\n setting.upgradeWorkspaceDependcenyHistory[dir2] = packages3\n\n await writeZixuluSetting(setting)\n\n for (const pkg of packages3) {\n consola.start(`开始升级 ${pkg} 的依赖`)\n chdir(join(dir2, pkg))\n await actionWithBackup(() =>\n upgradeDependency({\n dir: \".\",\n ...rest,\n }))()\n }\n}\n","import { mkdir, readdir, stat, writeFile } from \"fs/promises\"\nimport { join, resolve } from \"path\"\n\nimport consola from \"consola\"\nimport inquirer from \"inquirer\"\nimport { spawnAsync } from \"soda-nodejs\"\n\nimport { readZixuluSetting } from \"./readZixuluSetting\"\nimport { writeZixuluSetting } from \"./writeZixuluSetting\"\n\nconst script = `import { spawnSync } from \"child_process\"\nimport { rmSync } from \"fs\"\n\nspawnSync(\"docker compose down\", { cwd: \"verdaccio\", shell: true, stdio: \"inherit\" })\n\nspawnSync(\"rimraf verdaccio\", { shell: true, stdio: \"inherit\" })\n\nspawnSync(\"7z x verdaccio.zip\", { shell: true, stdio: \"inherit\" })\n\nspawnSync(\"docker compose up -d\", { cwd: \"verdaccio\", shell: true, stdio: \"inherit\" })\n\nspawnSync(\"rimraf verdaccio.zip\", { shell: true, stdio: \"inherit\" })\n\nrmSync(import.meta.filename)\n`\n\nexport async function verdaccio() {\n const dir = await readdir(\".\")\n\n if (dir.includes(\".verdaccio\")) {\n consola.warn(\".verdaccio 文件夹已存在\")\n process.exit(1)\n }\n\n await mkdir(\".verdaccio\", { recursive: true })\n\n const setting = await readZixuluSetting()\n\n interface Answer {\n verdaccioPath: string\n }\n\n let { verdaccioPath } = await inquirer.prompt<Answer>({\n type: \"input\",\n name: \"verdaccioPath\",\n message: \"请输入 verdaccio 文件夹的位置\",\n default: setting.verdaccioPath,\n })\n\n verdaccioPath = verdaccioPath.replace(/^\"|\"$/g, \"\")\n\n verdaccioPath = resolve(verdaccioPath)\n const stats = await stat(verdaccioPath)\n if (!stats.isDirectory()) throw new Error(\"verdaccio 文件夹不存在\")\n\n setting.verdaccioPath = verdaccioPath\n await writeZixuluSetting(setting)\n\n await spawnAsync(`7z a .verdaccio/verdaccio.zip ${verdaccioPath}`, { shell: true, stdio: \"inherit\" })\n\n await writeFile(join(\".verdaccio\", \"verdaccio.mjs\"), script, \"utf-8\")\n}\n","import { spawnAsync } from \"soda-nodejs\"\n\nexport async function winget() {\n const args = [\"update\", \"--accept-package-agreements\", \"--accept-source-agreements\", \"--all\"]\n\n if (global.__ZIXULU_PROXY__) args.push(\"--proxy\", \"http://127.0.0.1:7890\")\n spawnAsync(\"winget\", args)\n}\n","import { stat, writeFile } from \"fs/promises\"\nimport { parse, resolve } from \"path\"\n\nexport interface OpenWithOptions {\n file: boolean\n folder: boolean\n background: boolean\n}\n\nexport async function addOpenWith(path: string, { file, folder, background }: OpenWithOptions) {\n if (!file && !folder && !background) throw new Error(\"至少选择一个\")\n\n path = resolve(path)\n\n try {\n const status = await stat(path)\n if (!status.isFile()) throw new Error(\"路径不是文件\")\n } catch (error) {}\n\n const { name } = parse(path)\n\n const escapedPath = path.replace(/[\\\\\\/]/g, \"\\\\\\\\\")\n\n let reg = `\\ufeffWindows Registry Editor Version 5.00\n`\n\n if (file) {\n reg += `\n[HKEY_CLASSES_ROOT\\\\*\\\\shell\\\\${name}]\n@=\"使用 ${name} 打开\"\n\"Icon\"=\"\\\\\"${escapedPath}\\\\\"\"\n\n[HKEY_CLASSES_ROOT\\\\*\\\\shell\\\\${name}\\\\command]\n@=\"\\\\\"${escapedPath}\\\\\" \\\\\"%1\\\\\"\"`\n }\n\n if (folder) {\n reg += `\n[HKEY_CLASSES_ROOT\\\\Directory\\\\shell\\\\${name}]\n@=\"使用 ${name} 打开\"\n\"Icon\"=\"\\\\\"${escapedPath}\\\\\"\"\n\n[HKEY_CLASSES_ROOT\\\\Directory\\\\shell\\\\${name}\\\\command]\n@=\"\\\\\"${escapedPath}\\\\\" \\\\\"%V\\\\\"\"`\n }\n\n if (background) {\n reg += `\n[HKEY_CLASSES_ROOT\\\\Directory\\\\Background\\\\shell\\\\${name}]\n@=\"使用 ${name} 打开\"\n\"Icon\"=\"\\\\\"${escapedPath}\\\\\"\"\n\n[HKEY_CLASSES_ROOT\\\\Directory\\\\Background\\\\shell\\\\${name}\\\\command]\n@=\"\\\\\"${escapedPath}\\\\\" \\\\\"%V\\\\\"\"\n`\n }\n\n await writeFile(`add_open_with_${name}.reg`, reg, \"utf-16le\")\n}\n","import { copyFile, mkdir, readdir, rename, writeFile } from \"fs/promises\"\nimport { join } from \"path\"\n\nimport consola from \"consola\"\nimport { execAsync, setDefaultOptions, spawnAsync } from \"soda-nodejs\"\n\nimport { readPackageJson } from \"./readPackageJson\"\nimport { verdaccio } from \"./verdaccio\"\nimport { writePackageJson } from \"./writePackageJson\"\n\nconst script = `// @ts-check\n\nimport { spawnSync } from \"child_process\"\nimport { readdirSync, renameSync, rmSync } from \"fs\"\nimport { styleText } from \"util\"\n\nconst dir = readdirSync(\".\")\n\nif (!dir.includes(\".env.local\")) {\n console.log(styleText(\"redBright\", \".env.local 文件不存在\"))\n process.exit(1)\n}\n\nspawnSync(\"pm2 stop gdm\", { shell: true, stdio: \"inherit\" })\n\nspawnSync(\"rimraf geshu-docker-management\", { shell: true, stdio: \"inherit\" })\n\nspawnSync(\"7z x geshu-docker-management.zip\", { shell: true, stdio: \"inherit\" })\n\nrenameSync(\".env.local\", \"geshu-docker-management/.env.local\")\n\nspawnSync(\"npm install --registry http://localhost:4873\", { cwd: \"geshu-docker-management\", shell: true, stdio: \"inherit\" })\n\nspawnSync(\"npm run build\", { cwd: \"geshu-docker-management\", shell: true, stdio: \"inherit\" })\n\nspawnSync(\"pm2 restart gdm\", { cwd: \"geshu-docker-management\", shell: true, stdio: \"inherit\" })\n\nspawnSync(\"pm2 save\", { cwd: \"geshu-docker-management\", shell: true, stdio: \"inherit\" })\n\nspawnSync(\"rimraf geshu-docker-management.zip\", { shell: true, stdio: \"inherit\" })\n\nspawnSync(\"rimraf geshu-docker-management\", { shell: true, stdio: \"inherit\" })\n\nrmSync(import.meta.filename)\n\nconsole.log(styleText(\"greenBright\", \"更新完成\"))\n`\n\nexport async function gdm() {\n const dir = await readdir(\".\")\n\n if (dir.includes(\".gdm\")) {\n consola.warn(\".gdm 文件夹已存在\")\n process.exit(1)\n }\n\n setDefaultOptions(options => ({\n ...options,\n shell: true,\n stdio: \"inherit\",\n }))\n\n await spawnAsync(`gitpick 1adybug/geshu-docker-management .gdm`)\n\n const packageJson = await readPackageJson(\".gdm\")\n\n packageJson.overrides ??= {}\n\n packageJson.overrides.xlsx = \"npm:xlsx@0.20.3\"\n\n await writePackageJson({ data: packageJson, dir: \".gdm\" })\n\n await spawnAsync(\"rimraf package-lock.json\", { cwd: \".gdm\" })\n\n await mkdir(\".gdm/npm-cache\", { recursive: true })\n\n await spawnAsync(\"npm install --registry http://localhost:4873 --cache npm-cache\", { cwd: \".gdm\" })\n\n const version = (await execAsync(\"npx next --version\", { cwd: \".gdm\" })).replace(/^Next\\.js v/, \"\")\n\n const packages = [\"swc-linux-x64-gnu\", \"swc-linux-x64-musl\", \"swc-win32-x64-msvc\"]\n\n for (const pkg of packages) {\n const filename = (await execAsync(`npm pack @next/${pkg}@${version} --registry http://localhost:4873`, { cwd: \".gdm\" })).trim()\n await spawnAsync(`rimraf ${filename}`, { cwd: \".gdm\" })\n }\n\n await spawnAsync(\"rimraf npm-cache\", { cwd: \".gdm\" })\n\n await spawnAsync(\"npx prisma generate\", { cwd: \".gdm\" })\n\n const dir2 = await readdir(join(\".gdm\", \"prisma\", \"generated\"))\n\n for (const item of dir2) {\n if (item.endsWith(\".node\")) await copyFile(join(\".gdm\", \"prisma\", \"generated\", item), join(\".gdm\", \"prisma\", item))\n }\n\n await spawnAsync(\"rimraf node_modules\", { cwd: \".gdm\" })\n\n await spawnAsync(\"7z a geshu-docker-management.zip .gdm\")\n\n await spawnAsync(\"rimraf .gdm\")\n\n await mkdir(\".gdm\", { recursive: true })\n\n await rename(\"geshu-docker-management.zip\", \".gdm/geshu-docker-management.zip\")\n\n await writeFile(\".gdm/gdm.mjs\", script)\n\n await verdaccio()\n}\n","import { writeFile } from \"fs/promises\"\n\nimport { OpenWithOptions } from \"./addOpenWith\"\n\nexport async function removeOpenWith(name: string, { file, folder, background }: OpenWithOptions) {\n if (!file && !folder && !background) throw new Error(\"至少选择一个\")\n\n let reg = `\\ufeffWindows Registry Editor Version 5.00\n`\n\n // 在注册表路径前加 \"-\" 表示删除该项及其所有子项(包括 command)\n if (file) {\n reg += `\n[-HKEY_CLASSES_ROOT\\\\*\\\\shell\\\\${name}]`\n }\n\n if (folder) {\n reg += `\n[-HKEY_CLASSES_ROOT\\\\Directory\\\\shell\\\\${name}]`\n }\n\n if (background) {\n reg += `\n[-HKEY_CLASSES_ROOT\\\\Directory\\\\Background\\\\shell\\\\${name}]`\n }\n\n // 生成一个以 remove_ 开头的文件,防止覆盖原有的生成文件\n await writeFile(`remove_open_with_${name}.reg`, reg, \"utf-16le\")\n}\n","#!/usr/bin/env node\n\nimport chalk from \"chalk\"\nimport { Command } from \"commander\"\nimport consola from \"consola\"\nimport { emailReg } from \"deepsea-tools\"\nimport { setDefaultOptions } from \"soda-nodejs\"\n\nimport { CommitType } from \"@/constant/index\"\n\nimport { actionWithBackup } from \"@/utils/actionWithBackup\"\nimport { addAntd } from \"@/utils/addAntd\"\nimport { addApi } from \"@/utils/addApi\"\nimport { addBuildDocker } from \"@/utils/addBuildDocker\"\nimport { addEslint } from \"@/utils/addEslint\"\nimport { addGitignore } from \"@/utils/addGitignore\"\nimport { addHusky } from \"@/utils/addHusky\"\nimport { addFolderPathAlias, replacePathAlias } from \"@/utils/addPathAlias\"\nimport { addPrettier } from \"@/utils/addPrettier\"\nimport { addPrisma } from \"@/utils/addPrisma\"\nimport { addStartScript } from \"@/utils/addStartScript\"\nimport { addSyncPackageScript } from \"@/utils/addSyncPackageScript\"\nimport { addTag } from \"@/utils/addTag\"\nimport { addTailwind } from \"@/utils/addTailwind\"\nimport { addZipDist } from \"@/utils/addZipDist\"\nimport { arrowToFunction } from \"@/utils/arrowToFunction\"\nimport { betaVersion } from \"@/utils/betaVersion\"\nimport { checkType } from \"@/utils/checkType\"\nimport { clearDockerImage } from \"@/utils/clearDockerImage\"\nimport { clearDockerLog } from \"@/utils/clearDockerLog\"\nimport { code2Snippet } from \"@/utils/code2Snippet\"\nimport { createBrowserlistrc } from \"@/utils/createBrowserlistrc\"\nimport { createPrismaDebugger } from \"@/utils/createPrismaDebugger\"\nimport { downloadLatestSoftware } from \"@/utils/downloadLatestSoftware\"\nimport { downloadNpm } from \"@/utils/downloadNpm\"\nimport { generatePrisma } from \"@/utils/generatePrisma\"\nimport { getCommitMessage } from \"@/utils/getCommitMessage\"\nimport { getHeaders } from \"@/utils/getHeaders\"\nimport { initNode } from \"@/utils/initNode\"\nimport { initProject } from \"@/utils/initProject\"\nimport { installDocker } from \"@/utils/installDocker\"\nimport { interfaceToType } from \"@/utils/interfaceToType\"\nimport { json2type } from \"@/utils/json2type\"\nimport { killProcessByPort } from \"@/utils/killProcessByPort\"\nimport { next } from \"@/utils/next\"\nimport { pnpm } from \"@/utils/pnpm\"\nimport { readPackageJsonSync } from \"@/utils/readPackageJsonSync\"\nimport { reinstall } from \"@/utils/reinstall\"\nimport { removeComment } from \"@/utils/removeComment\"\nimport { removeFileOrFolderFromGit } from \"@/utils/removeFileOrFolderFromGit\"\nimport { removeLock } from \"@/utils/removeLock\"\nimport { removeTag } from \"@/utils/removeTag\"\nimport { replaceAssets } from \"@/utils/replaceAssets\"\nimport { CommitAuthor, replaceCommitAuthor } from \"@/utils/replaceCommitAuthor\"\nimport { replaceCommitMessage } from \"@/utils/replaceCommitMessage\"\nimport { replaceTag } from \"@/utils/replaceTag\"\nimport { rollup } from \"@/utils/rollup\"\nimport { rsbuild } from \"@/utils/rsbuild\"\nimport { rslib } from \"@/utils/rslib\"\nimport { serverToAction } from \"@/utils/serverToAction\"\nimport { setBun } from \"@/utils/setBun\"\nimport { setDockerRegistry } from \"@/utils/setDockerRegistry\"\nimport { setEnv } from \"@/utils/setEnv\"\nimport { setFatherConfig } from \"@/utils/setFatherConfig\"\nimport { setGitProxy } from \"@/utils/setGitProxy\"\nimport { setGlobalConfig } from \"@/utils/setGlobalConfig\"\nimport { setRegistry } from \"@/utils/setRegistry\"\nimport { setShellProxy } from \"@/utils/setShellProxy\"\nimport { sortPackageJson } from \"@/utils/sortPackageJson\"\nimport { asyncAgentRules } from \"@/utils/syncAgentRules\"\nimport { syncCursorExtToCode } from \"@/utils/syncCursorExtToCode\"\nimport { syncEditorSetting } from \"@/utils/syncEditorSetting\"\nimport { syncVscode } from \"@/utils/syncVscode\"\nimport { tailwindPatch } from \"@/utils/tailwindPatch\"\nimport { tar } from \"@/utils/tar\"\nimport { test } from \"@/utils/test\"\nimport { updateDockerCompose } from \"@/utils/updateDockerCompose\"\nimport { upgradeDependency } from \"@/utils/upgradeDependency\"\nimport { upgradeRsbuild } from \"@/utils/upgradeRsbuild\"\nimport { upgradeTailwind } from \"@/utils/upgradeTailwind\"\nimport { upgradeWorkspaceDependceny } from \"@/utils/upgradeWorkspaceDependceny\"\nimport { verdaccio } from \"@/utils/verdaccio\"\nimport { vite } from \"@/utils/vite\"\nimport { winget } from \"@/utils/winget\"\n\nimport { addOpenWith } from \"./utils/addOpenWith\"\nimport { gdm } from \"./utils/gdm\"\nimport { pullDockerImage } from \"./utils/pullDockerImage\"\nimport { removeOpenWith } from \"./utils/removeOpenWith\"\n\nsetDefaultOptions({\n shell: true,\n stdio: \"inherit\",\n})\n\nconst program = new Command()\n\nconst pkg = readPackageJsonSync(\n process.platform === \"win32\" ? import.meta.resolve(\"../\").replace(/^file:\\/\\/\\//, \"\") : import.meta.resolve(\"../\").replace(/^file:\\/\\//, \"\"),\n)\n\nprogram.name(\"格数科技\").version(pkg.version)\n\nconsole.log(chalk.redBright.bold(`zixulu ${pkg.version}`))\n\nprogram\n .command(\"eslint\")\n .description(\"添加 ESLint 相关配置\")\n .action(actionWithBackup(addEslint, getCommitMessage(CommitType.feature, \"添加 ESLint 相关配置\")))\n\nprogram\n .command(\"prettier\")\n .description(\"添加 prettier 配置\")\n .action(actionWithBackup(addPrettier, getCommitMessage(CommitType.feature, \"添加 prettier 配置文件\")))\n\nprogram\n .command(\"husky\")\n .description(\"添加 husky 配置\")\n .action(actionWithBackup(addHusky, getCommitMessage(CommitType.feature, \"添加 husky 配置\")))\n\nprogram\n .command(\"vite\")\n .description(\"初始化 vite 配置\")\n .action(actionWithBackup(vite, getCommitMessage(CommitType.feature, \"初始化 vite 配置\")))\n\nprogram\n .command(\"rsbuild\")\n .description(\"初始化 rsbuild 配置\")\n .action(actionWithBackup(rsbuild, getCommitMessage(CommitType.feature, \"初始化 rsbuild 配置\")))\n\nprogram\n .command(\"next\")\n .description(\"初始化 next 配置\")\n .action(actionWithBackup(next, getCommitMessage(CommitType.feature, \"初始化 next 配置\")))\n\nprogram\n .command(\"tailwind\")\n .description(\"添加 tailwind 配置\")\n .action(actionWithBackup(addTailwind, getCommitMessage(CommitType.feature, \"添加 tailwind 配置\")))\n\nprogram\n .command(\"remove-comment\")\n .description(\"删除文件注释\")\n .argument(\"path\", \"文件路径\")\n .action(actionWithBackup(removeComment, getCommitMessage(CommitType.feature, \"删除文件注释\")))\n\nprogram\n .command(\"father\")\n .alias(\"fs\")\n .description(\"初始化 father 项目配置\")\n .action(actionWithBackup(setFatherConfig, getCommitMessage(CommitType.feature, \"初始化 father 项目配置\")))\n\nprogram\n .command(\"upgrade-dependency\")\n .alias(\"ud\")\n .description(\"升级项目依赖\")\n .option(\"-r, --registry <registry>\", \"npm 源地址,可以是 npm、taobao、tencent 或者自定义地址\")\n .option(\"-p, --proxy\", \"是否使用代理\")\n .action(async optios => {\n setGlobalConfig(optios)\n await actionWithBackup(() => upgradeDependency())()\n })\n\nprogram\n .command(\"upgrade-workspace-dependency\")\n .alias(\"uwd\")\n .description(\"升级工作区项目依赖\")\n .option(\"-r, --registry <registry>\", \"npm 源地址,可以是 npm、taobao、tencent 或者自定义地址\")\n .option(\"-p, --proxy\", \"是否使用代理\")\n .action(async options => {\n setGlobalConfig(options)\n await upgradeWorkspaceDependceny()\n })\n\nprogram.command(\"registry\").description(\"设置 npm registry\").action(setRegistry)\n\nprogram\n .command(\"sort-package-json\")\n .alias(\"spj\")\n .description(\"对 package.json 中的依赖进行排序\")\n .action(actionWithBackup(sortPackageJson, getCommitMessage(CommitType.feature, \"对 package.json 中的依赖进行排序\")))\n\nprogram\n .command(\"arrow-to-function\")\n .alias(\"a2f\")\n .description(\"将箭头函数组件转换为函数组件\")\n .action(actionWithBackup(arrowToFunction, getCommitMessage(CommitType.feature, \"将箭头函数组件转换为函数组件\")))\n\nprogram\n .command(\"interface-to-type\")\n .alias(\"i2t\")\n .description(\"将 interface 转换为 type\")\n .action(actionWithBackup(interfaceToType, getCommitMessage(CommitType.feature, \"将 interface 转换为 type\")))\n\nprogram.command(\"gitignore\").description(\"添加 .gitignore 配置\").action(actionWithBackup(addGitignore))\n\nprogram.command(\"git-proxy\").alias(\"gp\").description(\"设置 git 代理\").action(setGitProxy)\n\nprogram.command(\"shell-proxy\").alias(\"sp\").description(\"设置 Shell 代理\").action(setShellProxy)\n\nprogram.command(\"download-software\").alias(\"ds\").description(\"下载最新版软件\").action(downloadLatestSoftware)\n\nprogram.command(\"vscode\").alias(\"vsc\").description(\"同步 VS Code 配置\").action(syncVscode)\n\nprogram.command(\"kill-port\").description(\"根据端口号杀死进程\").argument(\"port\", \"端口号\").action(killProcessByPort)\n\nprogram.command(\"rm-git\").argument(\"path\", \"要移除的文件或文件夹\").action(removeFileOrFolderFromGit)\n\nprogram.command(\"npm-download\").alias(\"nd\").description(\"下载 npm 包\").argument(\"name\", \"包名\").action(downloadNpm)\n\nprogram\n .command(\"prisma\")\n .description(\"添加 prisma 配置\")\n .action(actionWithBackup(() => addPrisma(), getCommitMessage(CommitType.feature, \"添加 prisma 配置\")))\n\nprogram.command(\"prisma-generate\").alias(\"pg\").description(\"生成 prisma client\").action(generatePrisma)\n\nprogram\n .command(\"antd\")\n .description(\"添加 antd 配置\")\n .action(actionWithBackup(addAntd, getCommitMessage(CommitType.feature, \"添加 antd 配置\")))\n\nprogram\n .command(\"init\")\n .description(\"初始化项目\")\n .action(actionWithBackup(initProject, getCommitMessage(CommitType.feature, \"初始化项目\")))\n\nprogram.command(\"tsc\").description(\"类型检查\").action(checkType)\n\nprogram.command(\"beta-version\").alias(\"bv\").description(\"设置版本号\").action(betaVersion)\n\nprogram\n .command(\"reinstall\")\n .alias(\"ri\")\n .description(\"重新安装依赖\")\n .option(\"-r, --registry <registry>\", \"npm 源地址,可以是 npm、taobao、tencent 或者自定义地址\")\n .action(async options => {\n setGlobalConfig(options)\n reinstall()\n })\n\nprogram.command(\"snippet\").alias(\"sn\").description(\"生成 vscode snippet\").argument(\"path\", \"文件路径\").action(code2Snippet)\n\nprogram.command(\"add-alias\").alias(\"aa\").description(\"添加路径别名\").action(actionWithBackup(addFolderPathAlias))\n\nprogram.command(\"replace-alias\").alias(\"ra\").description(\"替换路径别名\").action(actionWithBackup(replacePathAlias))\n\nprogram.command(\"pnpm\").description(\"设置 pnpm 配置\").action(pnpm)\n\nprogram.command(\"rollup\").description(\"rollup 打包\").action(rollup)\n\nprogram.command(\"browserlistrc\").alias(\"blr\").description(\"添加 browserlistrc 配置\").action(createBrowserlistrc)\n\nprogram\n .command(\"asset\")\n .description(\"替换文件中的资源地址\")\n .argument(\"input\", \"静态文件夹路径\")\n .option(\"-b, --base <base>\", \"资源地址 BaseUrl\")\n .option(\"-o, --output <output>\", \"输出文件夹\")\n .option(\"-p, --proxy\", \"是否使用代理\")\n .action((input, { proxy, base, output }) => replaceAssets({ base, input, proxy, output }))\n\nprogram\n .command(\"upgrade-rsbuild\")\n .alias(\"ur\")\n .description(\"升级 rsbuild\")\n .option(\"-r, --registry <registry>\", \"npm 源地址,可以是 npm、taobao、tencent 或者自定义地址\")\n .option(\"-p, --proxy\", \"是否使用代理\")\n .action(async options => {\n setGlobalConfig(options)\n await actionWithBackup(() => upgradeRsbuild())()\n })\n\nprogram\n .command(\"add-start-script\")\n .alias(\"ass\")\n .argument(\"type\", \"启动脚本类型:express、next\")\n .option(\"-p, --port <port>\", \"端口地址\")\n .option(\"-c, --core <core>\", \"实例数\")\n .option(\"-h, --hostname <hostname>\", \"主机名\")\n .option(\"--pem <pemPath>\", \"证书目录\")\n .description(\"添加 express 启动脚本\")\n .action(async (type, { port, core, pemPath }) => actionWithBackup(addStartScript)({ type, port, core, pemPath }))\n\nprogram.command(\"headers\").description(\"将浏览器中直接复制的 headers 转换为对象\").action(getHeaders)\n\nprogram\n .command(\"add-zip-dist\")\n .alias(\"azd\")\n .description(\"添加将 dist 压缩的脚本\")\n .action(actionWithBackup(() => addZipDist({ install: true })))\n\nprogram\n .command(\"upgrade-tailwind\")\n .alias(\"ut\")\n .description(\"升级 tailwind\")\n .option(\"-r, --registry <registry>\", \"npm 源地址,可以是 npm、taobao、tencent 或者自定义地址\")\n .option(\"-p, --proxy\", \"是否使用代理\")\n .action(async options => {\n setGlobalConfig(options)\n await actionWithBackup(() => upgradeTailwind())()\n })\n\nprogram.command(\"bun\").description(\"设置 bun\").action(setBun)\n\nprogram.command(\"tailwind-patch\").alias(\"tp\").description(\"tailwind 补丁\").action(tailwindPatch)\n\nprogram\n .command(\"remove-lock\")\n .alias(\"rl\")\n .description(\"删除 lock 文件\")\n .action(actionWithBackup(() => removeLock()))\n\nprogram\n .command(\"rename-commit-author\")\n .alias(\"rca\")\n .description(\"重写 Git 提交历史的作者信息\")\n .arguments(\"[infos...]\")\n .action(async (infos: string[]) => {\n let prev: CommitAuthor | undefined\n let next: CommitAuthor | undefined\n infos = infos.slice(0, 2)\n\n function getUsernameAndEmail(info: string): CommitAuthor {\n const index = info.indexOf(\":\")\n\n if (index === -1) {\n if (emailReg.test(info)) return { email: info }\n return { name: info }\n }\n\n return {\n name: info.slice(0, index),\n email: info.slice(index + 1),\n }\n }\n\n if (infos.length === 0) throw new Error(\"请输入作者信息!\")\n else {\n if (infos.length === 1) next = getUsernameAndEmail(infos[0])\n else {\n prev = getUsernameAndEmail(infos[0])\n next = getUsernameAndEmail(infos[1])\n }\n }\n\n await replaceCommitAuthor({ prev, next })\n })\n\nprogram.command(\"install-docker\").alias(\"id\").description(\"安装 Docker\").action(installDocker)\n\nprogram.command(\"set-docker-registry\").alias(\"sdr\").description(\"设置 Docker 镜像地址\").action(setDockerRegistry)\n\nprogram\n .command(\"add-sync\")\n .alias(\"asp\")\n .option(\"-m, --monorepo\", \"是否是 monorepo\")\n .description(\"添加同步包脚本\")\n .action(actionWithBackup(addSyncPackageScript))\n\nprogram\n .command(\"winget\")\n .option(\"-p, --proxy\", \"是否使用代理\")\n .description(\"使用 winget 更新软件\")\n .action(async options => {\n setGlobalConfig(options)\n await winget()\n })\n\nprogram\n .command(\"test\")\n .description(\"这是一个测试命令,生产环境中使用,非开发人员请勿使用!\")\n .action(async () => {\n consola.warn(\"这是一个测试命令,生产环境中使用,非开发人员请勿使用!\")\n consola.warn(\"这是一个测试命令,生产环境中使用,非开发人员请勿使用!\")\n consola.warn(\"这是一个测试命令,生产环境中使用,非开发人员请勿使用!\")\n await test()\n })\n\nprogram.command(\"sync-editor\").alias(\"se\").description(\"同步编辑器配置\").action(syncEditorSetting)\n\nprogram.command(\"server-to-action\").alias(\"sta\").description(\"将 server 文件夹下的文件转换为 action\").action(serverToAction)\n\nprogram\n .command(\"tar\")\n .description(\"压缩文件\")\n .argument(\"input\", \"输入文件夹\")\n .option(\"-o, --output <output>\", \"输出文件\")\n .action(async (input, { output }) => tar({ input, output }))\n\nprogram\n .command(\"set-env\")\n .description(\"设置环境变量\")\n .argument(\"key\", \"环境变量 key\")\n .argument(\"[value]\", \"环境变量 value\")\n .action(async (key, value) => {\n await setEnv(key, value)\n consola.success(\"设置环境变量成功\")\n })\n\nprogram\n .command(\"add-api\")\n .description(\"添加 api 文件\")\n .argument(\"type\", \"api 类型\")\n .option(\"-a, --api <api>\", \"api 文件夹路径\")\n .option(\"-h, --hook <hook>\", \"hook 文件夹路径\")\n .action(async (type, { api, hook }) => addApi({ type, api, hook }))\n\nprogram.command(\"rslib\").description(\"rslib 配置\").action(rslib)\n\nprogram.command(\"init-node\").description(\"初始化 node 项目\").action(initNode)\n\nprogram.command(\"add-build-docker\").alias(\"abd\").description(\"添加构建 docker 镜像的脚本\").action(addBuildDocker)\n\nprogram.command(\"json2type\").alias(\"j2t\").argument(\"[path]\", \"json 文件路径\").description(\"将 json 转换为 type\").action(json2type)\n\nprogram.command(\"clear-docker-image\").alias(\"cdi\").description(\"清除 docker 悬挂镜像\").argument(\"[name]\", \"镜像名称\").action(clearDockerImage)\n\nprogram.command(\"clear-docker-log\").alias(\"cdl\").description(\"清除 docker 容器日志\").argument(\"name\", \"容器名称或者 ID\").action(clearDockerLog)\n\nprogram.command(\"update-docker-compose\").alias(\"udc\").description(\"更新 docker compose 镜像\").action(updateDockerCompose)\n\nprogram.command(\"sync-cursor-ext-to-code\").alias(\"sce2c\").description(\"同步 cursor 扩展到 vscode\").action(syncCursorExtToCode)\n\nprogram.command(\"create-prisma-debugger\").alias(\"cpd\").description(\"创建 prisma 调试器\").action(createPrismaDebugger)\n\nprogram.command(\"verdaccio\").description(\"同步 verdaccio 配置\").action(verdaccio)\n\nprogram.command(\"sync-agent-rules\").alias(\"sar\").description(\"同步 Agent 规则\").action(actionWithBackup(asyncAgentRules))\n\nprogram\n .command(\"replace-tag\")\n .alias(\"rt\")\n .description(\"替换所有 git tag (正则中可用 {{CARET}} 代替 ^)\")\n .argument(\"regexp\", \"正则表达式字符串\")\n .argument(\"[replace]\", \"替换字符串,默认为空字符串\")\n .option(\"-f, --flags <flags>\", \"正则表达式标志,如 i、g、m 等\")\n .option(\"-p, --push\", \"是否推送到远程仓库\")\n .option(\"-r, --remote <remote>\", \"远程仓库名称,默认为 origin\")\n .action(async (regexp, replace, options) => {\n await replaceTag({ reg: regexp, replace: replace ?? \"\", flags: options.flags, push: options.push, remote: options.remote })\n })\n\nprogram\n .command(\"remove-tag\")\n .alias(\"rmt\")\n .description(\"删除匹配的 git tag (正则中可用 {{CARET}} 代替 ^)\")\n .argument(\"regexp\", \"正则表达式字符串\")\n .option(\"-f, --flags <flags>\", \"正则表达式标志,如 i、g、m 等\")\n .option(\"-p, --push\", \"是否同时删除远程仓库的 tag\")\n .option(\"-r, --remote <remote>\", \"远程仓库名称,默认为 origin\")\n .action(async (regexp, options) => {\n await removeTag({ reg: regexp, flags: options.flags, push: options.push, remote: options.remote })\n })\n\nprogram\n .command(\"add-tag\")\n .alias(\"adt\")\n .description(\"为匹配的 commit 添加 git tag (正则中可用 {{CARET}} 代替 ^)\")\n .argument(\"regexp\", \"用于匹配 commit message 的正则表达式字符串\")\n .argument(\"replacement\", \"用于生成 tag 名称的替换字符串\")\n .option(\"-f, --flags <flags>\", \"正则表达式标志,如 i、g、m 等\")\n .option(\"-p, --push\", \"是否推送到远程仓库\")\n .option(\"-r, --remote <remote>\", \"远程仓库名称,默认为 origin\")\n .option(\"--force\", \"是否覆盖已存在的 tag\")\n .action(async (regexp, replacement, options) => {\n await addTag({ reg: regexp, replacement, flags: options.flags, push: options.push, remote: options.remote, force: options.force })\n })\n\nprogram\n .command(\"replace-commit-message\")\n .alias(\"rcm\")\n .description(\"替换所有提交消息(⚠️ 会重写 Git 历史,正则中可用 {{CARET}} 代替 ^)\")\n .argument(\"regexp\", \"正则表达式字符串\")\n .argument(\"[replace]\", \"替换字符串,默认为空字符串\")\n .option(\"-f, --flags <flags>\", \"正则表达式标志,如 g、i 等(注意:sed 语法)\")\n .option(\"-p, --push\", \"是否强制推送到远程仓库\")\n .option(\"-r, --remote <remote>\", \"远程仓库名称,默认为 origin\")\n .option(\"-b, --branch <branch>\", \"分支名称,默认为当前分支\")\n .action(async (regexp, replace, options) => {\n await replaceCommitMessage({\n reg: regexp,\n replace: replace ?? \"\",\n flags: options.flags,\n push: options.push,\n remote: options.remote,\n branch: options.branch,\n })\n })\n\nprogram.command(\"gdm\").description(\"同步 geshu-docker-management\").action(gdm)\n\nprogram\n .command(\"add-open-with\")\n .alias(\"aow\")\n .description(\"添加打开文件的脚本\")\n .argument(\"path\", \"程序路径\")\n .option(\"--no-file\", \"是否不添加文件关联\")\n .option(\"--no-folder\", \"是否不添加文件夹关联\")\n .option(\"--no-background\", \"是否不添加文件夹空白处关联\")\n .action(addOpenWith)\n\nprogram\n .command(\"remove-open-with\")\n .alias(\"row\")\n .description(\"删除打开文件的脚本\")\n .argument(\"name\", \"脚本名称\")\n .option(\"--no-file\", \"是否不删除文件关联\")\n .option(\"--no-folder\", \"是否不删除文件夹关联\")\n .option(\"--no-background\", \"是否不删除文件夹空白处关联\")\n .action(removeOpenWith)\n\nprogram\n .command(\"pull-docker-image\")\n .alias(\"pd\")\n .description(\"拉取 docker 镜像\")\n .argument(\"image\", \"镜像名称\")\n .argument(\"sha256\", \"镜像 sha256\")\n .action((image: string, sha256: string) => pullDockerImage({ image, sha256 }))\n\nprogram.parse()\n"],"names":["addGitCommit","messageOrParams","message","cwd","consola","execAsync","hasChangeNoCommit","status","isRepository","shouldContinue","cont","inquirer","backupFirst","forceRepo","Error","exit","actionWithBackup","action","args","skip","msg","commit","commitMessage","PackageManager","Registry","Software","CommitTypeMap","agent","HttpsProxyAgent","addedRules","isSudo","process","getPackageManager","dir","globalThis","dir2","readdir","manager","getEnumValues","readBunConfig","path","join","homedir","existsSync","str","readFile","parse","getRegistry","global","packageManager","config","registry","isStableVersion","version","getPackageRequiredVersion","packageName","versionRange","url","URL","response","fetch","undefined","data","result","Object","item","semver","getPackageJsonPath","readPackageJson","JSON","error","retry","actionOrConfig","countNumber","current","count","callback","_retry","writeJson","output","writeFile","writePackageJson","addDependency","packages","Array","type","packageJson","addedPackages","keys","sortedDependencies","key","addAntd","componentDir","mkdir","isPathLike","override","_writeFile","addApi","api","hook","capitalize","type2","_","c","items","query","add","update","_delete","get","useQuery","useGet","useAdd","useUpdate","useDelete","getCommitMessage","addRuleToGitIgnore","rules","CommitType","gitignore","rules2","v","rule","hasDependency","dependency","dependencies","devDependencies","peerDependencies","total","insertWhen","condition","params","breakBefore","breakAfter","strs","ApplicationType","addBuildDocker","json","isFullStack","isBackend","defaultType","defaultManager","defaultBuild","name","local","versions","value","port","versionSource","versionSource2","docker","docker2","format","format2","build","defaultDist","dist","buildLatest","buildCustom","script","dockerFile","nginxFile","created","useGitignore","copyFile","sortArrayOrObject","_data","addScript","scripts","replace","installDependceny","silent","install","spawnAsync","getEslintConfig","isReact","eslintConfig","addEslint","addGitAttributes","addGitignore","addHusky","options","git","simpleGit","isRepo","shouldSetupHooks","huskyConfig","preCommitHook","getFiles","match","depth","exclude","e","Symbol","_getFiles","files","file","filePath","parsedPath","stats","stat","length","getRelativePath","getTsFile","ext","path2","path3","path4","path5","getTsConfigJsonPath","readTsConfig","JSON5","writeTsConfig","addPathAlias","nameOrAlias","tsConfig","replacePathAlias","oldPaths","paths","reg","code","arg","arg2","arg3","pathToReplace","tsFile","f","matchedKey","matchedPath","newPath","finalPath","addFolderPathAlias","folder","names","ignoreConfig","prettierConfig","addPrettier","config2","packageJson2","prismaFile","addPrisma","expressScript","nextScript","addStartScript","pemPath","core","hostname","env","addSyncPackageScript","monorepo","syncPackageScript","answer","preprocessRegex","addTag","flags","replacement","push","remote","force","processedReg","log","commits","existingTags","allExistingTags","Set","tagsToAdd","regexp","RegExp","tagName","hash","pushArgs","postcssConfig","addPostCSSConfig","rm","tailwindConfig","tailwindConfigWithHeroUi","addTailwindConfig","hasHeroUi","getEntryCssDir","createEntryCss","hasIndex","hasApp","cssPath","addTailwindToCss","base","css","console","addTailwind","zipDistContent","addZipDist","getTypeInGenerics","start","index","i","w","arrowToFunction","auto","warnFiles","modifiedFiles","exportDefaultReg","hasExport","edReg","hasExportDefault","typeIndex","matches","choices","prev","funName","choice","first","indexs","getBetaVersion","major","minor","patch","beta","newVersion","dayjs","level","newBaseVersion","parseInt","betaVersion","publish","checkType","clearDockerImage","outputs","Boolean","images","images2","image","next","clearDockerLog","code2Snippet","placeholders","placeholder","lines","reg2","trim","Math","line","Infinity","line2Snippet","body","snippet","clipboard","createBrowserlistrc","schema","createPrismaDebugger","zip","getFilename","headers","disposition","download","filename","writeable","createWriteStream","Promise","resolve","reject","Readable","sleep","ms","setTimeout","downloadFromWinget","id","filter","firstLetter","stables","a","b","avs","bvs","max","av","bv","response2","yaml","pkg","YAML","installers","InstallerUrl","Architecture","architecture","rename","download7Zip","downloadAnydesk","getLatestRelease","owner","repo","downloadBun","release","asset","unzip","downloadChrome","downloadFromPCQQ","cmdid","soft_id_list","URLSearchParams","Headers","downloadDeskGo","downloadFirefox","downloadGeekUninstaller","text","downloadGit","downloadHoneyview","downloadNodeJS","downloadPeaZip","downloadPotPlayer","downloadPowerShell","downloadPowerToys","downloadVscode","readZixuluSetting","userDir","settingPath","setting","writeZixuluSetting","SoftwareDownloadMap","downloadLatestSoftware","softwareDownloadHistory","softwares","software","getPackageVersionInDependcy","downloadNpm","generatePrisma","getHeaders","match2","initNode","getDependcy","checkTailwind","writeRsbuildConfig","title","description","mountId","rsbuildConfig","rsbuild","Target","Module","ModuleResolution","setTsConfig","tsconfig","t","m","mr","vite","initProject","allDependcies","ProjectType","modules","added","installed","isUrl","readZixuluCache","removeZixuluCache","cachePath","writeZixuluCache","cache","sudoCommand","unique","setDockerRegistry","daemon","mirrors","installDocker","info","distributorId","codename","dom","JSDOM","hrefs","href","deb","deb2","deb3","deb4","deb5","debs","addMirrors","splitExtendsType","types","interfaceToType","reg1","newCode","$2","extendsTypes","json2type","isNonNullable","j2t","getProcessInfoFromPid","pid","stdout","getPidInfoFromPort","killProcessByPort","Number","pidInfos","chosenPids","exec","pnpm","content","readPackageJsonSync","readFileSync","reinstall","removeComment","newText","removeFileOrFolderFromGit","input","recursive","removeLock","removeTag","tags","allTags","tagsToRemove","tag","isAsset","lower","getReg","getReg2","reg3","reg4","replaceAssets","proxy","downloadMap","Map","errors","md5","url2","getReplaceUrl","source","newUrl","replaceUrl","urlsToReplace","newData","replaceCommitAuthor","prevName","prevEmail","nextName","nextEmail","committerName","committerEmail","authorName","authorEmail","committerCondition","authorCondition","replaceCommitMessage","branch","currentBranch","logResult","commitCount","tempScriptPath","tmpdir","Date","scriptContent","scriptPathForCommand","filterCommand","unlink","replaceTag","operations","newTag","oldTag","tagInfo","commitHash","rollupConfig","rollup","rslibConfig","rslibConfigWithReact","tsconfigWithReact","rslib","newPackageJson","hasReact","serverToAction","actions","actions2","writeBunConfig","stringify","setBun","setEnv","isWindows","shell","fatherrcCode","setFatherConfig","setGitProxy","open","setGlobalConfig","setRegistry","getEnumKeys","isShellProxy","setShellProxy","isOpen","sortPackageJson","asyncAgentRules","target","existed","sourceDir","targetDir","map","sourceContent","targetContent","orders","agentsRule","p1","content2","syncCursorExtToCode","cursorOutput","cursorExts","vscodeOutput","vscodeExts","installExts","uninstallExts","getEditorExtensions","hasAntiGravity","hasCode","hasCursor","modifyJsonc","edits","modify","applyEdits","fileSourceMap","getFile","syncEditorFile","sourceType","sourceValue","targetType","targetValue","backup","syncEditorSetting","sourceChoices","targetChoices","targets","onlinePath","configs","fileType","vscodeExtensions","cursorExtensions","antigravityExtensions","onlineExtensions","sourceExtensions","installExtensions","uninstallExtensions","getVscodeExtInfo","html","author","codeVersions","displayName","downloadVscodeExts","extList","exts","vscodeDownloadHistory","exts2","VscodeSyncOption","syncVscode","getEnumEntries","snippetSource","snippetTarget","profile","clear","tailwindPatch","tar","overwrite","compress","test","pullDockerImage","sha256","updateDockerCompose","service","getPackageVersionFromRange","requiredVersion","getPackageUpgradeVersion","minorVersion","majorVersion","getUpgradeDependencyConfig","ks","questions","upgradeDependency","upgradeLogs","upgrades","allPkgs","rv","s","cv","upgrade","pkgs","getPackageLatestVersion","upgradeRsbuild","rsbuildDependencies","upgradeLog","upgradeTailwind","upgradeWorkspaceDependceny","rest","packages2","stat2","dir3","packages3","chdir","verdaccio","verdaccioPath","winget","addOpenWith","background","escapedPath","gdm","setDefaultOptions","removeOpenWith","program","Command","chalk","optios","infos","getUsernameAndEmail","emailReg"],"mappings":"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"}
|