@sfmc-bds/cli 0.2.0-beta.1 → 0.2.0-beta.6
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/argv-parse.d.ts +13 -0
- package/dist/argv-parse.d.ts.map +1 -0
- package/dist/argv-parse.js +32 -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 +48 -0
- package/dist/cli-gate.js.map +7 -0
- package/dist/cmd-remote.d.ts +13 -0
- package/dist/cmd-remote.d.ts.map +1 -0
- package/dist/cmd-remote.js +38 -0
- package/dist/cmd-remote.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 +92 -0
- package/dist/command-surface.d.ts.map +1 -0
- package/dist/command-surface.js +350 -0
- package/dist/command-surface.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 +79 -17
- 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/help-text.d.ts +3 -0
- package/dist/help-text.d.ts.map +1 -0
- package/dist/help-text.js +168 -0
- package/dist/help-text.js.map +7 -0
- package/dist/i18n/locales/en.d.ts +101 -20
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +105 -20
- 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 +153 -62
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +2 -2
- 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 +58 -44
- package/dist/main.js.map +2 -2
- package/dist/module-commands.d.ts +29 -33
- package/dist/module-commands.d.ts.map +1 -1
- package/dist/module-commands.js +101 -37
- 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 +430 -0
- package/dist/module-pack-build.js.map +7 -0
- package/dist/module-publish.d.ts +69 -0
- package/dist/module-publish.d.ts.map +1 -0
- package/dist/module-publish.js +478 -0
- package/dist/module-publish.js.map +7 -0
- package/dist/module-watch.d.ts +32 -0
- package/dist/module-watch.d.ts.map +1 -0
- package/dist/module-watch.js +171 -0
- package/dist/module-watch.js.map +7 -0
- package/dist/module-wizard.d.ts +4 -6
- package/dist/module-wizard.d.ts.map +1 -1
- package/dist/module-wizard.js +108 -124
- package/dist/module-wizard.js.map +2 -2
- package/dist/pack-lifecycle.d.ts +1 -1
- package/dist/pack-lifecycle.d.ts.map +1 -1
- package/dist/pack-lifecycle.js +3 -3
- 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 +6 -3
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +15 -3
- package/dist/registry.js.map +2 -2
- package/dist/remote-agent.d.ts.map +1 -1
- package/dist/remote-agent.js +7 -5
- package/dist/remote-agent.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 +28 -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 +7 -8
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +722 -412
- package/dist/repl.js.map +3 -3
- package/dist/runtime.d.ts +2 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +4 -0
- 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 +38 -0
- package/dist/send-target.js.map +7 -0
- package/dist/services.d.ts +21 -1
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +146 -7
- 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 +11 -9
- package/dist/wizard.js.map +2 -2
- 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 +16 -16
- 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/commands.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { killBedrockServerByImage, probeBdsStatus, clearBdsPidFile } from "@sfmc-bds/bds-tools/process-probe";
|
|
1
2
|
import { pushLog as pushUnifiedLog } from "./logs.js";
|
|
2
3
|
import { t } from "./i18n/index.js";
|
|
3
4
|
import { spawnService } from "./runtime.js";
|
|
4
|
-
import { ROOT, SERVICE_NAMES, services } from "./services.js";
|
|
5
|
-
import { c, DIVIDER, highlightLogLine } from "./theme.js";
|
|
5
|
+
import { ROOT, SERVICE_NAMES, queryServicesRuntime, services } from "./services.js";
|
|
6
|
+
import { c, DIVIDER, highlightLogLine, padRight } from "./theme.js";
|
|
6
7
|
import { stripTaskbarOsc } from "@sfmc-bds/bds-tools/taskbar";
|
|
7
8
|
import { didUpdateDeploy } from "@sfmc-bds/bds-tools/update-result";
|
|
8
9
|
function parseService(raw) {
|
|
@@ -10,26 +11,28 @@ function parseService(raw) {
|
|
|
10
11
|
if (SERVICE_NAMES.includes(s)) return s;
|
|
11
12
|
return null;
|
|
12
13
|
}
|
|
13
|
-
function statusLine(name, running, pid, uptime) {
|
|
14
|
+
function statusLine(name, running, pid, uptime, ownership) {
|
|
14
15
|
const dot = running ? c.green("\u25CF") : c.dim("\u25CB");
|
|
15
|
-
const
|
|
16
|
+
const state = running ? c.green(t("svc.state.running")) : c.dim(t("svc.state.stopped"));
|
|
17
|
+
let owner = c.dim(t("svc.owner.none"));
|
|
18
|
+
if (running && ownership === "managed") owner = c.cyan(t("svc.owner.managed"));
|
|
19
|
+
else if (running && ownership === "external") owner = c.yellow(t("svc.owner.external"));
|
|
16
20
|
const pidStr = pid ? c.dim(String(pid)) : c.dim("\u2014");
|
|
17
21
|
const upStr = uptime !== "\u2014" ? c.dim(uptime) : c.dim("\u2014");
|
|
18
|
-
return ` ${dot} ${c.bold(name
|
|
22
|
+
return ` ${dot} ${c.bold(padRight(name, 9))} ${padRight(state, 8)} ${padRight(owner, 6)} ${padRight(pidStr, 8)} ${upStr}`;
|
|
19
23
|
}
|
|
20
|
-
function cmdStatus() {
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
return statusLine(s.title, s.running, s.pid, s.uptime);
|
|
24
|
-
});
|
|
24
|
+
async function cmdStatus() {
|
|
25
|
+
const rows = await queryServicesRuntime();
|
|
26
|
+
const lines = rows.map((row) => statusLine(row.title, row.running, row.pid, row.uptime, row.ownership));
|
|
25
27
|
const nameH = t("svc.col.name");
|
|
26
28
|
const statusH = t("svc.col.status");
|
|
29
|
+
const ownerH = t("svc.col.owner");
|
|
27
30
|
const pidH = t("svc.col.pid");
|
|
28
31
|
const upH = t("svc.col.uptime");
|
|
32
|
+
const header = ` ${padRight(nameH, 11)}${padRight(statusH, 8)}${padRight(ownerH, 6)}${padRight(pidH, 8)}${upH}`;
|
|
29
33
|
return `
|
|
30
34
|
${c.bold(t("svc.header"))}
|
|
31
|
-
` + c.dim(
|
|
32
|
-
`) + DIVIDER + "\n" + lines.join("\n") + "\n";
|
|
35
|
+
` + c.dim(header) + "\n" + DIVIDER + "\n" + lines.join("\n") + "\n";
|
|
33
36
|
}
|
|
34
37
|
function cmdLogs(args, onFollow) {
|
|
35
38
|
let n = 20;
|
|
@@ -73,6 +76,17 @@ async function cmdStart(raw) {
|
|
|
73
76
|
const svc = parseService(raw);
|
|
74
77
|
if (!svc) return c.red(t("svc.unknown", { name: raw, list: SERVICE_NAMES.join(", ") }));
|
|
75
78
|
const svcObj = services[svc];
|
|
79
|
+
if (svc === "bds") {
|
|
80
|
+
const probe = await probeBdsStatus({ rootDir: ROOT });
|
|
81
|
+
if (probe.state !== "stopped") {
|
|
82
|
+
return c.yellow(
|
|
83
|
+
t("svc.bdsAlreadyRunning", {
|
|
84
|
+
pid: String(probe.pid),
|
|
85
|
+
kind: probe.state === "managed" ? t("svc.running") : t("svc.runningExternal")
|
|
86
|
+
})
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
76
90
|
if (svcObj.running) return c.yellow(t("svc.alreadyRunning", { title: svcObj.title, pid: svcObj.pid }));
|
|
77
91
|
if (STARTING.has(svc)) return c.dim(t("svc.alreadyStarting", { title: svcObj.title }));
|
|
78
92
|
STARTING.add(svc);
|
|
@@ -89,6 +103,26 @@ async function cmdStop(raw) {
|
|
|
89
103
|
const svc = parseService(raw);
|
|
90
104
|
if (!svc) return c.red(t("svc.unknown", { name: raw, list: SERVICE_NAMES.join(", ") }));
|
|
91
105
|
const svcObj = services[svc];
|
|
106
|
+
if (svc === "bds") {
|
|
107
|
+
const probe = await probeBdsStatus({
|
|
108
|
+
managedPid: svcObj.pid,
|
|
109
|
+
hasStdin: Boolean(svcObj.proc?.stdin),
|
|
110
|
+
rootDir: ROOT
|
|
111
|
+
});
|
|
112
|
+
if (probe.state === "external") {
|
|
113
|
+
if (STOPPING.has(svc)) return c.dim(t("svc.alreadyStopping", { title: svcObj.title }));
|
|
114
|
+
STOPPING.add(svc);
|
|
115
|
+
try {
|
|
116
|
+
await killBedrockServerByImage();
|
|
117
|
+
clearBdsPidFile(ROOT);
|
|
118
|
+
return c.dim(t("svc.stoppedExternal", { title: svcObj.title }));
|
|
119
|
+
} catch (e) {
|
|
120
|
+
return c.red(t("svc.stopFailed", { title: svcObj.title, message: e.message }));
|
|
121
|
+
} finally {
|
|
122
|
+
STOPPING.delete(svc);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
92
126
|
if (!svcObj.running) return c.yellow(t("svc.alreadyStopped", { title: svcObj.title }));
|
|
93
127
|
if (STOPPING.has(svc)) return c.dim(t("svc.alreadyStopping", { title: svcObj.title }));
|
|
94
128
|
STOPPING.add(svc);
|
|
@@ -106,10 +140,21 @@ async function cmdSend(raw, message) {
|
|
|
106
140
|
if (!svc) return c.red(t("svc.unknown", { name: raw, list: SERVICE_NAMES.join(", ") }));
|
|
107
141
|
if (!message) return c.yellow(t("svc.send.usage"));
|
|
108
142
|
const svcObj = services[svc];
|
|
143
|
+
await queryServicesRuntime();
|
|
144
|
+
if (svc === "bds") {
|
|
145
|
+
const probe = await probeBdsStatus({
|
|
146
|
+
managedPid: svcObj.pid,
|
|
147
|
+
hasStdin: Boolean(svcObj.proc?.stdin),
|
|
148
|
+
rootDir: ROOT
|
|
149
|
+
});
|
|
150
|
+
if (probe.state === "external") {
|
|
151
|
+
return c.yellow(t("svc.stdinUnavailable", { title: svcObj.title }));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
109
154
|
if (!svcObj.running || !svcObj.proc?.stdin) return c.yellow(t("svc.notRunning", { title: svcObj.title }));
|
|
110
155
|
try {
|
|
111
156
|
svcObj.proc.stdin.write(message + "\n");
|
|
112
|
-
return
|
|
157
|
+
return "";
|
|
113
158
|
} catch {
|
|
114
159
|
return c.red(t("svc.writeFailed"));
|
|
115
160
|
}
|
|
@@ -117,6 +162,10 @@ async function cmdSend(raw, message) {
|
|
|
117
162
|
async function cmdRestart(raw) {
|
|
118
163
|
const svc = parseService(raw);
|
|
119
164
|
if (!svc) return c.red(t("svc.unknown", { name: raw, list: SERVICE_NAMES.join(", ") }));
|
|
165
|
+
if (svc === "bds") {
|
|
166
|
+
await cmdStop("bds");
|
|
167
|
+
return cmdStart("bds");
|
|
168
|
+
}
|
|
120
169
|
const svcObj = services[svc];
|
|
121
170
|
try {
|
|
122
171
|
await svcObj.restart();
|
|
@@ -140,7 +189,12 @@ async function cmdUpdate(args = []) {
|
|
|
140
189
|
const checkOnly = args.includes("--check-only");
|
|
141
190
|
const spawnArgs = userNoStart ? [...args] : [...args, "--no-start"];
|
|
142
191
|
const bds = services.bds;
|
|
143
|
-
const
|
|
192
|
+
const bdsProbe = await probeBdsStatus({
|
|
193
|
+
managedPid: bds.pid,
|
|
194
|
+
hasStdin: Boolean(bds.proc?.stdin),
|
|
195
|
+
rootDir: ROOT
|
|
196
|
+
});
|
|
197
|
+
const bdsWasRunning = bdsProbe.state !== "stopped";
|
|
144
198
|
const result = await new Promise((resolve) => {
|
|
145
199
|
const proc = spawnService("update", spawnArgs, {
|
|
146
200
|
cwd: ROOT,
|
|
@@ -171,7 +225,12 @@ async function cmdUpdate(args = []) {
|
|
|
171
225
|
});
|
|
172
226
|
const didDeploy = didUpdateDeploy(result.out);
|
|
173
227
|
if (result.code === 0 && didDeploy && !userNoStart && !checkOnly) {
|
|
174
|
-
|
|
228
|
+
const afterProbe = await probeBdsStatus({
|
|
229
|
+
managedPid: bds.pid,
|
|
230
|
+
hasStdin: Boolean(bds.proc?.stdin),
|
|
231
|
+
rootDir: ROOT
|
|
232
|
+
});
|
|
233
|
+
if (afterProbe.state !== "stopped") {
|
|
175
234
|
return result.out;
|
|
176
235
|
}
|
|
177
236
|
try {
|
|
@@ -182,8 +241,11 @@ async function cmdUpdate(args = []) {
|
|
|
182
241
|
return result.out + "\n" + c.red(t("svc.bdsStartFailed", { message: e.message }));
|
|
183
242
|
}
|
|
184
243
|
}
|
|
185
|
-
if (result.code === 0 && didDeploy && userNoStart && bdsWasRunning
|
|
186
|
-
|
|
244
|
+
if (result.code === 0 && didDeploy && userNoStart && bdsWasRunning) {
|
|
245
|
+
const afterProbe = await probeBdsStatus({ rootDir: ROOT });
|
|
246
|
+
if (afterProbe.state === "stopped") {
|
|
247
|
+
return result.out + "\n" + c.yellow(t("svc.bdsStoppedForUpdate"));
|
|
248
|
+
}
|
|
187
249
|
}
|
|
188
250
|
return result.out;
|
|
189
251
|
}
|
package/dist/commands.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/commands.ts"],
|
|
4
|
-
"sourcesContent": ["import { pushLog as pushUnifiedLog } from \"./logs.js\";\nimport { t } from \"./i18n/index.js\";\nimport { spawnService } from \"./runtime.js\";\nimport { ROOT, SERVICE_NAMES, services, type ServiceName } from \"./services.js\";\nimport { c, DIVIDER, highlightLogLine } from \"./theme.js\";\nimport { stripTaskbarOsc } from \"@sfmc-bds/bds-tools/taskbar\";\nimport { didUpdateDeploy } from \"@sfmc-bds/bds-tools/update-result\";\n\nfunction parseService(raw: string): ServiceName | null {\n const s = raw.toLowerCase() as ServiceName;\n if (SERVICE_NAMES.includes(s)) return s;\n return null;\n}\n\nfunction statusLine(name: string, running: boolean, pid: number, uptime: string): string {\n const dot = running ? c.green(\"\u25CF\") : c.dim(\"\u25CB\");\n const status = running ? c.green(t(\"svc.running\")) : c.dim(t(\"svc.stopped\"));\n const pidStr = pid ? c.dim(String(pid)) : c.dim(\"\u2014\");\n const upStr = uptime !== \"\u2014\" ? c.dim(uptime) : c.dim(\"\u2014\");\n return ` ${dot} ${c.bold(name.padEnd(9))} ${status.padEnd(10)} ${pidStr.padEnd(8)} ${upStr}`;\n}\n\nexport function cmdStatus(): string {\n const lines = SERVICE_NAMES.map((name) => {\n const s = services[name];\n return statusLine(s.title, s.running, s.pid, s.uptime);\n });\n const nameH = t(\"svc.col.name\");\n const statusH = t(\"svc.col.status\");\n const pidH = t(\"svc.col.pid\");\n const upH = t(\"svc.col.uptime\");\n return (\n `\\n${c.bold(t(\"svc.header\"))}\\n` +\n c.dim(` ${nameH}${\" \".repeat(Math.max(1, 11 - nameH.length))}${statusH}${\" \".repeat(Math.max(1, 10 - statusH.length))}${pidH}${\" \".repeat(Math.max(1, 7 - pidH.length))}${upH}\\n`) +\n DIVIDER +\n \"\\n\" +\n lines.join(\"\\n\") +\n \"\\n\"\n );\n}\n\nexport function cmdLogs(args: string[], onFollow?: (serviceName: ServiceName) => void): string {\n let n = 20;\n let follow = false;\n const positional: string[] = [];\n\n for (const a of args) {\n if (a === \"-n\") continue; /* handled below */\n if (a === \"-f\") {\n follow = true;\n continue;\n }\n positional.push(a);\n }\n\n /* -n takes the next argument as value */\n const nIdx = args.indexOf(\"-n\");\n if (nIdx >= 0 && nIdx + 1 < args.length) n = parseInt(args[nIdx + 1] ?? \"0\", 10);\n\n const svcRaw = positional[0];\n if (!svcRaw) return c.yellow(t(\"svc.logs.usage\"));\n\n const svc = parseService(svcRaw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: svcRaw, list: SERVICE_NAMES.join(\", \") }));\n\n const svcObj = services[svc];\n\n const lines = svcObj.getRecentLogs(n);\n if (lines.length === 0) return c.dim(t(\"svc.logs.empty\"));\n\n const header = `\\n${c.bold(t(\"svc.logs.header\", { title: svcObj.title, count: lines.length }))}`;\n const body = lines\n .map((l) => {\n const ts = c.dim(l.time.toLocaleTimeString());\n const text = highlightLogLine(l.text);\n const prefix = l.stream === \"stderr\" ? c.red(\"!\") : c.dim(\" \");\n return `${ts} ${prefix} ${text}`;\n })\n .join(\"\\n\");\n\n const result = header + \"\\n\" + DIVIDER + \"\\n\" + body + \"\\n\";\n\n if (follow && onFollow) {\n onFollow(svc);\n return \"\";\n }\n\n return result;\n}\n\nconst STARTING = new Set<ServiceName>();\nconst STOPPING = new Set<ServiceName>();\n\nexport async function cmdStart(raw: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n const svcObj = services[svc];\n if (svcObj.running) return c.yellow(t(\"svc.alreadyRunning\", { title: svcObj.title, pid: svcObj.pid }));\n if (STARTING.has(svc)) return c.dim(t(\"svc.alreadyStarting\", { title: svcObj.title }));\n STARTING.add(svc);\n try {\n await svcObj.start();\n return c.green(t(\"svc.started\", { title: svcObj.title }));\n } catch (e) {\n return c.red(t(\"svc.startFailed\", { title: svcObj.title, message: (e as Error).message }));\n } finally {\n STARTING.delete(svc);\n }\n}\n\nexport async function cmdStop(raw: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n const svcObj = services[svc];\n if (!svcObj.running) return c.yellow(t(\"svc.alreadyStopped\", { title: svcObj.title }));\n if (STOPPING.has(svc)) return c.dim(t(\"svc.alreadyStopping\", { title: svcObj.title }));\n STOPPING.add(svc);\n try {\n await svcObj.stop();\n return c.dim(t(\"svc.stoppedMsg\", { title: svcObj.title }));\n } catch (e) {\n return c.red(t(\"svc.stopFailed\", { title: svcObj.title, message: (e as Error).message }));\n } finally {\n STOPPING.delete(svc);\n }\n}\n\nexport async function cmdSend(raw: string, message: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n if (!message) return c.yellow(t(\"svc.send.usage\"));\n const svcObj = services[svc];\n if (!svcObj.running || !svcObj.proc?.stdin) return c.yellow(t(\"svc.notRunning\", { title: svcObj.title }));\n try {\n svcObj.proc.stdin.write(message + \"\\n\");\n return c.dim(t(\"svc.sent\", { name: svc }));\n } catch {\n return c.red(t(\"svc.writeFailed\"));\n }\n}\n\nexport async function cmdRestart(raw: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n const svcObj = services[svc];\n try {\n await svcObj.restart();\n return c.green(t(\"svc.restarted\", { title: svcObj.title }));\n } catch (e) {\n return c.red(t(\"svc.restartFailed\", { title: svcObj.title, message: (e as Error).message }));\n }\n}\n\nexport async function cmdStartAll(): Promise<string> {\n const { startAll } = await import(\"./services.js\");\n await startAll();\n return c.green(t(\"svc.allStarted\"));\n}\n\nexport async function cmdStopAll(): Promise<string> {\n const { stopAll } = await import(\"./services.js\");\n await stopAll();\n return c.dim(t(\"svc.allStopped\"));\n}\n\n/**\n * BDS \u66F4\u65B0\uFF1A\u5B50\u8FDB\u7A0B\u59CB\u7EC8 --no-start\uFF0C\u7531 sfmc \u76D1\u7763\u5668\u63A5\u7BA1\u542F\u505C\u4E0E\u65E5\u5FD7\u3002\n * \uFF08updater \u5185 detached \u81EA\u542F\u4F1A\u5BFC\u81F4 REPL \u4E22 PID / \u65E0 stdout\uFF09\n *\n * \u4E0D\u505C\u670D\u9884\u64CD\u4F5C\uFF1A\u771F\u6B63\u9700\u8981\u66F4\u65B0\u65F6\u7531 updater \u505C\u670D\uFF1B\u5DF2\u662F\u6700\u65B0\u5219\u4E0D\u5F71\u54CD\u6B63\u5728\u8DD1\u7684 BDS\u3002\n * \u66F4\u65B0\u6210\u529F\u540E\u82E5\u672A\u6307\u5B9A --no-start\uFF0C\u518D\u7531\u76D1\u7763\u5668 `start bds`\uFF08\u63A5\u7BA1 PID + \u65E5\u5FD7\u7BA1\u9053\uFF09\u3002\n */\nexport async function cmdUpdate(args: string[] = []): Promise<string> {\n const userNoStart = args.includes(\"--no-start\");\n const checkOnly = args.includes(\"--check-only\");\n const spawnArgs = userNoStart ? [...args] : [...args, \"--no-start\"];\n\n const bds = services.bds;\n const bdsWasRunning = bds.running;\n\n const result = await new Promise<{ code: number | null; out: string }>((resolve) => {\n const proc = spawnService(\"update\", spawnArgs, {\n cwd: ROOT,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n let out = \"\";\n const pushChunk = (raw: string, level: \"info\" | \"error\"): void => {\n // \u5265\u79BB Windows Terminal \u4EFB\u52A1\u680F OSC\uFF0C\u907F\u514D pipe \u65E5\u5FD7\u7A7A\u767D\u884C\uFF08\u6743\u5A01\uFF1Abds-tools/taskbar\uFF09\n const s = stripTaskbarOsc(raw);\n out += s;\n for (const line of s\n .split(/\\r?\\n/)\n .map((l) => l.trimEnd())\n .filter((l) => l.length > 0)) {\n pushUnifiedLog(line, \"update\", level);\n }\n };\n proc.stdout?.on(\"data\", (d: Buffer) => pushChunk(d.toString(), \"info\"));\n proc.stderr?.on(\"data\", (d: Buffer) => pushChunk(d.toString(), \"error\"));\n proc.on(\"exit\", (code) => {\n if (code === 0) {\n pushUnifiedLog(t(\"svc.updateComplete\"), \"system\", \"success\");\n resolve({ code: 0, out: (out ? out + \"\\n\" : \"\") + t(\"svc.updateComplete\") });\n } else {\n resolve({ code, out: out || t(\"svc.updateExited\", { code: String(code) }) });\n }\n });\n proc.on(\"error\", (e) => {\n pushUnifiedLog(t(\"svc.updateError\", { message: e.message }), \"system\", \"error\");\n resolve({ code: 1, out: t(\"svc.updateError\", { message: e.message }) });\n });\n });\n\n /* \u4EC5\u5728\u771F\u6B63\u5B8C\u6210\u90E8\u7F72\u540E\u62C9\u8D77 BDS\uFF1B\u300C\u5DF2\u662F\u6700\u65B0\u300D\u4E0D\u6253\u6270\u5F53\u524D\u72B6\u6001\u3002\n * \u4EE5 updater \u8F93\u51FA\u7684 SFMC_UPDATE_RESULT=deployed \u673A\u5668\u6807\u8BB0\u4E3A\u51C6\uFF08\u52FF\u5339\u914D\u672C\u5730\u5316\u65E5\u5FD7\uFF09\u3002 */\n const didDeploy = didUpdateDeploy(result.out);\n if (result.code === 0 && didDeploy && !userNoStart && !checkOnly) {\n if (bds.running) {\n return result.out;\n }\n try {\n pushUnifiedLog(t(\"svc.updateStartBds\"), \"system\", \"info\");\n await bds.start();\n return result.out + \"\\n\" + c.green(t(\"svc.bdsStarted\"));\n } catch (e) {\n return result.out + \"\\n\" + c.red(t(\"svc.bdsStartFailed\", { message: (e as Error).message }));\n }\n }\n\n if (result.code === 0 && didDeploy && userNoStart && bdsWasRunning && !bds.running) {\n return result.out + \"\\n\" + c.yellow(t(\"svc.bdsStoppedForUpdate\"));\n }\n\n return result.out;\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,WAAW,sBAAsB;AAC1C,SAAS,SAAS;AAClB,SAAS,oBAAoB;AAC7B,SAAS,MAAM,eAAe,gBAAkC;
|
|
4
|
+
"sourcesContent": ["import { killBedrockServerByImage, probeBdsStatus, clearBdsPidFile } from \"@sfmc-bds/bds-tools/process-probe\";\nimport { pushLog as pushUnifiedLog } from \"./logs.js\";\nimport { t } from \"./i18n/index.js\";\nimport { spawnService } from \"./runtime.js\";\nimport { ROOT, SERVICE_NAMES, queryServicesRuntime, services, type ServiceName } from \"./services.js\";\nimport { c, DIVIDER, highlightLogLine, padRight } from \"./theme.js\";\nimport { stripTaskbarOsc } from \"@sfmc-bds/bds-tools/taskbar\";\nimport { didUpdateDeploy } from \"@sfmc-bds/bds-tools/update-result\";\n\nfunction parseService(raw: string): ServiceName | null {\n const s = raw.toLowerCase() as ServiceName;\n if (SERVICE_NAMES.includes(s)) return s;\n return null;\n}\n\nfunction statusLine(\n name: string,\n running: boolean,\n pid: number,\n uptime: string,\n ownership?: \"managed\" | \"external\"\n): string {\n const dot = running ? c.green(\"\u25CF\") : c.dim(\"\u25CB\");\n const state = running ? c.green(t(\"svc.state.running\")) : c.dim(t(\"svc.state.stopped\"));\n let owner = c.dim(t(\"svc.owner.none\"));\n if (running && ownership === \"managed\") owner = c.cyan(t(\"svc.owner.managed\"));\n else if (running && ownership === \"external\") owner = c.yellow(t(\"svc.owner.external\"));\n const pidStr = pid ? c.dim(String(pid)) : c.dim(\"\u2014\");\n const upStr = uptime !== \"\u2014\" ? c.dim(uptime) : c.dim(\"\u2014\");\n return ` ${dot} ${c.bold(padRight(name, 9))} ${padRight(state, 8)} ${padRight(owner, 6)} ${padRight(pidStr, 8)} ${upStr}`;\n}\n\nexport async function cmdStatus(): Promise<string> {\n const rows = await queryServicesRuntime();\n const lines = rows.map((row) => statusLine(row.title, row.running, row.pid, row.uptime, row.ownership));\n const nameH = t(\"svc.col.name\");\n const statusH = t(\"svc.col.status\");\n const ownerH = t(\"svc.col.owner\");\n const pidH = t(\"svc.col.pid\");\n const upH = t(\"svc.col.uptime\");\n const header =\n ` ${padRight(nameH, 11)}${padRight(statusH, 8)}${padRight(ownerH, 6)}${padRight(pidH, 8)}${upH}`;\n return (\n `\\n${c.bold(t(\"svc.header\"))}\\n` +\n c.dim(header) +\n \"\\n\" +\n DIVIDER +\n \"\\n\" +\n lines.join(\"\\n\") +\n \"\\n\"\n );\n}\n\nexport function cmdLogs(args: string[], onFollow?: (serviceName: ServiceName) => void): string {\n let n = 20;\n let follow = false;\n const positional: string[] = [];\n\n for (const a of args) {\n if (a === \"-n\") continue; /* handled below */\n if (a === \"-f\") {\n follow = true;\n continue;\n }\n positional.push(a);\n }\n\n /* -n takes the next argument as value */\n const nIdx = args.indexOf(\"-n\");\n if (nIdx >= 0 && nIdx + 1 < args.length) n = parseInt(args[nIdx + 1] ?? \"0\", 10);\n\n const svcRaw = positional[0];\n if (!svcRaw) return c.yellow(t(\"svc.logs.usage\"));\n\n const svc = parseService(svcRaw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: svcRaw, list: SERVICE_NAMES.join(\", \") }));\n\n const svcObj = services[svc];\n\n const lines = svcObj.getRecentLogs(n);\n if (lines.length === 0) return c.dim(t(\"svc.logs.empty\"));\n\n const header = `\\n${c.bold(t(\"svc.logs.header\", { title: svcObj.title, count: lines.length }))}`;\n const body = lines\n .map((l) => {\n const ts = c.dim(l.time.toLocaleTimeString());\n const text = highlightLogLine(l.text);\n const prefix = l.stream === \"stderr\" ? c.red(\"!\") : c.dim(\" \");\n return `${ts} ${prefix} ${text}`;\n })\n .join(\"\\n\");\n\n const result = header + \"\\n\" + DIVIDER + \"\\n\" + body + \"\\n\";\n\n if (follow && onFollow) {\n onFollow(svc);\n return \"\";\n }\n\n return result;\n}\n\nconst STARTING = new Set<ServiceName>();\nconst STOPPING = new Set<ServiceName>();\n\nexport async function cmdStart(raw: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n const svcObj = services[svc];\n if (svc === \"bds\") {\n const probe = await probeBdsStatus({ rootDir: ROOT });\n if (probe.state !== \"stopped\") {\n return c.yellow(\n t(\"svc.bdsAlreadyRunning\", {\n pid: String(probe.pid),\n kind: probe.state === \"managed\" ? t(\"svc.running\") : t(\"svc.runningExternal\"),\n })\n );\n }\n }\n if (svcObj.running) return c.yellow(t(\"svc.alreadyRunning\", { title: svcObj.title, pid: svcObj.pid }));\n if (STARTING.has(svc)) return c.dim(t(\"svc.alreadyStarting\", { title: svcObj.title }));\n STARTING.add(svc);\n try {\n await svcObj.start();\n return c.green(t(\"svc.started\", { title: svcObj.title }));\n } catch (e) {\n return c.red(t(\"svc.startFailed\", { title: svcObj.title, message: (e as Error).message }));\n } finally {\n STARTING.delete(svc);\n }\n}\n\nexport async function cmdStop(raw: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n const svcObj = services[svc];\n if (svc === \"bds\") {\n const probe = await probeBdsStatus({\n managedPid: svcObj.pid,\n hasStdin: Boolean(svcObj.proc?.stdin),\n rootDir: ROOT,\n });\n if (probe.state === \"external\") {\n if (STOPPING.has(svc)) return c.dim(t(\"svc.alreadyStopping\", { title: svcObj.title }));\n STOPPING.add(svc);\n try {\n await killBedrockServerByImage();\n clearBdsPidFile(ROOT);\n return c.dim(t(\"svc.stoppedExternal\", { title: svcObj.title }));\n } catch (e) {\n return c.red(t(\"svc.stopFailed\", { title: svcObj.title, message: (e as Error).message }));\n } finally {\n STOPPING.delete(svc);\n }\n }\n }\n if (!svcObj.running) return c.yellow(t(\"svc.alreadyStopped\", { title: svcObj.title }));\n if (STOPPING.has(svc)) return c.dim(t(\"svc.alreadyStopping\", { title: svcObj.title }));\n STOPPING.add(svc);\n try {\n await svcObj.stop();\n return c.dim(t(\"svc.stoppedMsg\", { title: svcObj.title }));\n } catch (e) {\n return c.red(t(\"svc.stopFailed\", { title: svcObj.title, message: (e as Error).message }));\n } finally {\n STOPPING.delete(svc);\n }\n}\n\nexport async function cmdSend(raw: string, message: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n if (!message) return c.yellow(t(\"svc.send.usage\"));\n const svcObj = services[svc];\n /* \u5148\u7EDF\u4E00\u63A2\u6D4B\uFF0C\u907F\u514D\u5185\u5B58 running \u4E0E\u771F\u5B9E\u8FDB\u7A0B\u8131\u8282 */\n await queryServicesRuntime();\n if (svc === \"bds\") {\n const probe = await probeBdsStatus({\n managedPid: svcObj.pid,\n hasStdin: Boolean(svcObj.proc?.stdin),\n rootDir: ROOT,\n });\n if (probe.state === \"external\") {\n return c.yellow(t(\"svc.stdinUnavailable\", { title: svcObj.title }));\n }\n }\n if (!svcObj.running || !svcObj.proc?.stdin) return c.yellow(t(\"svc.notRunning\", { title: svcObj.title }));\n try {\n svcObj.proc.stdin.write(message + \"\\n\");\n return \"\";\n } catch {\n return c.red(t(\"svc.writeFailed\"));\n }\n}\n\nexport async function cmdRestart(raw: string): Promise<string> {\n const svc = parseService(raw);\n if (!svc) return c.red(t(\"svc.unknown\", { name: raw, list: SERVICE_NAMES.join(\", \") }));\n if (svc === \"bds\") {\n await cmdStop(\"bds\");\n return cmdStart(\"bds\");\n }\n const svcObj = services[svc];\n try {\n await svcObj.restart();\n return c.green(t(\"svc.restarted\", { title: svcObj.title }));\n } catch (e) {\n return c.red(t(\"svc.restartFailed\", { title: svcObj.title, message: (e as Error).message }));\n }\n}\n\nexport async function cmdStartAll(): Promise<string> {\n const { startAll } = await import(\"./services.js\");\n await startAll();\n return c.green(t(\"svc.allStarted\"));\n}\n\nexport async function cmdStopAll(): Promise<string> {\n const { stopAll } = await import(\"./services.js\");\n await stopAll();\n return c.dim(t(\"svc.allStopped\"));\n}\n\n/**\n * BDS \u66F4\u65B0\uFF1A\u5B50\u8FDB\u7A0B\u59CB\u7EC8 --no-start\uFF0C\u7531 sfmc \u76D1\u7763\u5668\u63A5\u7BA1\u542F\u505C\u4E0E\u65E5\u5FD7\u3002\n * \uFF08updater \u5185 detached \u81EA\u542F\u4F1A\u5BFC\u81F4 REPL \u4E22 PID / \u65E0 stdout\uFF09\n *\n * \u4E0D\u505C\u670D\u9884\u64CD\u4F5C\uFF1A\u771F\u6B63\u9700\u8981\u66F4\u65B0\u65F6\u7531 updater \u505C\u670D\uFF1B\u5DF2\u662F\u6700\u65B0\u5219\u4E0D\u5F71\u54CD\u6B63\u5728\u8DD1\u7684 BDS\u3002\n * \u66F4\u65B0\u6210\u529F\u540E\u82E5\u672A\u6307\u5B9A --no-start\uFF0C\u518D\u7531\u76D1\u7763\u5668 `start bds`\uFF08\u63A5\u7BA1 PID + \u65E5\u5FD7\u7BA1\u9053\uFF09\u3002\n */\nexport async function cmdUpdate(args: string[] = []): Promise<string> {\n const userNoStart = args.includes(\"--no-start\");\n const checkOnly = args.includes(\"--check-only\");\n const spawnArgs = userNoStart ? [...args] : [...args, \"--no-start\"];\n\n const bds = services.bds;\n const bdsProbe = await probeBdsStatus({\n managedPid: bds.pid,\n hasStdin: Boolean(bds.proc?.stdin),\n rootDir: ROOT,\n });\n const bdsWasRunning = bdsProbe.state !== \"stopped\";\n\n const result = await new Promise<{ code: number | null; out: string }>((resolve) => {\n const proc = spawnService(\"update\", spawnArgs, {\n cwd: ROOT,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n let out = \"\";\n const pushChunk = (raw: string, level: \"info\" | \"error\"): void => {\n // \u5265\u79BB Windows Terminal \u4EFB\u52A1\u680F OSC\uFF0C\u907F\u514D pipe \u65E5\u5FD7\u7A7A\u767D\u884C\uFF08\u6743\u5A01\uFF1Abds-tools/taskbar\uFF09\n const s = stripTaskbarOsc(raw);\n out += s;\n for (const line of s\n .split(/\\r?\\n/)\n .map((l) => l.trimEnd())\n .filter((l) => l.length > 0)) {\n pushUnifiedLog(line, \"update\", level);\n }\n };\n proc.stdout?.on(\"data\", (d: Buffer) => pushChunk(d.toString(), \"info\"));\n proc.stderr?.on(\"data\", (d: Buffer) => pushChunk(d.toString(), \"error\"));\n proc.on(\"exit\", (code) => {\n if (code === 0) {\n pushUnifiedLog(t(\"svc.updateComplete\"), \"system\", \"success\");\n resolve({ code: 0, out: (out ? out + \"\\n\" : \"\") + t(\"svc.updateComplete\") });\n } else {\n resolve({ code, out: out || t(\"svc.updateExited\", { code: String(code) }) });\n }\n });\n proc.on(\"error\", (e) => {\n pushUnifiedLog(t(\"svc.updateError\", { message: e.message }), \"system\", \"error\");\n resolve({ code: 1, out: t(\"svc.updateError\", { message: e.message }) });\n });\n });\n\n /* \u4EC5\u5728\u771F\u6B63\u5B8C\u6210\u90E8\u7F72\u540E\u62C9\u8D77 BDS\uFF1B\u300C\u5DF2\u662F\u6700\u65B0\u300D\u4E0D\u6253\u6270\u5F53\u524D\u72B6\u6001\u3002\n * \u4EE5 updater \u8F93\u51FA\u7684 SFMC_UPDATE_RESULT=deployed \u673A\u5668\u6807\u8BB0\u4E3A\u51C6\uFF08\u52FF\u5339\u914D\u672C\u5730\u5316\u65E5\u5FD7\uFF09\u3002 */\n const didDeploy = didUpdateDeploy(result.out);\n if (result.code === 0 && didDeploy && !userNoStart && !checkOnly) {\n const afterProbe = await probeBdsStatus({\n managedPid: bds.pid,\n hasStdin: Boolean(bds.proc?.stdin),\n rootDir: ROOT,\n });\n if (afterProbe.state !== \"stopped\") {\n return result.out;\n }\n try {\n pushUnifiedLog(t(\"svc.updateStartBds\"), \"system\", \"info\");\n await bds.start();\n return result.out + \"\\n\" + c.green(t(\"svc.bdsStarted\"));\n } catch (e) {\n return result.out + \"\\n\" + c.red(t(\"svc.bdsStartFailed\", { message: (e as Error).message }));\n }\n }\n\n if (result.code === 0 && didDeploy && userNoStart && bdsWasRunning) {\n const afterProbe = await probeBdsStatus({ rootDir: ROOT });\n if (afterProbe.state === \"stopped\") {\n return result.out + \"\\n\" + c.yellow(t(\"svc.bdsStoppedForUpdate\"));\n }\n }\n\n return result.out;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** 供单测:truthy 判定与 SDK applyDebugFromVariables 对齐。 */
|
|
2
|
+
export declare function isDebugTruthy(v: unknown): boolean;
|
|
3
|
+
/** `sfmc debug [status|enable|disable|sentry on|off]` —— BDS 调试配置入口。 */
|
|
4
|
+
export declare function cmdDebug(args: string[]): Promise<string>;
|
|
5
|
+
//# sourceMappingURL=debug-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-command.d.ts","sourceRoot":"","sources":["../src/debug-command.ts"],"names":[],"mappings":"AAsDA,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAMjD;AAqED,wEAAwE;AACxE,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB9D"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import process from "node:process";
|
|
4
|
+
import { resolveBdsContext } from "./pack-lifecycle.js";
|
|
5
|
+
import { c } from "./theme.js";
|
|
6
|
+
import { t } from "./i18n/index.js";
|
|
7
|
+
const VARIABLES_PATH = path.join("config", "default", "variables.json");
|
|
8
|
+
const SECRETS_PATH = path.join("config", "default", "secrets.json");
|
|
9
|
+
async function readJsonOrEmpty(filePath) {
|
|
10
|
+
try {
|
|
11
|
+
const text = await fs.readFile(filePath, "utf8");
|
|
12
|
+
return JSON.parse(text);
|
|
13
|
+
} catch {
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async function writeJsonAtomic(filePath, value) {
|
|
18
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
19
|
+
const tmp = `${filePath}.${process.pid}.tmp`;
|
|
20
|
+
await fs.writeFile(tmp, `${JSON.stringify(value, null, 2)}
|
|
21
|
+
`, "utf8");
|
|
22
|
+
await fs.rename(tmp, filePath);
|
|
23
|
+
}
|
|
24
|
+
async function readBdsConfig() {
|
|
25
|
+
const { bdsRoot } = resolveBdsContext();
|
|
26
|
+
const variablesPath = path.join(bdsRoot, VARIABLES_PATH);
|
|
27
|
+
const secretsPath = path.join(bdsRoot, SECRETS_PATH);
|
|
28
|
+
const variables = await readJsonOrEmpty(variablesPath);
|
|
29
|
+
const secrets = await readJsonOrEmpty(secretsPath);
|
|
30
|
+
return { variables, secrets, variablesPath, secretsPath };
|
|
31
|
+
}
|
|
32
|
+
function isDebugTruthy(v) {
|
|
33
|
+
if (v === true || v === 1) return true;
|
|
34
|
+
if (typeof v === "string" && ["true", "1", "yes", "on"].includes(v.trim().toLowerCase())) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
function onOffLabel(on) {
|
|
40
|
+
return on ? c.green(t("debug.state.on")) : c.dim(t("debug.state.off"));
|
|
41
|
+
}
|
|
42
|
+
async function cmdDebugStatus() {
|
|
43
|
+
const { variables, secrets } = await readBdsConfig();
|
|
44
|
+
const lines = [c.bold(`
|
|
45
|
+
${t("debug.statusTitle")}`)];
|
|
46
|
+
lines.push(
|
|
47
|
+
` ${c.text("sfmc_debug")} : ${onOffLabel(isDebugTruthy(variables.sfmc_debug))} ${c.dim("(BDS variables.json)")}`
|
|
48
|
+
);
|
|
49
|
+
const dsn = secrets.SENTRY_DSN;
|
|
50
|
+
if (typeof dsn === "string" && dsn.length > 0) {
|
|
51
|
+
const masked = dsn.length > 12 ? `${dsn.slice(0, 8)}\u2026${dsn.slice(-4)}` : dsn;
|
|
52
|
+
lines.push(` ${c.text("SENTRY_DSN")} : ${c.green(t("debug.state.on"))} ${c.dim(`(${masked})`)}`);
|
|
53
|
+
} else {
|
|
54
|
+
lines.push(` ${c.text("SENTRY_DSN")} : ${c.dim(t("debug.state.off"))}`);
|
|
55
|
+
}
|
|
56
|
+
lines.push(c.dim(`
|
|
57
|
+
${t("debug.reloadHint")}`));
|
|
58
|
+
return lines.join("\n") + "\n";
|
|
59
|
+
}
|
|
60
|
+
async function cmdDebugEnable() {
|
|
61
|
+
const { variables, variablesPath } = await readBdsConfig();
|
|
62
|
+
variables.sfmc_debug = true;
|
|
63
|
+
await writeJsonAtomic(variablesPath, variables);
|
|
64
|
+
return c.green(t("debug.enabled")) + "\n" + c.dim(t("debug.reloadHint"));
|
|
65
|
+
}
|
|
66
|
+
async function cmdDebugDisable() {
|
|
67
|
+
const { variables, variablesPath } = await readBdsConfig();
|
|
68
|
+
variables.sfmc_debug = false;
|
|
69
|
+
await writeJsonAtomic(variablesPath, variables);
|
|
70
|
+
return c.yellow(t("debug.disabled")) + "\n" + c.dim(t("debug.reloadHint"));
|
|
71
|
+
}
|
|
72
|
+
async function cmdDebugSentryOn(args) {
|
|
73
|
+
let dsn;
|
|
74
|
+
for (let i = 0; i < args.length; i++) {
|
|
75
|
+
const a = args[i];
|
|
76
|
+
if (a === "--dsn") dsn = args[++i];
|
|
77
|
+
else if (a?.startsWith("--dsn=")) dsn = a.slice("--dsn=".length);
|
|
78
|
+
}
|
|
79
|
+
if (!dsn) {
|
|
80
|
+
return c.red(t("debug.sentry.dsnMissing")) + "\n" + c.dim(t("debug.sentry.usage"));
|
|
81
|
+
}
|
|
82
|
+
const { secrets, secretsPath } = await readBdsConfig();
|
|
83
|
+
secrets.SENTRY_DSN = dsn;
|
|
84
|
+
await writeJsonAtomic(secretsPath, secrets);
|
|
85
|
+
const masked = dsn.length > 12 ? `${dsn.slice(0, 8)}\u2026${dsn.slice(-4)}` : dsn;
|
|
86
|
+
return c.green(t("debug.sentry.set", { dsn: masked })) + "\n" + c.dim(t("debug.reloadHint"));
|
|
87
|
+
}
|
|
88
|
+
async function cmdDebugSentryOff() {
|
|
89
|
+
const { secrets, secretsPath } = await readBdsConfig();
|
|
90
|
+
if (!("SENTRY_DSN" in secrets)) {
|
|
91
|
+
return c.dim(t("debug.sentry.alreadyOff"));
|
|
92
|
+
}
|
|
93
|
+
delete secrets.SENTRY_DSN;
|
|
94
|
+
await writeJsonAtomic(secretsPath, secrets);
|
|
95
|
+
return c.yellow(t("debug.sentry.removed")) + "\n" + c.dim(t("debug.reloadHint"));
|
|
96
|
+
}
|
|
97
|
+
async function cmdDebug(args) {
|
|
98
|
+
const sub = args[0]?.toLowerCase();
|
|
99
|
+
try {
|
|
100
|
+
if (!sub || sub === "status") return await cmdDebugStatus();
|
|
101
|
+
if (sub === "enable") return await cmdDebugEnable();
|
|
102
|
+
if (sub === "disable") return await cmdDebugDisable();
|
|
103
|
+
if (sub === "sentry") {
|
|
104
|
+
const action = args[1]?.toLowerCase();
|
|
105
|
+
if (action === "on") return await cmdDebugSentryOn(args.slice(2));
|
|
106
|
+
if (action === "off") return await cmdDebugSentryOff();
|
|
107
|
+
return c.red(t("debug.sentry.unknown", { action: action ?? "" })) + "\n" + c.dim(t("debug.sentry.usage"));
|
|
108
|
+
}
|
|
109
|
+
return c.red(t("debug.unknown", { sub })) + "\n" + c.dim(t("debug.usage"));
|
|
110
|
+
} catch (e) {
|
|
111
|
+
return c.red(e.message);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export {
|
|
115
|
+
cmdDebug,
|
|
116
|
+
isDebugTruthy
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=debug-command.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/debug-command.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * debug-command.ts \u2014 sfmc debug \u9876\u5C42\u547D\u4EE4\n *\n * \u8BFB\u5199 BDS \u7AEF `config/default/variables.json` \u4E0E `config/default/secrets.json`\uFF1A\n * - `sfmc_debug` \u2014\u2014 SDK `applyDebugFromVariables()` \u5728\u542F\u52A8\u65F6\u8BFB\u53D6\n * - `SENTRY_DSN` \u2014\u2014 SDK `initSentryIfConfigured()` \u5728\u542F\u52A8\u65F6\u8BFB\u53D6\n *\n * \u672C\u6587\u4EF6\u53EA\u6539 BDS \u914D\u7F6E\uFF1B\u4E0D\u89E6\u78B0 SDK \u73B0\u6709 `applyDebugFromVariables` /\n * `initSentryIfConfigured` \u8BED\u4E49\uFF08OCP\uFF1ACLI = \u914D\u7F6E\u5165\u53E3\uFF0CSDK = \u8FD0\u884C\u65F6\u5165\u53E3\uFF09\u3002\n * \u6539\u5B8C\u540E\u9700 `sfmc mod reload` \u6216\u91CD\u542F BDS \u624D\u4F1A\u5728\u884C\u4E3A\u5305\u751F\u6548\u3002\n */\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { resolveBdsContext } from \"./pack-lifecycle.js\";\nimport { c } from \"./theme.js\";\nimport { t } from \"./i18n/index.js\";\n\nconst VARIABLES_PATH = path.join(\"config\", \"default\", \"variables.json\");\nconst SECRETS_PATH = path.join(\"config\", \"default\", \"secrets.json\");\n\ntype VariablesDoc = Record<string, unknown>;\ntype SecretsDoc = Record<string, unknown>;\n\nasync function readJsonOrEmpty<T extends object>(filePath: string): Promise<T> {\n try {\n const text = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(text) as T;\n } catch {\n return {} as T;\n }\n}\n\nasync function writeJsonAtomic(filePath: string, value: object): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n const tmp = `${filePath}.${process.pid}.tmp`;\n await fs.writeFile(tmp, `${JSON.stringify(value, null, 2)}\\n`, \"utf8\");\n await fs.rename(tmp, filePath);\n}\n\nasync function readBdsConfig(): Promise<{\n variables: VariablesDoc;\n secrets: SecretsDoc;\n variablesPath: string;\n secretsPath: string;\n}> {\n const { bdsRoot } = resolveBdsContext();\n const variablesPath = path.join(bdsRoot, VARIABLES_PATH);\n const secretsPath = path.join(bdsRoot, SECRETS_PATH);\n const variables = await readJsonOrEmpty<VariablesDoc>(variablesPath);\n const secrets = await readJsonOrEmpty<SecretsDoc>(secretsPath);\n return { variables, secrets, variablesPath, secretsPath };\n}\n\n/** \u4F9B\u5355\u6D4B\uFF1Atruthy \u5224\u5B9A\u4E0E SDK applyDebugFromVariables \u5BF9\u9F50\u3002 */\nexport function isDebugTruthy(v: unknown): boolean {\n if (v === true || v === 1) return true;\n if (typeof v === \"string\" && [\"true\", \"1\", \"yes\", \"on\"].includes(v.trim().toLowerCase())) {\n return true;\n }\n return false;\n}\n\nfunction onOffLabel(on: boolean): string {\n return on ? c.green(t(\"debug.state.on\")) : c.dim(t(\"debug.state.off\"));\n}\n\n/** `sfmc debug status` \u2014\u2014 \u5C55\u793A\u5F53\u524D sfmc_debug / SENTRY_DSN\u3002 */\nasync function cmdDebugStatus(): Promise<string> {\n const { variables, secrets } = await readBdsConfig();\n const lines = [c.bold(`\\n${t(\"debug.statusTitle\")}`)];\n lines.push(\n ` ${c.text(\"sfmc_debug\")} : ${onOffLabel(isDebugTruthy(variables.sfmc_debug))} ${c.dim(\"(BDS variables.json)\")}`\n );\n const dsn = secrets.SENTRY_DSN;\n if (typeof dsn === \"string\" && dsn.length > 0) {\n const masked = dsn.length > 12 ? `${dsn.slice(0, 8)}\u2026${dsn.slice(-4)}` : dsn;\n lines.push(` ${c.text(\"SENTRY_DSN\")} : ${c.green(t(\"debug.state.on\"))} ${c.dim(`(${masked})`)}`);\n } else {\n lines.push(` ${c.text(\"SENTRY_DSN\")} : ${c.dim(t(\"debug.state.off\"))}`);\n }\n lines.push(c.dim(`\\n ${t(\"debug.reloadHint\")}`));\n return lines.join(\"\\n\") + \"\\n\";\n}\n\n/** `sfmc debug enable` \u2014\u2014 \u5199 sfmc_debug: true\u3002 */\nasync function cmdDebugEnable(): Promise<string> {\n const { variables, variablesPath } = await readBdsConfig();\n variables.sfmc_debug = true;\n await writeJsonAtomic(variablesPath, variables);\n return c.green(t(\"debug.enabled\")) + \"\\n\" + c.dim(t(\"debug.reloadHint\"));\n}\n\n/** `sfmc debug disable` \u2014\u2014 \u5199 sfmc_debug: false\uFF1B\u4E0D\u52A8 SENTRY_DSN\u3002 */\nasync function cmdDebugDisable(): Promise<string> {\n const { variables, variablesPath } = await readBdsConfig();\n variables.sfmc_debug = false;\n await writeJsonAtomic(variablesPath, variables);\n return c.yellow(t(\"debug.disabled\")) + \"\\n\" + c.dim(t(\"debug.reloadHint\"));\n}\n\n/** `sfmc debug sentry on --dsn <dsn>` \u2014\u2014 \u5199\u5165 SENTRY_DSN\u3002 */\nasync function cmdDebugSentryOn(args: string[]): Promise<string> {\n let dsn: string | undefined;\n for (let i = 0; i < args.length; i++) {\n const a = args[i];\n if (a === \"--dsn\") dsn = args[++i];\n else if (a?.startsWith(\"--dsn=\")) dsn = a.slice(\"--dsn=\".length);\n }\n if (!dsn) {\n return c.red(t(\"debug.sentry.dsnMissing\")) + \"\\n\" + c.dim(t(\"debug.sentry.usage\"));\n }\n const { secrets, secretsPath } = await readBdsConfig();\n secrets.SENTRY_DSN = dsn;\n await writeJsonAtomic(secretsPath, secrets);\n const masked = dsn.length > 12 ? `${dsn.slice(0, 8)}\u2026${dsn.slice(-4)}` : dsn;\n return c.green(t(\"debug.sentry.set\", { dsn: masked })) + \"\\n\" + c.dim(t(\"debug.reloadHint\"));\n}\n\n/** `sfmc debug sentry off` \u2014\u2014 \u5220\u9664 SENTRY_DSN\u3002 */\nasync function cmdDebugSentryOff(): Promise<string> {\n const { secrets, secretsPath } = await readBdsConfig();\n if (!(\"SENTRY_DSN\" in secrets)) {\n return c.dim(t(\"debug.sentry.alreadyOff\"));\n }\n delete secrets.SENTRY_DSN;\n await writeJsonAtomic(secretsPath, secrets);\n return c.yellow(t(\"debug.sentry.removed\")) + \"\\n\" + c.dim(t(\"debug.reloadHint\"));\n}\n\n/** `sfmc debug [status|enable|disable|sentry on|off]` \u2014\u2014 BDS \u8C03\u8BD5\u914D\u7F6E\u5165\u53E3\u3002 */\nexport async function cmdDebug(args: string[]): Promise<string> {\n const sub = args[0]?.toLowerCase();\n try {\n if (!sub || sub === \"status\") return await cmdDebugStatus();\n if (sub === \"enable\") return await cmdDebugEnable();\n if (sub === \"disable\") return await cmdDebugDisable();\n if (sub === \"sentry\") {\n const action = args[1]?.toLowerCase();\n if (action === \"on\") return await cmdDebugSentryOn(args.slice(2));\n if (action === \"off\") return await cmdDebugSentryOff();\n return c.red(t(\"debug.sentry.unknown\", { action: action ?? \"\" })) + \"\\n\" + c.dim(t(\"debug.sentry.usage\"));\n }\n return (\n c.red(t(\"debug.unknown\", { sub })) +\n \"\\n\" +\n c.dim(t(\"debug.usage\"))\n );\n } catch (e) {\n return c.red((e as Error).message);\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;AAwDxG,wBAAgB,OAAO,CAAC,IAAI,GAAE,WAAoB,GAAG,MAAM,CAkJ1D"}
|
|
@@ -0,0 +1,168 @@
|
|
|
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 <source>] [--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: "create", suffix: "", key: "help.module.create" },
|
|
17
|
+
{ sub: "link", suffix: " [id]", key: "help.module.link" },
|
|
18
|
+
{ sub: "dev", suffix: "", key: "help.module.dev" },
|
|
19
|
+
{ sub: "build", suffix: "", key: "help.module.build" },
|
|
20
|
+
{ sub: "reload", suffix: " [--build-only]", key: "help.module.reload" }
|
|
21
|
+
];
|
|
22
|
+
const HELP_CMD_COL = 36;
|
|
23
|
+
function hasTop(mode, name) {
|
|
24
|
+
return listVisibleTopLevelNames(mode).includes(name);
|
|
25
|
+
}
|
|
26
|
+
function helpLine(cmdPainted, desc, col = HELP_CMD_COL) {
|
|
27
|
+
const plainLen = cmdPainted.replace(/\x1b\[[0-9;]*m/g, "").length;
|
|
28
|
+
if (plainLen >= col) {
|
|
29
|
+
return ` ${cmdPainted}
|
|
30
|
+
${c.dim(desc)}`;
|
|
31
|
+
}
|
|
32
|
+
return ` ${padRight(cmdPainted, col)}${desc}`;
|
|
33
|
+
}
|
|
34
|
+
function moduleHelpBlock(mode) {
|
|
35
|
+
const visible = new Set(getVisibleModuleSubcommands(mode));
|
|
36
|
+
const entries = MODULE_HELP_ENTRIES.filter(({ sub }) => visible.has(sub));
|
|
37
|
+
return entries.map(({ sub, suffix, key }) => {
|
|
38
|
+
const paint = isDeveloperSubcommand(sub) ? c.blue : c.green;
|
|
39
|
+
const plain = mode === "argv" ? `sfmc module ${sub}${suffix}` : `/module ${sub}${suffix}`;
|
|
40
|
+
return helpLine(paint(plain), t(key));
|
|
41
|
+
}).join("\n");
|
|
42
|
+
}
|
|
43
|
+
function p(mode, cmd, paint = c.green) {
|
|
44
|
+
return mode === "argv" ? paint(`sfmc ${cmd}`) : paint(`/${cmd}`);
|
|
45
|
+
}
|
|
46
|
+
function pArgs(mode, cmd, args, paint = c.green) {
|
|
47
|
+
return mode === "argv" ? paint(`sfmc ${cmd}`) + args : paint(`/${cmd}`) + args;
|
|
48
|
+
}
|
|
49
|
+
function getHelp(mode = "argv") {
|
|
50
|
+
const show = (name) => hasTop(mode, name);
|
|
51
|
+
const packsSubs = listVisiblePacksSubs(mode);
|
|
52
|
+
if (mode === "argv") {
|
|
53
|
+
const usage = `${c.bold(t("help.usage"))}
|
|
54
|
+
${c.green("sfmc")} [options] <command> [args]
|
|
55
|
+
`;
|
|
56
|
+
const options = `
|
|
57
|
+
${c.bold(t("help.section.options"))}
|
|
58
|
+
${helpLine(`${c.green("-p")}, ${c.green("--packs")}`, t("help.opt.packs"))}
|
|
59
|
+
${helpLine(`${c.green("--lang")}, ${c.green("--locale")}`, t("help.opt.lang"))}
|
|
60
|
+
${helpLine(`${c.green("-h")}, ${c.green("--help")}`, t("help.help"))}
|
|
61
|
+
${helpLine(`${c.green("-v")}, ${c.green("--version")}`, t("help.version"))}
|
|
62
|
+
`;
|
|
63
|
+
const service2 = [
|
|
64
|
+
show("status") ? helpLine(p(mode, "status"), t("help.status")) : "",
|
|
65
|
+
show("logs") ? helpLine(p(mode, "logs"), t("help.logs")) : "",
|
|
66
|
+
show("start") ? helpLine(pArgs(mode, "start", " <svc>|-all"), t("help.start")) : "",
|
|
67
|
+
show("stop") ? helpLine(pArgs(mode, "stop", " <svc>|-all"), t("help.stop")) : "",
|
|
68
|
+
show("restart") ? helpLine(pArgs(mode, "restart", " <svc>|-all"), t("help.restart")) : ""
|
|
69
|
+
].filter(Boolean).join("\n");
|
|
70
|
+
const install = `
|
|
71
|
+
${c.bold(t("help.section.module"))}
|
|
72
|
+
${helpLine(`${c.green("sfmc install|i")} <id> [\u2026]`, t("help.module.install"))}
|
|
73
|
+
${helpLine(`${c.green("sfmc uninstall|remove")} <id>`, t("help.module.uninstall"))}
|
|
74
|
+
${helpLine(`${c.green("sfmc search")} [id]`, t("help.module.search"))}
|
|
75
|
+
${helpLine(`${c.green("sfmc verify")} [id]`, t("help.module.verify"))}
|
|
76
|
+
${helpLine(`${c.green("sfmc link")} [id]`, t("help.module.link"))}
|
|
77
|
+
${helpLine(`${c.green("sfmc create")}`, t("help.module.create"))}
|
|
78
|
+
${moduleHelpBlock("argv")}
|
|
79
|
+
`;
|
|
80
|
+
const packsLines2 = packsSubs.map((sub) => {
|
|
81
|
+
const short = sub === "install" ? "i|install" : sub;
|
|
82
|
+
return helpLine(c.green(`sfmc packs ${short}`), "");
|
|
83
|
+
}).join("\n");
|
|
84
|
+
const addon2 = packsSubs.length > 0 ? `
|
|
85
|
+
${c.bold(t("help.section.addon"))}
|
|
86
|
+
${packsLines2}
|
|
87
|
+
${helpLine(c.dim("sfmc -p <sub> \u2026"), t("help.addon.compat"))}
|
|
88
|
+
` : "";
|
|
89
|
+
const update = show("update") ? `
|
|
90
|
+
${c.bold(t("help.section.update"))}
|
|
91
|
+
${helpLine(`${p(mode, "update")} [--check-only] [--channel=\u2026]`, t("help.update"))}
|
|
92
|
+
` : "";
|
|
93
|
+
const remote = show("remote") ? `
|
|
94
|
+
${c.bold(t("help.section.remote"))} ${c.dim("[beta]")}
|
|
95
|
+
${helpLine(`${p(mode, "remote")} status|enroll|disable`, "")}
|
|
96
|
+
` : "";
|
|
97
|
+
const debug = show("debug") ? `
|
|
98
|
+
${c.bold(t("help.section.debug"))}
|
|
99
|
+
${helpLine(`${c.blue("sfmc debug")} status|enable|disable|sentry \u2026`, "")}
|
|
100
|
+
` : "";
|
|
101
|
+
const general2 = [
|
|
102
|
+
show("init") ? helpLine(p(mode, "init"), t("help.init")) : "",
|
|
103
|
+
show("locale") ? helpLine(pArgs(mode, "locale", " [zh|en]"), t("help.locale")) : ""
|
|
104
|
+
].filter(Boolean).join("\n");
|
|
105
|
+
return `
|
|
106
|
+
${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")}
|
|
107
|
+
${c.bold("\u2502")} ${c.green(t("help.title"))}${" ".repeat(Math.max(1, 56 - t("help.title").length))}${c.bold("\u2502")}
|
|
108
|
+
${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")}
|
|
109
|
+
|
|
110
|
+
${usage}${options}
|
|
111
|
+
${c.bold(t("help.section.service"))}
|
|
112
|
+
${service2}
|
|
113
|
+
${update}${remote}${debug}${install}${addon2}
|
|
114
|
+
${c.bold(t("help.section.general"))}
|
|
115
|
+
${general2}
|
|
116
|
+
`;
|
|
117
|
+
}
|
|
118
|
+
const service = [
|
|
119
|
+
show("status") ? helpLine(p(mode, "status"), t("help.status")) : "",
|
|
120
|
+
show("logs") ? helpLine(p(mode, "logs"), t("help.logs")) : "",
|
|
121
|
+
show("start") ? helpLine(pArgs(mode, "start", " <svc>|-all"), t("help.start")) : "",
|
|
122
|
+
show("stop") ? helpLine(pArgs(mode, "stop", " <svc>|-all"), t("help.stop")) : "",
|
|
123
|
+
show("restart") ? helpLine(pArgs(mode, "restart", " <svc>|-all"), t("help.restart")) : "",
|
|
124
|
+
show("send") ? helpLine(pArgs(mode, "send", " <svc> <msg>"), t("help.send")) : ""
|
|
125
|
+
].filter(Boolean).join("\n");
|
|
126
|
+
const moduleSec = `
|
|
127
|
+
${c.bold(t("help.section.module"))}
|
|
128
|
+
${moduleHelpBlock("repl")}
|
|
129
|
+
`;
|
|
130
|
+
const packsLines = packsSubs.map((sub) => helpLine(c.green(`/packs ${sub}`), "")).join("\n");
|
|
131
|
+
const addon = packsSubs.length > 0 ? `
|
|
132
|
+
${c.bold(t("help.section.addon"))}
|
|
133
|
+
${packsLines}
|
|
134
|
+
` : "";
|
|
135
|
+
const general = [
|
|
136
|
+
show("version") ? helpLine(p(mode, "version"), t("help.version")) : "",
|
|
137
|
+
show("help") ? helpLine(p(mode, "help"), t("help.help")) : "",
|
|
138
|
+
show("quit") ? helpLine(p(mode, "quit"), t("help.quit")) : ""
|
|
139
|
+
].filter(Boolean).join("\n");
|
|
140
|
+
const shortcuts = `
|
|
141
|
+
${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")}
|
|
142
|
+
${c.dim(t("help.shortcuts"))}
|
|
143
|
+
${helpLine(c.dim("/"), t("help.shortcut.slash"), 12)}
|
|
144
|
+
${helpLine(c.dim("Ctrl+P"), t("help.shortcut.ctrlp"), 12)}
|
|
145
|
+
${helpLine(c.dim("Tab"), t("help.shortcut.tab"), 12)}
|
|
146
|
+
${helpLine(c.dim("\u2190\u2192"), t("help.shortcut.cursor"), 12)}
|
|
147
|
+
${helpLine(c.dim("\u2192"), t("help.shortcut.right"), 12)}
|
|
148
|
+
${helpLine(c.dim("Ctrl+L"), t("help.shortcut.ctrll"), 12)}
|
|
149
|
+
${helpLine(c.dim("\u2191\u2193"), t("help.shortcut.history"), 12)}
|
|
150
|
+
`;
|
|
151
|
+
return `
|
|
152
|
+
${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")}
|
|
153
|
+
${c.bold("\u2502")} ${c.green(t("help.title.repl"))}${" ".repeat(Math.max(1, 56 - t("help.title.repl").length))}${c.bold("\u2502")}
|
|
154
|
+
${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")}
|
|
155
|
+
|
|
156
|
+
${c.dim(t("help.slash.hint"))}
|
|
157
|
+
|
|
158
|
+
${c.bold(t("help.section.service"))}
|
|
159
|
+
${service}
|
|
160
|
+
${moduleSec}${addon}
|
|
161
|
+
${c.bold(t("help.section.general"))}
|
|
162
|
+
${general}
|
|
163
|
+
${shortcuts}`;
|
|
164
|
+
}
|
|
165
|
+
export {
|
|
166
|
+
getHelp
|
|
167
|
+
};
|
|
168
|
+
//# sourceMappingURL=help-text.js.map
|