@brickjs-fe/brick-cli
Version:
BrickJs CLI - 基于 pnpm + turbo 的现代化前端工程化脚手架工具
332 lines (326 loc) • 14.9 kB
JavaScript
;
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