@sfmc-bds/cli 0.1.0 → 0.2.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +7 -1
  2. package/dist/cli-result.d.ts +12 -0
  3. package/dist/cli-result.d.ts.map +1 -0
  4. package/dist/cli-result.js +15 -0
  5. package/dist/cli-result.js.map +7 -0
  6. package/dist/commands-behavior-pack.d.ts +11 -42
  7. package/dist/commands-behavior-pack.d.ts.map +1 -1
  8. package/dist/commands-behavior-pack.js +40 -159
  9. package/dist/commands-behavior-pack.js.map +7 -1
  10. package/dist/commands-reload.d.ts +9 -0
  11. package/dist/commands-reload.d.ts.map +1 -0
  12. package/dist/commands-reload.js +30 -0
  13. package/dist/commands-reload.js.map +7 -0
  14. package/dist/commands.d.ts +7 -0
  15. package/dist/commands.d.ts.map +1 -1
  16. package/dist/commands.js +182 -172
  17. package/dist/commands.js.map +7 -1
  18. package/dist/i18n/index.d.ts +26 -0
  19. package/dist/i18n/index.d.ts.map +1 -0
  20. package/dist/i18n/index.js +107 -0
  21. package/dist/i18n/index.js.map +7 -0
  22. package/dist/i18n/locales/en.d.ts +381 -0
  23. package/dist/i18n/locales/en.d.ts.map +1 -0
  24. package/dist/i18n/locales/en.js +393 -0
  25. package/dist/i18n/locales/en.js.map +7 -0
  26. package/dist/i18n/locales/zh-CN.d.ts +4 -0
  27. package/dist/i18n/locales/zh-CN.d.ts.map +1 -0
  28. package/dist/i18n/locales/zh-CN.js +379 -0
  29. package/dist/i18n/locales/zh-CN.js.map +7 -0
  30. package/dist/i18n/types.d.ts +7 -0
  31. package/dist/i18n/types.d.ts.map +1 -0
  32. package/dist/i18n/types.js +17 -0
  33. package/dist/i18n/types.js.map +7 -0
  34. package/dist/index.d.ts +5 -11
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +51 -43
  37. package/dist/index.js.map +7 -1
  38. package/dist/interactive-prompts.d.ts +8 -0
  39. package/dist/interactive-prompts.d.ts.map +1 -0
  40. package/dist/interactive-prompts.js +57 -0
  41. package/dist/interactive-prompts.js.map +7 -0
  42. package/dist/locale-command.d.ts +3 -0
  43. package/dist/locale-command.d.ts.map +1 -0
  44. package/dist/locale-command.js +19 -0
  45. package/dist/locale-command.js.map +7 -0
  46. package/dist/logs.d.ts +22 -4
  47. package/dist/logs.d.ts.map +1 -1
  48. package/dist/logs.js +208 -193
  49. package/dist/logs.js.map +7 -1
  50. package/dist/main.js +135 -173
  51. package/dist/main.js.map +7 -1
  52. package/dist/module-commands.d.ts +43 -4
  53. package/dist/module-commands.d.ts.map +1 -1
  54. package/dist/module-commands.js +440 -327
  55. package/dist/module-commands.js.map +7 -1
  56. package/dist/module-fingerprint.d.ts +7 -0
  57. package/dist/module-fingerprint.d.ts.map +1 -0
  58. package/dist/module-fingerprint.js +31 -0
  59. package/dist/module-fingerprint.js.map +7 -0
  60. package/dist/module-wizard.d.ts +14 -0
  61. package/dist/module-wizard.d.ts.map +1 -0
  62. package/dist/module-wizard.js +313 -0
  63. package/dist/module-wizard.js.map +7 -0
  64. package/dist/pack-lifecycle.d.ts +95 -0
  65. package/dist/pack-lifecycle.d.ts.map +1 -0
  66. package/dist/pack-lifecycle.js +634 -0
  67. package/dist/pack-lifecycle.js.map +7 -0
  68. package/dist/pack-update/bindings.d.ts +12 -0
  69. package/dist/pack-update/bindings.d.ts.map +1 -0
  70. package/dist/pack-update/bindings.js +64 -0
  71. package/dist/pack-update/bindings.js.map +7 -0
  72. package/dist/pack-update/config.d.ts +22 -0
  73. package/dist/pack-update/config.d.ts.map +1 -0
  74. package/dist/pack-update/config.js +141 -0
  75. package/dist/pack-update/config.js.map +7 -0
  76. package/dist/pack-update/providers/curseforge.d.ts +23 -0
  77. package/dist/pack-update/providers/curseforge.d.ts.map +1 -0
  78. package/dist/pack-update/providers/curseforge.js +209 -0
  79. package/dist/pack-update/providers/curseforge.js.map +7 -0
  80. package/dist/pack-update/providers/index.d.ts +16 -0
  81. package/dist/pack-update/providers/index.d.ts.map +1 -0
  82. package/dist/pack-update/providers/index.js +37 -0
  83. package/dist/pack-update/providers/index.js.map +7 -0
  84. package/dist/pack-update/service.d.ts +21 -0
  85. package/dist/pack-update/service.d.ts.map +1 -0
  86. package/dist/pack-update/service.js +567 -0
  87. package/dist/pack-update/service.js.map +7 -0
  88. package/dist/pack-update/types.d.ts +126 -0
  89. package/dist/pack-update/types.d.ts.map +1 -0
  90. package/dist/pack-update/types.js +8 -0
  91. package/dist/pack-update/types.js.map +7 -0
  92. package/dist/pack-update/version-policy.d.ts +80 -0
  93. package/dist/pack-update/version-policy.d.ts.map +1 -0
  94. package/dist/pack-update/version-policy.js +216 -0
  95. package/dist/pack-update/version-policy.js.map +7 -0
  96. package/dist/registry.d.ts +12 -4
  97. package/dist/registry.d.ts.map +1 -1
  98. package/dist/registry.js +73 -106
  99. package/dist/registry.js.map +7 -1
  100. package/dist/remote-agent.d.ts.map +1 -1
  101. package/dist/remote-agent.js +160 -176
  102. package/dist/remote-agent.js.map +7 -1
  103. package/dist/repl.d.ts +4 -0
  104. package/dist/repl.d.ts.map +1 -1
  105. package/dist/repl.js +683 -605
  106. package/dist/repl.js.map +7 -1
  107. package/dist/runtime.d.ts +40 -14
  108. package/dist/runtime.d.ts.map +1 -1
  109. package/dist/runtime.js +185 -62
  110. package/dist/runtime.js.map +7 -1
  111. package/dist/services.d.ts +2 -0
  112. package/dist/services.d.ts.map +1 -1
  113. package/dist/services.js +251 -238
  114. package/dist/services.js.map +7 -1
  115. package/dist/sfmc-modules-root.d.ts +24 -0
  116. package/dist/sfmc-modules-root.d.ts.map +1 -0
  117. package/dist/sfmc-modules-root.js +70 -0
  118. package/dist/sfmc-modules-root.js.map +7 -0
  119. package/dist/theme.d.ts +4 -0
  120. package/dist/theme.d.ts.map +1 -1
  121. package/dist/theme.js +134 -48
  122. package/dist/theme.js.map +7 -1
  123. package/dist/wizard.d.ts.map +1 -1
  124. package/dist/wizard.js +363 -438
  125. package/dist/wizard.js.map +7 -1
  126. package/dist/world-packs.d.ts +22 -0
  127. package/dist/world-packs.d.ts.map +1 -0
  128. package/dist/world-packs.js +872 -0
  129. package/dist/world-packs.js.map +7 -0
  130. package/package.json +10 -10
  131. package/dist/dispatcher.d.ts +0 -13
  132. package/dist/dispatcher.d.ts.map +0 -1
  133. package/dist/dispatcher.js +0 -23
  134. package/dist/dispatcher.js.map +0 -1
  135. package/dist/terminal.d.ts +0 -3
  136. package/dist/terminal.d.ts.map +0 -1
  137. package/dist/terminal.js +0 -178
  138. package/dist/terminal.js.map +0 -1
package/dist/commands.js CHANGED
@@ -1,191 +1,201 @@
1
1
  import { pushLog as pushUnifiedLog } from "./logs.js";
2
+ import { t } from "./i18n/index.js";
2
3
  import { spawnService } from "./runtime.js";
3
4
  import { ROOT, SERVICE_NAMES, services } from "./services.js";
4
5
  import { c, DIVIDER, highlightLogLine } from "./theme.js";
6
+ import { stripTaskbarOsc } from "@sfmc-bds/bds-tools/taskbar";
7
+ import { didUpdateDeploy } from "@sfmc-bds/bds-tools/update-result";
5
8
  function parseService(raw) {
6
- const s = raw.toLowerCase();
7
- if (SERVICE_NAMES.includes(s))
8
- return s;
9
- return null;
9
+ const s = raw.toLowerCase();
10
+ if (SERVICE_NAMES.includes(s)) return s;
11
+ return null;
10
12
  }
11
13
  function statusLine(name, running, pid, uptime) {
12
- const dot = running ? c.green("") : c.dim("");
13
- const status = running ? c.green("Running") : c.dim("Stopped");
14
- const pidStr = pid ? c.dim(String(pid)) : c.dim("");
15
- const upStr = uptime !== "" ? c.dim(uptime) : c.dim("");
16
- return ` ${dot} ${c.bold(name.padEnd(9))} ${status.padEnd(10)} ${pidStr.padEnd(8)} ${upStr}`;
14
+ const dot = running ? c.green("\u25CF") : c.dim("\u25CB");
15
+ const status = running ? c.green(t("svc.running")) : c.dim(t("svc.stopped"));
16
+ const pidStr = pid ? c.dim(String(pid)) : c.dim("\u2014");
17
+ const upStr = uptime !== "\u2014" ? c.dim(uptime) : c.dim("\u2014");
18
+ return ` ${dot} ${c.bold(name.padEnd(9))} ${status.padEnd(10)} ${pidStr.padEnd(8)} ${upStr}`;
17
19
  }
18
- export function cmdStatus() {
19
- const lines = SERVICE_NAMES.map((name) => {
20
- const s = services[name];
21
- return statusLine(s.title, s.running, s.pid, s.uptime);
22
- });
23
- return (`\n${c.bold("Services")}\n` +
24
- c.dim(` Name${" ".repeat(7)}Status${" ".repeat(4)}PID${" ".repeat(4)}Uptime\n`) +
25
- DIVIDER +
26
- "\n" +
27
- lines.join("\n") +
28
- "\n");
20
+ function cmdStatus() {
21
+ const lines = SERVICE_NAMES.map((name) => {
22
+ const s = services[name];
23
+ return statusLine(s.title, s.running, s.pid, s.uptime);
24
+ });
25
+ const nameH = t("svc.col.name");
26
+ const statusH = t("svc.col.status");
27
+ const pidH = t("svc.col.pid");
28
+ const upH = t("svc.col.uptime");
29
+ return `
30
+ ${c.bold(t("svc.header"))}
31
+ ` + 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}
32
+ `) + DIVIDER + "\n" + lines.join("\n") + "\n";
29
33
  }
30
- export function cmdLogs(args, onFollow) {
31
- let n = 20;
32
- let follow = false;
33
- const positional = [];
34
- for (const a of args) {
35
- if (a === "-n")
36
- continue; /* handled below */
37
- if (a === "-f") {
38
- follow = true;
39
- continue;
40
- }
41
- positional.push(a);
42
- }
43
- /* -n takes the next argument as value */
44
- const nIdx = args.indexOf("-n");
45
- if (nIdx >= 0 && nIdx + 1 < args.length)
46
- n = parseInt(args[nIdx + 1] ?? "0", 10);
47
- const svcRaw = positional[0];
48
- if (!svcRaw)
49
- return c.yellow("Usage: logs <service> [-n N] [-f]");
50
- const svc = parseService(svcRaw);
51
- if (!svc)
52
- return c.red(`Unknown service: ${svcRaw} (try: ${SERVICE_NAMES.join(", ")})`);
53
- const svcObj = services[svc];
54
- const lines = svcObj.getRecentLogs(n);
55
- if (lines.length === 0)
56
- return c.dim("(no logs yet)");
57
- const header = `\n${c.bold(svcObj.title)} logs (last ${lines.length}):`;
58
- const body = lines
59
- .map((l) => {
60
- const ts = c.dim(l.time.toLocaleTimeString());
61
- const text = highlightLogLine(l.text);
62
- const prefix = l.stream === "stderr" ? c.red("!") : c.dim(" ");
63
- return `${ts} ${prefix} ${text}`;
64
- })
65
- .join("\n");
66
- const result = header + "\n" + DIVIDER + "\n" + body + "\n";
67
- if (follow && onFollow) {
68
- onFollow(svc);
69
- return "";
34
+ function cmdLogs(args, onFollow) {
35
+ let n = 20;
36
+ let follow = false;
37
+ const positional = [];
38
+ for (const a of args) {
39
+ if (a === "-n") continue;
40
+ if (a === "-f") {
41
+ follow = true;
42
+ continue;
70
43
  }
71
- return result;
44
+ positional.push(a);
45
+ }
46
+ const nIdx = args.indexOf("-n");
47
+ if (nIdx >= 0 && nIdx + 1 < args.length) n = parseInt(args[nIdx + 1] ?? "0", 10);
48
+ const svcRaw = positional[0];
49
+ if (!svcRaw) return c.yellow(t("svc.logs.usage"));
50
+ const svc = parseService(svcRaw);
51
+ if (!svc) return c.red(t("svc.unknown", { name: svcRaw, list: SERVICE_NAMES.join(", ") }));
52
+ const svcObj = services[svc];
53
+ const lines = svcObj.getRecentLogs(n);
54
+ if (lines.length === 0) return c.dim(t("svc.logs.empty"));
55
+ const header = `
56
+ ${c.bold(t("svc.logs.header", { title: svcObj.title, count: lines.length }))}`;
57
+ const body = lines.map((l) => {
58
+ const ts = c.dim(l.time.toLocaleTimeString());
59
+ const text = highlightLogLine(l.text);
60
+ const prefix = l.stream === "stderr" ? c.red("!") : c.dim(" ");
61
+ return `${ts} ${prefix} ${text}`;
62
+ }).join("\n");
63
+ const result = header + "\n" + DIVIDER + "\n" + body + "\n";
64
+ if (follow && onFollow) {
65
+ onFollow(svc);
66
+ return "";
67
+ }
68
+ return result;
72
69
  }
73
- const STARTING = new Set();
74
- const STOPPING = new Set();
75
- export async function cmdStart(raw) {
76
- const svc = parseService(raw);
77
- if (!svc)
78
- return c.red(`Unknown service: ${raw} (try: ${SERVICE_NAMES.join(", ")})`);
79
- const svcObj = services[svc];
80
- if (svcObj.running)
81
- return c.yellow(`${svcObj.title} already running (PID ${svcObj.pid})`);
82
- if (STARTING.has(svc))
83
- return c.dim(`${svcObj.title} already starting...`);
84
- STARTING.add(svc);
85
- try {
86
- await svcObj.start();
87
- return c.green(`${svcObj.title} started`);
88
- }
89
- catch (e) {
90
- return c.red(`${svcObj.title} failed: ${e.message}`);
91
- }
92
- finally {
93
- STARTING.delete(svc);
94
- }
70
+ const STARTING = /* @__PURE__ */ new Set();
71
+ const STOPPING = /* @__PURE__ */ new Set();
72
+ async function cmdStart(raw) {
73
+ const svc = parseService(raw);
74
+ if (!svc) return c.red(t("svc.unknown", { name: raw, list: SERVICE_NAMES.join(", ") }));
75
+ const svcObj = services[svc];
76
+ if (svcObj.running) return c.yellow(t("svc.alreadyRunning", { title: svcObj.title, pid: svcObj.pid }));
77
+ if (STARTING.has(svc)) return c.dim(t("svc.alreadyStarting", { title: svcObj.title }));
78
+ STARTING.add(svc);
79
+ try {
80
+ await svcObj.start();
81
+ return c.green(t("svc.started", { title: svcObj.title }));
82
+ } catch (e) {
83
+ return c.red(t("svc.startFailed", { title: svcObj.title, message: e.message }));
84
+ } finally {
85
+ STARTING.delete(svc);
86
+ }
95
87
  }
96
- export async function cmdStop(raw) {
97
- const svc = parseService(raw);
98
- if (!svc)
99
- return c.red(`Unknown service: ${raw} (try: ${SERVICE_NAMES.join(", ")})`);
100
- const svcObj = services[svc];
101
- if (!svcObj.running)
102
- return c.yellow(`${svcObj.title} already stopped`);
103
- if (STOPPING.has(svc))
104
- return c.dim(`${svcObj.title} already stopping...`);
105
- STOPPING.add(svc);
106
- try {
107
- await svcObj.stop();
108
- return c.dim(`${svcObj.title} stopped`);
109
- }
110
- catch (e) {
111
- return c.red(`${svcObj.title} stop failed: ${e.message}`);
112
- }
113
- finally {
114
- STOPPING.delete(svc);
115
- }
88
+ async function cmdStop(raw) {
89
+ const svc = parseService(raw);
90
+ if (!svc) return c.red(t("svc.unknown", { name: raw, list: SERVICE_NAMES.join(", ") }));
91
+ const svcObj = services[svc];
92
+ if (!svcObj.running) return c.yellow(t("svc.alreadyStopped", { title: svcObj.title }));
93
+ if (STOPPING.has(svc)) return c.dim(t("svc.alreadyStopping", { title: svcObj.title }));
94
+ STOPPING.add(svc);
95
+ try {
96
+ await svcObj.stop();
97
+ return c.dim(t("svc.stoppedMsg", { title: svcObj.title }));
98
+ } catch (e) {
99
+ return c.red(t("svc.stopFailed", { title: svcObj.title, message: e.message }));
100
+ } finally {
101
+ STOPPING.delete(svc);
102
+ }
116
103
  }
117
- export async function cmdSend(raw, message) {
118
- const svc = parseService(raw);
119
- if (!svc)
120
- return c.red(`Unknown service: ${raw} (try: ${SERVICE_NAMES.join(", ")})`);
121
- if (!message)
122
- return c.yellow("Usage: send <service> <message>");
123
- const svcObj = services[svc];
124
- if (!svcObj.running || !svcObj.proc?.stdin)
125
- return c.yellow(`${svcObj.title} not running`);
126
- try {
127
- svcObj.proc.stdin.write(message + "\n");
128
- return c.dim(`sent to ${svc}`);
129
- }
130
- catch {
131
- return c.red("write failed");
132
- }
104
+ async function cmdSend(raw, message) {
105
+ const svc = parseService(raw);
106
+ if (!svc) return c.red(t("svc.unknown", { name: raw, list: SERVICE_NAMES.join(", ") }));
107
+ if (!message) return c.yellow(t("svc.send.usage"));
108
+ const svcObj = services[svc];
109
+ if (!svcObj.running || !svcObj.proc?.stdin) return c.yellow(t("svc.notRunning", { title: svcObj.title }));
110
+ try {
111
+ svcObj.proc.stdin.write(message + "\n");
112
+ return c.dim(t("svc.sent", { name: svc }));
113
+ } catch {
114
+ return c.red(t("svc.writeFailed"));
115
+ }
133
116
  }
134
- export async function cmdRestart(raw) {
135
- const svc = parseService(raw);
136
- if (!svc)
137
- return c.red(`Unknown service: ${raw} (try: ${SERVICE_NAMES.join(", ")})`);
138
- const svcObj = services[svc];
139
- try {
140
- await svcObj.restart();
141
- return c.green(`${svcObj.title} restarted`);
142
- }
143
- catch (e) {
144
- return c.red(`${svcObj.title} restart failed: ${e.message}`);
145
- }
117
+ async function cmdRestart(raw) {
118
+ const svc = parseService(raw);
119
+ if (!svc) return c.red(t("svc.unknown", { name: raw, list: SERVICE_NAMES.join(", ") }));
120
+ const svcObj = services[svc];
121
+ try {
122
+ await svcObj.restart();
123
+ return c.green(t("svc.restarted", { title: svcObj.title }));
124
+ } catch (e) {
125
+ return c.red(t("svc.restartFailed", { title: svcObj.title, message: e.message }));
126
+ }
146
127
  }
147
- export async function cmdStartAll() {
148
- const { startAll } = await import("./services.js");
149
- await startAll();
150
- return c.green("All services started");
128
+ async function cmdStartAll() {
129
+ const { startAll } = await import("./services.js");
130
+ await startAll();
131
+ return c.green(t("svc.allStarted"));
151
132
  }
152
- export async function cmdStopAll() {
153
- const { stopAll } = await import("./services.js");
154
- await stopAll();
155
- return c.dim("All services stopped");
133
+ async function cmdStopAll() {
134
+ const { stopAll } = await import("./services.js");
135
+ await stopAll();
136
+ return c.dim(t("svc.allStopped"));
156
137
  }
157
- export async function cmdUpdate(args = []) {
158
- return new Promise((resolve) => {
159
- const proc = spawnService("update", args, {
160
- cwd: ROOT,
161
- stdio: ["ignore", "pipe", "pipe"],
162
- });
163
- let out = "";
164
- proc.stdout?.on("data", (d) => {
165
- const s = d.toString();
166
- out += s;
167
- for (const line of s.split("\n").filter(Boolean))
168
- pushUnifiedLog(line, "update", "info");
169
- });
170
- proc.stderr?.on("data", (d) => {
171
- const s = d.toString();
172
- out += s;
173
- for (const line of s.split("\n").filter(Boolean))
174
- pushUnifiedLog(line, "update", "error");
175
- });
176
- proc.on("exit", (code) => {
177
- if (code === 0) {
178
- pushUnifiedLog("update complete", "system", "success");
179
- resolve((out ? out + "\n" : "") + "update complete");
180
- }
181
- else {
182
- resolve(out || `update exited with code ${code}`);
183
- }
184
- });
185
- proc.on("error", (e) => {
186
- pushUnifiedLog(`update error: ${e.message}`, "system", "error");
187
- resolve(`update error: ${e.message}`);
188
- });
138
+ async function cmdUpdate(args = []) {
139
+ const userNoStart = args.includes("--no-start");
140
+ const checkOnly = args.includes("--check-only");
141
+ const spawnArgs = userNoStart ? [...args] : [...args, "--no-start"];
142
+ const bds = services.bds;
143
+ const bdsWasRunning = bds.running;
144
+ const result = await new Promise((resolve) => {
145
+ const proc = spawnService("update", spawnArgs, {
146
+ cwd: ROOT,
147
+ stdio: ["ignore", "pipe", "pipe"]
189
148
  });
149
+ let out = "";
150
+ const pushChunk = (raw, level) => {
151
+ const s = stripTaskbarOsc(raw);
152
+ out += s;
153
+ for (const line of s.split(/\r?\n/).map((l) => l.trimEnd()).filter((l) => l.length > 0)) {
154
+ pushUnifiedLog(line, "update", level);
155
+ }
156
+ };
157
+ proc.stdout?.on("data", (d) => pushChunk(d.toString(), "info"));
158
+ proc.stderr?.on("data", (d) => pushChunk(d.toString(), "error"));
159
+ proc.on("exit", (code) => {
160
+ if (code === 0) {
161
+ pushUnifiedLog(t("svc.updateComplete"), "system", "success");
162
+ resolve({ code: 0, out: (out ? out + "\n" : "") + t("svc.updateComplete") });
163
+ } else {
164
+ resolve({ code, out: out || t("svc.updateExited", { code: String(code) }) });
165
+ }
166
+ });
167
+ proc.on("error", (e) => {
168
+ pushUnifiedLog(t("svc.updateError", { message: e.message }), "system", "error");
169
+ resolve({ code: 1, out: t("svc.updateError", { message: e.message }) });
170
+ });
171
+ });
172
+ const didDeploy = didUpdateDeploy(result.out);
173
+ if (result.code === 0 && didDeploy && !userNoStart && !checkOnly) {
174
+ if (bds.running) {
175
+ return result.out;
176
+ }
177
+ try {
178
+ pushUnifiedLog(t("svc.updateStartBds"), "system", "info");
179
+ await bds.start();
180
+ return result.out + "\n" + c.green(t("svc.bdsStarted"));
181
+ } catch (e) {
182
+ return result.out + "\n" + c.red(t("svc.bdsStartFailed", { message: e.message }));
183
+ }
184
+ }
185
+ if (result.code === 0 && didDeploy && userNoStart && bdsWasRunning && !bds.running) {
186
+ return result.out + "\n" + c.yellow(t("svc.bdsStoppedForUpdate"));
187
+ }
188
+ return result.out;
190
189
  }
191
- //# sourceMappingURL=commands.js.map
190
+ export {
191
+ cmdLogs,
192
+ cmdRestart,
193
+ cmdSend,
194
+ cmdStart,
195
+ cmdStartAll,
196
+ cmdStatus,
197
+ cmdStop,
198
+ cmdStopAll,
199
+ cmdUpdate
200
+ };
201
+ //# sourceMappingURL=commands.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAoB,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE1D,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,EAAiB,CAAC;IAC3C,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,OAAgB,EAAE,GAAW,EAAE,MAAc;IAC7E,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1D,OAAO,KAAK,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACvC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IACH,OAAO,CACL,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI;QAC3B,CAAC,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;QAChF,OAAO;QACP,IAAI;QACJ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAChB,IAAI,CACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAc,EAAE,QAA6C;IACnF,IAAI,CAAC,GAAG,EAAE,CAAC;IACX,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,IAAI;YAAE,SAAS,CAAC,mBAAmB;QAC7C,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACf,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,yCAAyC;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;QAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;IAEjF,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAC;IAElE,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,oBAAoB,MAAM,UAAU,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAExF,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE7B,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAEtD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,KAAK,CAAC,MAAM,IAAI,CAAC;IACxE,MAAM,IAAI,GAAG,KAAK;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/D,OAAO,GAAG,EAAE,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;IACnC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAE5D,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;QACvB,QAAQ,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;AACxC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW;IACxC,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,oBAAoB,GAAG,UAAU,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,yBAAyB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;IAC3F,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,sBAAsB,CAAC,CAAC;IAC3E,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,UAAU,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,YAAa,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW;IACvC,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,oBAAoB,GAAG,UAAU,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,kBAAkB,CAAC,CAAC;IACxE,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,sBAAsB,CAAC,CAAC;IAC3E,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,UAAU,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,iBAAkB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,OAAe;IACxD,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,oBAAoB,GAAG,UAAU,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrF,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,cAAc,CAAC,CAAC;IAC3F,IAAI,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QACxC,OAAO,CAAC,CAAC,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,oBAAoB,GAAG,UAAU,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,YAAY,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,oBAAqB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IACnD,MAAM,QAAQ,EAAE,CAAC;IACjB,OAAO,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAClD,MAAM,OAAO,EAAE,CAAC;IAChB,OAAO,CAAC,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAiB,EAAE;IACjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE;YACxC,GAAG,EAAE,IAAI;YACT,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;YACpC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;YACvB,GAAG,IAAI,CAAC,CAAC;YACT,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBAAE,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;YACpC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;YACvB,GAAG,IAAI,CAAC,CAAC;YACT,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBAAE,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACvB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,cAAc,CAAC,iBAAiB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;gBACvD,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC;YACvD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,IAAI,2BAA2B,IAAI,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACrB,cAAc,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChE,OAAO,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {
2
+ "version": 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": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,26 @@
1
+ import { type MessageKey } from "./locales/en.js";
2
+ import { type Locale } from "./types.js";
3
+ export type { Locale, MessageKey };
4
+ export { isLocale, normalizeLocale, LOCALES } from "./types.js";
5
+ export declare function getLocale(): Locale;
6
+ export declare function setLocale(locale: Locale): void;
7
+ /**
8
+ * 从 argv 剥离 `--lang=` / `--locale=` / `--lang x`,返回剩余参数与解析到的语言。
9
+ */
10
+ export declare function stripLangArgs(argv: string[]): {
11
+ args: string[];
12
+ lang: Locale | null;
13
+ };
14
+ export type InitLocaleOptions = {
15
+ /** 项目根(读 runtime.json) */
16
+ root?: string;
17
+ /** 已从 argv 解析的语言 */
18
+ flag?: Locale | null;
19
+ };
20
+ /** 进程启动时调用一次;之后可用 setLocale / persistLocale 切换。 */
21
+ export declare function initLocale(opts?: InitLocaleOptions): Locale;
22
+ /** 写入 configs/runtime.json#locale(浅合并,不破坏其它字段)。 */
23
+ export declare function persistLocale(root: string, locale: Locale): void;
24
+ /** 取当前语言文案;缺键时回退英文。 */
25
+ export declare function t(key: MessageKey, params?: Record<string, string | number>): string;
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAM,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAmB,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAE1D,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAUhE,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAG9C;AA0BD;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CA2BrF;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,mDAAmD;AACnD,wBAAgB,UAAU,CAAC,IAAI,GAAE,iBAAsB,GAAG,MAAM,CAO/D;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAGhE;AAUD,uBAAuB;AACvB,wBAAgB,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAQnF"}
@@ -0,0 +1,107 @@
1
+ import { configPath, patchJson, readJson } from "@sfmc-bds/sdk/node/config";
2
+ import { en } from "./locales/en.js";
3
+ import { zhCN } from "./locales/zh-CN.js";
4
+ import { normalizeLocale } from "./types.js";
5
+ import { isLocale, normalizeLocale as normalizeLocale2, LOCALES } from "./types.js";
6
+ const catalogs = {
7
+ en,
8
+ "zh-CN": zhCN
9
+ };
10
+ let active = "zh-CN";
11
+ let initialized = false;
12
+ function getLocale() {
13
+ return active;
14
+ }
15
+ function setLocale(locale) {
16
+ active = locale;
17
+ initialized = true;
18
+ }
19
+ function detectOsLocale() {
20
+ const candidates = [
21
+ process.env.LC_ALL,
22
+ process.env.LC_MESSAGES,
23
+ process.env.LANG,
24
+ Intl.DateTimeFormat().resolvedOptions().locale
25
+ ];
26
+ for (const raw of candidates) {
27
+ const n = normalizeLocale(raw?.split(".")[0]);
28
+ if (n) return n;
29
+ if (raw && /^zh\b/i.test(raw)) return "zh-CN";
30
+ }
31
+ return "en";
32
+ }
33
+ function readRuntimeLocale(root) {
34
+ try {
35
+ const runtime = readJson(configPath(root, "runtime.json"));
36
+ return normalizeLocale(runtime?.locale ?? null);
37
+ } catch {
38
+ return null;
39
+ }
40
+ }
41
+ function stripLangArgs(argv) {
42
+ const args = [];
43
+ let lang = null;
44
+ for (let i = 0; i < argv.length; i++) {
45
+ const a = argv[i];
46
+ if (a === "--lang" || a === "--locale") {
47
+ const next = argv[i + 1];
48
+ const n = normalizeLocale(next);
49
+ if (n) {
50
+ lang = n;
51
+ i++;
52
+ continue;
53
+ }
54
+ args.push(a);
55
+ continue;
56
+ }
57
+ const m = /^--(?:lang|locale)=(.*)$/i.exec(a);
58
+ if (m) {
59
+ const n = normalizeLocale(m[1]);
60
+ if (n) {
61
+ lang = n;
62
+ continue;
63
+ }
64
+ }
65
+ args.push(a);
66
+ }
67
+ return { args, lang };
68
+ }
69
+ function initLocale(opts = {}) {
70
+ const fromEnv = normalizeLocale(process.env.SFMC_LOCALE ?? process.env.SFMC_LANG ?? null);
71
+ const fromFlag = opts.flag ?? null;
72
+ const fromRuntime = opts.root ? readRuntimeLocale(opts.root) : null;
73
+ const locale = fromFlag ?? fromEnv ?? fromRuntime ?? detectOsLocale();
74
+ setLocale(locale);
75
+ return locale;
76
+ }
77
+ function persistLocale(root, locale) {
78
+ patchJson(configPath(root, "runtime.json"), { locale });
79
+ setLocale(locale);
80
+ }
81
+ function interpolate(template, params) {
82
+ if (!params) return template;
83
+ return template.replace(/\{(\w+)\}/g, (_, key) => {
84
+ const v = params[key];
85
+ return v === void 0 || v === null ? `{${key}}` : String(v);
86
+ });
87
+ }
88
+ function t(key, params) {
89
+ if (!initialized) {
90
+ initLocale();
91
+ }
92
+ const catalog = catalogs[active] ?? catalogs.en;
93
+ const raw = catalog[key] ?? catalogs.en[key] ?? String(key);
94
+ return interpolate(raw, params);
95
+ }
96
+ export {
97
+ LOCALES,
98
+ getLocale,
99
+ initLocale,
100
+ isLocale,
101
+ normalizeLocale2 as normalizeLocale,
102
+ persistLocale,
103
+ setLocale,
104
+ stripLangArgs,
105
+ t
106
+ };
107
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/i18n/index.ts"],
4
+ "sourcesContent": ["/**\n * sfmc CLI \u591A\u8BED\u8A00\uFF08\u4E2D\u82F1\u53CC\u8BED\uFF09\n *\n * \u4F18\u5148\u7EA7: --lang / --locale \u65D7\u6807 > SFMC_LOCALE / SFMC_LANG \u73AF\u5883\u53D8\u91CF\n * > configs/runtime.json#locale > \u7CFB\u7EDF\u8BED\u8A00\uFF08zh* \u2192 zh-CN\uFF0C\u5426\u5219 en\uFF09\n */\nimport { configPath, patchJson, readJson, type RuntimeConfig } from \"@sfmc-bds/sdk/node/config\";\nimport { en, type MessageKey } from \"./locales/en.js\";\nimport { zhCN } from \"./locales/zh-CN.js\";\nimport { normalizeLocale, type Locale } from \"./types.js\";\n\nexport type { Locale, MessageKey };\nexport { isLocale, normalizeLocale, LOCALES } from \"./types.js\";\n\nconst catalogs: Record<Locale, Record<MessageKey, string>> = {\n en,\n \"zh-CN\": zhCN,\n};\n\nlet active: Locale = \"zh-CN\";\nlet initialized = false;\n\nexport function getLocale(): Locale {\n return active;\n}\n\nexport function setLocale(locale: Locale): void {\n active = locale;\n initialized = true;\n}\n\nfunction detectOsLocale(): Locale {\n const candidates = [\n process.env.LC_ALL,\n process.env.LC_MESSAGES,\n process.env.LANG,\n Intl.DateTimeFormat().resolvedOptions().locale,\n ];\n for (const raw of candidates) {\n const n = normalizeLocale(raw?.split(\".\")[0]);\n if (n) return n;\n if (raw && /^zh\\b/i.test(raw)) return \"zh-CN\";\n }\n return \"en\";\n}\n\nfunction readRuntimeLocale(root: string): Locale | null {\n try {\n const runtime = readJson<RuntimeConfig & { locale?: string }>(configPath(root, \"runtime.json\"));\n return normalizeLocale(runtime?.locale ?? null);\n } catch {\n return null;\n }\n}\n\n/**\n * \u4ECE argv \u5265\u79BB `--lang=` / `--locale=` / `--lang x`\uFF0C\u8FD4\u56DE\u5269\u4F59\u53C2\u6570\u4E0E\u89E3\u6790\u5230\u7684\u8BED\u8A00\u3002\n */\nexport function stripLangArgs(argv: string[]): { args: string[]; lang: Locale | null } {\n const args: string[] = [];\n let lang: Locale | null = null;\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i]!;\n if (a === \"--lang\" || a === \"--locale\") {\n const next = argv[i + 1];\n const n = normalizeLocale(next);\n if (n) {\n lang = n;\n i++;\n continue;\n }\n args.push(a);\n continue;\n }\n const m = /^--(?:lang|locale)=(.*)$/i.exec(a);\n if (m) {\n const n = normalizeLocale(m[1]);\n if (n) {\n lang = n;\n continue;\n }\n }\n args.push(a);\n }\n return { args, lang };\n}\n\nexport type InitLocaleOptions = {\n /** \u9879\u76EE\u6839\uFF08\u8BFB runtime.json\uFF09 */\n root?: string;\n /** \u5DF2\u4ECE argv \u89E3\u6790\u7684\u8BED\u8A00 */\n flag?: Locale | null;\n};\n\n/** \u8FDB\u7A0B\u542F\u52A8\u65F6\u8C03\u7528\u4E00\u6B21\uFF1B\u4E4B\u540E\u53EF\u7528 setLocale / persistLocale \u5207\u6362\u3002 */\nexport function initLocale(opts: InitLocaleOptions = {}): Locale {\n const fromEnv = normalizeLocale(process.env.SFMC_LOCALE ?? process.env.SFMC_LANG ?? null);\n const fromFlag = opts.flag ?? null;\n const fromRuntime = opts.root ? readRuntimeLocale(opts.root) : null;\n const locale = fromFlag ?? fromEnv ?? fromRuntime ?? detectOsLocale();\n setLocale(locale);\n return locale;\n}\n\n/** \u5199\u5165 configs/runtime.json#locale\uFF08\u6D45\u5408\u5E76\uFF0C\u4E0D\u7834\u574F\u5176\u5B83\u5B57\u6BB5\uFF09\u3002 */\nexport function persistLocale(root: string, locale: Locale): void {\n patchJson(configPath(root, \"runtime.json\"), { locale } as Partial<RuntimeConfig & { locale: string }>);\n setLocale(locale);\n}\n\nfunction interpolate(template: string, params?: Record<string, string | number>): string {\n if (!params) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) => {\n const v = params[key];\n return v === undefined || v === null ? `{${key}}` : String(v);\n });\n}\n\n/** \u53D6\u5F53\u524D\u8BED\u8A00\u6587\u6848\uFF1B\u7F3A\u952E\u65F6\u56DE\u9000\u82F1\u6587\u3002 */\nexport function t(key: MessageKey, params?: Record<string, string | number>): string {\n if (!initialized) {\n /* \u61D2\u521D\u59CB\u5316\uFF1A\u5141\u8BB8\u5728 initLocale \u524D\u88AB import \u7684\u6A21\u5757\u8C03\u7528 */\n initLocale();\n }\n const catalog = catalogs[active] ?? catalogs.en;\n const raw = catalog[key] ?? catalogs.en[key] ?? String(key);\n return interpolate(raw, params);\n}\n"],
5
+ "mappings": "AAMA,SAAS,YAAY,WAAW,gBAAoC;AACpE,SAAS,UAA2B;AACpC,SAAS,YAAY;AACrB,SAAS,uBAAoC;AAG7C,SAAS,UAAU,mBAAAA,kBAAiB,eAAe;AAEnD,MAAM,WAAuD;AAAA,EAC3D;AAAA,EACA,SAAS;AACX;AAEA,IAAI,SAAiB;AACrB,IAAI,cAAc;AAEX,SAAS,YAAoB;AAClC,SAAO;AACT;AAEO,SAAS,UAAU,QAAsB;AAC9C,WAAS;AACT,gBAAc;AAChB;AAEA,SAAS,iBAAyB;AAChC,QAAM,aAAa;AAAA,IACjB,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI;AAAA,IACZ,KAAK,eAAe,EAAE,gBAAgB,EAAE;AAAA,EAC1C;AACA,aAAW,OAAO,YAAY;AAC5B,UAAM,IAAI,gBAAgB,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC;AAC5C,QAAI,EAAG,QAAO;AACd,QAAI,OAAO,SAAS,KAAK,GAAG,EAAG,QAAO;AAAA,EACxC;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,MAA6B;AACtD,MAAI;AACF,UAAM,UAAU,SAA8C,WAAW,MAAM,cAAc,CAAC;AAC9F,WAAO,gBAAgB,SAAS,UAAU,IAAI;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,cAAc,MAAyD;AACrF,QAAM,OAAiB,CAAC;AACxB,MAAI,OAAsB;AAC1B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,IAAI,KAAK,CAAC;AAChB,QAAI,MAAM,YAAY,MAAM,YAAY;AACtC,YAAM,OAAO,KAAK,IAAI,CAAC;AACvB,YAAM,IAAI,gBAAgB,IAAI;AAC9B,UAAI,GAAG;AACL,eAAO;AACP;AACA;AAAA,MACF;AACA,WAAK,KAAK,CAAC;AACX;AAAA,IACF;AACA,UAAM,IAAI,4BAA4B,KAAK,CAAC;AAC5C,QAAI,GAAG;AACL,YAAM,IAAI,gBAAgB,EAAE,CAAC,CAAC;AAC9B,UAAI,GAAG;AACL,eAAO;AACP;AAAA,MACF;AAAA,IACF;AACA,SAAK,KAAK,CAAC;AAAA,EACb;AACA,SAAO,EAAE,MAAM,KAAK;AACtB;AAUO,SAAS,WAAW,OAA0B,CAAC,GAAW;AAC/D,QAAM,UAAU,gBAAgB,QAAQ,IAAI,eAAe,QAAQ,IAAI,aAAa,IAAI;AACxF,QAAM,WAAW,KAAK,QAAQ;AAC9B,QAAM,cAAc,KAAK,OAAO,kBAAkB,KAAK,IAAI,IAAI;AAC/D,QAAM,SAAS,YAAY,WAAW,eAAe,eAAe;AACpE,YAAU,MAAM;AAChB,SAAO;AACT;AAGO,SAAS,cAAc,MAAc,QAAsB;AAChE,YAAU,WAAW,MAAM,cAAc,GAAG,EAAE,OAAO,CAAgD;AACrG,YAAU,MAAM;AAClB;AAEA,SAAS,YAAY,UAAkB,QAAkD;AACvF,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,SAAS,QAAQ,cAAc,CAAC,GAAG,QAAgB;AACxD,UAAM,IAAI,OAAO,GAAG;AACpB,WAAO,MAAM,UAAa,MAAM,OAAO,IAAI,GAAG,MAAM,OAAO,CAAC;AAAA,EAC9D,CAAC;AACH;AAGO,SAAS,EAAE,KAAiB,QAAkD;AACnF,MAAI,CAAC,aAAa;AAEhB,eAAW;AAAA,EACb;AACA,QAAM,UAAU,SAAS,MAAM,KAAK,SAAS;AAC7C,QAAM,MAAM,QAAQ,GAAG,KAAK,SAAS,GAAG,GAAG,KAAK,OAAO,GAAG;AAC1D,SAAO,YAAY,KAAK,MAAM;AAChC;",
6
+ "names": ["normalizeLocale"]
7
+ }