@sfmc-bds/cli 0.2.0-beta.1 → 0.2.0-beta.11
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/LICENSE +663 -0
- package/dist/argv-parse.d.ts +11 -0
- package/dist/argv-parse.d.ts.map +1 -0
- package/dist/argv-parse.js +28 -0
- package/dist/argv-parse.js.map +7 -0
- package/dist/cli-gate.d.ts +11 -0
- package/dist/cli-gate.d.ts.map +1 -0
- package/dist/cli-gate.js +46 -0
- package/dist/cli-gate.js.map +7 -0
- package/dist/command-palette.d.ts +61 -0
- package/dist/command-palette.d.ts.map +1 -0
- package/dist/command-palette.js +352 -0
- package/dist/command-palette.js.map +7 -0
- package/dist/command-surface.d.ts +85 -0
- package/dist/command-surface.d.ts.map +1 -0
- package/dist/command-surface.js +292 -0
- package/dist/command-surface.js.map +7 -0
- package/dist/command-surface.test.js +92 -0
- package/dist/command-surface.test.js.map +7 -0
- package/dist/commands-reload.js +2 -2
- package/dist/commands-reload.js.map +2 -2
- package/dist/commands.d.ts +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +196 -21
- package/dist/commands.js.map +2 -2
- package/dist/debug-command.d.ts +5 -0
- package/dist/debug-command.d.ts.map +1 -0
- package/dist/debug-command.js +118 -0
- package/dist/debug-command.js.map +7 -0
- package/dist/debug-command.test.js +76 -0
- package/dist/debug-command.test.js.map +7 -0
- package/dist/directory-picker.d.ts +27 -0
- package/dist/directory-picker.d.ts.map +1 -0
- package/dist/directory-picker.js +112 -0
- package/dist/directory-picker.js.map +7 -0
- package/dist/help-text.d.ts +3 -0
- package/dist/help-text.d.ts.map +1 -0
- package/dist/help-text.js +160 -0
- package/dist/help-text.js.map +7 -0
- package/dist/i18n/locales/en.d.ts +94 -79
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +96 -81
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
- package/dist/i18n/locales/zh-CN.js +130 -109
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -4
- package/dist/index.js.map +2 -2
- package/dist/interactive-prompts.d.ts +1 -2
- package/dist/interactive-prompts.d.ts.map +1 -1
- package/dist/interactive-prompts.js +12 -23
- package/dist/interactive-prompts.js.map +3 -3
- package/dist/llbot-launch.d.ts +20 -0
- package/dist/llbot-launch.d.ts.map +1 -0
- package/dist/llbot-launch.js +40 -0
- package/dist/llbot-launch.js.map +7 -0
- package/dist/log-filter.test.js +119 -0
- package/dist/log-filter.test.js.map +7 -0
- package/dist/logs.d.ts +16 -1
- package/dist/logs.d.ts.map +1 -1
- package/dist/logs.js +80 -11
- package/dist/logs.js.map +2 -2
- package/dist/main.js +55 -46
- package/dist/main.js.map +2 -2
- package/dist/module-commands.d.ts +17 -40
- package/dist/module-commands.d.ts.map +1 -1
- package/dist/module-commands.js +129 -85
- package/dist/module-commands.js.map +2 -2
- package/dist/module-pack-build.d.ts +10 -0
- package/dist/module-pack-build.d.ts.map +1 -0
- package/dist/module-pack-build.js +434 -0
- package/dist/module-pack-build.js.map +7 -0
- package/dist/module-toggle.d.ts +33 -0
- package/dist/module-toggle.d.ts.map +1 -0
- package/dist/module-toggle.js +28 -0
- package/dist/module-toggle.js.map +7 -0
- package/dist/module-toggle.test.js +37 -0
- package/dist/module-toggle.test.js.map +7 -0
- package/dist/node-service-probe.d.ts +18 -0
- package/dist/node-service-probe.d.ts.map +1 -0
- package/dist/node-service-probe.js +97 -0
- package/dist/node-service-probe.js.map +7 -0
- package/dist/pack-lifecycle.d.ts +1 -1
- package/dist/pack-lifecycle.d.ts.map +1 -1
- package/dist/pack-lifecycle.js +14 -4
- package/dist/pack-lifecycle.js.map +2 -2
- package/dist/pack-update/index.d.ts +18 -0
- package/dist/pack-update/index.d.ts.map +1 -0
- package/dist/pack-update/index.js +113 -0
- package/dist/pack-update/index.js.map +7 -0
- package/dist/registry.d.ts +7 -4
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +15 -3
- package/dist/registry.js.map +2 -2
- package/dist/repl-windows/format-display.d.ts +10 -0
- package/dist/repl-windows/format-display.d.ts.map +1 -0
- package/dist/repl-windows/format-display.js +57 -0
- package/dist/repl-windows/format-display.js.map +7 -0
- package/dist/repl-windows/host.d.ts +60 -0
- package/dist/repl-windows/host.d.ts.map +1 -0
- package/dist/repl-windows/host.js +179 -0
- package/dist/repl-windows/host.js.map +7 -0
- package/dist/repl-windows/index.d.ts +9 -0
- package/dist/repl-windows/index.d.ts.map +1 -0
- package/dist/repl-windows/index.js +13 -0
- package/dist/repl-windows/index.js.map +7 -0
- package/dist/repl-windows/logs-filter-window.d.ts +15 -0
- package/dist/repl-windows/logs-filter-window.d.ts.map +1 -0
- package/dist/repl-windows/logs-filter-window.js +77 -0
- package/dist/repl-windows/logs-filter-window.js.map +7 -0
- package/dist/repl-windows/service-window.d.ts +4 -0
- package/dist/repl-windows/service-window.d.ts.map +1 -0
- package/dist/repl-windows/service-window.js +35 -0
- package/dist/repl-windows/service-window.js.map +7 -0
- package/dist/repl-windows/types.d.ts +56 -0
- package/dist/repl-windows/types.d.ts.map +1 -0
- package/dist/repl-windows/types.js +1 -0
- package/dist/repl-windows/types.js.map +7 -0
- package/dist/repl.d.ts +6 -9
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +698 -427
- package/dist/repl.js.map +3 -3
- package/dist/runtime.d.ts +6 -13
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +23 -28
- package/dist/runtime.js.map +2 -2
- package/dist/send-target.d.ts +11 -0
- package/dist/send-target.d.ts.map +1 -0
- package/dist/send-target.js +42 -0
- package/dist/send-target.js.map +7 -0
- package/dist/services.d.ts +50 -4
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +244 -20
- package/dist/services.js.map +2 -2
- package/dist/theme.js +1 -1
- package/dist/theme.js.map +2 -2
- package/dist/wizard.d.ts.map +1 -1
- package/dist/wizard.js +76 -16
- package/dist/wizard.js.map +2 -2
- package/dist/world-packs-uninstall.test.js +54 -0
- package/dist/world-packs-uninstall.test.js.map +7 -0
- package/dist/world-packs.d.ts.map +1 -1
- package/dist/world-packs.js +6 -3
- package/dist/world-packs.js.map +2 -2
- package/package.json +29 -24
- package/scripts/module-install/check-modules.mjs +204 -0
- package/scripts/module-install/fetch-module.mjs +1007 -0
- package/scripts/module-install/lib/catalog.mjs +96 -0
- package/scripts/module-install/lib/io.mjs +37 -0
- package/scripts/module-install/lib/link-from.mjs +80 -0
- package/scripts/module-install/lib/lock.mjs +78 -0
- package/scripts/module-install/lib/npm-resolver.mjs +55 -0
- package/scripts/module-install/lib/packages.mjs +142 -0
- package/scripts/module-install/lib/paths.mjs +48 -0
- package/scripts/module-install/lib/registry-index.mjs +50 -0
- package/scripts/module-install/test/install-resolver.test.ts +47 -0
- package/scripts/module-install/test/link-local.test.ts +50 -0
- package/scripts/module-install/test/local-resolver.test.ts +44 -0
- package/scripts/module-install/test/registry-index.test.ts +27 -0
- package/dist/module-wizard.d.ts +0 -14
- package/dist/module-wizard.d.ts.map +0 -1
- package/dist/module-wizard.js +0 -313
- package/dist/module-wizard.js.map +0 -7
- package/dist/pack-update/bindings.d.ts +0 -12
- package/dist/pack-update/bindings.d.ts.map +0 -1
- package/dist/pack-update/bindings.js +0 -64
- package/dist/pack-update/bindings.js.map +0 -7
- package/dist/pack-update/config.d.ts +0 -22
- package/dist/pack-update/config.d.ts.map +0 -1
- package/dist/pack-update/config.js +0 -141
- package/dist/pack-update/config.js.map +0 -7
- package/dist/pack-update/providers/curseforge.d.ts +0 -23
- package/dist/pack-update/providers/curseforge.d.ts.map +0 -1
- package/dist/pack-update/providers/curseforge.js +0 -229
- package/dist/pack-update/providers/curseforge.js.map +0 -7
- package/dist/pack-update/providers/index.d.ts +0 -16
- package/dist/pack-update/providers/index.d.ts.map +0 -1
- package/dist/pack-update/providers/index.js +0 -37
- package/dist/pack-update/providers/index.js.map +0 -7
- package/dist/pack-update/service.d.ts +0 -21
- package/dist/pack-update/service.d.ts.map +0 -1
- package/dist/pack-update/service.js +0 -572
- package/dist/pack-update/service.js.map +0 -7
- package/dist/pack-update/types.d.ts +0 -126
- package/dist/pack-update/types.d.ts.map +0 -1
- package/dist/pack-update/types.js +0 -8
- package/dist/pack-update/types.js.map +0 -7
- package/dist/pack-update/version-policy.d.ts +0 -81
- package/dist/pack-update/version-policy.d.ts.map +0 -1
- package/dist/pack-update/version-policy.js +0 -210
- package/dist/pack-update/version-policy.js.map +0 -7
- package/dist/remote-agent.d.ts +0 -18
- package/dist/remote-agent.d.ts.map +0 -1
- package/dist/remote-agent.js +0 -196
- package/dist/remote-agent.js.map +0 -7
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import test from "node:test";
|
|
6
|
+
import { cmdDebug, isDebugTruthy } from "./debug-command.js";
|
|
7
|
+
function setupSfmcRoot(bdsRoot) {
|
|
8
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), "sfmc-debug-"));
|
|
9
|
+
fs.mkdirSync(path.join(root, "configs"), { recursive: true });
|
|
10
|
+
fs.writeFileSync(
|
|
11
|
+
path.join(root, "configs", "bds_updater.json"),
|
|
12
|
+
JSON.stringify({ bds_path: bdsRoot.replace(/\\/g, "/") }, null, 2)
|
|
13
|
+
);
|
|
14
|
+
return root;
|
|
15
|
+
}
|
|
16
|
+
test("isDebugTruthy \u4E0E SDK \u5951\u7EA6\u4E00\u81F4", () => {
|
|
17
|
+
assert.equal(isDebugTruthy(true), true);
|
|
18
|
+
assert.equal(isDebugTruthy(1), true);
|
|
19
|
+
assert.equal(isDebugTruthy("yes"), true);
|
|
20
|
+
assert.equal(isDebugTruthy("on"), true);
|
|
21
|
+
assert.equal(isDebugTruthy(false), false);
|
|
22
|
+
assert.equal(isDebugTruthy("no"), false);
|
|
23
|
+
});
|
|
24
|
+
test("debug enable/disable/status \u5199 BDS variables.json", async () => {
|
|
25
|
+
const bdsRoot = fs.mkdtempSync(path.join(os.tmpdir(), "sfmc-bds-"));
|
|
26
|
+
const sfmcRoot = setupSfmcRoot(bdsRoot);
|
|
27
|
+
const prev = process.env.SFMC_ROOT;
|
|
28
|
+
process.env.SFMC_ROOT = sfmcRoot;
|
|
29
|
+
try {
|
|
30
|
+
const variablesPath = path.join(bdsRoot, "config", "default", "variables.json");
|
|
31
|
+
await cmdDebug(["enable"]);
|
|
32
|
+
const afterEnable = JSON.parse(fs.readFileSync(variablesPath, "utf8"));
|
|
33
|
+
assert.equal(afterEnable.sfmc_debug, true);
|
|
34
|
+
const statusOn = await cmdDebug(["status"]);
|
|
35
|
+
assert.match(statusOn, /sfmc_debug/i);
|
|
36
|
+
await cmdDebug(["disable"]);
|
|
37
|
+
const afterDisable = JSON.parse(fs.readFileSync(variablesPath, "utf8"));
|
|
38
|
+
assert.equal(afterDisable.sfmc_debug, false);
|
|
39
|
+
} finally {
|
|
40
|
+
if (prev === void 0) delete process.env.SFMC_ROOT;
|
|
41
|
+
else process.env.SFMC_ROOT = prev;
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
test("debug sentry on/off \u5199 BDS secrets.json", async () => {
|
|
45
|
+
const bdsRoot = fs.mkdtempSync(path.join(os.tmpdir(), "sfmc-bds-"));
|
|
46
|
+
const sfmcRoot = setupSfmcRoot(bdsRoot);
|
|
47
|
+
const prev = process.env.SFMC_ROOT;
|
|
48
|
+
process.env.SFMC_ROOT = sfmcRoot;
|
|
49
|
+
try {
|
|
50
|
+
const secretsPath = path.join(bdsRoot, "config", "default", "secrets.json");
|
|
51
|
+
const dsn = "https://example@o123.ingest.sentry.io/456";
|
|
52
|
+
await cmdDebug(["sentry", "on", "--dsn", dsn]);
|
|
53
|
+
const afterOn = JSON.parse(fs.readFileSync(secretsPath, "utf8"));
|
|
54
|
+
assert.equal(afterOn.SENTRY_DSN, dsn);
|
|
55
|
+
await cmdDebug(["sentry", "off"]);
|
|
56
|
+
const afterOff = JSON.parse(fs.readFileSync(secretsPath, "utf8"));
|
|
57
|
+
assert.equal("SENTRY_DSN" in afterOff, false);
|
|
58
|
+
} finally {
|
|
59
|
+
if (prev === void 0) delete process.env.SFMC_ROOT;
|
|
60
|
+
else process.env.SFMC_ROOT = prev;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
test("debug sentry on \u7F3A --dsn \u62A5\u9519", async () => {
|
|
64
|
+
const bdsRoot = fs.mkdtempSync(path.join(os.tmpdir(), "sfmc-bds-"));
|
|
65
|
+
const sfmcRoot = setupSfmcRoot(bdsRoot);
|
|
66
|
+
const prev = process.env.SFMC_ROOT;
|
|
67
|
+
process.env.SFMC_ROOT = sfmcRoot;
|
|
68
|
+
try {
|
|
69
|
+
const out = await cmdDebug(["sentry", "on"]);
|
|
70
|
+
assert.match(out, /--dsn|required|需要/i);
|
|
71
|
+
} finally {
|
|
72
|
+
if (prev === void 0) delete process.env.SFMC_ROOT;
|
|
73
|
+
else process.env.SFMC_ROOT = prev;
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=debug-command.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/debug-command.test.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * debug-command BDS variables.json / secrets.json \u8BFB\u5199\n */\nimport assert from \"node:assert/strict\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport test from \"node:test\";\nimport { cmdDebug, isDebugTruthy } from \"./debug-command.js\";\n\nfunction setupSfmcRoot(bdsRoot: string): string {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), \"sfmc-debug-\"));\n fs.mkdirSync(path.join(root, \"configs\"), { recursive: true });\n fs.writeFileSync(\n path.join(root, \"configs\", \"bds_updater.json\"),\n JSON.stringify({ bds_path: bdsRoot.replace(/\\\\/g, \"/\") }, null, 2)\n );\n return root;\n}\n\ntest(\"isDebugTruthy \u4E0E SDK \u5951\u7EA6\u4E00\u81F4\", () => {\n assert.equal(isDebugTruthy(true), true);\n assert.equal(isDebugTruthy(1), true);\n assert.equal(isDebugTruthy(\"yes\"), true);\n assert.equal(isDebugTruthy(\"on\"), true);\n assert.equal(isDebugTruthy(false), false);\n assert.equal(isDebugTruthy(\"no\"), false);\n});\n\ntest(\"debug enable/disable/status \u5199 BDS variables.json\", async () => {\n const bdsRoot = fs.mkdtempSync(path.join(os.tmpdir(), \"sfmc-bds-\"));\n const sfmcRoot = setupSfmcRoot(bdsRoot);\n const prev = process.env.SFMC_ROOT;\n process.env.SFMC_ROOT = sfmcRoot;\n\n try {\n const variablesPath = path.join(bdsRoot, \"config\", \"default\", \"variables.json\");\n\n await cmdDebug([\"enable\"]);\n const afterEnable = JSON.parse(fs.readFileSync(variablesPath, \"utf8\")) as { sfmc_debug?: boolean };\n assert.equal(afterEnable.sfmc_debug, true);\n\n const statusOn = await cmdDebug([\"status\"]);\n assert.match(statusOn, /sfmc_debug/i);\n\n await cmdDebug([\"disable\"]);\n const afterDisable = JSON.parse(fs.readFileSync(variablesPath, \"utf8\")) as { sfmc_debug?: boolean };\n assert.equal(afterDisable.sfmc_debug, false);\n } finally {\n if (prev === undefined) delete process.env.SFMC_ROOT;\n else process.env.SFMC_ROOT = prev;\n }\n});\n\ntest(\"debug sentry on/off \u5199 BDS secrets.json\", async () => {\n const bdsRoot = fs.mkdtempSync(path.join(os.tmpdir(), \"sfmc-bds-\"));\n const sfmcRoot = setupSfmcRoot(bdsRoot);\n const prev = process.env.SFMC_ROOT;\n process.env.SFMC_ROOT = sfmcRoot;\n\n try {\n const secretsPath = path.join(bdsRoot, \"config\", \"default\", \"secrets.json\");\n const dsn = \"https://example@o123.ingest.sentry.io/456\";\n\n await cmdDebug([\"sentry\", \"on\", \"--dsn\", dsn]);\n const afterOn = JSON.parse(fs.readFileSync(secretsPath, \"utf8\")) as { SENTRY_DSN?: string };\n assert.equal(afterOn.SENTRY_DSN, dsn);\n\n await cmdDebug([\"sentry\", \"off\"]);\n const afterOff = JSON.parse(fs.readFileSync(secretsPath, \"utf8\")) as Record<string, unknown>;\n assert.equal(\"SENTRY_DSN\" in afterOff, false);\n } finally {\n if (prev === undefined) delete process.env.SFMC_ROOT;\n else process.env.SFMC_ROOT = prev;\n }\n});\n\ntest(\"debug sentry on \u7F3A --dsn \u62A5\u9519\", async () => {\n const bdsRoot = fs.mkdtempSync(path.join(os.tmpdir(), \"sfmc-bds-\"));\n const sfmcRoot = setupSfmcRoot(bdsRoot);\n const prev = process.env.SFMC_ROOT;\n process.env.SFMC_ROOT = sfmcRoot;\n\n try {\n const out = await cmdDebug([\"sentry\", \"on\"]);\n assert.match(out, /--dsn|required|\u9700\u8981/i);\n } finally {\n if (prev === undefined) delete process.env.SFMC_ROOT;\n else process.env.SFMC_ROOT = prev;\n }\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type DirectoryPickerResult = {
|
|
2
|
+
status: "selected";
|
|
3
|
+
path: string;
|
|
4
|
+
} | {
|
|
5
|
+
status: "cancelled";
|
|
6
|
+
} | {
|
|
7
|
+
status: "unavailable";
|
|
8
|
+
};
|
|
9
|
+
export type PickerCommand = {
|
|
10
|
+
command: string;
|
|
11
|
+
args: string[];
|
|
12
|
+
};
|
|
13
|
+
/** PowerShell 单引号字符串转义。 */
|
|
14
|
+
export declare function escapePowerShellSingleQuoted(value: string): string;
|
|
15
|
+
/** AppleScript 双引号字符串转义。 */
|
|
16
|
+
export declare function escapeAppleScriptString(value: string): string;
|
|
17
|
+
/** 选择器起始目录:默认路径不存在时回退到父目录或 cwd。 */
|
|
18
|
+
export declare function resolvePickerStartDir(defaultDirectory: string): string;
|
|
19
|
+
export declare function buildWindowsPickerScript(title: string, defaultDirectory: string): string;
|
|
20
|
+
export declare function buildMacOsPickerScript(title: string, defaultDirectory: string): string;
|
|
21
|
+
/** 按平台生成原生目录选择器命令候选(先试桌面默认,再试通用工具)。 */
|
|
22
|
+
export declare function buildDirectoryPickerCandidates(platform: NodeJS.Platform, title: string, defaultDirectory: string): PickerCommand[];
|
|
23
|
+
/** 执行单次原生目录选择;命令不存在时返回 unavailable。 */
|
|
24
|
+
export declare function runDirectoryPickerCommand(candidate: PickerCommand): DirectoryPickerResult;
|
|
25
|
+
/** 跨平台系统文件夹选择器(zenity / kdialog / osascript / PowerShell)。 */
|
|
26
|
+
export declare function pickDirectoryDialog(title: string, defaultDirectory: string): DirectoryPickerResult;
|
|
27
|
+
//# sourceMappingURL=directory-picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory-picker.d.ts","sourceRoot":"","sources":["../src/directory-picker.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,qBAAqB,GAC7B;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,GACvB;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC;AAE9B,MAAM,MAAM,aAAa,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEhE,2BAA2B;AAC3B,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,4BAA4B;AAC5B,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,mCAAmC;AACnC,wBAAgB,qBAAqB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAMtE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CASxF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAWtF;AAED,uCAAuC;AACvC,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,CAAC,QAAQ,EACzB,KAAK,EAAE,MAAM,EACb,gBAAgB,EAAE,MAAM,GACvB,aAAa,EAAE,CA8BjB;AAYD,uCAAuC;AACvC,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,aAAa,GAAG,qBAAqB,CAgBzF;AAED,8DAA8D;AAC9D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,qBAAqB,CAUlG"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
function escapePowerShellSingleQuoted(value) {
|
|
5
|
+
return value.replace(/'/g, "''");
|
|
6
|
+
}
|
|
7
|
+
function escapeAppleScriptString(value) {
|
|
8
|
+
return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
9
|
+
}
|
|
10
|
+
function resolvePickerStartDir(defaultDirectory) {
|
|
11
|
+
const resolved = path.resolve(defaultDirectory);
|
|
12
|
+
if (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) return resolved;
|
|
13
|
+
const parent = path.dirname(resolved);
|
|
14
|
+
if (fs.existsSync(parent) && fs.statSync(parent).isDirectory()) return parent;
|
|
15
|
+
return process.cwd();
|
|
16
|
+
}
|
|
17
|
+
function buildWindowsPickerScript(title, defaultDirectory) {
|
|
18
|
+
const escape = escapePowerShellSingleQuoted;
|
|
19
|
+
return [
|
|
20
|
+
"Add-Type -AssemblyName System.Windows.Forms",
|
|
21
|
+
"$dialog = New-Object System.Windows.Forms.FolderBrowserDialog",
|
|
22
|
+
`$dialog.Description = '${escape(title)}'`,
|
|
23
|
+
`$dialog.SelectedPath = '${escape(defaultDirectory)}'`,
|
|
24
|
+
"if ($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) { Write-Output $dialog.SelectedPath }"
|
|
25
|
+
].join("; ");
|
|
26
|
+
}
|
|
27
|
+
function buildMacOsPickerScript(title, defaultDirectory) {
|
|
28
|
+
const escTitle = escapeAppleScriptString(title);
|
|
29
|
+
const escPath = escapeAppleScriptString(defaultDirectory.replace(/\\/g, "/"));
|
|
30
|
+
return [
|
|
31
|
+
`set defaultFolder to POSIX file "${escPath}"`,
|
|
32
|
+
"try",
|
|
33
|
+
` POSIX path of (choose folder with prompt "${escTitle}" default location defaultFolder)`,
|
|
34
|
+
"on error number -128",
|
|
35
|
+
' error "User cancelled"',
|
|
36
|
+
"end try"
|
|
37
|
+
].join("\n");
|
|
38
|
+
}
|
|
39
|
+
function buildDirectoryPickerCandidates(platform, title, defaultDirectory) {
|
|
40
|
+
const startDir = resolvePickerStartDir(defaultDirectory);
|
|
41
|
+
if (platform === "win32") {
|
|
42
|
+
const script = buildWindowsPickerScript(title, startDir);
|
|
43
|
+
return [
|
|
44
|
+
{ command: "powershell.exe", args: ["-NoProfile", "-STA", "-Command", script] },
|
|
45
|
+
{ command: "pwsh", args: ["-NoProfile", "-STA", "-Command", script] }
|
|
46
|
+
];
|
|
47
|
+
}
|
|
48
|
+
if (platform === "darwin") {
|
|
49
|
+
return [{ command: "osascript", args: ["-e", buildMacOsPickerScript(title, startDir)] }];
|
|
50
|
+
}
|
|
51
|
+
if (platform === "linux") {
|
|
52
|
+
const desktop = process.env.XDG_CURRENT_DESKTOP ?? "";
|
|
53
|
+
const kdeFirst = /KDE/i.test(desktop);
|
|
54
|
+
const zenity = {
|
|
55
|
+
command: "zenity",
|
|
56
|
+
args: ["--file-selection", "--directory", `--title=${title}`, `--filename=${startDir}/`]
|
|
57
|
+
};
|
|
58
|
+
const kdialog = {
|
|
59
|
+
command: "kdialog",
|
|
60
|
+
args: ["--getexistingdirectory", startDir, "--title", title]
|
|
61
|
+
};
|
|
62
|
+
return kdeFirst ? [kdialog, zenity] : [zenity, kdialog];
|
|
63
|
+
}
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
function isPickerCancelled(error) {
|
|
67
|
+
if (!error || typeof error !== "object") return false;
|
|
68
|
+
const err = error;
|
|
69
|
+
if (err.status === 1) return true;
|
|
70
|
+
const stderr = typeof err.stderr === "string" ? err.stderr : err.stderr?.toString("utf-8") ?? "";
|
|
71
|
+
if (/cancelled|-128|User cancelled/i.test(stderr)) return true;
|
|
72
|
+
const message = err.message ?? "";
|
|
73
|
+
return /cancelled|-128/i.test(message);
|
|
74
|
+
}
|
|
75
|
+
function runDirectoryPickerCommand(candidate) {
|
|
76
|
+
try {
|
|
77
|
+
const output = execFileSync(candidate.command, candidate.args, {
|
|
78
|
+
encoding: "utf-8",
|
|
79
|
+
windowsHide: true,
|
|
80
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
81
|
+
});
|
|
82
|
+
const trimmed = output.trim();
|
|
83
|
+
if (!trimmed) return { status: "cancelled" };
|
|
84
|
+
return { status: "selected", path: trimmed };
|
|
85
|
+
} catch (error) {
|
|
86
|
+
const err = error;
|
|
87
|
+
if (err.code === "ENOENT") return { status: "unavailable" };
|
|
88
|
+
if (isPickerCancelled(error)) return { status: "cancelled" };
|
|
89
|
+
return { status: "unavailable" };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function pickDirectoryDialog(title, defaultDirectory) {
|
|
93
|
+
const candidates = buildDirectoryPickerCandidates(process.platform, title, defaultDirectory);
|
|
94
|
+
if (candidates.length === 0) return { status: "unavailable" };
|
|
95
|
+
for (const candidate of candidates) {
|
|
96
|
+
const result = runDirectoryPickerCommand(candidate);
|
|
97
|
+
if (result.status === "unavailable") continue;
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
return { status: "unavailable" };
|
|
101
|
+
}
|
|
102
|
+
export {
|
|
103
|
+
buildDirectoryPickerCandidates,
|
|
104
|
+
buildMacOsPickerScript,
|
|
105
|
+
buildWindowsPickerScript,
|
|
106
|
+
escapeAppleScriptString,
|
|
107
|
+
escapePowerShellSingleQuoted,
|
|
108
|
+
pickDirectoryDialog,
|
|
109
|
+
resolvePickerStartDir,
|
|
110
|
+
runDirectoryPickerCommand
|
|
111
|
+
};
|
|
112
|
+
//# sourceMappingURL=directory-picker.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/directory-picker.ts"],
|
|
4
|
+
"sourcesContent": ["import { execFileSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport type DirectoryPickerResult =\n | { status: \"selected\"; path: string }\n | { status: \"cancelled\" }\n | { status: \"unavailable\" };\n\nexport type PickerCommand = { command: string; args: string[] };\n\n/** PowerShell \u5355\u5F15\u53F7\u5B57\u7B26\u4E32\u8F6C\u4E49\u3002 */\nexport function escapePowerShellSingleQuoted(value: string): string {\n return value.replace(/'/g, \"''\");\n}\n\n/** AppleScript \u53CC\u5F15\u53F7\u5B57\u7B26\u4E32\u8F6C\u4E49\u3002 */\nexport function escapeAppleScriptString(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\n/** \u9009\u62E9\u5668\u8D77\u59CB\u76EE\u5F55\uFF1A\u9ED8\u8BA4\u8DEF\u5F84\u4E0D\u5B58\u5728\u65F6\u56DE\u9000\u5230\u7236\u76EE\u5F55\u6216 cwd\u3002 */\nexport function resolvePickerStartDir(defaultDirectory: string): string {\n const resolved = path.resolve(defaultDirectory);\n if (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) return resolved;\n const parent = path.dirname(resolved);\n if (fs.existsSync(parent) && fs.statSync(parent).isDirectory()) return parent;\n return process.cwd();\n}\n\nexport function buildWindowsPickerScript(title: string, defaultDirectory: string): string {\n const escape = escapePowerShellSingleQuoted;\n return [\n \"Add-Type -AssemblyName System.Windows.Forms\",\n \"$dialog = New-Object System.Windows.Forms.FolderBrowserDialog\",\n `$dialog.Description = '${escape(title)}'`,\n `$dialog.SelectedPath = '${escape(defaultDirectory)}'`,\n \"if ($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) { Write-Output $dialog.SelectedPath }\",\n ].join(\"; \");\n}\n\nexport function buildMacOsPickerScript(title: string, defaultDirectory: string): string {\n const escTitle = escapeAppleScriptString(title);\n const escPath = escapeAppleScriptString(defaultDirectory.replace(/\\\\/g, \"/\"));\n return [\n `set defaultFolder to POSIX file \"${escPath}\"`,\n \"try\",\n ` POSIX path of (choose folder with prompt \"${escTitle}\" default location defaultFolder)`,\n \"on error number -128\",\n ' error \"User cancelled\"',\n \"end try\",\n ].join(\"\\n\");\n}\n\n/** \u6309\u5E73\u53F0\u751F\u6210\u539F\u751F\u76EE\u5F55\u9009\u62E9\u5668\u547D\u4EE4\u5019\u9009\uFF08\u5148\u8BD5\u684C\u9762\u9ED8\u8BA4\uFF0C\u518D\u8BD5\u901A\u7528\u5DE5\u5177\uFF09\u3002 */\nexport function buildDirectoryPickerCandidates(\n platform: NodeJS.Platform,\n title: string,\n defaultDirectory: string\n): PickerCommand[] {\n const startDir = resolvePickerStartDir(defaultDirectory);\n\n if (platform === \"win32\") {\n const script = buildWindowsPickerScript(title, startDir);\n return [\n { command: \"powershell.exe\", args: [\"-NoProfile\", \"-STA\", \"-Command\", script] },\n { command: \"pwsh\", args: [\"-NoProfile\", \"-STA\", \"-Command\", script] },\n ];\n }\n\n if (platform === \"darwin\") {\n return [{ command: \"osascript\", args: [\"-e\", buildMacOsPickerScript(title, startDir)] }];\n }\n\n if (platform === \"linux\") {\n const desktop = process.env.XDG_CURRENT_DESKTOP ?? \"\";\n const kdeFirst = /KDE/i.test(desktop);\n const zenity: PickerCommand = {\n command: \"zenity\",\n args: [\"--file-selection\", \"--directory\", `--title=${title}`, `--filename=${startDir}/`],\n };\n const kdialog: PickerCommand = {\n command: \"kdialog\",\n args: [\"--getexistingdirectory\", startDir, \"--title\", title],\n };\n return kdeFirst ? [kdialog, zenity] : [zenity, kdialog];\n }\n\n return [];\n}\n\nfunction isPickerCancelled(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const err = error as NodeJS.ErrnoException & { status?: number | null; stderr?: Buffer | string };\n if (err.status === 1) return true;\n const stderr = typeof err.stderr === \"string\" ? err.stderr : err.stderr?.toString(\"utf-8\") ?? \"\";\n if (/cancelled|-128|User cancelled/i.test(stderr)) return true;\n const message = err.message ?? \"\";\n return /cancelled|-128/i.test(message);\n}\n\n/** \u6267\u884C\u5355\u6B21\u539F\u751F\u76EE\u5F55\u9009\u62E9\uFF1B\u547D\u4EE4\u4E0D\u5B58\u5728\u65F6\u8FD4\u56DE unavailable\u3002 */\nexport function runDirectoryPickerCommand(candidate: PickerCommand): DirectoryPickerResult {\n try {\n const output = execFileSync(candidate.command, candidate.args, {\n encoding: \"utf-8\",\n windowsHide: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n const trimmed = output.trim();\n if (!trimmed) return { status: \"cancelled\" };\n return { status: \"selected\", path: trimmed };\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === \"ENOENT\") return { status: \"unavailable\" };\n if (isPickerCancelled(error)) return { status: \"cancelled\" };\n return { status: \"unavailable\" };\n }\n}\n\n/** \u8DE8\u5E73\u53F0\u7CFB\u7EDF\u6587\u4EF6\u5939\u9009\u62E9\u5668\uFF08zenity / kdialog / osascript / PowerShell\uFF09\u3002 */\nexport function pickDirectoryDialog(title: string, defaultDirectory: string): DirectoryPickerResult {\n const candidates = buildDirectoryPickerCandidates(process.platform, title, defaultDirectory);\n if (candidates.length === 0) return { status: \"unavailable\" };\n\n for (const candidate of candidates) {\n const result = runDirectoryPickerCommand(candidate);\n if (result.status === \"unavailable\") continue;\n return result;\n }\n return { status: \"unavailable\" };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help-text.d.ts","sourceRoot":"","sources":["../src/help-text.ts"],"names":[],"mappings":"AAOA,OAAO,EAAkD,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAqDxG,wBAAgB,OAAO,CAAC,IAAI,GAAE,WAAoB,GAAG,MAAM,CA2I1D"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getVisibleModuleSubcommands,
|
|
3
|
+
isDeveloperSubcommand
|
|
4
|
+
} from "./module-commands.js";
|
|
5
|
+
import { listVisiblePacksSubs, listVisibleTopLevelNames } from "./command-surface.js";
|
|
6
|
+
import { t } from "./i18n/index.js";
|
|
7
|
+
import { c, padRight } from "./theme.js";
|
|
8
|
+
const MODULE_HELP_ENTRIES = [
|
|
9
|
+
{ sub: "list", suffix: "", key: "help.module.list" },
|
|
10
|
+
{ sub: "search", suffix: " [id]", key: "help.module.search" },
|
|
11
|
+
{ sub: "install", suffix: " <id> [--from <path> --link]", key: "help.module.install" },
|
|
12
|
+
{ sub: "uninstall", suffix: " <id>", key: "help.module.uninstall" },
|
|
13
|
+
{ sub: "verify", suffix: " [id]", key: "help.module.verify" },
|
|
14
|
+
{ sub: "info", suffix: " <id>", key: "help.module.info" },
|
|
15
|
+
{ sub: "enable", suffix: "|disable <id>", key: "help.module.toggle" },
|
|
16
|
+
{ sub: "build", suffix: "", key: "help.module.build" },
|
|
17
|
+
{ sub: "reload", suffix: " [--build-only]", key: "help.module.reload" }
|
|
18
|
+
];
|
|
19
|
+
const HELP_CMD_COL = 36;
|
|
20
|
+
function hasTop(mode, name) {
|
|
21
|
+
return listVisibleTopLevelNames(mode).includes(name);
|
|
22
|
+
}
|
|
23
|
+
function helpLine(cmdPainted, desc, col = HELP_CMD_COL) {
|
|
24
|
+
const plainLen = cmdPainted.replace(/\x1b\[[0-9;]*m/g, "").length;
|
|
25
|
+
if (plainLen >= col) {
|
|
26
|
+
return ` ${cmdPainted}
|
|
27
|
+
${c.dim(desc)}`;
|
|
28
|
+
}
|
|
29
|
+
return ` ${padRight(cmdPainted, col)}${desc}`;
|
|
30
|
+
}
|
|
31
|
+
function moduleHelpBlock(mode) {
|
|
32
|
+
const visible = new Set(getVisibleModuleSubcommands(mode));
|
|
33
|
+
const entries = MODULE_HELP_ENTRIES.filter(({ sub }) => visible.has(sub));
|
|
34
|
+
return entries.map(({ sub, suffix, key }) => {
|
|
35
|
+
const paint = isDeveloperSubcommand(sub) ? c.blue : c.green;
|
|
36
|
+
const plain = mode === "argv" ? `sfmc module ${sub}${suffix}` : `/module ${sub}${suffix}`;
|
|
37
|
+
return helpLine(paint(plain), t(key));
|
|
38
|
+
}).join("\n");
|
|
39
|
+
}
|
|
40
|
+
function p(mode, cmd, paint = c.green) {
|
|
41
|
+
return mode === "argv" ? paint(`sfmc ${cmd}`) : paint(`/${cmd}`);
|
|
42
|
+
}
|
|
43
|
+
function pArgs(mode, cmd, args, paint = c.green) {
|
|
44
|
+
return mode === "argv" ? paint(`sfmc ${cmd}`) + args : paint(`/${cmd}`) + args;
|
|
45
|
+
}
|
|
46
|
+
function getHelp(mode = "argv") {
|
|
47
|
+
const show = (name) => hasTop(mode, name);
|
|
48
|
+
const packsSubs = listVisiblePacksSubs(mode);
|
|
49
|
+
if (mode === "argv") {
|
|
50
|
+
const usage = `${c.bold(t("help.usage"))}
|
|
51
|
+
${c.green("sfmc")} [options] <command> [args]
|
|
52
|
+
`;
|
|
53
|
+
const options = `
|
|
54
|
+
${c.bold(t("help.section.options"))}
|
|
55
|
+
${helpLine(`${c.green("-p")}, ${c.green("--packs")}`, t("help.opt.packs"))}
|
|
56
|
+
${helpLine(`${c.green("--lang")}, ${c.green("--locale")}`, t("help.opt.lang"))}
|
|
57
|
+
${helpLine(`${c.green("-h")}, ${c.green("--help")}`, t("help.help"))}
|
|
58
|
+
${helpLine(`${c.green("-v")}, ${c.green("--version")}`, t("help.version"))}
|
|
59
|
+
`;
|
|
60
|
+
const service2 = [
|
|
61
|
+
show("status") ? helpLine(p(mode, "status"), t("help.status")) : "",
|
|
62
|
+
show("logs") ? helpLine(p(mode, "logs"), t("help.logs")) : "",
|
|
63
|
+
show("start") ? helpLine(pArgs(mode, "start", " <svc>|-all"), t("help.start")) : "",
|
|
64
|
+
show("stop") ? helpLine(pArgs(mode, "stop", " <svc>|-all"), t("help.stop")) : "",
|
|
65
|
+
show("restart") ? helpLine(pArgs(mode, "restart", " <svc>|-all"), t("help.restart")) : ""
|
|
66
|
+
].filter(Boolean).join("\n");
|
|
67
|
+
const install = `
|
|
68
|
+
${c.bold(t("help.section.module"))}
|
|
69
|
+
${helpLine(`${c.green("sfmc mod install")} <id>`, t("help.module.install"))}
|
|
70
|
+
${helpLine(`${c.green("sfmc mod install")} <id> --from <path> --link`, t("help.module.install"))}
|
|
71
|
+
${helpLine(`${c.green("sfmc mod uninstall")} <id>`, t("help.module.uninstall"))}
|
|
72
|
+
${helpLine(`${c.green("sfmc mod search")} [id]`, t("help.module.search"))}
|
|
73
|
+
${helpLine(`${c.green("sfmc mod verify")} [id]`, t("help.module.verify"))}
|
|
74
|
+
${moduleHelpBlock("argv")}
|
|
75
|
+
`;
|
|
76
|
+
const packsLines2 = packsSubs.map((sub) => {
|
|
77
|
+
const short = sub === "install" ? "i|install" : sub;
|
|
78
|
+
return helpLine(c.green(`sfmc packs ${short}`), "");
|
|
79
|
+
}).join("\n");
|
|
80
|
+
const addon2 = packsSubs.length > 0 ? `
|
|
81
|
+
${c.bold(t("help.section.addon"))}
|
|
82
|
+
${packsLines2}
|
|
83
|
+
${helpLine(c.dim("sfmc -p <sub> \u2026"), t("help.addon.compat"))}
|
|
84
|
+
` : "";
|
|
85
|
+
const update = show("update") ? `
|
|
86
|
+
${c.bold(t("help.section.update"))}
|
|
87
|
+
${helpLine(`${p(mode, "update")} [--check-only] [--channel=\u2026]`, t("help.update"))}
|
|
88
|
+
` : "";
|
|
89
|
+
const debug = show("debug") ? `
|
|
90
|
+
${c.bold(t("help.section.debug"))}
|
|
91
|
+
${helpLine(`${c.blue("sfmc debug")} status|enable|disable|sentry \u2026`, "")}
|
|
92
|
+
` : "";
|
|
93
|
+
const general2 = [
|
|
94
|
+
show("init") ? helpLine(p(mode, "init"), t("help.init")) : "",
|
|
95
|
+
show("locale") ? helpLine(pArgs(mode, "locale", " [zh|en]"), t("help.locale")) : ""
|
|
96
|
+
].filter(Boolean).join("\n");
|
|
97
|
+
return `
|
|
98
|
+
${c.bold("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E")}
|
|
99
|
+
${c.bold("\u2502")} ${c.green(t("help.title"))}${" ".repeat(Math.max(1, 56 - t("help.title").length))}${c.bold("\u2502")}
|
|
100
|
+
${c.bold("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F")}
|
|
101
|
+
|
|
102
|
+
${usage}${options}
|
|
103
|
+
${c.bold(t("help.section.service"))}
|
|
104
|
+
${service2}
|
|
105
|
+
${update}${debug}${install}${addon2}
|
|
106
|
+
${c.bold(t("help.section.general"))}
|
|
107
|
+
${general2}
|
|
108
|
+
`;
|
|
109
|
+
}
|
|
110
|
+
const service = [
|
|
111
|
+
show("status") ? helpLine(p(mode, "status"), t("help.status")) : "",
|
|
112
|
+
show("logs") ? helpLine(p(mode, "logs"), t("help.logs")) : "",
|
|
113
|
+
show("start") ? helpLine(pArgs(mode, "start", " <svc>|-all"), t("help.start")) : "",
|
|
114
|
+
show("stop") ? helpLine(pArgs(mode, "stop", " <svc>|-all"), t("help.stop")) : "",
|
|
115
|
+
show("restart") ? helpLine(pArgs(mode, "restart", " <svc>|-all"), t("help.restart")) : "",
|
|
116
|
+
show("send") ? helpLine(pArgs(mode, "send", " <svc> <msg>"), t("help.send")) : ""
|
|
117
|
+
].filter(Boolean).join("\n");
|
|
118
|
+
const moduleSec = `
|
|
119
|
+
${c.bold(t("help.section.module"))}
|
|
120
|
+
${moduleHelpBlock("repl")}
|
|
121
|
+
`;
|
|
122
|
+
const packsLines = packsSubs.map((sub) => helpLine(c.green(`/packs ${sub}`), "")).join("\n");
|
|
123
|
+
const addon = packsSubs.length > 0 ? `
|
|
124
|
+
${c.bold(t("help.section.addon"))}
|
|
125
|
+
${packsLines}
|
|
126
|
+
` : "";
|
|
127
|
+
const general = [
|
|
128
|
+
show("version") ? helpLine(p(mode, "version"), t("help.version")) : "",
|
|
129
|
+
show("help") ? helpLine(p(mode, "help"), t("help.help")) : "",
|
|
130
|
+
show("quit") ? helpLine(p(mode, "quit"), t("help.quit")) : ""
|
|
131
|
+
].filter(Boolean).join("\n");
|
|
132
|
+
const shortcuts = `
|
|
133
|
+
${c.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")}
|
|
134
|
+
${c.dim(t("help.shortcuts"))}
|
|
135
|
+
${helpLine(c.dim("/"), t("help.shortcut.slash"), 12)}
|
|
136
|
+
${helpLine(c.dim("Ctrl+P"), t("help.shortcut.ctrlp"), 12)}
|
|
137
|
+
${helpLine(c.dim("Tab"), t("help.shortcut.tab"), 12)}
|
|
138
|
+
${helpLine(c.dim("\u2190\u2192"), t("help.shortcut.cursor"), 12)}
|
|
139
|
+
${helpLine(c.dim("\u2192"), t("help.shortcut.right"), 12)}
|
|
140
|
+
${helpLine(c.dim("Ctrl+L"), t("help.shortcut.ctrll"), 12)}
|
|
141
|
+
${helpLine(c.dim("\u2191\u2193"), t("help.shortcut.history"), 12)}
|
|
142
|
+
`;
|
|
143
|
+
return `
|
|
144
|
+
${c.bold("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E")}
|
|
145
|
+
${c.bold("\u2502")} ${c.green(t("help.title.repl"))}${" ".repeat(Math.max(1, 56 - t("help.title.repl").length))}${c.bold("\u2502")}
|
|
146
|
+
${c.bold("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F")}
|
|
147
|
+
|
|
148
|
+
${c.dim(t("help.slash.hint"))}
|
|
149
|
+
|
|
150
|
+
${c.bold(t("help.section.service"))}
|
|
151
|
+
${service}
|
|
152
|
+
${moduleSec}${addon}
|
|
153
|
+
${c.bold(t("help.section.general"))}
|
|
154
|
+
${general}
|
|
155
|
+
${shortcuts}`;
|
|
156
|
+
}
|
|
157
|
+
export {
|
|
158
|
+
getHelp
|
|
159
|
+
};
|
|
160
|
+
//# sourceMappingURL=help-text.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/help-text.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * help-text.ts \u2014 argv / REPL \u5E2E\u52A9\u6587\u6848\uFF08\u6309 command-surface \u901A\u9053\u8FC7\u6EE4\uFF09\n */\nimport {\n getVisibleModuleSubcommands,\n isDeveloperSubcommand,\n} from \"./module-commands.js\";\nimport { listVisiblePacksSubs, listVisibleTopLevelNames, type CommandMode } from \"./command-surface.js\";\nimport { t } from \"./i18n/index.js\";\nimport { c, padRight } from \"./theme.js\";\n\nconst MODULE_HELP_ENTRIES: ReadonlyArray<{ sub: string; suffix: string; key: string }> = [\n { sub: \"list\", suffix: \"\", key: \"help.module.list\" },\n { sub: \"search\", suffix: \" [id]\", key: \"help.module.search\" },\n { sub: \"install\", suffix: \" <id> [--from <path> --link]\", key: \"help.module.install\" },\n { sub: \"uninstall\", suffix: \" <id>\", key: \"help.module.uninstall\" },\n { sub: \"verify\", suffix: \" [id]\", key: \"help.module.verify\" },\n { sub: \"info\", suffix: \" <id>\", key: \"help.module.info\" },\n { sub: \"enable\", suffix: \"|disable <id>\", key: \"help.module.toggle\" },\n { sub: \"build\", suffix: \"\", key: \"help.module.build\" },\n { sub: \"reload\", suffix: \" [--build-only]\", key: \"help.module.reload\" },\n];\n\n/** \u547D\u4EE4\u5217\u76EE\u6807\u5BBD\u5EA6\uFF08\u8D85\u51FA\u5219\u8BF4\u660E\u6362\u884C\uFF09 */\nconst HELP_CMD_COL = 36;\n\nfunction hasTop(mode: CommandMode, name: string): boolean {\n return listVisibleTopLevelNames(mode).includes(name);\n}\n\n/** \u5355\u884C\u300C\u547D\u4EE4 + \u8BF4\u660E\u300D\uFF1B\u547D\u4EE4\u8FC7\u957F\u5219\u8BF4\u660E\u53E6\u8D77\u4E00\u884C */\nfunction helpLine(cmdPainted: string, desc: string, col: number = HELP_CMD_COL): string {\n const plainLen = cmdPainted.replace(/\\x1b\\[[0-9;]*m/g, \"\").length;\n if (plainLen >= col) {\n return ` ${cmdPainted}\\n ${c.dim(desc)}`;\n }\n return ` ${padRight(cmdPainted, col)}${desc}`;\n}\n\nfunction moduleHelpBlock(mode: CommandMode): string {\n const visible = new Set(getVisibleModuleSubcommands(mode));\n const entries = MODULE_HELP_ENTRIES.filter(({ sub }) => visible.has(sub));\n return entries\n .map(({ sub, suffix, key }) => {\n const paint = isDeveloperSubcommand(sub) ? c.blue : c.green;\n const plain = mode === \"argv\" ? `sfmc module ${sub}${suffix}` : `/module ${sub}${suffix}`;\n return helpLine(paint(plain), t(key as never));\n })\n .join(\"\\n\");\n}\n\nfunction p(mode: CommandMode, cmd: string, paint: (s: string) => string = c.green): string {\n return mode === \"argv\" ? paint(`sfmc ${cmd}`) : paint(`/${cmd}`);\n}\n\n/** \u5E26\u53C2\u6570\u540E\u7F00\u7684\u547D\u4EE4\u884C */\nfunction pArgs(mode: CommandMode, cmd: string, args: string, paint: (s: string) => string = c.green): string {\n return mode === \"argv\" ? paint(`sfmc ${cmd}`) + args : paint(`/${cmd}`) + args;\n}\n\nexport function getHelp(mode: CommandMode = \"argv\"): string {\n const show = (name: string) => hasTop(mode, name);\n const packsSubs = listVisiblePacksSubs(mode);\n\n if (mode === \"argv\") {\n const usage = `${c.bold(t(\"help.usage\"))}\\n ${c.green(\"sfmc\")} [options] <command> [args]\\n`;\n const options = `\n${c.bold(t(\"help.section.options\"))}\n${helpLine(`${c.green(\"-p\")}, ${c.green(\"--packs\")}`, t(\"help.opt.packs\"))}\n${helpLine(`${c.green(\"--lang\")}, ${c.green(\"--locale\")}`, t(\"help.opt.lang\"))}\n${helpLine(`${c.green(\"-h\")}, ${c.green(\"--help\")}`, t(\"help.help\"))}\n${helpLine(`${c.green(\"-v\")}, ${c.green(\"--version\")}`, t(\"help.version\"))}\n`;\n const service = [\n show(\"status\") ? helpLine(p(mode, \"status\"), t(\"help.status\")) : \"\",\n show(\"logs\") ? helpLine(p(mode, \"logs\"), t(\"help.logs\")) : \"\",\n show(\"start\") ? helpLine(pArgs(mode, \"start\", \" <svc>|-all\"), t(\"help.start\")) : \"\",\n show(\"stop\") ? helpLine(pArgs(mode, \"stop\", \" <svc>|-all\"), t(\"help.stop\")) : \"\",\n show(\"restart\") ? helpLine(pArgs(mode, \"restart\", \" <svc>|-all\"), t(\"help.restart\")) : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n const install = `\n${c.bold(t(\"help.section.module\"))}\n${helpLine(`${c.green(\"sfmc mod install\")} <id>`, t(\"help.module.install\"))}\n${helpLine(`${c.green(\"sfmc mod install\")} <id> --from <path> --link`, t(\"help.module.install\"))}\n${helpLine(`${c.green(\"sfmc mod uninstall\")} <id>`, t(\"help.module.uninstall\"))}\n${helpLine(`${c.green(\"sfmc mod search\")} [id]`, t(\"help.module.search\"))}\n${helpLine(`${c.green(\"sfmc mod verify\")} [id]`, t(\"help.module.verify\"))}\n${moduleHelpBlock(\"argv\")}\n`;\n\n const packsLines = packsSubs\n .map((sub) => {\n const short = sub === \"install\" ? \"i|install\" : sub;\n return helpLine(c.green(`sfmc packs ${short}`), \"\");\n })\n .join(\"\\n\");\n const addon =\n packsSubs.length > 0\n ? `\n${c.bold(t(\"help.section.addon\"))}\n${packsLines}\n${helpLine(c.dim(\"sfmc -p <sub> \u2026\"), t(\"help.addon.compat\"))}\n`\n : \"\";\n\n const update = show(\"update\")\n ? `\n${c.bold(t(\"help.section.update\"))}\n${helpLine(`${p(mode, \"update\")} [--check-only] [--channel=\u2026]`, t(\"help.update\"))}\n`\n : \"\";\n const debug = show(\"debug\")\n ? `\n${c.bold(t(\"help.section.debug\"))}\n${helpLine(`${c.blue(\"sfmc debug\")} status|enable|disable|sentry \u2026`, \"\")}\n`\n : \"\";\n const general = [\n show(\"init\") ? helpLine(p(mode, \"init\"), t(\"help.init\")) : \"\",\n show(\"locale\") ? helpLine(pArgs(mode, \"locale\", \" [zh|en]\"), t(\"help.locale\")) : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n return `\n${c.bold(\"\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E\")}\n${c.bold(\"\u2502\")} ${c.green(t(\"help.title\"))}${\" \".repeat(Math.max(1, 56 - t(\"help.title\").length))}${c.bold(\"\u2502\")}\n${c.bold(\"\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F\")}\n\n${usage}${options}\n${c.bold(t(\"help.section.service\"))}\n${service}\n${update}${debug}${install}${addon}\n${c.bold(t(\"help.section.general\"))}\n${general}\n`;\n }\n\n const service = [\n show(\"status\") ? helpLine(p(mode, \"status\"), t(\"help.status\")) : \"\",\n show(\"logs\") ? helpLine(p(mode, \"logs\"), t(\"help.logs\")) : \"\",\n show(\"start\") ? helpLine(pArgs(mode, \"start\", \" <svc>|-all\"), t(\"help.start\")) : \"\",\n show(\"stop\") ? helpLine(pArgs(mode, \"stop\", \" <svc>|-all\"), t(\"help.stop\")) : \"\",\n show(\"restart\") ? helpLine(pArgs(mode, \"restart\", \" <svc>|-all\"), t(\"help.restart\")) : \"\",\n show(\"send\") ? helpLine(pArgs(mode, \"send\", \" <svc> <msg>\"), t(\"help.send\")) : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n const moduleSec = `\n${c.bold(t(\"help.section.module\"))}\n${moduleHelpBlock(\"repl\")}\n`;\n\n const packsLines = packsSubs.map((sub) => helpLine(c.green(`/packs ${sub}`), \"\")).join(\"\\n\");\n const addon =\n packsSubs.length > 0\n ? `\n${c.bold(t(\"help.section.addon\"))}\n${packsLines}\n`\n : \"\";\n\n const general = [\n show(\"version\") ? helpLine(p(mode, \"version\"), t(\"help.version\")) : \"\",\n show(\"help\") ? helpLine(p(mode, \"help\"), t(\"help.help\")) : \"\",\n show(\"quit\") ? helpLine(p(mode, \"quit\"), t(\"help.quit\")) : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n const shortcuts = `\n${c.dim(\"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\")}\n${c.dim(t(\"help.shortcuts\"))}\n${helpLine(c.dim(\"/\"), t(\"help.shortcut.slash\"), 12)}\n${helpLine(c.dim(\"Ctrl+P\"), t(\"help.shortcut.ctrlp\"), 12)}\n${helpLine(c.dim(\"Tab\"), t(\"help.shortcut.tab\"), 12)}\n${helpLine(c.dim(\"\u2190\u2192\"), t(\"help.shortcut.cursor\"), 12)}\n${helpLine(c.dim(\"\u2192\"), t(\"help.shortcut.right\"), 12)}\n${helpLine(c.dim(\"Ctrl+L\"), t(\"help.shortcut.ctrll\"), 12)}\n${helpLine(c.dim(\"\u2191\u2193\"), t(\"help.shortcut.history\"), 12)}\n`;\n\n return `\n${c.bold(\"\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E\")}\n${c.bold(\"\u2502\")} ${c.green(t(\"help.title.repl\"))}${\" \".repeat(Math.max(1, 56 - t(\"help.title.repl\").length))}${c.bold(\"\u2502\")}\n${c.bold(\"\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F\")}\n\n${c.dim(t(\"help.slash.hint\"))}\n\n${c.bold(t(\"help.section.service\"))}\n${service}\n${moduleSec}${addon}\n${c.bold(t(\"help.section.general\"))}\n${general}\n${shortcuts}`;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["service", "packsLines", "addon", "general"]
|
|
7
|
+
}
|