@ruan-cat/utils 4.23.0 → 4.25.0
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/cli/{chunk-BPIJ4Z5J.js → chunk-GY4LBTTR.js} +19 -5
- package/dist/cli/chunk-GY4LBTTR.js.map +1 -0
- package/dist/cli/index.js +1 -1
- package/dist/cli/relizy-runner.js +1 -1
- package/dist/node-esm/index.d.ts +9 -2
- package/dist/node-esm/index.js +19 -4
- package/dist/node-esm/index.js.map +1 -1
- package/package.json +5 -5
- package/src/node-esm/scripts/relizy-runner/index.test.ts +38 -0
- package/src/node-esm/scripts/relizy-runner/index.ts +46 -5
- package/dist/cli/chunk-BPIJ4Z5J.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ruan-cat/utils",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.25.0",
|
|
4
4
|
"description": "阮喵喵工具集合。默认提供js文件,也直接提供ts文件。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./src/index.ts",
|
|
@@ -71,9 +71,9 @@
|
|
|
71
71
|
],
|
|
72
72
|
"dependencies": {
|
|
73
73
|
"@vueuse/integrations": "^13.9.0",
|
|
74
|
-
"axios": "^1.
|
|
74
|
+
"axios": "^1.14.0",
|
|
75
75
|
"consola": "^3.4.2",
|
|
76
|
-
"lodash-es": "^4.
|
|
76
|
+
"lodash-es": "^4.18.1",
|
|
77
77
|
"pkg-types": "^2.3.0",
|
|
78
78
|
"pnpm-workspace-yaml": "^1.6.0",
|
|
79
79
|
"tinyglobby": "^0.2.15"
|
|
@@ -90,9 +90,9 @@
|
|
|
90
90
|
"qs": "^6.15.0",
|
|
91
91
|
"tsup": "^8.5.1",
|
|
92
92
|
"type-plus": "^7.6.2",
|
|
93
|
-
"typedoc": "^0.28.
|
|
93
|
+
"typedoc": "^0.28.18",
|
|
94
94
|
"typedoc-plugin-frontmatter": "^1.3.1",
|
|
95
|
-
"typedoc-plugin-markdown": "^4.
|
|
95
|
+
"typedoc-plugin-markdown": "^4.11.0",
|
|
96
96
|
"typescript": "^5.9.3",
|
|
97
97
|
"unplugin-auto-import": "^21.0.0",
|
|
98
98
|
"unplugin-vue-router": "^0.16.1",
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
getRelizyRunnerHelpText,
|
|
9
9
|
getWorkspacePackages,
|
|
10
10
|
parseRelizyRunnerCliArgs,
|
|
11
|
+
prepareRelizySpawnArgs,
|
|
11
12
|
shouldCheckIndependentBootstrap,
|
|
12
13
|
} from "./index";
|
|
13
14
|
|
|
@@ -217,6 +218,36 @@ describe("relizy-runner", () => {
|
|
|
217
218
|
});
|
|
218
219
|
});
|
|
219
220
|
|
|
221
|
+
describe("prepareRelizySpawnArgs", () => {
|
|
222
|
+
test("release 未带 --yes 时自动追加", () => {
|
|
223
|
+
expect(prepareRelizySpawnArgs(["release", "--no-publish"])).toEqual(["release", "--no-publish", "--yes"]);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
test("bump 未带 --yes 时自动追加", () => {
|
|
227
|
+
expect(prepareRelizySpawnArgs(["bump", "--patch"])).toEqual(["bump", "--patch", "--yes"]);
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
test("已包含 --yes 时不重复追加", () => {
|
|
231
|
+
expect(prepareRelizySpawnArgs(["release", "--yes", "--dry-run"])).toEqual(["release", "--yes", "--dry-run"]);
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
test("--no-yes 时不再注入且不转发给 relizy", () => {
|
|
235
|
+
expect(prepareRelizySpawnArgs(["release", "--no-publish", "--no-yes"])).toEqual(["release", "--no-publish"]);
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
test("changelog 不注入 --yes", () => {
|
|
239
|
+
expect(prepareRelizySpawnArgs(["changelog", "--dry-run"])).toEqual(["changelog", "--dry-run"]);
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
test("bump 与 --no-yes 时不追加 --yes", () => {
|
|
243
|
+
expect(prepareRelizySpawnArgs(["bump", "--no-yes"])).toEqual(["bump"]);
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
test("仅 --no-yes 时去掉后只剩子命令仍需能区分", () => {
|
|
247
|
+
expect(prepareRelizySpawnArgs(["release", "--no-yes", "--dry-run"])).toEqual(["release", "--dry-run"]);
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
|
|
220
251
|
describe("parseRelizyRunnerCliArgs", () => {
|
|
221
252
|
test("无参数时返回 help", () => {
|
|
222
253
|
const result = parseRelizyRunnerCliArgs([]);
|
|
@@ -277,5 +308,12 @@ describe("relizy-runner", () => {
|
|
|
277
308
|
|
|
278
309
|
expect(helpText).toContain("-h, --help");
|
|
279
310
|
});
|
|
311
|
+
|
|
312
|
+
test("帮助文本说明自动 --yes 与 --no-yes", () => {
|
|
313
|
+
const helpText = getRelizyRunnerHelpText();
|
|
314
|
+
|
|
315
|
+
expect(helpText).toContain("--no-yes");
|
|
316
|
+
expect(helpText).toContain("release / bump");
|
|
317
|
+
});
|
|
280
318
|
});
|
|
281
319
|
});
|
|
@@ -7,6 +7,18 @@ import consola from "consola";
|
|
|
7
7
|
import { parsePnpmWorkspaceYaml } from "pnpm-workspace-yaml";
|
|
8
8
|
import type { PackageJson } from "pkg-types";
|
|
9
9
|
|
|
10
|
+
/**
|
|
11
|
+
* 本脚本将(经本节所述规整后的)参数转发给 relizy CLI。
|
|
12
|
+
*
|
|
13
|
+
* **`release` / `bump` 默认附带 `--yes`(内部预设)**:`relizy` 在应用版本计划前会交互询问
|
|
14
|
+
* 「Do you want to proceed with these version updates?」。在终端、CI、`pnpm` 脚本中若
|
|
15
|
+
* 未关闭该提示,进程会一直等待 stdin,看起来像“卡死”。`--yes` 对应上游选项
|
|
16
|
+
* *Skip confirmation prompt about bumping packages*,与改发版算法无关。
|
|
17
|
+
*
|
|
18
|
+
* 若需在本地逐步人工确认,可传入 **runner 专用** 的 `--no-yes`:该参数不会转发给 relizy,
|
|
19
|
+
* 且会关闭上述自动注入(仅对 `release` / `bump` 生效)。
|
|
20
|
+
*/
|
|
21
|
+
|
|
10
22
|
const WINDOWS_GNU_COMMANDS = ["grep", "head", "sed"] as const;
|
|
11
23
|
|
|
12
24
|
/** 发版基线 tag 校验所需的最小字段,由 {@link PackageJson} 派生。 */
|
|
@@ -181,6 +193,28 @@ export function shouldCheckIndependentBootstrap(relizyArgs: string[]) {
|
|
|
181
193
|
return command === "release" || command === "bump";
|
|
182
194
|
}
|
|
183
195
|
|
|
196
|
+
const RELIZY_SUBCOMMANDS_WITH_YES_PRESET = new Set(["release", "bump"]);
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* 规整即将交给 relizy 的参数:移除 runner 专用选项,并在适当时追加 `--yes`。
|
|
200
|
+
*
|
|
201
|
+
* - 对 `release` / `bump`:若未出现 `--yes` 且未要求 `--no-yes`,则在末尾追加 `--yes`。
|
|
202
|
+
* - `--no-yes` 仅由 relizy-runner 识别,不会传递给 relizy。
|
|
203
|
+
*/
|
|
204
|
+
export function prepareRelizySpawnArgs(relizyArgs: string[]): string[] {
|
|
205
|
+
const optOutYes = relizyArgs.includes("--no-yes");
|
|
206
|
+
const forward = relizyArgs.filter((arg) => arg !== "--no-yes");
|
|
207
|
+
const [command] = forward;
|
|
208
|
+
|
|
209
|
+
const shouldInjectYes =
|
|
210
|
+
!optOutYes &&
|
|
211
|
+
command !== undefined &&
|
|
212
|
+
RELIZY_SUBCOMMANDS_WITH_YES_PRESET.has(command) &&
|
|
213
|
+
!forward.includes("--yes");
|
|
214
|
+
|
|
215
|
+
return shouldInjectYes ? [...forward, "--yes"] : forward;
|
|
216
|
+
}
|
|
217
|
+
|
|
184
218
|
function getPackagesMissingBootstrapTags(env: NodeJS.ProcessEnv) {
|
|
185
219
|
return getWorkspacePackages().filter((pkg) => getPackageTags(pkg.name, env).length === 0);
|
|
186
220
|
}
|
|
@@ -223,7 +257,10 @@ export function getRelizyRunnerHelpText() {
|
|
|
223
257
|
" relizy-runner changelog --dry-run",
|
|
224
258
|
" relizy-runner bump",
|
|
225
259
|
"",
|
|
226
|
-
"
|
|
260
|
+
"runner 行为:对 release / bump 默认在末尾追加 --yes(跳过上游确认);",
|
|
261
|
+
" 需要交互确认时请加上 --no-yes(仅 runner 识别,不传给 relizy)。",
|
|
262
|
+
"",
|
|
263
|
+
"常用参数(节选,由 relizy 处理;除 --no-yes 外 runner 仅透传):",
|
|
227
264
|
" --dry-run 预览,不写文件、不打 tag、不提交",
|
|
228
265
|
" --no-push 不 push 到远端",
|
|
229
266
|
" --no-publish 不执行 npm publish",
|
|
@@ -231,6 +268,7 @@ export function getRelizyRunnerHelpText() {
|
|
|
231
268
|
" --no-commit 不创建提交与 tag",
|
|
232
269
|
" --no-changelog 不生成 changelog 文件",
|
|
233
270
|
" --no-verify 提交时跳过 git hooks",
|
|
271
|
+
" --yes 跳过 relizy 的确认提示(release/bump 下 runner 也会自动追加)",
|
|
234
272
|
"",
|
|
235
273
|
"以上仅为常用参数节选,完整参数请查阅 relizy 包自身文档:",
|
|
236
274
|
" npx relizy --help",
|
|
@@ -242,6 +280,7 @@ export function getRelizyRunnerHelpText() {
|
|
|
242
280
|
" npx ruan-cat-utils relizy-runner release --dry-run",
|
|
243
281
|
"",
|
|
244
282
|
"选项:",
|
|
283
|
+
" --no-yes 关闭 release/bump 的自动 --yes,恢复 relizy 交互确认",
|
|
245
284
|
" -h, --help 查看帮助信息",
|
|
246
285
|
].join("\n");
|
|
247
286
|
}
|
|
@@ -260,7 +299,7 @@ function resolveRelizyEntrypoint() {
|
|
|
260
299
|
* 1. Windows 下自动补齐 Git for Windows 的 `usr\bin` 路径,避免 relizy 内部调用 `grep`/`head`/`sed` 失败。
|
|
261
300
|
* 2. 在 `release`/`bump` 前校验 independent 基线 tag,缺失时打印补打命令并终止。
|
|
262
301
|
*
|
|
263
|
-
* @param relizyArgs - 透传给 relizy
|
|
302
|
+
* @param relizyArgs - 透传给 relizy 的子命令与参数(会先经 {@link prepareRelizySpawnArgs} 规整)
|
|
264
303
|
* @returns 退出码
|
|
265
304
|
*/
|
|
266
305
|
export function runRelizyRunner(relizyArgs: string[]) {
|
|
@@ -270,11 +309,13 @@ export function runRelizyRunner(relizyArgs: string[]) {
|
|
|
270
309
|
return 1;
|
|
271
310
|
}
|
|
272
311
|
|
|
273
|
-
|
|
312
|
+
const spawnArgs = prepareRelizySpawnArgs(relizyArgs);
|
|
313
|
+
|
|
314
|
+
consola.start(`[release:relizy] 执行命令:relizy ${spawnArgs.join(" ")}`);
|
|
274
315
|
|
|
275
316
|
const env = ensureRelizyShellEnv();
|
|
276
317
|
|
|
277
|
-
if (shouldCheckIndependentBootstrap(
|
|
318
|
+
if (shouldCheckIndependentBootstrap(spawnArgs)) {
|
|
278
319
|
consola.info("[release:relizy] 检查 independent 基线 tag...");
|
|
279
320
|
const missingPackages = getPackagesMissingBootstrapTags(env);
|
|
280
321
|
|
|
@@ -295,7 +336,7 @@ export function runRelizyRunner(relizyArgs: string[]) {
|
|
|
295
336
|
|
|
296
337
|
consola.info(`[release:relizy] 调用 relizy 入口:${relizyEntrypoint}`);
|
|
297
338
|
|
|
298
|
-
const result = spawnSync(process.execPath, [relizyEntrypoint, ...
|
|
339
|
+
const result = spawnSync(process.execPath, [relizyEntrypoint, ...spawnArgs], {
|
|
299
340
|
cwd: process.cwd(),
|
|
300
341
|
env,
|
|
301
342
|
stdio: "inherit",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/node-esm/scripts/relizy-runner/index.ts"],"sourcesContent":["import { execFileSync, spawnSync } from \"node:child_process\";\nimport { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\nimport consola from \"consola\";\nimport { parsePnpmWorkspaceYaml } from \"pnpm-workspace-yaml\";\nimport type { PackageJson } from \"pkg-types\";\n\nconst WINDOWS_GNU_COMMANDS = [\"grep\", \"head\", \"sed\"] as const;\n\n/** 发版基线 tag 校验所需的最小字段,由 {@link PackageJson} 派生。 */\nexport type WorkspacePackageInfo = Required<Pick<PackageJson, \"name\" | \"version\">>;\n\n// ── 工作区包发现 ──────────────────────────────────────────────────────────────\n\n/**\n * 解析根目录 `pnpm-workspace.yaml` 并展开 glob 模式,\n * 收集所有含 `package.json` 的子包目录,返回其 name 与 version。\n *\n * 使用 [pnpm-workspace-yaml](https://github.com/antfu/pnpm-workspace-utils/tree/main/packages/pnpm-workspace-yaml)\n * 解析工作区清单,再用 `pkg-types` 的 `PackageJson` 约束子包字段。\n */\nexport function getWorkspacePackages(workspaceRoot?: string): WorkspacePackageInfo[] {\n\tconst root = workspaceRoot ?? process.cwd();\n\tconst yamlPath = resolve(root, \"pnpm-workspace.yaml\");\n\n\tif (!existsSync(yamlPath)) {\n\t\tconsola.error(\"release:relizy:未在当前目录找到 pnpm-workspace.yaml,请从仓库根目录执行。\");\n\t\treturn [];\n\t}\n\n\tconst globs = parsePnpmWorkspaceYaml(readFileSync(yamlPath, \"utf8\")).toJSON().packages ?? [];\n\tconst packages: WorkspacePackageInfo[] = [];\n\n\tfor (const pattern of globs) {\n\t\tconst parts = pattern.split(\"/\");\n\n\t\tif (parts.length !== 2 || parts[1] !== \"*\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst dir = resolve(root, parts[0]);\n\n\t\tif (!existsSync(dir)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst discovered = readdirSync(dir, { withFileTypes: true })\n\t\t\t.filter((entry) => entry.isDirectory())\n\t\t\t.map((entry) => join(dir, entry.name, \"package.json\"))\n\t\t\t.filter((pkgPath) => existsSync(pkgPath))\n\t\t\t.map((pkgPath) => {\n\t\t\t\tconst pkg = JSON.parse(readFileSync(pkgPath, \"utf8\")) as PackageJson;\n\n\t\t\t\treturn { name: pkg.name, version: pkg.version };\n\t\t\t})\n\t\t\t.filter((pkg): pkg is WorkspacePackageInfo => typeof pkg.name === \"string\" && typeof pkg.version === \"string\");\n\n\t\tpackages.push(...discovered);\n\t}\n\n\treturn packages;\n}\n\n// ── Windows GNU 工具兼容层 ────────────────────────────────────────────────────\n\nfunction runLookup(command: string, args: string[], env: NodeJS.ProcessEnv = process.env) {\n\treturn spawnSync(command, args, {\n\t\tcwd: process.cwd(),\n\t\tenv,\n\t\tencoding: \"utf8\",\n\t\tstdio: \"pipe\",\n\t});\n}\n\nfunction hasExecutable(command: string, env: NodeJS.ProcessEnv = process.env) {\n\tconst lookupCommand = process.platform === \"win32\" ? \"where\" : \"which\";\n\n\treturn runLookup(lookupCommand, [command], env).status === 0;\n}\n\nfunction listExecutableMatches(command: string) {\n\tconst lookupCommand = process.platform === \"win32\" ? \"where\" : \"which\";\n\tconst result = runLookup(lookupCommand, [command]);\n\n\tif (result.status !== 0) {\n\t\treturn [];\n\t}\n\n\treturn result.stdout\n\t\t.split(/\\r?\\n/u)\n\t\t.map((line) => line.trim())\n\t\t.filter(Boolean);\n}\n\nfunction resolveGitUsrBinPath() {\n\tif (process.platform !== \"win32\") {\n\t\treturn null;\n\t}\n\n\tconst candidates = new Set<string>();\n\n\tfor (const executablePath of [...listExecutableMatches(\"bash\"), ...listExecutableMatches(\"git\")]) {\n\t\tconst executableDir = dirname(executablePath);\n\n\t\tcandidates.add(resolve(executableDir, \"..\", \"usr\", \"bin\"));\n\t\tcandidates.add(resolve(executableDir, \"usr\", \"bin\"));\n\t}\n\n\tfor (const candidate of candidates) {\n\t\tconst hasAllCommands = WINDOWS_GNU_COMMANDS.every((command) => existsSync(join(candidate, `${command}.exe`)));\n\n\t\tif (hasAllCommands) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\n\treturn null;\n}\n\n/**\n * 确保 relizy 所需的 GNU 工具(grep / head / sed)在 PATH 中可用。\n * Windows 下会自动补齐 Git for Windows 的 `usr\\bin` 路径。\n */\nexport function ensureRelizyShellEnv() {\n\tif (process.platform !== \"win32\") {\n\t\treturn { ...process.env };\n\t}\n\n\tif (WINDOWS_GNU_COMMANDS.every((command) => hasExecutable(command))) {\n\t\treturn { ...process.env };\n\t}\n\n\tconst gitUsrBinPath = resolveGitUsrBinPath();\n\n\tif (!gitUsrBinPath) {\n\t\tconsola.error(\"[release:relizy] 在 Windows 上未找到 relizy 所需的 GNU 工具(grep / head / sed)。\");\n\t\tconsola.error(\"请先安装 Git for Windows,或将其安装目录下的 usr\\\\bin 加入 PATH。\");\n\t\tprocess.exit(1);\n\t}\n\n\tconst env = {\n\t\t...process.env,\n\t\tPATH: `${gitUsrBinPath};${process.env.PATH ?? \"\"}`,\n\t};\n\n\tif (!WINDOWS_GNU_COMMANDS.every((command) => hasExecutable(command, env))) {\n\t\tconsola.error(\"[release:relizy] 已定位到 Git for Windows,但 grep / head / sed 仍不可用。\");\n\t\tconsola.error(`请检查 PATH,或手动确认该目录是否存在所需可执行文件:${gitUsrBinPath}`);\n\t\tprocess.exit(1);\n\t}\n\n\tconsola.info(`[release:relizy] Windows 下已补齐 GNU 工具路径:${gitUsrBinPath}`);\n\n\treturn env;\n}\n\n// ── independent 模式 baseline tag 检查 ───────────────────────────────────────\n\nfunction getPackageTags(packageName: string, env: NodeJS.ProcessEnv) {\n\tconst stdout = execFileSync(\"git\", [\"tag\", \"--list\", `${packageName}@*`], {\n\t\tcwd: process.cwd(),\n\t\tenv,\n\t\tencoding: \"utf8\",\n\t});\n\n\treturn stdout\n\t\t.split(/\\r?\\n/u)\n\t\t.map((line) => line.trim())\n\t\t.filter(Boolean);\n}\n\n/**\n * 判断当前 relizy 子命令是否需要检查 independent 基线 tag。\n * 仅 `release` 与 `bump` 需要。\n */\nexport function shouldCheckIndependentBootstrap(relizyArgs: string[]) {\n\tconst [command] = relizyArgs;\n\n\treturn command === \"release\" || command === \"bump\";\n}\n\nfunction getPackagesMissingBootstrapTags(env: NodeJS.ProcessEnv) {\n\treturn getWorkspacePackages().filter((pkg) => getPackageTags(pkg.name, env).length === 0);\n}\n\n/**\n * 根据缺少基线 tag 的包列表,生成包含补打 tag 命令的提示文本。\n */\nexport function buildBootstrapInstructions(missingPackages: WorkspacePackageInfo[]) {\n\tconst tagCommands = missingPackages.map((pkg) => `git tag \"${pkg.name}@${pkg.version}\"`);\n\tconst pushArgs = missingPackages.map((pkg) => `\"${pkg.name}@${pkg.version}\"`).join(\" \");\n\n\treturn [\n\t\t\"[release:relizy] 检测到本仓库尚未为以下包建立基线 tag(independent 模式首次发版前需要):\",\n\t\t...missingPackages.map((pkg) => `- ${pkg.name}@${pkg.version}`),\n\t\t\"\",\n\t\t\"请按当前 package.json 版本创建基线 tag,并推送到远端:\",\n\t\t...tagCommands,\n\t\t`git push origin ${pushArgs}`,\n\t].join(\"\\n\");\n}\n\nfunction printBootstrapInstructions(missingPackages: WorkspacePackageInfo[]) {\n\tconsola.error(buildBootstrapInstructions(missingPackages));\n}\n\n// ── 帮助信息 ──────────────────────────────────────────────────────────────────\n\n/**\n * 获取 relizy-runner CLI 的帮助文本。\n */\nexport function getRelizyRunnerHelpText() {\n\treturn [\n\t\t\"relizy-runner <relizy 子命令与参数>\",\n\t\t\"\",\n\t\t\"在 relizy 执行前补齐 Windows GNU 工具路径,并在首次 independent 发版前\",\n\t\t\"校验基线 tag。不改变 relizy 自身的发版与版本计算逻辑。\",\n\t\t\"\",\n\t\t\"用法:\",\n\t\t\" relizy-runner release --no-publish --no-provider-release\",\n\t\t\" relizy-runner changelog --dry-run\",\n\t\t\" relizy-runner bump\",\n\t\t\"\",\n\t\t\"常用参数(节选,由 relizy 处理,runner 仅透传):\",\n\t\t\" --dry-run 预览,不写文件、不打 tag、不提交\",\n\t\t\" --no-push 不 push 到远端\",\n\t\t\" --no-publish 不执行 npm publish\",\n\t\t\" --no-provider-release 不在 GitHub/GitLab 创建 Release\",\n\t\t\" --no-commit 不创建提交与 tag\",\n\t\t\" --no-changelog 不生成 changelog 文件\",\n\t\t\" --no-verify 提交时跳过 git hooks\",\n\t\t\"\",\n\t\t\"以上仅为常用参数节选,完整参数请查阅 relizy 包自身文档:\",\n\t\t\" npx relizy --help\",\n\t\t\" npx relizy release --help\",\n\t\t\" npx relizy changelog --help\",\n\t\t\"\",\n\t\t\"示例:\",\n\t\t\" npx relizy-runner release --no-publish --no-provider-release\",\n\t\t\" npx ruan-cat-utils relizy-runner release --dry-run\",\n\t\t\"\",\n\t\t\"选项:\",\n\t\t\" -h, --help 查看帮助信息\",\n\t].join(\"\\n\");\n}\n\n// ── 主入口 ────────────────────────────────────────────────────────────────────\n\nfunction resolveRelizyEntrypoint() {\n\treturn resolve(process.cwd(), \"node_modules\", \"relizy\", \"bin\", \"relizy.mjs\");\n}\n\n/**\n * 执行 relizy-runner。\n *\n * @description\n * 在 relizy 执行前做两件事:\n * 1. Windows 下自动补齐 Git for Windows 的 `usr\\bin` 路径,避免 relizy 内部调用 `grep`/`head`/`sed` 失败。\n * 2. 在 `release`/`bump` 前校验 independent 基线 tag,缺失时打印补打命令并终止。\n *\n * @param relizyArgs - 透传给 relizy 的子命令与参数\n * @returns 退出码\n */\nexport function runRelizyRunner(relizyArgs: string[]) {\n\tif (relizyArgs.length === 0) {\n\t\tconsola.error(\"用法:relizy-runner <relizy 子命令与参数>\");\n\t\tconsola.error(\"示例:relizy-runner release --no-publish --no-provider-release\");\n\t\treturn 1;\n\t}\n\n\tconsola.start(`[release:relizy] 执行命令:relizy ${relizyArgs.join(\" \")}`);\n\n\tconst env = ensureRelizyShellEnv();\n\n\tif (shouldCheckIndependentBootstrap(relizyArgs)) {\n\t\tconsola.info(\"[release:relizy] 检查 independent 基线 tag...\");\n\t\tconst missingPackages = getPackagesMissingBootstrapTags(env);\n\n\t\tif (missingPackages.length > 0) {\n\t\t\tprintBootstrapInstructions(missingPackages);\n\t\t\treturn 1;\n\t\t}\n\n\t\tconsola.success(\"[release:relizy] 基线 tag 检查通过。\");\n\t}\n\n\tconst relizyEntrypoint = resolveRelizyEntrypoint();\n\n\tif (!existsSync(relizyEntrypoint)) {\n\t\tconsola.error(\"未在 node_modules 中找到 relizy 命令行入口,请先执行 pnpm install。\");\n\t\treturn 1;\n\t}\n\n\tconsola.info(`[release:relizy] 调用 relizy 入口:${relizyEntrypoint}`);\n\n\tconst result = spawnSync(process.execPath, [relizyEntrypoint, ...relizyArgs], {\n\t\tcwd: process.cwd(),\n\t\tenv,\n\t\tstdio: \"inherit\",\n\t});\n\n\tif (result.status === 0) {\n\t\tconsola.success(\"[release:relizy] relizy 执行完毕。\");\n\t} else {\n\t\tconsola.error(`[release:relizy] relizy 以退出码 ${result.status} 结束。`);\n\t}\n\n\treturn result.status ?? 1;\n}\n\n/**\n * 解析 relizy-runner CLI 参数。\n * 如果首个参数是 `--help` 或 `-h`,返回 `{ help: true }`。\n * 否则将所有参数透传给 relizy。\n */\nexport function parseRelizyRunnerCliArgs(args: string[]): { help: boolean; relizyArgs: string[] } {\n\tif (args.length === 0 || args[0] === \"--help\" || args[0] === \"-h\") {\n\t\treturn { help: true, relizyArgs: [] };\n\t}\n\n\treturn { help: false, relizyArgs: args };\n}\n\n/**\n * 执行 relizy-runner CLI。\n */\nexport function runRelizyRunnerCli(args: string[] = process.argv.slice(2)) {\n\tconst parsed = parseRelizyRunnerCliArgs(args);\n\n\tif (parsed.help) {\n\t\tconsole.log(getRelizyRunnerHelpText());\n\t\treturn;\n\t}\n\n\tconst exitCode = runRelizyRunner(parsed.relizyArgs);\n\tprocess.exitCode = exitCode;\n}\n\nfunction isRunningAsCli() {\n\tconst currentFilePath = fileURLToPath(import.meta.url);\n\tconst entryPath = process.argv[1];\n\n\tif (!entryPath) {\n\t\treturn false;\n\t}\n\n\treturn resolve(entryPath) === currentFilePath;\n}\n\nif (isRunningAsCli()) {\n\trunRelizyRunnerCli();\n}\n"],"mappings":"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","names":[]}
|