UNPKG

@brickjs-fe/brick-cli

Version:

BrickJs CLI - 基于 pnpm + turbo 的现代化前端工程化脚手架工具

332 lines (326 loc) 14.9 kB
#!/usr/bin/env node "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); // src/index.ts var import_commander3 = require("commander"); var import_chalk3 = __toESM(require("chalk")); // src/commands/release.ts var import_commander = require("commander"); var import_chalk = __toESM(require("chalk")); var import_ora = __toESM(require("ora")); var import_execa2 = require("execa"); var import_fs_extra = require("fs-extra"); var import_path = require("path"); // src/utils/process.ts var import_execa = require("execa"); async function runNpm(args, cwd) { await (0, import_execa.execa)("npm", args, { cwd, stdio: "pipe", env: { ...process.env, npm_config_yes: void 0 } }); } async function runNpmCapture(args, cwd) { const result = await (0, import_execa.execa)("npm", args, { cwd, stdio: "pipe", env: { ...process.env, npm_config_yes: void 0 } }); return result.stdout || ""; } // src/commands/release.ts var releaseCommand = new import_commander.Command("release").description("\u53D1\u5E03\u5305\u5230 npm").option("-p, --package <name>", "\u6307\u5B9A\u8981\u53D1\u5E03\u7684\u5305\u540D").option("-v, --version <version>", "\u6307\u5B9A\u7248\u672C\u53F7").option("-d, --dry-run", "\u6A21\u62DF\u53D1\u5E03\uFF0C\u4E0D\u5B9E\u9645\u53D1\u5E03").option("--skip-build", "\u8DF3\u8FC7\u6784\u5EFA\u6B65\u9AA4").action(async (options) => { try { console.log(import_chalk.default.blue("\u{1F680} BrickJs CLI - \u53D1\u5E03\u5305\u5230 npm\n")); const currentDir = process.cwd(); const packageJsonPath = (0, import_path.join)(currentDir, "package.json"); if (!await (0, import_fs_extra.pathExists)(packageJsonPath)) { console.error(import_chalk.default.red("\u274C \u9519\u8BEF: \u5F53\u524D\u76EE\u5F55\u627E\u4E0D\u5230 package.json \u6587\u4EF6")); console.log(import_chalk.default.yellow("\u{1F4A1} \u8BF7\u5728\u5305\u542B package.json \u7684\u9879\u76EE\u76EE\u5F55\u4E2D\u8FD0\u884C\u6B64\u547D\u4EE4")); process.exit(1); } const currentPackageJson = JSON.parse(await (0, import_fs_extra.readFile)(packageJsonPath, "utf-8")); if (!currentPackageJson.name) { console.error(import_chalk.default.red("\u274C \u9519\u8BEF: package.json \u4E2D\u7F3A\u5C11 name \u5B57\u6BB5")); process.exit(1); } if (!currentPackageJson.version) { console.error(import_chalk.default.red("\u274C \u9519\u8BEF: package.json \u4E2D\u7F3A\u5C11 version \u5B57\u6BB5")); process.exit(1); } console.log(import_chalk.default.blue(`\u{1F4E6} \u51C6\u5907\u53D1\u5E03\u5305: ${currentPackageJson.name}@${currentPackageJson.version} `)); const packages = [{ name: currentPackageJson.name, version: currentPackageJson.version, path: currentDir, published: false }]; if (currentPackageJson.name === "@brickjs-fe/brick-cli") { options.skipBuild = true; } if (packages.length === 0) { console.log(import_chalk.default.yellow("\u26A0\uFE0F \u6CA1\u6709\u627E\u5230\u5305")); return; } console.log(import_chalk.default.green(`\u{1F4E6} \u5F53\u524D\u5305: ${packages[0].name}@${packages[0].version}`)); console.log(""); if (!options.dryRun) { await checkNpmAuth(); } for (const pkg of packages) { if (options.package && pkg.name !== options.package) { continue; } await releasePackage(pkg, options); } console.log(import_chalk.default.green("\n\u2705 \u5305\u53D1\u5E03\u5B8C\u6210\uFF01")); } catch (error) { console.error(import_chalk.default.red(`\u274C \u53D1\u5E03\u5931\u8D25: ${error instanceof Error ? error.message : error}`)); process.exit(1); } }); async function createGitTag(pkg) { try { const projectName = pkg.name.split("/").pop() || pkg.name.replace("@", ""); const tagName = `${projectName}@v${pkg.version}`; const tagMessage = `Release ${pkg.name}@${pkg.version}`; try { await (0, import_execa2.execa)("git", ["rev-parse", `refs/tags/${tagName}`], { stdio: "pipe" }); console.log(import_chalk.default.yellow(` \u26A0\uFE0F Git tag ${tagName} \u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7\u521B\u5EFA`)); return; } catch { } await (0, import_execa2.execa)("git", ["tag", "-a", tagName, "-m", tagMessage], { stdio: "pipe" }); console.log(import_chalk.default.green(` \u2705 \u521B\u5EFA Git tag: ${tagName}`)); try { await (0, import_execa2.execa)("git", ["push", "origin", tagName], { stdio: "pipe" }); console.log(import_chalk.default.green(` \u{1F4E4} \u63A8\u9001 tag \u5230\u8FDC\u7A0B: ${tagName}`)); } catch (error) { console.log(import_chalk.default.yellow(` \u26A0\uFE0F \u63A8\u9001 tag \u5931\u8D25: ${error instanceof Error ? error.message : error}`)); } } catch (error) { console.log(import_chalk.default.red(` \u274C \u521B\u5EFA Git tag \u5931\u8D25: ${error instanceof Error ? error.message : error}`)); } } async function checkNpmAuth() { const spinner = (0, import_ora.default)("\u68C0\u67E5 npm \u767B\u5F55\u72B6\u6001...").start(); try { await runNpm(["whoami"]); spinner.succeed("npm \u767B\u5F55\u72B6\u6001\u6B63\u5E38"); } catch { spinner.fail("npm \u672A\u767B\u5F55"); console.log(import_chalk.default.yellow("\u{1F4A1} \u8BF7\u5148\u8FD0\u884C: npm login")); throw new Error("\u8BF7\u5148\u767B\u5F55 npm"); } } async function releasePackage(pkg, options) { const spinner = (0, import_ora.default)(`\u53D1\u5E03 ${pkg.name}...`).start(); try { if (!options.dryRun) { try { const stdout = await runNpmCapture(["view", `${pkg.name}@${pkg.version}`, "version"]); if (stdout.trim() === pkg.version) { spinner.warn(`${pkg.name}@${pkg.version} \u5DF2\u5B58\u5728\u4E8E npm\uFF0C\u8DF3\u8FC7\u53D1\u5E03`); await cleanupTempDirs(pkg.path); return; } } catch { spinner.text = `${pkg.name}@${pkg.version} \u7248\u672C\u4E0D\u5B58\u5728\uFF0C\u51C6\u5907\u53D1\u5E03...`; } } if (!options.skipBuild) { spinner.text = `\u6784\u5EFA ${pkg.name}...`; await buildPackage(pkg.path); } await cleanupTempDirs(pkg.path); if (options.dryRun) { spinner.text = `[\u6A21\u62DF] \u53D1\u5E03 ${pkg.name}@${pkg.version}...`; await runNpm(["publish", "--dry-run"], pkg.path); spinner.succeed(`[\u6A21\u62DF] ${pkg.name}@${pkg.version} \u53D1\u5E03\u6210\u529F`); } else { spinner.text = `\u53D1\u5E03 ${pkg.name}@${pkg.version}...`; await runNpm(["publish"], pkg.path); spinner.succeed(`${pkg.name}@${pkg.version} \u53D1\u5E03\u6210\u529F`); await createGitTag(pkg); } await cleanupTempDirs(pkg.path); } catch (error) { spinner.fail(`${pkg.name} \u53D1\u5E03\u5931\u8D25`); await cleanupTempDirs(pkg.path); throw error; } } async function buildPackage(packagePath) { const packageJsonPath = (0, import_path.join)(packagePath, "package.json"); const packageJson = JSON.parse(await (0, import_fs_extra.readFile)(packageJsonPath, "utf-8")); if (packageJson.scripts?.build) { await (0, import_execa2.execa)("pnpm", ["run", "build"], { cwd: packagePath, stdio: "pipe" }); } } async function cleanupTempDirs(packagePath) { const tempDirs = ["true", "_cacache", "_logs", ".npm"]; for (const dir of tempDirs) { const dirPath = (0, import_path.join)(packagePath, dir); if (await (0, import_fs_extra.pathExists)(dirPath)) { try { await (0, import_execa2.execa)("rm", ["-rf", dir], { cwd: packagePath, stdio: "pipe" }); console.log(import_chalk.default.gray(` \u6E05\u7406\u4E34\u65F6\u76EE\u5F55: ${dir}`)); } catch (error) { console.log(import_chalk.default.yellow(` \u8B66\u544A: \u65E0\u6CD5\u6E05\u7406\u76EE\u5F55 ${dir}: ${error instanceof Error ? error.message : error}`)); } } } } // src/commands/version.ts var import_commander2 = require("commander"); var import_chalk2 = __toESM(require("chalk")); var import_ora2 = __toESM(require("ora")); var import_fs_extra2 = require("fs-extra"); var import_path2 = require("path"); var import_semver = __toESM(require("semver")); var versionCommand = new import_commander2.Command("version").description("\u7BA1\u7406\u5305\u7248\u672C").option("-p, --package <name>", "\u6307\u5B9A\u5305\u540D").option("-v, --version <version>", "\u6307\u5B9A\u7248\u672C\u53F7").option("--major", "\u4E3B\u7248\u672C\u53F7\u5347\u7EA7").option("--minor", "\u6B21\u7248\u672C\u53F7\u5347\u7EA7").option("--patch", "\u8865\u4E01\u7248\u672C\u53F7\u5347\u7EA7").option("--pre <type>", "\u9884\u53D1\u5E03\u7248\u672C\u7C7B\u578B (alpha, beta, rc)").action(async (options) => { try { console.log(import_chalk2.default.blue("\u{1F4E6} BrickJs CLI - \u7248\u672C\u7BA1\u7406\n")); const rootDir = process.cwd(); const packageJsonPath = (0, import_path2.join)(rootDir, "package.json"); if (!await (0, import_fs_extra2.pathExists)(packageJsonPath)) { console.error(import_chalk2.default.red("\u274C \u9519\u8BEF: \u8BF7\u5728\u9879\u76EE\u6839\u76EE\u5F55\u8FD0\u884C\u6B64\u547D\u4EE4")); process.exit(1); } const rootPackageJson = JSON.parse(await (0, import_fs_extra2.readFile)(packageJsonPath, "utf-8")); if (rootPackageJson.name !== "brickjs") { console.error(import_chalk2.default.red("\u274C \u9519\u8BEF: \u8BF7\u5728 BrickJs \u9879\u76EE\u6839\u76EE\u5F55\u8FD0\u884C\u6B64\u547D\u4EE4")); process.exit(1); } const configPackages = await getConfigPackages(rootDir); if (configPackages.length === 0) { console.log(import_chalk2.default.yellow("\u26A0\uFE0F \u6CA1\u6709\u627E\u5230\u914D\u7F6E\u5305")); return; } console.log(import_chalk2.default.green("\u{1F4CB} \u5F53\u524D\u7248\u672C:")); configPackages.forEach((pkg) => { console.log(import_chalk2.default.gray(` ${pkg.name}: ${pkg.version}`)); }); console.log(""); if (options.package) { const targetPackage = configPackages.find((pkg) => pkg.name === options.package); if (!targetPackage) { console.error(import_chalk2.default.red(`\u274C \u627E\u4E0D\u5230\u5305: ${options.package}`)); process.exit(1); } await updatePackageVersion(targetPackage, options); } else { for (const pkg of configPackages) { await updatePackageVersion(pkg, options); } } console.log(import_chalk2.default.green("\n\u2705 \u7248\u672C\u66F4\u65B0\u5B8C\u6210\uFF01")); } catch (error) { console.error( import_chalk2.default.red(`\u274C \u7248\u672C\u66F4\u65B0\u5931\u8D25: ${error instanceof Error ? error.message : error}`) ); process.exit(1); } }); async function getConfigPackages(rootDir) { const packagesDir = (0, import_path2.join)(rootDir, "packages"); const configPackageNames = [ "brick-eslint-config", "brick-prettier-config", "brick-stylelint-config" ]; const packages = []; for (const name of configPackageNames) { const packagePath = (0, import_path2.join)(packagesDir, name); const packageJsonPath = (0, import_path2.join)(packagePath, "package.json"); if (await (0, import_fs_extra2.pathExists)(packageJsonPath)) { const packageJson = JSON.parse(await (0, import_fs_extra2.readFile)(packageJsonPath, "utf-8")); packages.push({ name: packageJson.name, version: packageJson.version, path: packagePath }); } } return packages; } async function updatePackageVersion(pkg, options) { const spinner = (0, import_ora2.default)(`\u66F4\u65B0 ${pkg.name} \u7248\u672C...`).start(); try { let newVersion; if (options.version) { newVersion = options.version; } else if (options.major) { newVersion = import_semver.default.inc(pkg.version, "major") || pkg.version; } else if (options.minor) { newVersion = import_semver.default.inc(pkg.version, "minor") || pkg.version; } else if (options.patch) { newVersion = import_semver.default.inc(pkg.version, "patch") || pkg.version; } else if (options.pre) { newVersion = import_semver.default.inc(pkg.version, `pre${options.pre}`) || pkg.version; } else { newVersion = import_semver.default.inc(pkg.version, "patch") || pkg.version; } if (newVersion === pkg.version) { spinner.warn(`${pkg.name} \u7248\u672C\u65E0\u9700\u66F4\u65B0`); return; } const packageJsonPath = (0, import_path2.join)(pkg.path, "package.json"); const packageJson = JSON.parse(await (0, import_fs_extra2.readFile)(packageJsonPath, "utf-8")); packageJson.version = newVersion; await (0, import_fs_extra2.writeFile)(packageJsonPath, JSON.stringify(packageJson, null, 2) + "\n"); spinner.succeed(`${pkg.name}: ${pkg.version} \u2192 ${newVersion}`); } catch (error) { spinner.fail(`${pkg.name} \u7248\u672C\u66F4\u65B0\u5931\u8D25`); throw error; } } // src/index.ts var program = new import_commander3.Command(); program.name("brick").description("BrickJs CLI - \u57FA\u4E8E pnpm + turbo \u7684\u73B0\u4EE3\u5316\u524D\u7AEF\u5DE5\u7A0B\u5316\u811A\u624B\u67B6\u5DE5\u5177").version("1.0.0"); program.addCommand(releaseCommand); program.addCommand(versionCommand); program.on("command:*", () => { console.error(import_chalk3.default.red(`\u274C \u672A\u77E5\u547D\u4EE4: ${program.args.join(" ")}`)); console.log(import_chalk3.default.yellow("\u{1F4A1} \u4F7F\u7528 brick --help \u67E5\u770B\u53EF\u7528\u547D\u4EE4")); process.exit(1); }); program.parse(); if (!process.argv.slice(2).length) { program.outputHelp(); } //# sourceMappingURL=index.js.map