@sfmc-bds/cli 0.3.2 → 0.4.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 (86) hide show
  1. package/dist/command-surface.d.ts.map +1 -1
  2. package/dist/command-surface.js +5 -6
  3. package/dist/command-surface.js.map +2 -2
  4. package/dist/daemon/client.d.ts +3 -0
  5. package/dist/daemon/client.d.ts.map +1 -1
  6. package/dist/daemon/client.js +38 -8
  7. package/dist/daemon/client.js.map +2 -2
  8. package/dist/daemon/protocol.d.ts +9 -3
  9. package/dist/daemon/protocol.d.ts.map +1 -1
  10. package/dist/daemon/protocol.js.map +2 -2
  11. package/dist/daemon/server.d.ts.map +1 -1
  12. package/dist/daemon/server.js +82 -2
  13. package/dist/daemon/server.js.map +2 -2
  14. package/dist/i18n/locales/en.d.ts +1 -0
  15. package/dist/i18n/locales/en.d.ts.map +1 -1
  16. package/dist/i18n/locales/en.js +1 -0
  17. package/dist/i18n/locales/en.js.map +2 -2
  18. package/dist/i18n/locales/zh-CN.js +1 -0
  19. package/dist/i18n/locales/zh-CN.js.map +2 -2
  20. package/dist/logs.d.ts.map +1 -1
  21. package/dist/logs.js +13 -1
  22. package/dist/logs.js.map +2 -2
  23. package/dist/main.js +14 -184
  24. package/dist/main.js.map +2 -2
  25. package/dist/management/config.d.ts +8 -0
  26. package/dist/management/config.d.ts.map +1 -0
  27. package/dist/management/config.js +107 -0
  28. package/dist/management/config.js.map +7 -0
  29. package/dist/management/deployment.d.ts +7 -0
  30. package/dist/management/deployment.d.ts.map +1 -0
  31. package/dist/management/deployment.js +36 -0
  32. package/dist/management/deployment.js.map +7 -0
  33. package/dist/management/domain.d.ts +65 -0
  34. package/dist/management/domain.d.ts.map +1 -0
  35. package/dist/management/domain.js +137 -0
  36. package/dist/management/domain.js.map +7 -0
  37. package/dist/management/maintenance.d.ts +18 -0
  38. package/dist/management/maintenance.d.ts.map +1 -0
  39. package/dist/management/maintenance.js +214 -0
  40. package/dist/management/maintenance.js.map +7 -0
  41. package/dist/management/platform-worker.d.ts +2 -0
  42. package/dist/management/platform-worker.d.ts.map +1 -0
  43. package/dist/management/platform-worker.js +155 -0
  44. package/dist/management/platform-worker.js.map +7 -0
  45. package/dist/management/server.d.ts +7 -0
  46. package/dist/management/server.d.ts.map +1 -0
  47. package/dist/management/server.js +291 -0
  48. package/dist/management/server.js.map +7 -0
  49. package/dist/management/startup.d.ts +6 -0
  50. package/dist/management/startup.d.ts.map +1 -0
  51. package/dist/management/startup.js +67 -0
  52. package/dist/management/startup.js.map +7 -0
  53. package/dist/management/stdio.d.ts +3 -0
  54. package/dist/management/stdio.d.ts.map +1 -0
  55. package/dist/management/stdio.js +93 -0
  56. package/dist/management/stdio.js.map +7 -0
  57. package/dist/management/tasks.d.ts +21 -0
  58. package/dist/management/tasks.d.ts.map +1 -0
  59. package/dist/management/tasks.js +103 -0
  60. package/dist/management/tasks.js.map +7 -0
  61. package/dist/module-commands.d.ts +2 -2
  62. package/dist/module-commands.d.ts.map +1 -1
  63. package/dist/module-commands.js +28 -24
  64. package/dist/module-commands.js.map +2 -2
  65. package/dist/pack-lifecycle.d.ts.map +1 -1
  66. package/dist/pack-lifecycle.js +2 -0
  67. package/dist/pack-lifecycle.js.map +2 -2
  68. package/dist/runtime-main.d.ts +3 -0
  69. package/dist/runtime-main.d.ts.map +1 -0
  70. package/dist/runtime-main.js +188 -0
  71. package/dist/runtime-main.js.map +7 -0
  72. package/dist/runtime.d.ts +6 -0
  73. package/dist/runtime.d.ts.map +1 -1
  74. package/dist/runtime.js +6 -1
  75. package/dist/runtime.js.map +2 -2
  76. package/dist/services.d.ts +1 -1
  77. package/dist/services.d.ts.map +1 -1
  78. package/dist/services.js +8 -4
  79. package/dist/services.js.map +2 -2
  80. package/dist/world-packs.d.ts.map +1 -1
  81. package/dist/world-packs.js +7 -0
  82. package/dist/world-packs.js.map +2 -2
  83. package/package.json +8 -4
  84. package/scripts/module-install/.sfmc-registry-cache.json +95 -0
  85. package/scripts/module-install/fetch-module.mjs +5 -1
  86. package/scripts/module-install/lib/packages.mjs +3 -6
package/dist/main.js CHANGED
@@ -1,188 +1,18 @@
1
1
  #!/usr/bin/env node
2
- import process from "node:process";
3
- import { mapPacksSubAlias, parseGlobalArgv } from "./argv-parse.js";
4
- import { cmdRestart, cmdStart, cmdStartAll, cmdStatus, cmdStop, cmdStopAll, cmdUpdate } from "./commands.js";
5
- import { gateModuleSub, gatePacksSub, gateTopLevel } from "./cli-gate.js";
6
- import { resolveModuleTopShorthand } from "./command-surface.js";
7
- import { cmdDebug } from "./debug-command.js";
8
- import { initLocale, stripLangArgs, t } from "./i18n/index.js";
9
- import { cmdLocale } from "./locale-command.js";
10
- import { dispatchModuleCommand, isModuleCommand, scanAndWarnUnknown } from "./module-commands.js";
11
- import { getHelp, playWelcomeAnimation, startRepl } from "./repl.js";
12
- import { ROOT } from "./runtime.js";
13
- import { c } from "./theme.js";
14
- import { dispatchPacksCommand, isPacksCommand } from "./world-packs.js";
15
- const MODE = "argv";
16
- async function printVersion() {
17
- await playWelcomeAnimation();
18
- }
19
- function printUsage() {
20
- console.log(`${getHelp("argv")}`);
21
- }
22
- function deny(msg) {
23
- console.log(msg);
24
- process.exit(1);
25
- }
26
- async function main() {
27
- const stripped = stripLangArgs(process.argv.slice(2));
28
- initLocale({ root: ROOT, flag: stripped.lang });
29
- let args = stripped.args;
30
- if (args[0] === "--daemon") {
31
- const { runDaemonServer } = await import("./daemon/server.js");
32
- await runDaemonServer();
33
- return;
34
- }
35
- const { packsMode, args: parsedArgs } = parseGlobalArgv(args);
36
- args = parsedArgs;
37
- if (args.length === 0 && !packsMode) {
38
- const { isRuntimeInitialized } = await import("./runtime.js");
39
- if (!isRuntimeInitialized()) {
40
- const { runWizard } = await import("./wizard.js");
41
- await runWizard();
42
- const { refreshServices } = await import("./services.js");
43
- refreshServices();
44
- }
45
- const warn = await scanAndWarnUnknown();
46
- if (warn) console.log(warn);
47
- await startRepl();
48
- return;
49
- }
50
- if (packsMode) {
51
- const [subRaw, ...subRest] = args;
52
- const sub = mapPacksSubAlias(subRaw);
53
- const g = gatePacksSub(sub, MODE);
54
- if (g) deny(g);
55
- console.log(await dispatchPacksCommand(sub, subRest));
56
- process.exit(0);
57
- }
58
- const [cmd, ...rest] = args;
59
- if (cmd && !["--help", "-h", "--version", "-v"].includes(cmd)) {
60
- const topGate = gateTopLevel(cmd, MODE);
61
- if (topGate) deny(topGate);
62
- }
63
- const moduleSub = resolveModuleTopShorthand(cmd);
64
- if (moduleSub) {
65
- const g = gateModuleSub(moduleSub, MODE);
66
- if (g) deny(g);
67
- console.log(await dispatchModuleCommand(moduleSub, rest));
68
- process.exit(0);
69
- }
70
- switch (cmd) {
71
- case "--help":
72
- case "-h":
73
- case "help":
74
- printUsage();
75
- break;
76
- case "--version":
77
- case "-v":
78
- await printVersion();
79
- break;
80
- case "locale":
81
- case "lang":
82
- console.log(cmdLocale(rest));
83
- break;
84
- case "debug":
85
- console.log(await cmdDebug(rest));
86
- break;
87
- case "ui": {
88
- const { cmdUi } = await import("./ui-command.js");
89
- console.log(await cmdUi(rest, { block: true }));
90
- break;
91
- }
92
- case "daemon": {
93
- const sub = rest[0];
94
- if (sub === "stop") {
95
- const { shutdownDaemon } = await import("./daemon/client.js");
96
- const err = await shutdownDaemon();
97
- console.log(err ? c.red(err) : c.dim(t("daemon.stopped")));
98
- } else if (sub === "status" || !sub) {
99
- const { readDaemonMeta } = await import("./daemon/paths.js");
100
- const { isProcessAlive } = await import("@sfmc-bds/bds-tools/process-probe");
101
- const meta = readDaemonMeta();
102
- if (!meta || !await isProcessAlive(meta.pid)) {
103
- console.log(c.dim(t("daemon.notRunning")));
104
- } else {
105
- console.log(c.green(t("daemon.running", { pid: String(meta.pid) })));
106
- }
107
- } else {
108
- console.log(c.yellow(t("daemon.usage")));
109
- }
110
- break;
111
- }
112
- case "status":
113
- console.log(await cmdStatus());
114
- break;
115
- case "logs":
116
- case "log":
117
- deny(gateTopLevel("logs", MODE) ?? c.yellow(t("cli.replOnly", { cmd: "logs" })));
118
- break;
119
- case "start":
120
- if (rest[0] === "-all" || rest[0] === "all" || rest[0] === "--all") {
121
- console.log(await cmdStartAll());
122
- } else if (rest[0]) {
123
- console.log(await cmdStart(rest[0]));
124
- } else {
125
- console.log(c.yellow(t("svc.start.usage")));
126
- }
127
- break;
128
- case "stop":
129
- if (rest[0] === "-all" || rest[0] === "all" || rest[0] === "--all") {
130
- console.log(await cmdStopAll());
131
- } else if (rest[0]) {
132
- console.log(await cmdStop(rest[0]));
133
- } else {
134
- console.log(c.yellow(t("svc.stop.usage")));
135
- }
136
- break;
137
- case "restart":
138
- if (rest[0] === "-all" || rest[0] === "all" || rest[0] === "--all") {
139
- await cmdStopAll();
140
- console.log(await cmdStartAll());
141
- } else if (rest[0]) {
142
- console.log(await cmdRestart(rest[0]));
143
- } else {
144
- console.log(c.yellow(t("svc.restart.usage")));
145
- }
146
- break;
147
- case "update":
148
- console.log(await cmdUpdate(rest));
149
- break;
150
- case "packs":
151
- case "addon": {
152
- const [sub, ...subRest] = rest;
153
- const g = gatePacksSub(sub, MODE);
154
- if (g) deny(g);
155
- console.log(await dispatchPacksCommand(sub, subRest));
156
- break;
157
- }
158
- case "init": {
159
- const { runWizard } = await import("./wizard.js");
160
- await runWizard();
161
- break;
162
- }
163
- default:
164
- if (isModuleCommand(cmd)) {
165
- const [sub, ...subRest] = rest;
166
- const g = gateModuleSub(sub, MODE);
167
- if (g) deny(g);
168
- console.log(await dispatchModuleCommand(sub, subRest));
169
- break;
170
- }
171
- if (isPacksCommand(cmd)) {
172
- const [sub, ...subRest] = rest;
173
- const g = gatePacksSub(sub, MODE);
174
- if (g) deny(g);
175
- console.log(await dispatchPacksCommand(sub, subRest));
176
- break;
177
- }
178
- console.log(c.red(t("common.unknownCommand", { cmd: cmd ?? "" })));
179
- printUsage();
180
- process.exit(1);
2
+ import { stripLangArgs } from "./i18n/index.js";
3
+ const args = stripLangArgs(process.argv.slice(2)).args;
4
+ if (args[0] === "manage" && args[1] === "--stdio") {
5
+ const { runManagementStdio } = await import("./management/stdio.js");
6
+ await runManagementStdio();
7
+ } else if ((args[0] === "mod" || args[0] === "module") && args[1] === "submit") {
8
+ try {
9
+ const { runRegistrySubmitCommand } = await import("@sfmc-bds/devkit");
10
+ console.log(await runRegistrySubmitCommand(args.slice(2)));
11
+ } catch (error) {
12
+ console.error(error instanceof Error ? error.message : String(error));
13
+ process.exitCode = 1;
181
14
  }
182
- process.exit(0);
15
+ } else {
16
+ await import("./runtime-main.js");
183
17
  }
184
- main().catch((err) => {
185
- console.error(c.red(err?.message ? t("common.error", { message: err.message }) : t("common.fatal")));
186
- process.exit(1);
187
- });
188
18
  //# sourceMappingURL=main.js.map
package/dist/main.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/main.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\nimport process from \"node:process\";\nimport { mapPacksSubAlias, parseGlobalArgv } from \"./argv-parse.js\";\nimport { cmdRestart, cmdStart, cmdStartAll, cmdStatus, cmdStop, cmdStopAll, cmdUpdate } from \"./commands.js\";\nimport { gateModuleSub, gatePacksSub, gateTopLevel } from \"./cli-gate.js\";\nimport { resolveModuleTopShorthand } from \"./command-surface.js\";\nimport { cmdDebug } from \"./debug-command.js\";\nimport { initLocale, stripLangArgs, t } from \"./i18n/index.js\";\nimport { cmdLocale } from \"./locale-command.js\";\nimport { dispatchModuleCommand, isModuleCommand, scanAndWarnUnknown } from \"./module-commands.js\";\nimport { getHelp, playWelcomeAnimation, startRepl } from \"./repl.js\";\nimport { ROOT } from \"./runtime.js\";\nimport { c } from \"./theme.js\";\nimport { dispatchPacksCommand, isPacksCommand } from \"./world-packs.js\";\n\nconst MODE = \"argv\" as const;\n\nasync function printVersion(): Promise<void> {\n await playWelcomeAnimation();\n}\n\nfunction printUsage(): void {\n console.log(`${getHelp(\"argv\")}`);\n}\n\nfunction deny(msg: string): never {\n console.log(msg);\n process.exit(1);\n}\n\nasync function main(): Promise<void> {\n const stripped = stripLangArgs(process.argv.slice(2));\n initLocale({ root: ROOT, flag: stripped.lang });\n let args = stripped.args;\n\n /* \u5185\u90E8\u5165\u53E3\uFF1A\u540E\u53F0\u5B88\u62A4\u8FDB\u7A0B\uFF08\u4E0D\u89E3\u6790\u7528\u6237\u547D\u4EE4\uFF09 */\n if (args[0] === \"--daemon\") {\n const { runDaemonServer } = await import(\"./daemon/server.js\");\n await runDaemonServer();\n return;\n }\n\n const { packsMode, args: parsedArgs } = parseGlobalArgv(args);\n args = parsedArgs;\n\n if (args.length === 0 && !packsMode) {\n const { isRuntimeInitialized } = await import(\"./runtime.js\");\n if (!isRuntimeInitialized()) {\n const { runWizard } = await import(\"./wizard.js\");\n await runWizard();\n const { refreshServices } = await import(\"./services.js\");\n refreshServices();\n }\n const warn = await scanAndWarnUnknown();\n if (warn) console.log(warn);\n await startRepl();\n return;\n }\n\n if (packsMode) {\n const [subRaw, ...subRest] = args;\n const sub = mapPacksSubAlias(subRaw);\n const g = gatePacksSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchPacksCommand(sub, subRest));\n process.exit(0);\n }\n\n const [cmd, ...rest] = args;\n\n if (cmd && ![\"--help\", \"-h\", \"--version\", \"-v\"].includes(cmd)) {\n const topGate = gateTopLevel(cmd, MODE);\n if (topGate) deny(topGate);\n }\n\n const moduleSub = resolveModuleTopShorthand(cmd);\n if (moduleSub) {\n const g = gateModuleSub(moduleSub, MODE);\n if (g) deny(g);\n console.log(await dispatchModuleCommand(moduleSub, rest));\n process.exit(0);\n }\n\n switch (cmd) {\n case \"--help\":\n case \"-h\":\n case \"help\":\n printUsage();\n break;\n case \"--version\":\n case \"-v\":\n await printVersion();\n break;\n case \"locale\":\n case \"lang\":\n console.log(cmdLocale(rest));\n break;\n case \"debug\":\n console.log(await cmdDebug(rest));\n break;\n case \"ui\": {\n const { cmdUi } = await import(\"./ui-command.js\");\n console.log(await cmdUi(rest, { block: true }));\n break;\n }\n case \"daemon\": {\n const sub = rest[0];\n if (sub === \"stop\") {\n const { shutdownDaemon } = await import(\"./daemon/client.js\");\n const err = await shutdownDaemon();\n console.log(err ? c.red(err) : c.dim(t(\"daemon.stopped\")));\n } else if (sub === \"status\" || !sub) {\n const { readDaemonMeta } = await import(\"./daemon/paths.js\");\n const { isProcessAlive } = await import(\"@sfmc-bds/bds-tools/process-probe\");\n const meta = readDaemonMeta();\n if (!meta || !(await isProcessAlive(meta.pid))) {\n console.log(c.dim(t(\"daemon.notRunning\")));\n } else {\n console.log(c.green(t(\"daemon.running\", { pid: String(meta.pid) })));\n }\n } else {\n console.log(c.yellow(t(\"daemon.usage\")));\n }\n break;\n }\n case \"status\":\n console.log(await cmdStatus());\n break;\n case \"logs\":\n case \"log\":\n /* channel=repl\uFF1A\u6B63\u5E38\u7531 gateTopLevel \u62E6\u622A\uFF1B\u6B64\u5904\u515C\u5E95 */\n deny(gateTopLevel(\"logs\", MODE) ?? c.yellow(t(\"cli.replOnly\", { cmd: \"logs\" })));\n break;\n case \"start\":\n if (rest[0] === \"-all\" || rest[0] === \"all\" || rest[0] === \"--all\") {\n console.log(await cmdStartAll());\n } else if (rest[0]) {\n console.log(await cmdStart(rest[0]));\n } else {\n console.log(c.yellow(t(\"svc.start.usage\")));\n }\n break;\n case \"stop\":\n if (rest[0] === \"-all\" || rest[0] === \"all\" || rest[0] === \"--all\") {\n console.log(await cmdStopAll());\n } else if (rest[0]) {\n console.log(await cmdStop(rest[0]));\n } else {\n console.log(c.yellow(t(\"svc.stop.usage\")));\n }\n break;\n case \"restart\":\n if (rest[0] === \"-all\" || rest[0] === \"all\" || rest[0] === \"--all\") {\n await cmdStopAll();\n console.log(await cmdStartAll());\n } else if (rest[0]) {\n console.log(await cmdRestart(rest[0]));\n } else {\n console.log(c.yellow(t(\"svc.restart.usage\")));\n }\n break;\n case \"update\":\n console.log(await cmdUpdate(rest));\n break;\n case \"packs\":\n case \"addon\": {\n const [sub, ...subRest] = rest;\n const g = gatePacksSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchPacksCommand(sub, subRest));\n break;\n }\n case \"init\": {\n const { runWizard } = await import(\"./wizard.js\");\n await runWizard();\n break;\n }\n default:\n if (isModuleCommand(cmd)) {\n const [sub, ...subRest] = rest;\n const g = gateModuleSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchModuleCommand(sub, subRest));\n break;\n }\n if (isPacksCommand(cmd)) {\n const [sub, ...subRest] = rest;\n const g = gatePacksSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchPacksCommand(sub, subRest));\n break;\n }\n console.log(c.red(t(\"common.unknownCommand\", { cmd: cmd ?? \"\" })));\n printUsage();\n process.exit(1);\n }\n process.exit(0);\n}\n\nmain().catch((err) => {\n console.error(c.red(err?.message ? t(\"common.error\", { message: err.message }) : t(\"common.fatal\")));\n process.exit(1);\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["#!/usr/bin/env node\n/** \u4F5C\u8005\u547D\u4EE4\u5148\u5206\u6D41\uFF0C\u907F\u514D\u4EC5\u63D0\u4EA4\u7D22\u5F15\u65F6\u521D\u59CB\u5316\u670D\u52A1\u4E0E\u8FD0\u884C\u76EE\u5F55\u914D\u7F6E\u3002 */\nimport { stripLangArgs } from \"./i18n/index.js\";\n\nconst args = stripLangArgs(process.argv.slice(2)).args;\nif (args[0] === \"manage\" && args[1] === \"--stdio\") {\n const { runManagementStdio } = await import(\"./management/stdio.js\");\n await runManagementStdio();\n} else if ((args[0] === \"mod\" || args[0] === \"module\") && args[1] === \"submit\") {\n try {\n const { runRegistrySubmitCommand } = await import(\"@sfmc-bds/devkit\");\n console.log(await runRegistrySubmitCommand(args.slice(2)));\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n} else {\n await import(\"./runtime-main.js\");\n}\n"],
5
+ "mappings": ";AAEA,SAAS,qBAAqB;AAE9B,MAAM,OAAO,cAAc,QAAQ,KAAK,MAAM,CAAC,CAAC,EAAE;AAClD,IAAI,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,WAAW;AACjD,QAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,uBAAuB;AACnE,QAAM,mBAAmB;AAC3B,YAAY,KAAK,CAAC,MAAM,SAAS,KAAK,CAAC,MAAM,aAAa,KAAK,CAAC,MAAM,UAAU;AAC9E,MAAI;AACF,UAAM,EAAE,yBAAyB,IAAI,MAAM,OAAO,kBAAkB;AACpE,YAAQ,IAAI,MAAM,yBAAyB,KAAK,MAAM,CAAC,CAAC,CAAC;AAAA,EAC3D,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,YAAQ,WAAW;AAAA,EACrB;AACF,OAAO;AACL,QAAM,OAAO,mBAAmB;AAClC;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,8 @@
1
+ import type { ConfigDocument } from "@sfmc-bds/management";
2
+ export declare function configFiles(): Map<string, string>;
3
+ export declare function configPath(key: string): string;
4
+ export declare function revision(text: string): string;
5
+ export declare function readDocument(key: string): ConfigDocument;
6
+ export declare function validateDocument(document: ConfigDocument, text: string): void;
7
+ export declare function saveDocument(key: string, expected: string, text: string): ConfigDocument;
8
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/management/config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAc3D,wBAAgB,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBjD;AACD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK9C;AACD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,UAA6D;AAClG,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAaxD;AACD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,QAqBtE;AACD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAQvE"}
@@ -0,0 +1,107 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { createHash, randomUUID } from "node:crypto";
4
+ import Ajv2020 from "ajv/dist/2020.js";
5
+ import { parse } from "jsonc-parser";
6
+ import { resolveSdkPackageRoot, ROOT } from "../runtime.js";
7
+ import { resolveBdsContext } from "../pack-lifecycle.js";
8
+ import { readJson, stripBom } from "./domain.js";
9
+ const CORE_FILES = ["runtime.json", "db_config.json", "qq_config.json", "bds_updater.json", "permissions.json", "log-filter.json", "module-update.json", "pack-update.json"];
10
+ const SCHEMA_STEM = {
11
+ "log-filter.json": "log_filter",
12
+ "module-update.json": "module_update",
13
+ "pack-update.json": "pack_update"
14
+ };
15
+ const ajv = new Ajv2020.default({ allErrors: true, strict: false });
16
+ const validators = /* @__PURE__ */ new Map();
17
+ function configFiles() {
18
+ const files = new Map(CORE_FILES.map((name) => [`core/${name}`, path.join(ROOT, "configs", name)]));
19
+ files.set("bds/server.properties", path.join(resolveBdsContext().bdsRoot, "server.properties"));
20
+ const modules = path.join(ROOT, "modules", "packages");
21
+ if (fs.existsSync(modules)) for (const entry of fs.readdirSync(modules, { withFileTypes: true })) {
22
+ if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;
23
+ const configDir = path.join(modules, entry.name, "configs");
24
+ if (!fs.existsSync(configDir)) continue;
25
+ for (const filename of fs.readdirSync(configDir)) if (/^[\w.-]+\.jsonc?$/.test(filename)) files.set(`module/${entry.name}/${filename}`, path.join(configDir, filename));
26
+ }
27
+ const catalog = readJson(path.join(ROOT, "modules", "catalog.json"), {});
28
+ const taken = new Set([...files.values()].map((file) => path.resolve(file)));
29
+ for (const row of catalog.modules ?? []) {
30
+ if (!row.id || !row.configKey || !/^[\w.-]+$/.test(row.id) || !/^[\w.-]+$/.test(row.configKey)) continue;
31
+ const filename = `${row.configKey}.json`;
32
+ const file = path.join(ROOT, "configs", filename);
33
+ if (!fs.existsSync(file) || taken.has(path.resolve(file))) continue;
34
+ files.set(`module/${row.id}/${filename}`, file);
35
+ taken.add(path.resolve(file));
36
+ }
37
+ return files;
38
+ }
39
+ function configPath(key) {
40
+ const file = configFiles().get(key);
41
+ if (!file) throw Object.assign(new Error("\u914D\u7F6E\u4E0D\u5728\u5141\u8BB8\u7F16\u8F91\u7684\u5217\u8868\u4E2D"), { code: "validation" });
42
+ if (fs.existsSync(file) && fs.lstatSync(file).isSymbolicLink()) throw new Error("\u4E0D\u80FD\u901A\u8FC7\u914D\u7F6E\u6587\u4EF6\u94FE\u63A5\u5199\u5165\u5176\u4ED6\u6587\u4EF6");
43
+ return file;
44
+ }
45
+ function revision(text) {
46
+ return createHash("sha256").update(text).digest("hex");
47
+ }
48
+ function readDocument(key) {
49
+ const file = configPath(key);
50
+ const text = fs.existsSync(file) ? stripBom(fs.readFileSync(file, "utf8")) : "";
51
+ let schema;
52
+ if (key.startsWith("core/")) {
53
+ const name = SCHEMA_STEM[path.basename(file)] ?? path.basename(file, ".json");
54
+ const schemaFile = path.join(resolveSdkPackageRoot(), "schemas", `${name}.schema.json`);
55
+ if (fs.existsSync(schemaFile)) schema = JSON.parse(fs.readFileSync(schemaFile, "utf8"));
56
+ } else if (key.startsWith("module/")) {
57
+ const schemaFile = path.join(path.dirname(file), `${path.basename(file).replace(/\.jsonc?$/, "")}.schema.json`);
58
+ if (fs.existsSync(schemaFile)) schema = JSON.parse(fs.readFileSync(schemaFile, "utf8"));
59
+ }
60
+ return { key, text, revision: revision(text), ...schema ? { schema } : {}, format: file.endsWith(".properties") ? "properties" : file.endsWith(".jsonc") ? "jsonc" : "json", affectedServices: ["db", "tunnel", "qq", "llbot", "bds"] };
61
+ }
62
+ function validateDocument(document, text) {
63
+ if (Buffer.byteLength(text) > 2 * 1024 * 1024) throw new Error("\u914D\u7F6E\u6587\u4EF6\u8FC7\u5927");
64
+ if (document.format === "properties") {
65
+ for (const line of text.split(/\r?\n/)) if (line.trim() && !line.trim().startsWith("#") && !/^[^=\r\n]+=.*$/.test(line)) throw new Error("server.properties \u5305\u542B\u975E\u6CD5\u914D\u7F6E\u884C");
66
+ return;
67
+ }
68
+ const errors = [];
69
+ const value = parse(text, errors, { allowTrailingComma: document.format === "jsonc", disallowComments: document.format === "json" });
70
+ if (errors.length) throw Object.assign(new Error("\u914D\u7F6E\u8BED\u6CD5\u9519\u8BEF"), { code: "validation", details: errors });
71
+ if (document.schema) {
72
+ const schemaObject = document.schema;
73
+ if (schemaObject.additionalProperties === false && value && typeof value === "object" && !Array.isArray(value)) {
74
+ const previous = parse(document.text || "{}");
75
+ for (const key of Object.keys(value)) if (!(key in (schemaObject.properties ?? {})) && previous && key in previous && JSON.stringify(previous[key]) === JSON.stringify(value[key])) delete value[key];
76
+ }
77
+ const hash = revision(JSON.stringify(document.schema));
78
+ let validator = validators.get(hash);
79
+ if (!validator) {
80
+ const schema = { ...document.schema };
81
+ delete schema.$id;
82
+ validator = ajv.compile(schema);
83
+ validators.set(hash, validator);
84
+ }
85
+ if (!validator(value)) throw Object.assign(new Error("\u914D\u7F6E\u4E0D\u7B26\u5408 Schema"), { code: "validation", details: validator.errors });
86
+ }
87
+ }
88
+ function saveDocument(key, expected, text) {
89
+ const document = readDocument(key);
90
+ if (document.revision !== expected) throw Object.assign(new Error("\u914D\u7F6E\u5DF2\u88AB\u5176\u4ED6\u64CD\u4F5C\u4FEE\u6539\uFF0C\u8BF7\u91CD\u65B0\u8BFB\u53D6"), { code: "conflict" });
91
+ validateDocument(document, text);
92
+ const file = configPath(key);
93
+ const temp = `${file}.${randomUUID()}.tmp`;
94
+ fs.mkdirSync(path.dirname(file), { recursive: true });
95
+ fs.writeFileSync(temp, text, { mode: 384 });
96
+ fs.renameSync(temp, file);
97
+ return document;
98
+ }
99
+ export {
100
+ configFiles,
101
+ configPath,
102
+ readDocument,
103
+ revision,
104
+ saveDocument,
105
+ validateDocument
106
+ };
107
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/management/config.ts"],
4
+ "sourcesContent": ["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport Ajv2020 from \"ajv/dist/2020.js\";\nimport { parse, type ParseError } from \"jsonc-parser\";\nimport type { ConfigDocument } from \"@sfmc-bds/management\";\nimport { resolveSdkPackageRoot, ROOT } from \"../runtime.js\";\nimport { resolveBdsContext } from \"../pack-lifecycle.js\";\nimport { readJson, stripBom } from \"./domain.js\";\n\n/** \u78C1\u76D8\u4E0A\u7684\u771F\u5B9E\u6587\u4EF6\u540D\u3002schema \u6587\u4EF6\u4ECD\u7528\u4E0B\u5212\u7EBF\uFF08log_filter.schema.json\uFF09\u3002 */\nconst CORE_FILES = [\"runtime.json\", \"db_config.json\", \"qq_config.json\", \"bds_updater.json\", \"permissions.json\", \"log-filter.json\", \"module-update.json\", \"pack-update.json\"];\nconst SCHEMA_STEM: Record<string, string> = {\n \"log-filter.json\": \"log_filter\",\n \"module-update.json\": \"module_update\",\n \"pack-update.json\": \"pack_update\",\n};\nconst ajv = new Ajv2020.default({ allErrors: true, strict: false });\nconst validators = new Map<string, ReturnType<typeof ajv.compile>>();\nexport function configFiles(): Map<string, string> {\n const files = new Map(CORE_FILES.map(name => [`core/${name}`, path.join(ROOT, \"configs\", name)]));\n files.set(\"bds/server.properties\", path.join(resolveBdsContext().bdsRoot, \"server.properties\"));\n const modules = path.join(ROOT, \"modules\", \"packages\");\n if (fs.existsSync(modules)) for (const entry of fs.readdirSync(modules, { withFileTypes: true })) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;\n const configDir = path.join(modules, entry.name, \"configs\");\n if (!fs.existsSync(configDir)) continue;\n for (const filename of fs.readdirSync(configDir)) if (/^[\\w.-]+\\.jsonc?$/.test(filename)) files.set(`module/${entry.name}/${filename}`, path.join(configDir, filename));\n }\n // \u771F\u5B9E\u5B9E\u4F8B\u7684\u6A21\u5757\u914D\u7F6E\u5199\u5728 <SFMC_ROOT>/configs/<configKey>.json\uFF0C\u76EE\u5F55\u540D\u6765\u81EA catalog.configKey\u3002\n const catalog = readJson<{ modules?: { id?: string; configKey?: string }[] }>(path.join(ROOT, \"modules\", \"catalog.json\"), {});\n const taken = new Set([...files.values()].map(file => path.resolve(file)));\n for (const row of catalog.modules ?? []) {\n if (!row.id || !row.configKey || !/^[\\w.-]+$/.test(row.id) || !/^[\\w.-]+$/.test(row.configKey)) continue;\n const filename = `${row.configKey}.json`;\n const file = path.join(ROOT, \"configs\", filename);\n if (!fs.existsSync(file) || taken.has(path.resolve(file))) continue;\n files.set(`module/${row.id}/${filename}`, file);\n taken.add(path.resolve(file));\n }\n return files;\n}\nexport function configPath(key: string): string {\n const file = configFiles().get(key);\n if (!file) throw Object.assign(new Error(\"\u914D\u7F6E\u4E0D\u5728\u5141\u8BB8\u7F16\u8F91\u7684\u5217\u8868\u4E2D\"), { code: \"validation\" });\n if (fs.existsSync(file) && fs.lstatSync(file).isSymbolicLink()) throw new Error(\"\u4E0D\u80FD\u901A\u8FC7\u914D\u7F6E\u6587\u4EF6\u94FE\u63A5\u5199\u5165\u5176\u4ED6\u6587\u4EF6\");\n return file;\n}\nexport function revision(text: string) { return createHash(\"sha256\").update(text).digest(\"hex\"); }\nexport function readDocument(key: string): ConfigDocument {\n const file = configPath(key);\n const text = fs.existsSync(file) ? stripBom(fs.readFileSync(file, \"utf8\")) : \"\";\n let schema: object | undefined;\n if (key.startsWith(\"core/\")) {\n const name = SCHEMA_STEM[path.basename(file)] ?? path.basename(file, \".json\");\n const schemaFile = path.join(resolveSdkPackageRoot(), \"schemas\", `${name}.schema.json`);\n if (fs.existsSync(schemaFile)) schema = JSON.parse(fs.readFileSync(schemaFile, \"utf8\")) as object;\n } else if (key.startsWith(\"module/\")) {\n const schemaFile = path.join(path.dirname(file), `${path.basename(file).replace(/\\.jsonc?$/, \"\")}.schema.json`);\n if (fs.existsSync(schemaFile)) schema = JSON.parse(fs.readFileSync(schemaFile, \"utf8\")) as object;\n }\n return { key, text, revision: revision(text), ...(schema ? { schema } : {}), format: file.endsWith(\".properties\") ? \"properties\" : file.endsWith(\".jsonc\") ? \"jsonc\" : \"json\", affectedServices: [\"db\", \"tunnel\", \"qq\", \"llbot\", \"bds\"] };\n}\nexport function validateDocument(document: ConfigDocument, text: string) {\n if (Buffer.byteLength(text) > 2 * 1024 * 1024) throw new Error(\"\u914D\u7F6E\u6587\u4EF6\u8FC7\u5927\");\n if (document.format === \"properties\") {\n for (const line of text.split(/\\r?\\n/)) if (line.trim() && !line.trim().startsWith(\"#\") && !/^[^=\\r\\n]+=.*$/.test(line)) throw new Error(\"server.properties \u5305\u542B\u975E\u6CD5\u914D\u7F6E\u884C\");\n return;\n }\n const errors: ParseError[] = [];\n const value: unknown = parse(text, errors, { allowTrailingComma: document.format === \"jsonc\", disallowComments: document.format === \"json\" });\n if (errors.length) throw Object.assign(new Error(\"\u914D\u7F6E\u8BED\u6CD5\u9519\u8BEF\"), { code: \"validation\", details: errors });\n if (document.schema) {\n // \u4FDD\u7559\u5DF2\u6709\u672A\u77E5\u5B57\u6BB5\uFF1B\u53EA\u4ECE\u6821\u9A8C\u526F\u672C\u6392\u9664\u672A\u4FEE\u6539\u7684\u672A\u77E5\u5B57\u6BB5\uFF0C\u4FDD\u5B58\u7684\u539F\u6587\u4ECD\u5B8C\u5168\u4FDD\u7559\u3002\n const schemaObject = document.schema as { additionalProperties?: boolean; properties?: Record<string, unknown> };\n if (schemaObject.additionalProperties === false && value && typeof value === \"object\" && !Array.isArray(value)) {\n const previous = parse(document.text || \"{}\") as Record<string, unknown>;\n for (const key of Object.keys(value)) if (!(key in (schemaObject.properties ?? {})) && previous && key in previous && JSON.stringify(previous[key]) === JSON.stringify((value as Record<string, unknown>)[key])) delete (value as Record<string, unknown>)[key];\n }\n const hash = revision(JSON.stringify(document.schema));\n let validator = validators.get(hash);\n if (!validator) { const schema = { ...document.schema } as Record<string, unknown>; delete schema.$id; validator = ajv.compile(schema); validators.set(hash, validator); }\n if (!validator(value)) throw Object.assign(new Error(\"\u914D\u7F6E\u4E0D\u7B26\u5408 Schema\"), { code: \"validation\", details: validator.errors });\n }\n}\nexport function saveDocument(key: string, expected: string, text: string) {\n const document = readDocument(key);\n if (document.revision !== expected) throw Object.assign(new Error(\"\u914D\u7F6E\u5DF2\u88AB\u5176\u4ED6\u64CD\u4F5C\u4FEE\u6539\uFF0C\u8BF7\u91CD\u65B0\u8BFB\u53D6\"), { code: \"conflict\" });\n validateDocument(document, text);\n const file = configPath(key); const temp = `${file}.${randomUUID()}.tmp`;\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(temp, text, { mode: 0o600 }); fs.renameSync(temp, file);\n return document;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ export declare function deploymentPort(value: unknown, fallback: number): number;
2
+ export declare function deploymentPreflight(ports: {
3
+ db: number;
4
+ bds: number;
5
+ bds6: number;
6
+ }): Promise<void>;
7
+ //# sourceMappingURL=deployment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment.d.ts","sourceRoot":"","sources":["../../src/management/deployment.ts"],"names":[],"mappings":"AAKA,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAI9D;AACD,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,iBAgBzF"}
@@ -0,0 +1,36 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import net from "node:net";
4
+ import dgram from "node:dgram";
5
+ import { ROOT } from "../runtime.js";
6
+ function deploymentPort(value, fallback) {
7
+ const port = value === void 0 ? fallback : Number(value);
8
+ if (!Number.isInteger(port) || port < 1 || port > 65535) throw new Error("\u7AEF\u53E3\u5FC5\u987B\u4E3A 1 \u5230 65535 \u7684\u6574\u6570");
9
+ return port;
10
+ }
11
+ async function deploymentPreflight(ports) {
12
+ if (path.resolve(ROOT) === path.parse(ROOT).root) throw new Error("\u4E0D\u80FD\u5728\u78C1\u76D8\u6839\u76EE\u5F55\u521B\u5EFA\u90E8\u7F72");
13
+ for (const file of ["BDS/bedrock_server.exe", "BDS/bedrock_server", "data/sfmc_data.db"]) if (fs.existsSync(path.join(ROOT, file))) throw new Error("\u5DF2\u6709 BDS \u6216\u6570\u636E\u5E93\uFF0C\u8BF7\u63A5\u5165\u73B0\u6709\u90E8\u7F72\uFF0C\u4E0D\u8986\u76D6\u6570\u636E");
14
+ const space = fs.statfsSync(ROOT);
15
+ if (space.bavail * space.bsize < 1024 ** 3) throw new Error("\u53EF\u7528\u7A7A\u95F4\u4E0D\u8DB3 1 GiB\uFF0C\u65E0\u6CD5\u51C6\u5907\u8FD0\u884C\u65F6\u3001BDS \u548C\u7EF4\u62A4\u5907\u4EFD");
16
+ await new Promise((resolve, reject) => {
17
+ const server = net.createServer();
18
+ server.once("error", (error) => reject(new Error(`DB \u7AEF\u53E3 ${ports.db} \u4E0D\u53EF\u7528: ${error.message}`)));
19
+ server.listen(ports.db, "0.0.0.0", () => server.close((error) => error ? reject(error) : resolve()));
20
+ });
21
+ for (const [port, type, address] of [[ports.bds, "udp4", "0.0.0.0"], [ports.bds6, "udp6", "::"]]) {
22
+ await new Promise((resolve, reject) => {
23
+ const socket = dgram.createSocket(type);
24
+ socket.once("error", (error) => {
25
+ socket.close();
26
+ reject(new Error(`BDS \u7AEF\u53E3 ${port} \u4E0D\u53EF\u7528: ${error.message}`));
27
+ });
28
+ socket.bind(port, address, () => socket.close(() => resolve()));
29
+ });
30
+ }
31
+ }
32
+ export {
33
+ deploymentPort,
34
+ deploymentPreflight
35
+ };
36
+ //# sourceMappingURL=deployment.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/management/deployment.ts"],
4
+ "sourcesContent": ["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport net from \"node:net\";\nimport dgram from \"node:dgram\";\nimport { ROOT } from \"../runtime.js\";\nexport function deploymentPort(value: unknown, fallback: number) {\n const port = value === undefined ? fallback : Number(value);\n if (!Number.isInteger(port) || port < 1 || port > 65535) throw new Error(\"\u7AEF\u53E3\u5FC5\u987B\u4E3A 1 \u5230 65535 \u7684\u6574\u6570\");\n return port;\n}\nexport async function deploymentPreflight(ports: { db: number; bds: number; bds6: number }) {\n if (path.resolve(ROOT) === path.parse(ROOT).root) throw new Error(\"\u4E0D\u80FD\u5728\u78C1\u76D8\u6839\u76EE\u5F55\u521B\u5EFA\u90E8\u7F72\");\n for (const file of [\"BDS/bedrock_server.exe\", \"BDS/bedrock_server\", \"data/sfmc_data.db\"]) if (fs.existsSync(path.join(ROOT, file))) throw new Error(\"\u5DF2\u6709 BDS \u6216\u6570\u636E\u5E93\uFF0C\u8BF7\u63A5\u5165\u73B0\u6709\u90E8\u7F72\uFF0C\u4E0D\u8986\u76D6\u6570\u636E\");\n const space = fs.statfsSync(ROOT);\n if (space.bavail * space.bsize < 1024 ** 3) throw new Error(\"\u53EF\u7528\u7A7A\u95F4\u4E0D\u8DB3 1 GiB\uFF0C\u65E0\u6CD5\u51C6\u5907\u8FD0\u884C\u65F6\u3001BDS \u548C\u7EF4\u62A4\u5907\u4EFD\");\n await new Promise<void>((resolve, reject) => {\n const server = net.createServer(); server.once(\"error\", error => reject(new Error(`DB \u7AEF\u53E3 ${ports.db} \u4E0D\u53EF\u7528: ${error.message}`)));\n server.listen(ports.db, \"0.0.0.0\", () => server.close(error => error ? reject(error) : resolve()));\n });\n for (const [port, type, address] of [[ports.bds, \"udp4\", \"0.0.0.0\"], [ports.bds6, \"udp6\", \"::\"]] as const) {\n await new Promise<void>((resolve, reject) => {\n const socket = dgram.createSocket(type);\n socket.once(\"error\", error => { socket.close(); reject(new Error(`BDS \u7AEF\u53E3 ${port} \u4E0D\u53EF\u7528: ${error.message}`)); });\n socket.bind(port, address, () => socket.close(() => resolve()));\n });\n }\n}\n"],
5
+ "mappings": "AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,SAAS;AAChB,OAAO,WAAW;AAClB,SAAS,YAAY;AACd,SAAS,eAAe,OAAgB,UAAkB;AAC/D,QAAM,OAAO,UAAU,SAAY,WAAW,OAAO,KAAK;AAC1D,MAAI,CAAC,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,OAAO,MAAO,OAAM,IAAI,MAAM,kEAAqB;AAC9F,SAAO;AACT;AACA,eAAsB,oBAAoB,OAAkD;AAC1F,MAAI,KAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,IAAI,EAAE,KAAM,OAAM,IAAI,MAAM,0EAAc;AAChF,aAAW,QAAQ,CAAC,0BAA0B,sBAAsB,mBAAmB,EAAG,KAAI,GAAG,WAAW,KAAK,KAAK,MAAM,IAAI,CAAC,EAAG,OAAM,IAAI,MAAM,+HAA2B;AAC/K,QAAM,QAAQ,GAAG,WAAW,IAAI;AAChC,MAAI,MAAM,SAAS,MAAM,QAAQ,QAAQ,EAAG,OAAM,IAAI,MAAM,oIAAgC;AAC5F,QAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,UAAM,SAAS,IAAI,aAAa;AAAG,WAAO,KAAK,SAAS,WAAS,OAAO,IAAI,MAAM,mBAAS,MAAM,EAAE,wBAAS,MAAM,OAAO,EAAE,CAAC,CAAC;AAC7H,WAAO,OAAO,MAAM,IAAI,WAAW,MAAM,OAAO,MAAM,WAAS,QAAQ,OAAO,KAAK,IAAI,QAAQ,CAAC,CAAC;AAAA,EACnG,CAAC;AACD,aAAW,CAAC,MAAM,MAAM,OAAO,KAAK,CAAC,CAAC,MAAM,KAAK,QAAQ,SAAS,GAAG,CAAC,MAAM,MAAM,QAAQ,IAAI,CAAC,GAAY;AACzG,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,YAAM,SAAS,MAAM,aAAa,IAAI;AACtC,aAAO,KAAK,SAAS,WAAS;AAAE,eAAO,MAAM;AAAG,eAAO,IAAI,MAAM,oBAAU,IAAI,wBAAS,MAAM,OAAO,EAAE,CAAC;AAAA,MAAG,CAAC;AAC5G,aAAO,KAAK,MAAM,SAAS,MAAM,OAAO,MAAM,MAAM,QAAQ,CAAC,CAAC;AAAA,IAChE,CAAC;AAAA,EACH;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * 去掉 UTF-8 BOM。
3
+ * 使用场景:编辑器或 BDS 写出的 JSON(例如 configs/permissions.json)常带 BOM,直接 JSON.parse 会失败。
4
+ */
5
+ export declare function stripBom(text: string): string;
6
+ export declare function readJson<T>(file: string, fallback: T): T;
7
+ export declare function identifier(value: unknown): string;
8
+ export declare function listModules(): Promise<{
9
+ modules: {
10
+ id: string;
11
+ folder: string;
12
+ name: string;
13
+ version: string;
14
+ enabled: boolean;
15
+ linked: boolean;
16
+ }[];
17
+ }>;
18
+ export declare function searchModules(query: string): Promise<{
19
+ modules: {
20
+ npm?: string;
21
+ version?: string;
22
+ sdk?: string;
23
+ repo?: string;
24
+ tag?: string;
25
+ id: string;
26
+ }[];
27
+ stale: boolean;
28
+ }>;
29
+ export declare function runFetch(args: string[]): Promise<{
30
+ changed: boolean;
31
+ }>;
32
+ export declare function runProcess(command: string, args: string[], cwd: string, onLine?: (text: string) => void): Promise<void>;
33
+ export declare function modulePlan(ids?: string[]): Promise<unknown>;
34
+ export declare function applyModulePlan(ids: string[]): Promise<{
35
+ failed: {
36
+ id: string;
37
+ message: string;
38
+ }[];
39
+ }>;
40
+ export declare function listPacks(): {
41
+ packs: {
42
+ id: string;
43
+ name: string;
44
+ kind: import("@sfmc-bds/bds-tools/world-packs").WorldPackKind;
45
+ enabled: boolean;
46
+ version: string;
47
+ }[];
48
+ };
49
+ export declare function togglePack(id: string, enabled: boolean): Promise<{
50
+ changed: boolean;
51
+ restartRequired: boolean;
52
+ }>;
53
+ export declare function importPack(filename: string): Promise<{
54
+ changed: boolean;
55
+ restartRequired: boolean;
56
+ }>;
57
+ export declare function playerFiles(): {
58
+ allowlist: string;
59
+ permissions: string;
60
+ sfmcPermissions: string;
61
+ };
62
+ export declare function savePlayerPermissions(kind: string, entries: unknown): {
63
+ saved: boolean;
64
+ };
65
+ //# sourceMappingURL=domain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../src/management/domain.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AACD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAGxD;AACD,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGjD;AACD,wBAAsB,WAAW;;;;;;;;;GAMhC;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM;;;;;;;;;;GAGhD;AACD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE;;GAG5C;AACD,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvH;AACD,wBAAsB,UAAU,CAAC,GAAG,GAAE,MAAM,EAAO,oBAIlD;AACD,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE;YAI+B;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE;GAQlH;AACD,wBAAgB,SAAS;IAEd,KAAK;;;;;;;EACf;AACD,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;;;GAO5D;AACD,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM;;;GAiBhD;AACD,wBAAgB,WAAW;IAEhB,SAAS;IAAoC,WAAW;IAAsC,eAAe;EACvH;AACD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IAWzD,KAAK;EACf"}