@sfmc-bds/cli 0.2.0-beta.14 → 0.2.0-beta.16

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 (61) hide show
  1. package/dist/i18n/locales/en.d.ts +10 -5
  2. package/dist/i18n/locales/en.d.ts.map +1 -1
  3. package/dist/i18n/locales/en.js +5 -0
  4. package/dist/i18n/locales/en.js.map +2 -2
  5. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  6. package/dist/i18n/locales/zh-CN.js +5 -0
  7. package/dist/i18n/locales/zh-CN.js.map +2 -2
  8. package/dist/logs-blank-line.test.js +16 -0
  9. package/dist/logs-blank-line.test.js.map +7 -0
  10. package/dist/logs.d.ts +2 -0
  11. package/dist/logs.d.ts.map +1 -1
  12. package/dist/logs.js +8 -1
  13. package/dist/logs.js.map +2 -2
  14. package/dist/module-pack-build.d.ts +1 -1
  15. package/dist/module-pack-build.d.ts.map +1 -1
  16. package/dist/module-pack-build.js +20 -51
  17. package/dist/module-pack-build.js.map +2 -2
  18. package/dist/pack-bundle.test.js +6 -0
  19. package/dist/pack-bundle.test.js.map +2 -2
  20. package/dist/pack-lifecycle.d.ts.map +1 -1
  21. package/dist/pack-lifecycle.js +1 -1
  22. package/dist/pack-lifecycle.js.map +2 -2
  23. package/dist/repl-windows/host.d.ts +6 -3
  24. package/dist/repl-windows/host.d.ts.map +1 -1
  25. package/dist/repl-windows/host.js +12 -6
  26. package/dist/repl-windows/host.js.map +2 -2
  27. package/dist/repl-windows/host.test.js +72 -0
  28. package/dist/repl-windows/host.test.js.map +7 -0
  29. package/dist/repl-windows/index.d.ts +1 -0
  30. package/dist/repl-windows/index.d.ts.map +1 -1
  31. package/dist/repl-windows/index.js +3 -0
  32. package/dist/repl-windows/index.js.map +2 -2
  33. package/dist/repl-windows/sfmc-window.d.ts +7 -0
  34. package/dist/repl-windows/sfmc-window.d.ts.map +1 -0
  35. package/dist/repl-windows/sfmc-window.js +28 -0
  36. package/dist/repl-windows/sfmc-window.js.map +7 -0
  37. package/dist/repl.d.ts.map +1 -1
  38. package/dist/repl.js +21 -7
  39. package/dist/repl.js.map +2 -2
  40. package/dist/send-target.d.ts +2 -0
  41. package/dist/send-target.d.ts.map +1 -1
  42. package/dist/send-target.js +4 -0
  43. package/dist/send-target.js.map +2 -2
  44. package/dist/services-output.test.js +9 -0
  45. package/dist/services-output.test.js.map +7 -0
  46. package/dist/services.d.ts +2 -0
  47. package/dist/services.d.ts.map +1 -1
  48. package/dist/services.js +6 -2
  49. package/dist/services.js.map +2 -2
  50. package/dist/world-packs-list.test.js +11 -0
  51. package/dist/world-packs-list.test.js.map +7 -0
  52. package/dist/world-packs.d.ts +2 -0
  53. package/dist/world-packs.d.ts.map +1 -1
  54. package/dist/world-packs.js +90 -18
  55. package/dist/world-packs.js.map +3 -3
  56. package/package.json +4 -4
  57. package/scripts/module-install/check-modules.mjs +42 -2
  58. package/scripts/module-install/fetch-module.mjs +70 -46
  59. package/scripts/module-install/lib/config-seeding.mjs +128 -0
  60. package/scripts/module-install/test/check-modules-config.test.ts +46 -0
  61. package/scripts/module-install/test/config-seeding.test.ts +99 -0
package/dist/logs.d.ts CHANGED
@@ -19,6 +19,8 @@ export interface UnifiedLog extends LogEntry {
19
19
  }
20
20
  /** 再导出 SDK BDS 解析(测试与调用方统一入口,权威在 @sfmc-bds/sdk/logs) */
21
21
  export { mapBdsLevelToken, parseBdsEmbeddedLevel, stripBdsLogPrefix } from "@sfmc-bds/sdk/logs";
22
+ /** 剥离 BDS 自带前缀;若前缀后没有正文,则判定为仅用于排版的空行。 */
23
+ export declare function normalizeBdsLogBody(text: string): string | null;
22
24
  /** 推送一条日志到内存缓冲,并按策略落盘 */
23
25
  export declare function pushLog(text: string, source: LogSource, level: LogLevel): void;
24
26
  /** 订阅新日志事件,返回取消订阅函数 */
@@ -1 +1 @@
1
- {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../src/logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAQL,KAAK,QAAQ,EACb,KAAK,QAAQ,IAAI,cAAc,EAChC,MAAM,oBAAoB,CAAC;AAa5B,MAAM,MAAM,QAAQ,GAAG,cAAc,CAAC;AACtC,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAC/B,MAAM,WAAW,UAAW,SAAQ,QAAQ;CAAG;AAE/C,wDAAwD;AACxD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AA+BhG,yBAAyB;AACzB,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CA6C9E;AAED,uBAAuB;AACvB,wBAAgB,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,CAE/D;AAED,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU,EAAE,CAG/F;AAED,qDAAqD;AACrD,wBAAgB,UAAU,IAAI,UAAU,EAAE,CAGzC;AASD,6BAA6B;AAC7B,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIxD;AAuBD,2BAA2B;AAC3B,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAS/D;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,gBAAqB,GAAG,UAAU,EAAE,CA+BtE;AAMD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,WAAW,EAAE,UAAU,EASnC,CAAC;AASF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,UAAU,GAAG,QAAQ,CAM3D;AAED,oCAAoC;AACpC,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAEjD;AA+BD,4CAA4C;AAC5C,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAW/C;AAwBD,2CAA2C;AAC3C,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAKpD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAa7D"}
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../src/logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAQL,KAAK,QAAQ,EACb,KAAK,QAAQ,IAAI,cAAc,EAChC,MAAM,oBAAoB,CAAC;AAa5B,MAAM,MAAM,QAAQ,GAAG,cAAc,CAAC;AACtC,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAC/B,MAAM,WAAW,UAAW,SAAQ,QAAQ;CAAG;AAE/C,wDAAwD;AACxD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAShG,yCAAyC;AACzC,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG/D;AAwBD,yBAAyB;AACzB,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CA+C9E;AAED,uBAAuB;AACvB,wBAAgB,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,CAE/D;AAED,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU,EAAE,CAG/F;AAED,qDAAqD;AACrD,wBAAgB,UAAU,IAAI,UAAU,EAAE,CAGzC;AASD,6BAA6B;AAC7B,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIxD;AAuBD,2BAA2B;AAC3B,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAS/D;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,gBAAqB,GAAG,UAAU,EAAE,CA+BtE;AAMD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,WAAW,EAAE,UAAU,EASnC,CAAC;AASF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,UAAU,GAAG,QAAQ,CAM3D;AAED,oCAAoC;AACpC,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAEjD;AA+BD,4CAA4C;AAC5C,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAW/C;AAwBD,2CAA2C;AAC3C,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAKpD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAa7D"}
package/dist/logs.js CHANGED
@@ -21,6 +21,10 @@ import { mapBdsLevelToken, parseBdsEmbeddedLevel as parseBdsEmbeddedLevel2, stri
21
21
  const buffer = createMemoryBuffer(5e3);
22
22
  const CHILD_OWNED_SOURCES = /* @__PURE__ */ new Set(["db", "qq", "update"]);
23
23
  const fileSinks = /* @__PURE__ */ new Map();
24
+ function normalizeBdsLogBody(text) {
25
+ const body = stripBdsLogPrefix(text);
26
+ return body.trim().length > 0 ? body : null;
27
+ }
24
28
  function resolveDiskLogName(source) {
25
29
  if (CHILD_OWNED_SOURCES.has(source)) return null;
26
30
  if (source === "bds" || source === "llbot") return source;
@@ -45,7 +49,9 @@ function pushLog(text, source, level) {
45
49
  if (source === "bds") {
46
50
  const embedded = parseBdsEmbeddedLevel(text);
47
51
  if (embedded) lvl = embedded;
48
- body = stripBdsLogPrefix(text);
52
+ const normalized = normalizeBdsLogBody(text);
53
+ if (normalized === null) return;
54
+ body = normalized;
49
55
  }
50
56
  const rawEntry = { time: /* @__PURE__ */ new Date(), text: body, source, level: lvl };
51
57
  const filter = getCompiledLogFilter((src) => {
@@ -302,6 +308,7 @@ export {
302
308
  inferLevel,
303
309
  logPrefixWidth,
304
310
  mapBdsLevelToken,
311
+ normalizeBdsLogBody,
305
312
  onLog,
306
313
  parseBdsEmbeddedLevel2 as parseBdsEmbeddedLevel,
307
314
  parseDiskLogLine,
package/dist/logs.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/logs.ts"],
4
- "sourcesContent": ["/**\n * logs.ts \u2014 sfmc \u4E3B\u8FDB\u7A0B\u7EDF\u4E00\u65E5\u5FD7\u805A\u5408\u5C42\n *\n * \u5185\u90E8\u59D4\u6258 @sfmc-bds/logs \u5171\u4EAB\u5305\u7684 createMemoryBuffer + inferLevel,\n * \u4FDD\u6301\u5411\u540E\u517C\u5BB9\u7684 pushLog / onLog / getAllLogs / getRecentLogs API\n * (services.ts \u6355\u83B7\u5B50\u8FDB\u7A0B stdout \u540E\u8C03\u7528 pushLog \u6C47\u805A\u5230\u6B64)\u3002\n *\n * \u843D\u76D8\u7B56\u7565(\u4E0E\u5B50\u8FDB\u7A0B\u81EA\u5199\u6587\u4EF6\u5206\u5DE5,\u907F\u514D\u91CD\u590D):\n * - db / qq / update \u2192 \u5B50\u8FDB\u7A0B\u5DF2\u5199 `.sfmc/logs/{db,qq,bds-update}.log`,\u6B64\u5904\u8DF3\u8FC7\n * - bds / llbot \u2192 `.sfmc/logs/{bds,llbot}.log`(\u5916\u90E8\u8FDB\u7A0B\u65E0\u81EA\u5E26 file sink)\n * - \u5176\u4F59(system / pack / \u2026) \u2192 `.sfmc/logs/sfmc.log`\n *\n * formatLog \u4FDD\u7559 theme.ts (chalk) \u914D\u8272,\u6BD4\u5171\u4EAB\u5305\u7684\u7EAF ANSI \u7248\u672C\u89C6\u89C9\u66F4\u4E30\u5BCC\u3002\n */\n\nimport {\n createFileSink,\n createMemoryBuffer,\n formatLogLine,\n inferLevel as sharedInferLevel,\n parseBdsEmbeddedLevel,\n stripBdsLogPrefix,\n type FileSink,\n type LogEntry,\n type LogLevel as SharedLogLevel,\n} from \"@sfmc-bds/sdk/logs\";\nimport { logFile, logsDir } from \"@sfmc-bds/sdk/node/config\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n getCompiledLogFilter,\n shouldDropForDisk,\n shouldDropForDisplay,\n transformLogEntry,\n} from \"./log-filter.js\";\nimport { c, highlightLogLine } from \"./theme.js\";\nimport { ROOT } from \"./runtime.js\";\n\nexport type LogLevel = SharedLogLevel;\nexport type LogSource = string;\nexport interface UnifiedLog extends LogEntry {}\n\n/** \u518D\u5BFC\u51FA SDK BDS \u89E3\u6790\uFF08\u6D4B\u8BD5\u4E0E\u8C03\u7528\u65B9\u7EDF\u4E00\u5165\u53E3\uFF0C\u6743\u5A01\u5728 @sfmc-bds/sdk/logs\uFF09 */\nexport { mapBdsLevelToken, parseBdsEmbeddedLevel, stripBdsLogPrefix } from \"@sfmc-bds/sdk/logs\";\n\nconst buffer = createMemoryBuffer(5000);\n\n/** \u5B50\u8FDB\u7A0B\u5DF2\u7528 createNodeServiceLogger \u81EA\u884C\u843D\u76D8\u7684 source */\nconst CHILD_OWNED_SOURCES = new Set([\"db\", \"qq\", \"update\"]);\n\nconst fileSinks = new Map<string, FileSink>();\n\n/** \u89E3\u6790\u672C\u6761\u65E5\u5FD7\u5E94\u5199\u5165\u7684\u6587\u4EF6\u540D(\u4E0D\u542B .log);null \u8868\u793A\u8DF3\u8FC7(\u5B50\u8FDB\u7A0B\u5DF2\u5199) */\nfunction resolveDiskLogName(source: string): string | null {\n if (CHILD_OWNED_SOURCES.has(source)) return null;\n if (source === \"bds\" || source === \"llbot\") return source;\n return \"sfmc\";\n}\n\nfunction sinkFor(source: string): FileSink | null {\n const name = resolveDiskLogName(source);\n if (!name) return null;\n let sink = fileSinks.get(name);\n if (!sink) {\n sink = createFileSink(logFile(ROOT, name));\n fileSinks.set(name, sink);\n }\n return sink;\n}\n\nprocess.on(\"exit\", () => {\n for (const sink of fileSinks.values()) sink.close();\n});\n\n/** \u63A8\u9001\u4E00\u6761\u65E5\u5FD7\u5230\u5185\u5B58\u7F13\u51B2,\u5E76\u6309\u7B56\u7565\u843D\u76D8 */\nexport function pushLog(text: string, source: LogSource, level: LogLevel): void {\n let body = text;\n let lvl = level;\n /* BDS\uFF1A\u5148\u63D0\u53D6\u5185\u5D4C\u7EA7\u522B\uFF0C\u518D\u5265\u6389\u81EA\u5E26\u65F6\u95F4\u6233+\u7B49\u7EA7\uFF0C\u907F\u514D\u5C55\u793A/\u843D\u76D8\u91CD\u590D */\n if (source === \"bds\") {\n const embedded = parseBdsEmbeddedLevel(text);\n if (embedded) lvl = embedded;\n body = stripBdsLogPrefix(text);\n }\n\n const rawEntry: LogEntry = { time: new Date(), text: body, source, level: lvl };\n const filter = getCompiledLogFilter((src) => {\n /* \u907F\u514D\u9012\u5F52\uFF1A\u975E\u6CD5\u6B63\u5219\u53EA\u5199\u6587\u4EF6 sink\uFF0C\u4E0D\u7ECF pushLog */\n try {\n const sink = sinkFor(\"system\");\n if (!sink) return;\n const warn: LogEntry = {\n time: new Date(),\n text: `log-filter: invalid regex skipped: ${src}`,\n source: \"system\",\n level: \"warn\",\n };\n sink.write(warn, formatLogLine(warn, false));\n } catch {\n /* ignore */\n }\n });\n\n const dropDisplay = shouldDropForDisplay(rawEntry, filter);\n const dropDisk = shouldDropForDisk(rawEntry, filter);\n const { entry: transformedEntry } = transformLogEntry(rawEntry, filter);\n\n if (!dropDisplay) {\n buffer.pushDirect(transformedEntry.text, source, lvl);\n }\n\n if (dropDisk) return;\n const sink = sinkFor(source);\n if (!sink) return;\n try {\n const diskEntry: LogEntry = filter.applyTo === \"all\" ? { ...rawEntry, text: transformedEntry.text } : rawEntry;\n sink.write(diskEntry, formatLogLine(diskEntry, false));\n } catch {\n /* \u843D\u76D8\u5931\u8D25\u4E0D\u963B\u65AD\u4E3B\u6D41\u7A0B */\n }\n}\n\n/** \u8BA2\u9605\u65B0\u65E5\u5FD7\u4E8B\u4EF6,\u8FD4\u56DE\u53D6\u6D88\u8BA2\u9605\u51FD\u6570 */\nexport function onLog(fn: (log: UnifiedLog) => void): () => void {\n return buffer.subscribe(fn);\n}\n\n/** \u83B7\u53D6\u6700\u8FD1 n \u6761,\u53EF\u6309 level / source \u8FC7\u6EE4\uFF1B\u518D\u5957\u914D\u7F6E\u8FC7\u6EE4\uFF08display\uFF09 */\nexport function getRecentLogs(n: number, levels: LogLevel[], sources: LogSource[]): UnifiedLog[] {\n const filter = getCompiledLogFilter();\n return buffer.getRecent(n, levels, sources).filter((l) => !shouldDropForDisplay(l, filter));\n}\n\n/** \u83B7\u53D6\u5168\u90E8\u65E5\u5FD7\uFF1B\u914D\u7F6E\u8FC7\u6EE4\u4EC5\u5F71\u54CD\u8FD4\u56DE\u89C6\u56FE\uFF08\u7F13\u51B2\u5185\u53EF\u80FD\u4ECD\u6709\u5168\u91CF\uFF0C\u89C6 push \u65F6 applyTo\uFF09 */\nexport function getAllLogs(): UnifiedLog[] {\n const filter = getCompiledLogFilter();\n return buffer.getAll().filter((l) => !shouldDropForDisplay(l, filter));\n}\n\n/* ==================================================================\n * \u843D\u76D8\u6587\u4EF6\u8BFB\u53D6\uFF08/logs \u7A97\u7528\uFF0C\u4E0D\u8D70\u5185\u5B58\u7F13\u51B2\uFF09\n * ================================================================== */\n\n/** \u4E0E\u843D\u76D8\u7B56\u7565\u5BF9\u5E94\u7684\u6587\u4EF6\u57FA\u540D\uFF08\u4E0D\u542B .log\uFF09 */\nconst DISK_LOG_FILES = [\"bds\", \"llbot\", \"db\", \"qq\", \"bds-update\", \"sfmc\"] as const;\n\n/** source \u2192 \u843D\u76D8\u6587\u4EF6\u540D\uFF08\u542B\u5B50\u8FDB\u7A0B\u81EA\u5199\uFF09 */\nexport function diskFileForSource(source: string): string {\n if (source === \"update\") return \"bds-update\";\n if (source === \"bds\" || source === \"llbot\" || source === \"db\" || source === \"qq\") return source;\n return \"sfmc\";\n}\n\n/** formatLogLine \u65E0\u8272\u884C\uFF1A`YYYY-MM-DD HH:mm:ss [source] [LEVEL] text` */\nconst DISK_LINE_RE =\n /^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}) \\[([^\\]]+)\\] \\[(INFO|WARN|ERROR|OK|DEBUG|SUCCESS|FATAL)\\]\\s?(.*)$/;\n\nfunction mapDiskLevelTag(tag: string): LogLevel {\n switch (tag) {\n case \"ERROR\":\n case \"FATAL\":\n return \"error\";\n case \"WARN\":\n return \"warn\";\n case \"OK\":\n case \"SUCCESS\":\n return \"success\";\n case \"DEBUG\":\n return \"debug\";\n default:\n return \"info\";\n }\n}\n\n/** \u89E3\u6790\u5355\u884C\u843D\u76D8\u65E5\u5FD7\uFF1B\u4E0D\u7B26\u683C\u5F0F\u8FD4\u56DE null */\nexport function parseDiskLogLine(raw: string): UnifiedLog | null {\n const m = DISK_LINE_RE.exec(raw);\n if (!m) return null;\n const ts = m[1]!;\n const source = m[2]!.trim();\n const level = mapDiskLevelTag(m[3]!);\n const body = m[4] ?? \"\";\n const time = new Date(ts.replace(\" \", \"T\") + \"Z\");\n return { time, source, level, text: body };\n}\n\nexport type ReadDiskLogsOpts = {\n levels?: LogLevel[];\n sources?: LogSource[];\n /** \u8986\u76D6\u65E5\u5FD7\u76EE\u5F55\uFF08\u6D4B\u8BD5\u7528\uFF09\uFF1B\u9ED8\u8BA4 `<ROOT>/.sfmc/logs` */\n dir?: string;\n};\n\n/**\n * \u4ECE `.sfmc/logs/*.log` \u8BFB\u53D6\u5E76\u89E3\u6790\u4E3A UnifiedLog\uFF08\u6309\u65F6\u95F4\u5347\u5E8F\uFF09\u3002\n * \u4F9B /logs \u7B5B\u9009\u7A97\u56DE\u653E\uFF1B\u4E0E\u5185\u5B58\u7F13\u51B2\u65E0\u5173\u3002\n */\nexport function readDiskLogs(opts: ReadDiskLogsOpts = {}): UnifiedLog[] {\n const levels = opts.levels ?? [];\n const sources = opts.sources ?? [];\n const dir = opts.dir ?? logsDir(ROOT);\n const fileNames = new Set<string>();\n if (sources.length === 0) {\n for (const n of DISK_LOG_FILES) fileNames.add(n);\n } else {\n for (const s of sources) fileNames.add(diskFileForSource(s));\n }\n\n const out: UnifiedLog[] = [];\n for (const name of fileNames) {\n const fp = path.join(dir, name.endsWith(\".log\") ? name : `${name}.log`);\n let text: string;\n try {\n text = fs.readFileSync(fp, \"utf8\");\n } catch {\n continue;\n }\n for (const raw of text.split(/\\r?\\n/)) {\n if (!raw) continue;\n const entry = parseDiskLogLine(raw);\n if (!entry) continue;\n if (sources.length && !sources.includes(entry.source)) continue;\n if (levels.length && !levels.includes(entry.level)) continue;\n out.push(entry);\n }\n }\n out.sort((a, b) => a.time.getTime() - b.time.getTime());\n return out;\n}\n\n/* ==================================================================\n * \u6765\u6E90\u6807\u7B7E\u5143\u6570\u636E (\u65B9\u62EC\u53F7\u4E0E\u6587\u5B57\u540C\u8272,\u5BF9\u9F50 levelTag)\n * ================================================================== */\n\nexport interface SourceMeta {\n value: string;\n /** \u65B9\u62EC\u53F7\u5185\u56FA\u5B9A 3 \u5B57\u7B26\uFF0C\u4E0E [INF] \u5BF9\u9F50 */\n name: string;\n paint: (s: string) => string;\n}\n\nexport const SOURCE_META: SourceMeta[] = [\n { value: \"bds\", name: \"BDS\", paint: (s) => c.green(s) },\n { value: \"db\", name: \"DB \", paint: (s) => c.blue(s) },\n { value: \"qq\", name: \"QQ \", paint: (s) => c.purple(s) },\n { value: \"llbot\", name: \"BOT\", paint: (s) => c.yellow(s) },\n { value: \"system\", name: \"SYS\", paint: (s) => c.cyan(s) },\n { value: \"update\", name: \"UPD\", paint: (s) => c.orange(s) },\n { value: \"pack\", name: \"PAK\", paint: (s) => c.purple(s) },\n { value: \"bds-tools\", name: \"TOL\", paint: (s) => c.red(s) },\n];\n\n/** \u6E90\u6807\u7B7E\u65E0\u8272\u6587\u672C\uFF08formatSourceTag / logPrefixWidth \u5171\u7528\uFF09 */\nfunction sourceTagPlain(source: string): string {\n const meta = SOURCE_META.find((m) => m.value === source);\n if (meta) return `[${meta.name}]`;\n return `[${source.toUpperCase().padEnd(3).slice(0, 3)}]`;\n}\n\nexport function formatSourceTag(source: string): string {\n const meta = SOURCE_META.find((m) => m.value === source);\n const plain = sourceTagPlain(source);\n if (meta) return meta.paint(plain);\n return c.bold(plain);\n}\n\n/**\n * \u5C55\u793A\u7528\u7EA7\u522B\uFF1ABDS \u82E5\u4ECD\u5E26\u65F6\u95F4\u6233\u524D\u7F00\u5219\u89E3\u6790\u5185\u5D4C\u7EA7\u522B\uFF1B\u5DF2\u5265\u79BB\uFF08pushLog \u5165\u5E93\uFF09\u5219\u4FE1\u4EFB entry.level\u3002\n * \u7981\u6B62\u5BF9\u6B63\u6587\u505A\u677E\u6563\u5173\u952E\u8BCD\u5339\u914D\uFF08\u4F1A\u628A `[Commands] Error on line` \u8BEF\u5224\u4E3A error\uFF09\u3002\n */\nexport function resolveDisplayLevel(l: UnifiedLog): LogLevel {\n if (l.source === \"bds\") {\n const embedded = parseBdsEmbeddedLevel(l.text);\n if (embedded) return embedded;\n }\n return l.level;\n}\n\n/** \u4ECE\u539F\u59CB\u6587\u672C\u63A8\u65AD\u7EA7\u522B\uFF1A\u59D4\u6258\u5171\u4EAB\u5305\uFF08\u5185\u542B BDS \u65F6\u95F4\u6233\u89E3\u6790\uFF09 */\nexport function inferLevel(text: string): LogLevel {\n return sharedInferLevel(text);\n}\n\n/** \u65E0\u8272\u7EA7\u522B\u6807\u7B7E\u6587\u672C\uFF08\u53EF\u89C1\u5BBD\u5EA6\u6743\u5A01\u6E90\uFF1B\u62EC\u53F7\u5185\u5747\u4E3A 3 \u5B57\u7B26\uFF09 */\nconst LEVEL_TAG_TEXT: Record<LogLevel, string> = {\n error: \"[ERR]\",\n warn: \"[WRN]\",\n success: \"[SUC]\",\n debug: \"[DBG]\",\n info: \"[INF]\",\n};\n\nfunction levelTagPlain(lvl: LogLevel): string {\n return LEVEL_TAG_TEXT[lvl] ?? LEVEL_TAG_TEXT.info;\n}\n\nfunction levelTag(lvl: LogLevel): string {\n const text = levelTagPlain(lvl);\n switch (lvl) {\n case \"error\":\n return c.red(text);\n case \"warn\":\n return c.yellow(text);\n case \"success\":\n return c.green(c.bold(text));\n case \"debug\":\n return c.dim(text);\n default:\n return c.blue(text);\n }\n}\n\n/** \u683C\u5F0F\u5316\u65E5\u5FD7\u7528\u4E8E REPL \u5C55\u793A (\u7528 theme.ts chalk \u914D\u8272) */\nexport function formatLog(l: UnifiedLog): string {\n const ts = c.dim(l.time.toLocaleTimeString());\n const level = resolveDisplayLevel(l);\n const lvl = levelTag(level);\n const src = formatSourceTag(l.source);\n /* BDS\uFF1A\u53BB\u6389\u81EA\u5E26\u65F6\u95F4\u6233+\u7B49\u7EA7\u524D\u7F00\u540E\u518D\u672C\u5730\u5316\u7FFB\u8BD1\u4E0E\u9AD8\u4EAE\u6B63\u6587\uFF08push \u65F6\u591A\u534A\u5DF2\u8F6C\u8FC7\uFF0C\u6B64\u5904\u5E42\u7B49\u4E14\u8986\u76D6\u56DE\u653E\uFF09 */\n const body = l.source === \"bds\" ? stripBdsLogPrefix(l.text) : l.text;\n const filter = getCompiledLogFilter();\n const { entry } = transformLogEntry({ text: body, source: l.source, level }, filter);\n const txt = highlightLogLine(entry.text);\n return `${ts} ${src} ${lvl} ${txt}`;\n}\n\n/* ==================================================================\n * \u8F6F\u6362\u884C: \u8D85\u7EC8\u7AEF\u5BBD\u5EA6\u65F6\u6362\u884C,\u540E\u7EED\u884C\u7F29\u8FDB\u5BF9\u9F50\n * ================================================================== */\n\n/** \u5355\u4E2A\u5B57\u7B26\u5728\u7EC8\u7AEF\u7684\u663E\u793A\u5BBD\u5EA6 (CJK \u5168\u89D2=2, \u5176\u4F59=1) */\nfunction charWidth(ch: string): number {\n const cp = ch.codePointAt(0) ?? 0;\n if (\n cp >= 0x1100 &&\n (cp <= 0x115f ||\n (cp >= 0x2e80 && cp <= 0xa4cf && cp !== 0x303f) ||\n (cp >= 0xac00 && cp <= 0xd7a3) ||\n (cp >= 0xf900 && cp <= 0xfaff) ||\n (cp >= 0xfe30 && cp <= 0xfe4f) ||\n (cp >= 0xff00 && cp <= 0xff60) ||\n (cp >= 0xffe0 && cp <= 0xffe6) ||\n (cp >= 0x20000 && cp <= 0x2fffd))\n )\n return 2;\n return 1;\n}\n\n/** \u5B57\u7B26\u4E32\u5728\u7EC8\u7AEF\u7684\u53EF\u89C1\u5BBD\u5EA6 (strip ANSI \u540E\u6309 CJK \u5BBD\u5EA6\u7D2F\u52A0) */\nexport function visibleWidth(s: string): number {\n const stripped = s.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n let w = 0;\n for (const ch of stripped) w += charWidth(ch);\n return w;\n}\n\n/**\n * \u65E5\u5FD7\u524D\u7F00\u53EF\u89C1\u5BBD\u5EA6(\u65F6\u95F4 + \u6E90 + \u7EA7\u522B + \u5C3E\u7A7A\u683C),\u4F9B\u60AC\u6302\u7F29\u8FDB\u5BF9\u9F50\u6B63\u6587\u8D77\u70B9\u3002\n * \u4E0E formatLog \u62FC\u63A5\u987A\u5E8F\u4FDD\u6301\u4E00\u81F4\uFF08\u5171\u7528 resolveDisplayLevel / sourceTagPlain / levelTagPlain\uFF09\u3002\n */\nexport function logPrefixWidth(l: UnifiedLog): number {\n const ts = l.time.toLocaleTimeString();\n const src = sourceTagPlain(l.source);\n const level = resolveDisplayLevel(l);\n return visibleWidth(`${ts} ${src} ${levelTagPlain(level)} `);\n}\n\n/**\n * \u6309\u7EC8\u7AEF\u53EF\u89C1\u5BBD\u5EA6\u6362\u884C;\u663E\u5F0F \\\\n \u4E0E\u8F6F\u6362\u884C\u7684\u540E\u7EED\u884C\u4E00\u5F8B\u5DE6\u4FA7\u7F29\u8FDB indent \u5217\u3002\n * \u4FDD\u7559 ANSI:\u6362\u884C\u65F6 reset,\u65B0\u884C\u6062\u590D\u5F53\u524D\u989C\u8272\u72B6\u6001(\u53EF\u591A\u5C42\u53E0\u52A0)\u3002\n * \u5BBD\u5B57\u7B26(CJK)\u6309 2 \u5217;cols \u9884\u7559 1 \u5217,\u907F\u514D Windows Terminal \u8FB9\u754C\u518D\u8F6F\u6298\u5230\u7B2C 0 \u5217\u3002\n */\nexport function wrapLogLine(s: string, indent: number): string {\n const rawCols = process.stdout.columns || 80;\n /* \u81F3\u5C11\u7559\u7ED9\u6B63\u6587\u82E5\u5E72\u5217,\u907F\u514D indent >= cols \u65F6\u6B7B\u5FAA\u73AF */\n const cols = Math.max(rawCols - 1, indent + 4);\n const segments = s.split(/\\r?\\n/);\n const out: string[] = [];\n for (let si = 0; si < segments.length; si++) {\n const raw = segments[si]!;\n /* \u663E\u5F0F\u6362\u884C\u6BB5\u53BB\u6389\u6587\u6848\u81EA\u5E26\u7684\u5DE6\u7A7A\u683C,\u7EDF\u4E00\u7531 hang indent \u5BF9\u9F50\u6B63\u6587 */\n const piece = si === 0 ? raw : raw.replace(/^[ \\t]+/, \"\");\n out.push(wrapSegment(piece, cols, si === 0 ? 0 : indent, indent));\n }\n return out.join(\"\\n\");\n}\n\n/** \u5355\u6BB5(\u65E0\u5185\u5D4C \\\\n)\u8F6F\u6362\u884C;startPad>0 \u8868\u793A\u672C\u6BB5\u5F00\u5934\u5DF2\u5360\u7528\u7684\u5217(\u663E\u5F0F\u6362\u884C\u540E\u7684\u60AC\u6302) */\nfunction wrapSegment(s: string, cols: number, startPad: number, hangIndent: number): string {\n if (s.length === 0) return startPad > 0 ? \" \".repeat(startPad) : \"\";\n\n const lines: string[] = [];\n let cur = startPad > 0 ? \" \".repeat(startPad) : \"\";\n let w = startPad;\n /** \u5F53\u524D\u751F\u6548\u7684 ANSI \u5F00\u7801\u6808(\u4E0D\u542B reset),\u6362\u884C\u540E\u91CD\u653E */\n const ansiStack: string[] = [];\n\n const resetIfNeeded = (): void => {\n if (ansiStack.length) cur += \"\\x1b[0m\";\n };\n const replayAnsi = (): void => {\n for (const code of ansiStack) cur += code;\n };\n\n let i = 0;\n while (i < s.length) {\n const m = /^\\x1b\\[[0-9;]*m/.exec(s.slice(i));\n if (m) {\n const code = m[0]!;\n cur += code;\n if (code === \"\\x1b[0m\") ansiStack.length = 0;\n else ansiStack.push(code);\n i += code.length;\n continue;\n }\n\n const cp = s.codePointAt(i)!;\n const ch = String.fromCodePoint(cp);\n const cw = charWidth(ch);\n const advance = ch.length;\n\n /* w > startPad:\u5F53\u524D\u884C\u9664\u5DE6\u57AB\u5916\u5DF2\u6709\u5185\u5BB9,\u53EF\u4EE5\u62C6\u884C;\u5426\u5219\u5F3A\u5236\u585E\u5165\u907F\u514D\u6B7B\u5FAA\u73AF */\n if (w + cw > cols && w > startPad) {\n resetIfNeeded();\n lines.push(cur);\n cur = \" \".repeat(hangIndent);\n replayAnsi();\n w = hangIndent;\n startPad = hangIndent;\n }\n\n cur += ch;\n w += cw;\n i += advance;\n }\n\n if (ansiStack.length) cur += \"\\x1b[0m\";\n lines.push(cur);\n return lines.join(\"\\n\");\n}\n\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * logs.ts \u2014 sfmc \u4E3B\u8FDB\u7A0B\u7EDF\u4E00\u65E5\u5FD7\u805A\u5408\u5C42\n *\n * \u5185\u90E8\u59D4\u6258 @sfmc-bds/logs \u5171\u4EAB\u5305\u7684 createMemoryBuffer + inferLevel,\n * \u4FDD\u6301\u5411\u540E\u517C\u5BB9\u7684 pushLog / onLog / getAllLogs / getRecentLogs API\n * (services.ts \u6355\u83B7\u5B50\u8FDB\u7A0B stdout \u540E\u8C03\u7528 pushLog \u6C47\u805A\u5230\u6B64)\u3002\n *\n * \u843D\u76D8\u7B56\u7565(\u4E0E\u5B50\u8FDB\u7A0B\u81EA\u5199\u6587\u4EF6\u5206\u5DE5,\u907F\u514D\u91CD\u590D):\n * - db / qq / update \u2192 \u5B50\u8FDB\u7A0B\u5DF2\u5199 `.sfmc/logs/{db,qq,bds-update}.log`,\u6B64\u5904\u8DF3\u8FC7\n * - bds / llbot \u2192 `.sfmc/logs/{bds,llbot}.log`(\u5916\u90E8\u8FDB\u7A0B\u65E0\u81EA\u5E26 file sink)\n * - \u5176\u4F59(system / pack / \u2026) \u2192 `.sfmc/logs/sfmc.log`\n *\n * formatLog \u4FDD\u7559 theme.ts (chalk) \u914D\u8272,\u6BD4\u5171\u4EAB\u5305\u7684\u7EAF ANSI \u7248\u672C\u89C6\u89C9\u66F4\u4E30\u5BCC\u3002\n */\n\nimport {\n createFileSink,\n createMemoryBuffer,\n formatLogLine,\n inferLevel as sharedInferLevel,\n parseBdsEmbeddedLevel,\n stripBdsLogPrefix,\n type FileSink,\n type LogEntry,\n type LogLevel as SharedLogLevel,\n} from \"@sfmc-bds/sdk/logs\";\nimport { logFile, logsDir } from \"@sfmc-bds/sdk/node/config\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n getCompiledLogFilter,\n shouldDropForDisk,\n shouldDropForDisplay,\n transformLogEntry,\n} from \"./log-filter.js\";\nimport { c, highlightLogLine } from \"./theme.js\";\nimport { ROOT } from \"./runtime.js\";\n\nexport type LogLevel = SharedLogLevel;\nexport type LogSource = string;\nexport interface UnifiedLog extends LogEntry {}\n\n/** \u518D\u5BFC\u51FA SDK BDS \u89E3\u6790\uFF08\u6D4B\u8BD5\u4E0E\u8C03\u7528\u65B9\u7EDF\u4E00\u5165\u53E3\uFF0C\u6743\u5A01\u5728 @sfmc-bds/sdk/logs\uFF09 */\nexport { mapBdsLevelToken, parseBdsEmbeddedLevel, stripBdsLogPrefix } from \"@sfmc-bds/sdk/logs\";\n\nconst buffer = createMemoryBuffer(5000);\n\n/** \u5B50\u8FDB\u7A0B\u5DF2\u7528 createNodeServiceLogger \u81EA\u884C\u843D\u76D8\u7684 source */\nconst CHILD_OWNED_SOURCES = new Set([\"db\", \"qq\", \"update\"]);\n\nconst fileSinks = new Map<string, FileSink>();\n\n/** \u5265\u79BB BDS \u81EA\u5E26\u524D\u7F00\uFF1B\u82E5\u524D\u7F00\u540E\u6CA1\u6709\u6B63\u6587\uFF0C\u5219\u5224\u5B9A\u4E3A\u4EC5\u7528\u4E8E\u6392\u7248\u7684\u7A7A\u884C\u3002 */\nexport function normalizeBdsLogBody(text: string): string | null {\n const body = stripBdsLogPrefix(text);\n return body.trim().length > 0 ? body : null;\n}\n\n/** \u89E3\u6790\u672C\u6761\u65E5\u5FD7\u5E94\u5199\u5165\u7684\u6587\u4EF6\u540D(\u4E0D\u542B .log);null \u8868\u793A\u8DF3\u8FC7(\u5B50\u8FDB\u7A0B\u5DF2\u5199) */\nfunction resolveDiskLogName(source: string): string | null {\n if (CHILD_OWNED_SOURCES.has(source)) return null;\n if (source === \"bds\" || source === \"llbot\") return source;\n return \"sfmc\";\n}\n\nfunction sinkFor(source: string): FileSink | null {\n const name = resolveDiskLogName(source);\n if (!name) return null;\n let sink = fileSinks.get(name);\n if (!sink) {\n sink = createFileSink(logFile(ROOT, name));\n fileSinks.set(name, sink);\n }\n return sink;\n}\n\nprocess.on(\"exit\", () => {\n for (const sink of fileSinks.values()) sink.close();\n});\n\n/** \u63A8\u9001\u4E00\u6761\u65E5\u5FD7\u5230\u5185\u5B58\u7F13\u51B2,\u5E76\u6309\u7B56\u7565\u843D\u76D8 */\nexport function pushLog(text: string, source: LogSource, level: LogLevel): void {\n let body = text;\n let lvl = level;\n /* BDS\uFF1A\u5148\u63D0\u53D6\u5185\u5D4C\u7EA7\u522B\uFF0C\u518D\u5265\u6389\u81EA\u5E26\u65F6\u95F4\u6233+\u7B49\u7EA7\uFF0C\u907F\u514D\u5C55\u793A/\u843D\u76D8\u91CD\u590D */\n if (source === \"bds\") {\n const embedded = parseBdsEmbeddedLevel(text);\n if (embedded) lvl = embedded;\n const normalized = normalizeBdsLogBody(text);\n if (normalized === null) return;\n body = normalized;\n }\n\n const rawEntry: LogEntry = { time: new Date(), text: body, source, level: lvl };\n const filter = getCompiledLogFilter((src) => {\n /* \u907F\u514D\u9012\u5F52\uFF1A\u975E\u6CD5\u6B63\u5219\u53EA\u5199\u6587\u4EF6 sink\uFF0C\u4E0D\u7ECF pushLog */\n try {\n const sink = sinkFor(\"system\");\n if (!sink) return;\n const warn: LogEntry = {\n time: new Date(),\n text: `log-filter: invalid regex skipped: ${src}`,\n source: \"system\",\n level: \"warn\",\n };\n sink.write(warn, formatLogLine(warn, false));\n } catch {\n /* ignore */\n }\n });\n\n const dropDisplay = shouldDropForDisplay(rawEntry, filter);\n const dropDisk = shouldDropForDisk(rawEntry, filter);\n const { entry: transformedEntry } = transformLogEntry(rawEntry, filter);\n\n if (!dropDisplay) {\n buffer.pushDirect(transformedEntry.text, source, lvl);\n }\n\n if (dropDisk) return;\n const sink = sinkFor(source);\n if (!sink) return;\n try {\n const diskEntry: LogEntry = filter.applyTo === \"all\" ? { ...rawEntry, text: transformedEntry.text } : rawEntry;\n sink.write(diskEntry, formatLogLine(diskEntry, false));\n } catch {\n /* \u843D\u76D8\u5931\u8D25\u4E0D\u963B\u65AD\u4E3B\u6D41\u7A0B */\n }\n}\n\n/** \u8BA2\u9605\u65B0\u65E5\u5FD7\u4E8B\u4EF6,\u8FD4\u56DE\u53D6\u6D88\u8BA2\u9605\u51FD\u6570 */\nexport function onLog(fn: (log: UnifiedLog) => void): () => void {\n return buffer.subscribe(fn);\n}\n\n/** \u83B7\u53D6\u6700\u8FD1 n \u6761,\u53EF\u6309 level / source \u8FC7\u6EE4\uFF1B\u518D\u5957\u914D\u7F6E\u8FC7\u6EE4\uFF08display\uFF09 */\nexport function getRecentLogs(n: number, levels: LogLevel[], sources: LogSource[]): UnifiedLog[] {\n const filter = getCompiledLogFilter();\n return buffer.getRecent(n, levels, sources).filter((l) => !shouldDropForDisplay(l, filter));\n}\n\n/** \u83B7\u53D6\u5168\u90E8\u65E5\u5FD7\uFF1B\u914D\u7F6E\u8FC7\u6EE4\u4EC5\u5F71\u54CD\u8FD4\u56DE\u89C6\u56FE\uFF08\u7F13\u51B2\u5185\u53EF\u80FD\u4ECD\u6709\u5168\u91CF\uFF0C\u89C6 push \u65F6 applyTo\uFF09 */\nexport function getAllLogs(): UnifiedLog[] {\n const filter = getCompiledLogFilter();\n return buffer.getAll().filter((l) => !shouldDropForDisplay(l, filter));\n}\n\n/* ==================================================================\n * \u843D\u76D8\u6587\u4EF6\u8BFB\u53D6\uFF08/logs \u7A97\u7528\uFF0C\u4E0D\u8D70\u5185\u5B58\u7F13\u51B2\uFF09\n * ================================================================== */\n\n/** \u4E0E\u843D\u76D8\u7B56\u7565\u5BF9\u5E94\u7684\u6587\u4EF6\u57FA\u540D\uFF08\u4E0D\u542B .log\uFF09 */\nconst DISK_LOG_FILES = [\"bds\", \"llbot\", \"db\", \"qq\", \"bds-update\", \"sfmc\"] as const;\n\n/** source \u2192 \u843D\u76D8\u6587\u4EF6\u540D\uFF08\u542B\u5B50\u8FDB\u7A0B\u81EA\u5199\uFF09 */\nexport function diskFileForSource(source: string): string {\n if (source === \"update\") return \"bds-update\";\n if (source === \"bds\" || source === \"llbot\" || source === \"db\" || source === \"qq\") return source;\n return \"sfmc\";\n}\n\n/** formatLogLine \u65E0\u8272\u884C\uFF1A`YYYY-MM-DD HH:mm:ss [source] [LEVEL] text` */\nconst DISK_LINE_RE =\n /^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}) \\[([^\\]]+)\\] \\[(INFO|WARN|ERROR|OK|DEBUG|SUCCESS|FATAL)\\]\\s?(.*)$/;\n\nfunction mapDiskLevelTag(tag: string): LogLevel {\n switch (tag) {\n case \"ERROR\":\n case \"FATAL\":\n return \"error\";\n case \"WARN\":\n return \"warn\";\n case \"OK\":\n case \"SUCCESS\":\n return \"success\";\n case \"DEBUG\":\n return \"debug\";\n default:\n return \"info\";\n }\n}\n\n/** \u89E3\u6790\u5355\u884C\u843D\u76D8\u65E5\u5FD7\uFF1B\u4E0D\u7B26\u683C\u5F0F\u8FD4\u56DE null */\nexport function parseDiskLogLine(raw: string): UnifiedLog | null {\n const m = DISK_LINE_RE.exec(raw);\n if (!m) return null;\n const ts = m[1]!;\n const source = m[2]!.trim();\n const level = mapDiskLevelTag(m[3]!);\n const body = m[4] ?? \"\";\n const time = new Date(ts.replace(\" \", \"T\") + \"Z\");\n return { time, source, level, text: body };\n}\n\nexport type ReadDiskLogsOpts = {\n levels?: LogLevel[];\n sources?: LogSource[];\n /** \u8986\u76D6\u65E5\u5FD7\u76EE\u5F55\uFF08\u6D4B\u8BD5\u7528\uFF09\uFF1B\u9ED8\u8BA4 `<ROOT>/.sfmc/logs` */\n dir?: string;\n};\n\n/**\n * \u4ECE `.sfmc/logs/*.log` \u8BFB\u53D6\u5E76\u89E3\u6790\u4E3A UnifiedLog\uFF08\u6309\u65F6\u95F4\u5347\u5E8F\uFF09\u3002\n * \u4F9B /logs \u7B5B\u9009\u7A97\u56DE\u653E\uFF1B\u4E0E\u5185\u5B58\u7F13\u51B2\u65E0\u5173\u3002\n */\nexport function readDiskLogs(opts: ReadDiskLogsOpts = {}): UnifiedLog[] {\n const levels = opts.levels ?? [];\n const sources = opts.sources ?? [];\n const dir = opts.dir ?? logsDir(ROOT);\n const fileNames = new Set<string>();\n if (sources.length === 0) {\n for (const n of DISK_LOG_FILES) fileNames.add(n);\n } else {\n for (const s of sources) fileNames.add(diskFileForSource(s));\n }\n\n const out: UnifiedLog[] = [];\n for (const name of fileNames) {\n const fp = path.join(dir, name.endsWith(\".log\") ? name : `${name}.log`);\n let text: string;\n try {\n text = fs.readFileSync(fp, \"utf8\");\n } catch {\n continue;\n }\n for (const raw of text.split(/\\r?\\n/)) {\n if (!raw) continue;\n const entry = parseDiskLogLine(raw);\n if (!entry) continue;\n if (sources.length && !sources.includes(entry.source)) continue;\n if (levels.length && !levels.includes(entry.level)) continue;\n out.push(entry);\n }\n }\n out.sort((a, b) => a.time.getTime() - b.time.getTime());\n return out;\n}\n\n/* ==================================================================\n * \u6765\u6E90\u6807\u7B7E\u5143\u6570\u636E (\u65B9\u62EC\u53F7\u4E0E\u6587\u5B57\u540C\u8272,\u5BF9\u9F50 levelTag)\n * ================================================================== */\n\nexport interface SourceMeta {\n value: string;\n /** \u65B9\u62EC\u53F7\u5185\u56FA\u5B9A 3 \u5B57\u7B26\uFF0C\u4E0E [INF] \u5BF9\u9F50 */\n name: string;\n paint: (s: string) => string;\n}\n\nexport const SOURCE_META: SourceMeta[] = [\n { value: \"bds\", name: \"BDS\", paint: (s) => c.green(s) },\n { value: \"db\", name: \"DB \", paint: (s) => c.blue(s) },\n { value: \"qq\", name: \"QQ \", paint: (s) => c.purple(s) },\n { value: \"llbot\", name: \"BOT\", paint: (s) => c.yellow(s) },\n { value: \"system\", name: \"SYS\", paint: (s) => c.cyan(s) },\n { value: \"update\", name: \"UPD\", paint: (s) => c.orange(s) },\n { value: \"pack\", name: \"PAK\", paint: (s) => c.purple(s) },\n { value: \"bds-tools\", name: \"TOL\", paint: (s) => c.red(s) },\n];\n\n/** \u6E90\u6807\u7B7E\u65E0\u8272\u6587\u672C\uFF08formatSourceTag / logPrefixWidth \u5171\u7528\uFF09 */\nfunction sourceTagPlain(source: string): string {\n const meta = SOURCE_META.find((m) => m.value === source);\n if (meta) return `[${meta.name}]`;\n return `[${source.toUpperCase().padEnd(3).slice(0, 3)}]`;\n}\n\nexport function formatSourceTag(source: string): string {\n const meta = SOURCE_META.find((m) => m.value === source);\n const plain = sourceTagPlain(source);\n if (meta) return meta.paint(plain);\n return c.bold(plain);\n}\n\n/**\n * \u5C55\u793A\u7528\u7EA7\u522B\uFF1ABDS \u82E5\u4ECD\u5E26\u65F6\u95F4\u6233\u524D\u7F00\u5219\u89E3\u6790\u5185\u5D4C\u7EA7\u522B\uFF1B\u5DF2\u5265\u79BB\uFF08pushLog \u5165\u5E93\uFF09\u5219\u4FE1\u4EFB entry.level\u3002\n * \u7981\u6B62\u5BF9\u6B63\u6587\u505A\u677E\u6563\u5173\u952E\u8BCD\u5339\u914D\uFF08\u4F1A\u628A `[Commands] Error on line` \u8BEF\u5224\u4E3A error\uFF09\u3002\n */\nexport function resolveDisplayLevel(l: UnifiedLog): LogLevel {\n if (l.source === \"bds\") {\n const embedded = parseBdsEmbeddedLevel(l.text);\n if (embedded) return embedded;\n }\n return l.level;\n}\n\n/** \u4ECE\u539F\u59CB\u6587\u672C\u63A8\u65AD\u7EA7\u522B\uFF1A\u59D4\u6258\u5171\u4EAB\u5305\uFF08\u5185\u542B BDS \u65F6\u95F4\u6233\u89E3\u6790\uFF09 */\nexport function inferLevel(text: string): LogLevel {\n return sharedInferLevel(text);\n}\n\n/** \u65E0\u8272\u7EA7\u522B\u6807\u7B7E\u6587\u672C\uFF08\u53EF\u89C1\u5BBD\u5EA6\u6743\u5A01\u6E90\uFF1B\u62EC\u53F7\u5185\u5747\u4E3A 3 \u5B57\u7B26\uFF09 */\nconst LEVEL_TAG_TEXT: Record<LogLevel, string> = {\n error: \"[ERR]\",\n warn: \"[WRN]\",\n success: \"[SUC]\",\n debug: \"[DBG]\",\n info: \"[INF]\",\n};\n\nfunction levelTagPlain(lvl: LogLevel): string {\n return LEVEL_TAG_TEXT[lvl] ?? LEVEL_TAG_TEXT.info;\n}\n\nfunction levelTag(lvl: LogLevel): string {\n const text = levelTagPlain(lvl);\n switch (lvl) {\n case \"error\":\n return c.red(text);\n case \"warn\":\n return c.yellow(text);\n case \"success\":\n return c.green(c.bold(text));\n case \"debug\":\n return c.dim(text);\n default:\n return c.blue(text);\n }\n}\n\n/** \u683C\u5F0F\u5316\u65E5\u5FD7\u7528\u4E8E REPL \u5C55\u793A (\u7528 theme.ts chalk \u914D\u8272) */\nexport function formatLog(l: UnifiedLog): string {\n const ts = c.dim(l.time.toLocaleTimeString());\n const level = resolveDisplayLevel(l);\n const lvl = levelTag(level);\n const src = formatSourceTag(l.source);\n /* BDS\uFF1A\u53BB\u6389\u81EA\u5E26\u65F6\u95F4\u6233+\u7B49\u7EA7\u524D\u7F00\u540E\u518D\u672C\u5730\u5316\u7FFB\u8BD1\u4E0E\u9AD8\u4EAE\u6B63\u6587\uFF08push \u65F6\u591A\u534A\u5DF2\u8F6C\u8FC7\uFF0C\u6B64\u5904\u5E42\u7B49\u4E14\u8986\u76D6\u56DE\u653E\uFF09 */\n const body = l.source === \"bds\" ? stripBdsLogPrefix(l.text) : l.text;\n const filter = getCompiledLogFilter();\n const { entry } = transformLogEntry({ text: body, source: l.source, level }, filter);\n const txt = highlightLogLine(entry.text);\n return `${ts} ${src} ${lvl} ${txt}`;\n}\n\n/* ==================================================================\n * \u8F6F\u6362\u884C: \u8D85\u7EC8\u7AEF\u5BBD\u5EA6\u65F6\u6362\u884C,\u540E\u7EED\u884C\u7F29\u8FDB\u5BF9\u9F50\n * ================================================================== */\n\n/** \u5355\u4E2A\u5B57\u7B26\u5728\u7EC8\u7AEF\u7684\u663E\u793A\u5BBD\u5EA6 (CJK \u5168\u89D2=2, \u5176\u4F59=1) */\nfunction charWidth(ch: string): number {\n const cp = ch.codePointAt(0) ?? 0;\n if (\n cp >= 0x1100 &&\n (cp <= 0x115f ||\n (cp >= 0x2e80 && cp <= 0xa4cf && cp !== 0x303f) ||\n (cp >= 0xac00 && cp <= 0xd7a3) ||\n (cp >= 0xf900 && cp <= 0xfaff) ||\n (cp >= 0xfe30 && cp <= 0xfe4f) ||\n (cp >= 0xff00 && cp <= 0xff60) ||\n (cp >= 0xffe0 && cp <= 0xffe6) ||\n (cp >= 0x20000 && cp <= 0x2fffd))\n )\n return 2;\n return 1;\n}\n\n/** \u5B57\u7B26\u4E32\u5728\u7EC8\u7AEF\u7684\u53EF\u89C1\u5BBD\u5EA6 (strip ANSI \u540E\u6309 CJK \u5BBD\u5EA6\u7D2F\u52A0) */\nexport function visibleWidth(s: string): number {\n const stripped = s.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n let w = 0;\n for (const ch of stripped) w += charWidth(ch);\n return w;\n}\n\n/**\n * \u65E5\u5FD7\u524D\u7F00\u53EF\u89C1\u5BBD\u5EA6(\u65F6\u95F4 + \u6E90 + \u7EA7\u522B + \u5C3E\u7A7A\u683C),\u4F9B\u60AC\u6302\u7F29\u8FDB\u5BF9\u9F50\u6B63\u6587\u8D77\u70B9\u3002\n * \u4E0E formatLog \u62FC\u63A5\u987A\u5E8F\u4FDD\u6301\u4E00\u81F4\uFF08\u5171\u7528 resolveDisplayLevel / sourceTagPlain / levelTagPlain\uFF09\u3002\n */\nexport function logPrefixWidth(l: UnifiedLog): number {\n const ts = l.time.toLocaleTimeString();\n const src = sourceTagPlain(l.source);\n const level = resolveDisplayLevel(l);\n return visibleWidth(`${ts} ${src} ${levelTagPlain(level)} `);\n}\n\n/**\n * \u6309\u7EC8\u7AEF\u53EF\u89C1\u5BBD\u5EA6\u6362\u884C;\u663E\u5F0F \\\\n \u4E0E\u8F6F\u6362\u884C\u7684\u540E\u7EED\u884C\u4E00\u5F8B\u5DE6\u4FA7\u7F29\u8FDB indent \u5217\u3002\n * \u4FDD\u7559 ANSI:\u6362\u884C\u65F6 reset,\u65B0\u884C\u6062\u590D\u5F53\u524D\u989C\u8272\u72B6\u6001(\u53EF\u591A\u5C42\u53E0\u52A0)\u3002\n * \u5BBD\u5B57\u7B26(CJK)\u6309 2 \u5217;cols \u9884\u7559 1 \u5217,\u907F\u514D Windows Terminal \u8FB9\u754C\u518D\u8F6F\u6298\u5230\u7B2C 0 \u5217\u3002\n */\nexport function wrapLogLine(s: string, indent: number): string {\n const rawCols = process.stdout.columns || 80;\n /* \u81F3\u5C11\u7559\u7ED9\u6B63\u6587\u82E5\u5E72\u5217,\u907F\u514D indent >= cols \u65F6\u6B7B\u5FAA\u73AF */\n const cols = Math.max(rawCols - 1, indent + 4);\n const segments = s.split(/\\r?\\n/);\n const out: string[] = [];\n for (let si = 0; si < segments.length; si++) {\n const raw = segments[si]!;\n /* \u663E\u5F0F\u6362\u884C\u6BB5\u53BB\u6389\u6587\u6848\u81EA\u5E26\u7684\u5DE6\u7A7A\u683C,\u7EDF\u4E00\u7531 hang indent \u5BF9\u9F50\u6B63\u6587 */\n const piece = si === 0 ? raw : raw.replace(/^[ \\t]+/, \"\");\n out.push(wrapSegment(piece, cols, si === 0 ? 0 : indent, indent));\n }\n return out.join(\"\\n\");\n}\n\n/** \u5355\u6BB5(\u65E0\u5185\u5D4C \\\\n)\u8F6F\u6362\u884C;startPad>0 \u8868\u793A\u672C\u6BB5\u5F00\u5934\u5DF2\u5360\u7528\u7684\u5217(\u663E\u5F0F\u6362\u884C\u540E\u7684\u60AC\u6302) */\nfunction wrapSegment(s: string, cols: number, startPad: number, hangIndent: number): string {\n if (s.length === 0) return startPad > 0 ? \" \".repeat(startPad) : \"\";\n\n const lines: string[] = [];\n let cur = startPad > 0 ? \" \".repeat(startPad) : \"\";\n let w = startPad;\n /** \u5F53\u524D\u751F\u6548\u7684 ANSI \u5F00\u7801\u6808(\u4E0D\u542B reset),\u6362\u884C\u540E\u91CD\u653E */\n const ansiStack: string[] = [];\n\n const resetIfNeeded = (): void => {\n if (ansiStack.length) cur += \"\\x1b[0m\";\n };\n const replayAnsi = (): void => {\n for (const code of ansiStack) cur += code;\n };\n\n let i = 0;\n while (i < s.length) {\n const m = /^\\x1b\\[[0-9;]*m/.exec(s.slice(i));\n if (m) {\n const code = m[0]!;\n cur += code;\n if (code === \"\\x1b[0m\") ansiStack.length = 0;\n else ansiStack.push(code);\n i += code.length;\n continue;\n }\n\n const cp = s.codePointAt(i)!;\n const ch = String.fromCodePoint(cp);\n const cw = charWidth(ch);\n const advance = ch.length;\n\n /* w > startPad:\u5F53\u524D\u884C\u9664\u5DE6\u57AB\u5916\u5DF2\u6709\u5185\u5BB9,\u53EF\u4EE5\u62C6\u884C;\u5426\u5219\u5F3A\u5236\u585E\u5165\u907F\u514D\u6B7B\u5FAA\u73AF */\n if (w + cw > cols && w > startPad) {\n resetIfNeeded();\n lines.push(cur);\n cur = \" \".repeat(hangIndent);\n replayAnsi();\n w = hangIndent;\n startPad = hangIndent;\n }\n\n cur += ch;\n w += cw;\n i += advance;\n }\n\n if (ansiStack.length) cur += \"\\x1b[0m\";\n lines.push(cur);\n return lines.join(\"\\n\");\n}\n\n"],
5
+ "mappings": "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",
6
6
  "names": ["parseBdsEmbeddedLevel", "stripBdsLogPrefix", "sink"]
7
7
  }
@@ -12,7 +12,7 @@ export declare function buildModulePacks(force?: boolean): Promise<BuildModulePa
12
12
  /**
13
13
  * `sfmc mod build` —— 组装 BP + RP(不部署)。
14
14
  */
15
- export declare function cmdModuleBuild(args?: string[]): Promise<string>;
15
+ export declare function cmdModuleBuild(_args?: string[]): Promise<string>;
16
16
  /**
17
17
  * `sfmc mod reload [--build-only] [--force]` —— 组装 + 部署 + 清理过期 + 写权限 + (默认)发 reload 到 BDS。
18
18
  */
@@ -1 +1 @@
1
- {"version":3,"file":"module-pack-build.d.ts","sourceRoot":"","sources":["../src/module-pack-build.ts"],"names":[],"mappings":"AAoBA,OAAO,EAgBL,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAyU7B,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA6DrF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAIzE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAsD1E"}
1
+ {"version":3,"file":"module-pack-build.d.ts","sourceRoot":"","sources":["../src/module-pack-build.ts"],"names":[],"mappings":"AAsBA,OAAO,EAgBL,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAsS7B,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAyDrF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAI1E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAsD1E"}
@@ -1,30 +1,30 @@
1
+ import { writeJson } from "@sfmc-bds/sdk/node/config";
1
2
  import { spawn } from "node:child_process";
2
3
  import { existsSync } from "node:fs";
3
4
  import fs from "node:fs/promises";
4
5
  import path from "node:path";
5
6
  import process from "node:process";
6
- import { writeJson } from "@sfmc-bds/sdk/node/config";
7
+ import { t } from "./i18n/index.js";
8
+ import { pushLog } from "./logs.js";
7
9
  import {
8
10
  BP_NAME,
9
- RP_NAME,
10
11
  DEPLOY_CATALOG_NAME,
12
+ RP_NAME,
11
13
  bpOut,
12
14
  bpSrc,
13
- rpOut,
14
15
  buildRoot,
15
- computeDesiredCatalog,
16
- readDeployedCatalog,
17
16
  catalogsEqual,
18
- resolveBdsContext,
17
+ computeDesiredCatalog,
18
+ createSdkResolvePlugin,
19
19
  deployedBpDir,
20
20
  formatPackLoadInfo,
21
- scanLocalModules,
22
- createSdkResolvePlugin
21
+ readDeployedCatalog,
22
+ resolveBdsContext,
23
+ rpOut,
24
+ scanLocalModules
23
25
  } from "./pack-lifecycle.js";
24
- import { ROOT, getRoot, resolveServiceScript, resolveSdkPackageRoot } from "./runtime.js";
26
+ import { ROOT, getRoot, resolveSdkPackageRoot, resolveServiceScript } from "./runtime.js";
25
27
  import { c } from "./theme.js";
26
- import { t } from "./i18n/index.js";
27
- import { pushLog } from "./logs.js";
28
28
  function spawnPackManager(args) {
29
29
  return new Promise((resolve) => {
30
30
  const script = resolveServiceScript("pack-manager");
@@ -138,11 +138,7 @@ async function spawnAssembleRp(catalog, rpDirs) {
138
138
  if (catalog.rpModuleUuid) args.push("--module-uuid", catalog.rpModuleUuid);
139
139
  const r = await spawnPackManager(args);
140
140
  if (r.code === 0) {
141
- pushLog(
142
- `assembled RP uuid=${catalog.rpUuid} (${Object.keys(rpDirs).length} modules)`,
143
- "pack",
144
- "info"
145
- );
141
+ pushLog(`assembled RP uuid=${catalog.rpUuid} (${Object.keys(rpDirs).length} modules)`, "pack", "info");
146
142
  }
147
143
  return r;
148
144
  }
@@ -192,11 +188,7 @@ async function spawnEnablePacks(catalog) {
192
188
  const bpR = await spawnPackManager(bpArgs);
193
189
  output += bpR.output;
194
190
  if (bpR.code !== 0) return { code: bpR.code, output };
195
- pushLog(
196
- `enabled behavior pack ${catalog.bpUuid} in world list`,
197
- "pack",
198
- "info"
199
- );
191
+ pushLog(`enabled behavior pack ${catalog.bpUuid} in world list`, "pack", "info");
200
192
  if (catalog.rpUuid && catalog.rpVersion) {
201
193
  const rpArgs = [
202
194
  "enable-pack",
@@ -214,11 +206,7 @@ async function spawnEnablePacks(catalog) {
214
206
  const rpR = await spawnPackManager(rpArgs);
215
207
  output += rpR.output;
216
208
  if (rpR.code !== 0) return { code: rpR.code, output };
217
- pushLog(
218
- `enabled resource pack ${catalog.rpUuid} in world list`,
219
- "pack",
220
- "info"
221
- );
209
+ pushLog(`enabled resource pack ${catalog.rpUuid} in world list`, "pack", "info");
222
210
  }
223
211
  return { code: 0, output };
224
212
  }
@@ -243,11 +231,7 @@ async function spawnDisableStale(current, bdsRoot, levelName) {
243
231
  if (r.code === 0) {
244
232
  pushLog(`disabled stale resource pack ${staleRp}`, "pack", "info");
245
233
  } else {
246
- pushLog(
247
- `disable stale RP ${staleRp} failed: ${r.output.trim()}`,
248
- "pack",
249
- "warn"
250
- );
234
+ pushLog(`disable stale RP ${staleRp} failed: ${r.output.trim()}`, "pack", "warn");
251
235
  }
252
236
  }
253
237
  for (const staleBp of previous.bp) {
@@ -268,11 +252,7 @@ async function spawnDisableStale(current, bdsRoot, levelName) {
268
252
  if (r.code === 0) {
269
253
  pushLog(`disabled stale behavior pack ${staleBp}`, "pack", "info");
270
254
  } else {
271
- pushLog(
272
- `disable stale BP ${staleBp} failed: ${r.output.trim()}`,
273
- "pack",
274
- "warn"
275
- );
255
+ pushLog(`disable stale BP ${staleBp} failed: ${r.output.trim()}`, "pack", "warn");
276
256
  }
277
257
  }
278
258
  }
@@ -304,13 +284,7 @@ async function collectDeployedPackUuids(bdsRoot, levelName) {
304
284
  }
305
285
  async function spawnEnsurePermission(catalog) {
306
286
  const { bdsRoot } = resolveBdsContext();
307
- const r = await spawnPackManager([
308
- "ensure-permission",
309
- "--bds-root",
310
- bdsRoot,
311
- "--pack-id",
312
- catalog.bpUuid
313
- ]);
287
+ const r = await spawnPackManager(["ensure-permission", "--bds-root", bdsRoot, "--pack-id", catalog.bpUuid]);
314
288
  return r;
315
289
  }
316
290
  async function buildModulePacks(force = false) {
@@ -325,11 +299,7 @@ async function buildModulePacks(force = false) {
325
299
  catalog: deployed
326
300
  };
327
301
  }
328
- pushLog(
329
- `building BP/RP (modules=${Object.keys(desired.modules).length})\u2026`,
330
- "pack",
331
- "info"
332
- );
302
+ pushLog(`building BP/RP (modules=${Object.keys(desired.modules).length})\u2026`, "pack", "info");
333
303
  await bundleBehaviorPackScript();
334
304
  const mods = await scanLocalModules();
335
305
  const rpDirs = {};
@@ -369,9 +339,8 @@ async function buildModulePacks(force = false) {
369
339
  };
370
340
  }
371
341
  }
372
- async function cmdModuleBuild(args = []) {
373
- const force = args.includes("--force") || args.includes("-f");
374
- const res = await buildModulePacks(force);
342
+ async function cmdModuleBuild(_args = []) {
343
+ const res = await buildModulePacks(true);
375
344
  return res.message;
376
345
  }
377
346
  async function cmdModuleReload(args = []) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/module-pack-build.ts"],
4
- "sourcesContent": ["/**\n * module-pack-build.ts \u2014 `mod build` / `mod reload` \u7684 spawn-based \u5B9E\u73B0\n *\n * CLI \u6D3E\u53D1\u7684 module build / reload \u5B50\u547D\u4EE4\u8D70\u8FD9\u91CC\uFF1Bpack-lifecycle.ts \u4FDD\u7559\n * ensurePacksReady \u542F\u52A8\u94A9\u5B50\u4E0E wizard \u5185\u90E8\u6D88\u8D39\u65B9\u7684 in-process \u5165\u53E3\u3002\n *\n * \u5B9E\u9645\u6587\u4EF6\u5199\u5165\uFF08assemble-bp / assemble-rp / deploy / enable-pack / disable-pack /\n * ensure-permission\uFF09\u901A\u8FC7 spawn bds-tools/cli-pack-manager.ts \u7684 verb \u6267\u884C\uFF1B\n * \u4E0E module install/uninstall\uFF08\u2192 scripts/module-install/fetch-module.mjs\uFF09\u4FDD\u6301\u540C\u4E00\u67B6\u6784\uFF1A\n * CLI \u662F thin wrapper\uFF1B\u5EFA\u4ED3\u811A\u624B\u67B6\u5728 @sfmc-bds/create-module\uFF08npm create\uFF09\u3002\n *\n * \u552F\u4E00\u6743\u5A01\uFF1A\u672C\u6587\u4EF6 = `sfmc mod build|reload` \u7684\u6D3E\u53D1\u5165\u53E3\uFF1B\u5176\u4ED6\u6587\u4EF6\u4E0D\u5F97\u518D\n * \u76F4\u63A5 import pack-lifecycle \u7684 cmdPackBuild / deployPacks\uFF08\u786E\u4FDD\u53EA\u6709\u4E00\u4E2A spawn \u5165\u53E3\uFF09\u3002\n */\nimport { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { writeJson } from \"@sfmc-bds/sdk/node/config\";\nimport {\n BP_NAME,\n RP_NAME,\n DEPLOY_CATALOG_NAME,\n bpOut,\n bpSrc,\n rpOut,\n buildRoot,\n computeDesiredCatalog,\n readDeployedCatalog,\n catalogsEqual,\n resolveBdsContext,\n deployedBpDir,\n formatPackLoadInfo,\n scanLocalModules,\n createSdkResolvePlugin,\n type DeployCatalog,\n} from \"./pack-lifecycle.js\";\nimport { ROOT, getRoot, resolveServiceScript, resolveSdkPackageRoot } from \"./runtime.js\";\nimport { c } from \"./theme.js\";\nimport { t } from \"./i18n/index.js\";\nimport { pushLog } from \"./logs.js\";\n\ntype SpawnResult = { code: number | null; output: string };\n\n/** spawn bds-tools/cli-pack-manager.ts \u5B50\u8FDB\u7A0B\uFF1B\u6355\u83B7 stdout+stderr\u3002 */\nfunction spawnPackManager(args: string[]): Promise<SpawnResult> {\n return new Promise((resolve) => {\n const script = resolveServiceScript(\"pack-manager\");\n const proc = spawn(process.execPath, [script, ...args], {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env, SFMC_ROOT: getRoot(), SFMC_SERVICE: \"pack-manager\" },\n });\n let output = \"\";\n proc.stdout?.on(\"data\", (d: Buffer) => {\n output += d.toString();\n });\n proc.stderr?.on(\"data\", (d: Buffer) => {\n output += d.toString();\n });\n proc.on(\"exit\", (code) => resolve({ code, output }));\n proc.on(\"error\", (e) => resolve({ code: 1, output: `${output}${e.message}` }));\n });\n}\n\n/* esbuild bundle \u2014\u2014 JS bundler \u662F in-process \u5E93\uFF0C\u4E0D\u8D70 spawn\u3002 */\nasync function bundleBehaviorPackScript(): Promise<void> {\n const mods = await scanLocalModules();\n const entries = mods.filter((m) => m.enabled && m.entryPath).map((m) => m.entryPath!);\n const outFile = path.join(bpSrc(), \"scripts\", \"main.js\");\n await fs.mkdir(path.dirname(outFile), { recursive: true });\n\n if (entries.length === 0) {\n await fs.writeFile(outFile, \"/* no modules enabled */\\n\", \"utf8\");\n pushLog(\"no enabled SAPI modules \u2014 empty main.js\", \"pack\", \"warn\");\n return;\n }\n\n const { build } = await import(\"esbuild\");\n const sdkRoot = resolveSdkPackageRoot();\n await build({\n stdin: {\n contents: [\n 'import \"sfmc:host\";',\n ...entries.map((e) => `import ${JSON.stringify(path.resolve(e).replace(/\\\\/g, \"/\"))};`),\n ].join(\"\\n\"),\n resolveDir: ROOT,\n sourcefile: \"bootstrap.ts\",\n loader: \"ts\",\n },\n outfile: outFile,\n bundle: true,\n platform: \"neutral\",\n format: \"esm\",\n target: \"es2022\",\n logLevel: \"warning\",\n sourcemap: true,\n external: [\"@minecraft/*\"],\n tsconfigRaw: JSON.stringify({\n compilerOptions: {\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n target: \"ES2022\",\n strict: true,\n skipLibCheck: true,\n },\n }),\n plugins: [createSdkResolvePlugin(sdkRoot)],\n });\n pushLog(`esbuild bundled ${entries.length} entr(y/ies)`, \"pack\", \"info\");\n}\n\n/** spawn assemble-bp verb\u3002 */\nasync function spawnAssembleBp(catalog: DeployCatalog): Promise<SpawnResult> {\n const args = [\n \"assemble-bp\",\n \"--src\",\n bpSrc(),\n \"--out\",\n bpOut(),\n \"--name\",\n BP_NAME,\n \"--uuid\",\n catalog.bpUuid,\n \"--version\",\n catalog.bpVersion.join(\",\"),\n ];\n if (catalog.bpModuleUuid) args.push(\"--module-uuid\", catalog.bpModuleUuid);\n if (catalog.dependencies && catalog.dependencies.length > 0) {\n const depsFile = path.join(buildRoot(), \"bp-dependencies.json\");\n await fs.mkdir(buildRoot(), { recursive: true });\n await fs.writeFile(depsFile, JSON.stringify(catalog.dependencies), \"utf8\");\n args.push(\"--dependencies-json\", depsFile);\n }\n const r = await spawnPackManager(args);\n if (r.code === 0) {\n pushLog(`assembled BP uuid=${catalog.bpUuid}`, \"pack\", \"info\");\n }\n return r;\n}\n\n/** spawn assemble-rp verb\uFF1B\u65E0 RP \u65F6\u6E05\u7406\u65E7\u4EA7\u7269\u3002 */\nasync function spawnAssembleRp(\n catalog: DeployCatalog,\n rpDirs: Record<string, string>\n): Promise<SpawnResult> {\n if (!catalog.rpUuid || Object.keys(rpDirs).length === 0) {\n await fs.rm(rpOut(), { recursive: true, force: true });\n pushLog(\"no enabled resource packs \u2014 RP skipped\", \"pack\", \"info\");\n return { code: 0, output: \"[pack-manager] no enabled resource packs \u2014 RP skipped\\n\" };\n }\n const mapFile = path.join(buildRoot(), \"rp-map.json\");\n await fs.mkdir(buildRoot(), { recursive: true });\n await fs.writeFile(mapFile, JSON.stringify(rpDirs), \"utf8\");\n const args = [\n \"assemble-rp\",\n \"--modules-json\",\n mapFile,\n \"--out\",\n rpOut(),\n \"--name\",\n RP_NAME,\n \"--uuid\",\n catalog.rpUuid,\n \"--version\",\n (catalog.rpVersion ?? [1, 0, 0]).join(\",\"),\n ];\n if (catalog.rpModuleUuid) args.push(\"--module-uuid\", catalog.rpModuleUuid);\n const r = await spawnPackManager(args);\n if (r.code === 0) {\n pushLog(\n `assembled RP uuid=${catalog.rpUuid} (${Object.keys(rpDirs).length} modules)`,\n \"pack\",\n \"info\"\n );\n }\n return r;\n}\n\n/** spawn deploy verb\uFF1B\u65E0 RP \u65F6\u5E26 --clear-rp\u3002 */\nasync function spawnDeploy(catalog: DeployCatalog): Promise<SpawnResult> {\n const { bdsRoot, levelName } = resolveBdsContext();\n const args = [\n \"deploy\",\n \"--bds-root\",\n bdsRoot,\n \"--level\",\n levelName,\n \"--bp-src\",\n bpOut(),\n \"--bp-name\",\n BP_NAME,\n \"--rp-name\",\n RP_NAME,\n ];\n if (catalog.rpUuid && existsSync(rpOut())) {\n args.push(\"--rp-src\", rpOut());\n } else {\n args.push(\"--clear-rp\");\n }\n const r = await spawnPackManager(args);\n if (r.code === 0) {\n pushLog(`deployed to worlds/${levelName}`, \"pack\", \"info\");\n }\n return r;\n}\n\n/** spawn enable-pack verb\uFF1ABP \u5FC5\u987B\uFF0CRP \u4EC5\u5728\u6709 UUID \u65F6\u3002 */\nasync function spawnEnablePacks(catalog: DeployCatalog): Promise<SpawnResult> {\n const { bdsRoot, levelName } = resolveBdsContext();\n const worldsDir = path.join(bdsRoot, \"worlds\");\n let output = \"\";\n const bpArgs = [\n \"enable-pack\",\n \"--worlds-dir\",\n worldsDir,\n \"--level\",\n levelName,\n \"--kind\",\n \"behavior\",\n \"--pack-id\",\n catalog.bpUuid,\n \"--version\",\n catalog.bpVersion.join(\",\"),\n ];\n const bpR = await spawnPackManager(bpArgs);\n output += bpR.output;\n if (bpR.code !== 0) return { code: bpR.code, output };\n pushLog(\n `enabled behavior pack ${catalog.bpUuid} in world list`,\n \"pack\",\n \"info\"\n );\n if (catalog.rpUuid && catalog.rpVersion) {\n const rpArgs = [\n \"enable-pack\",\n \"--worlds-dir\",\n worldsDir,\n \"--level\",\n levelName,\n \"--kind\",\n \"resource\",\n \"--pack-id\",\n catalog.rpUuid,\n \"--version\",\n catalog.rpVersion.join(\",\"),\n ];\n const rpR = await spawnPackManager(rpArgs);\n output += rpR.output;\n if (rpR.code !== 0) return { code: rpR.code, output };\n pushLog(\n `enabled resource pack ${catalog.rpUuid} in world list`,\n \"pack\",\n \"info\"\n );\n }\n return { code: 0, output };\n}\n\n/** spawn disable-pack verb\uFF1A\u6E05\u7406\u8FC7\u671F UUID\uFF08uuid \u8F6E\u6362 / \u4E0D\u518D\u63D0\u4F9B RP\uFF09\u3002 */\nasync function spawnDisableStale(\n current: DeployCatalog,\n bdsRoot: string,\n levelName: string\n): Promise<void> {\n const previous = await collectDeployedPackUuids(bdsRoot, levelName);\n const worldsDir = path.join(bdsRoot, \"worlds\");\n for (const staleRp of previous.rp) {\n if (staleRp === (current.rpUuid ?? null)) continue;\n const r = await spawnPackManager([\n \"disable-pack\",\n \"--worlds-dir\",\n worldsDir,\n \"--level\",\n levelName,\n \"--kind\",\n \"resource\",\n \"--pack-id\",\n staleRp,\n \"--version\",\n \"1,0,0\",\n ]);\n if (r.code === 0) {\n pushLog(`disabled stale resource pack ${staleRp}`, \"pack\", \"info\");\n } else {\n pushLog(\n `disable stale RP ${staleRp} failed: ${r.output.trim()}`,\n \"pack\",\n \"warn\"\n );\n }\n }\n for (const staleBp of previous.bp) {\n if (staleBp === current.bpUuid) continue;\n const r = await spawnPackManager([\n \"disable-pack\",\n \"--worlds-dir\",\n worldsDir,\n \"--level\",\n levelName,\n \"--kind\",\n \"behavior\",\n \"--pack-id\",\n staleBp,\n \"--version\",\n \"1,0,0\",\n ]);\n if (r.code === 0) {\n pushLog(`disabled stale behavior pack ${staleBp}`, \"pack\", \"info\");\n } else {\n pushLog(\n `disable stale BP ${staleBp} failed: ${r.output.trim()}`,\n \"pack\",\n \"warn\"\n );\n }\n }\n}\n\n/** \u901A\u8FC7 bds-tools \u7684 list-installed + read-manifest \u62FF\u5230 deployed UUID\uFF08spawn\uFF09\u3002 */\nasync function collectDeployedPackUuids(\n bdsRoot: string,\n levelName: string\n): Promise<{ bp: Set<string>; rp: Set<string> }> {\n const bp = new Set<string>();\n const rp = new Set<string>();\n const cat = readDeployedCatalog(bdsRoot, levelName);\n if (cat?.bpUuid) bp.add(cat.bpUuid);\n if (cat?.rpUuid) rp.add(cat.rpUuid);\n // \u901A\u8FC7 read-manifest \u770B\u4E16\u754C\u78C1\u76D8 BP/RP manifest \u7684 uuid\uFF0C\u4F5C\u4E3A catalog \u7F3A\u5931\u65F6\u7684\u515C\u5E95\u3002\n const bpDir = path.join(bdsRoot, \"worlds\", levelName, \"behavior_packs\", BP_NAME);\n const rpDir = path.join(bdsRoot, \"worlds\", levelName, \"resource_packs\", RP_NAME);\n const bpR = await spawnPackManager([\"read-manifest\", \"--pack-dir\", bpDir]);\n if (bpR.code === 0) {\n try {\n const j = JSON.parse(bpR.output.trim()) as { uuid?: string } | null;\n if (j?.uuid) bp.add(j.uuid);\n } catch {\n /* ignore */\n }\n }\n const rpR = await spawnPackManager([\"read-manifest\", \"--pack-dir\", rpDir]);\n if (rpR.code === 0) {\n try {\n const j = JSON.parse(rpR.output.trim()) as { uuid?: string } | null;\n if (j?.uuid) rp.add(j.uuid);\n } catch {\n /* ignore */\n }\n }\n return { bp, rp };\n}\n\n/** spawn ensure-permission verb\u3002 */\nasync function spawnEnsurePermission(catalog: DeployCatalog): Promise<SpawnResult> {\n const { bdsRoot } = resolveBdsContext();\n const r = await spawnPackManager([\n \"ensure-permission\",\n \"--bds-root\",\n bdsRoot,\n \"--pack-id\",\n catalog.bpUuid,\n ]);\n return r;\n}\n\nexport type BuildModulePacksResult = {\n success: boolean;\n message: string;\n catalog?: DeployCatalog;\n};\n\n/**\n * \u7EC4\u88C5 BP + RP \u7EAF\u903B\u8F91\uFF08\u4E0D\u90E8\u7F72\uFF09\u3002\n * \u4EC5\u5F53 catalog \u4E0E\u4E16\u754C\u5185\u5DF2\u90E8\u7F72\u4E0D\u4E00\u81F4\u65F6\u6267\u884C\uFF1B\u5426\u5219\u76F4\u63A5\u6253\"\u5DF2\u540C\u6B65\"\u3002\n */\nexport async function buildModulePacks(force = false): Promise<BuildModulePacksResult> {\n try {\n const { bdsRoot, levelName } = resolveBdsContext();\n const deployed = readDeployedCatalog(bdsRoot, levelName);\n const desired = await computeDesiredCatalog(deployed ? reusePackIds(deployed) : undefined);\n\n if (!force && deployed && catalogsEqual(desired, deployed)) {\n return {\n success: true,\n message: formatPackLoadInfo(desired, false),\n catalog: deployed,\n };\n }\n\n pushLog(\n `building BP/RP (modules=${Object.keys(desired.modules).length})\u2026`,\n \"pack\",\n \"info\"\n );\n await bundleBehaviorPackScript();\n\n const mods = await scanLocalModules();\n const rpDirs: Record<string, string> = {};\n for (const m of mods) {\n if (!m.enabled || !m.hasResourcePack) continue;\n rpDirs[m.folderId] = path.join(\"modules\", \"packages\", m.folderId, \"resource_pack\");\n }\n\n const bpR = await spawnAssembleBp(desired);\n if (bpR.code !== 0) {\n return {\n success: false,\n message: c.red(bpR.output.trim() || `assemble-bp exit ${bpR.code}`),\n };\n }\n const rpR = await spawnAssembleRp(desired, rpDirs);\n if (rpR.code !== 0) {\n return {\n success: false,\n message: c.red(rpR.output.trim() || `assemble-rp exit ${rpR.code}`),\n };\n }\n\n desired.generatedAt = Date.now();\n if (Object.keys(rpDirs).length === 0) {\n desired.rpUuid = null;\n desired.rpVersion = null;\n }\n writeJson(path.join(bpOut(), DEPLOY_CATALOG_NAME), desired);\n\n return {\n success: true,\n message: formatPackLoadInfo(desired, true),\n catalog: desired,\n };\n } catch (e) {\n return {\n success: false,\n message: c.red((e as Error).message),\n };\n }\n}\n\n/**\n * `sfmc mod build` \u2014\u2014 \u7EC4\u88C5 BP + RP\uFF08\u4E0D\u90E8\u7F72\uFF09\u3002\n */\nexport async function cmdModuleBuild(args: string[] = []): Promise<string> {\n const force = args.includes(\"--force\") || args.includes(\"-f\");\n const res = await buildModulePacks(force);\n return res.message;\n}\n\n/**\n * `sfmc mod reload [--build-only] [--force]` \u2014\u2014 \u7EC4\u88C5 + \u90E8\u7F72 + \u6E05\u7406\u8FC7\u671F + \u5199\u6743\u9650 + \uFF08\u9ED8\u8BA4\uFF09\u53D1 reload \u5230 BDS\u3002\n */\nexport async function cmdModuleReload(args: string[] = []): Promise<string> {\n const buildOnly = args?.includes(\"--build-only\") ?? false;\n const force = args?.includes(\"--force\") || args?.includes(\"-f\");\n const parts: string[] = [];\n\n const buildRes = await buildModulePacks(force);\n parts.push(buildRes.message.trimEnd());\n if (!buildRes.success || !buildRes.catalog) {\n return parts.join(\"\\n\") + \"\\n\";\n }\n\n try {\n const { bdsRoot, levelName } = resolveBdsContext();\n const desired = buildRes.catalog;\n\n const depR = await spawnDeploy(desired);\n if (depR.code !== 0) {\n return parts.join(\"\\n\") + \"\\n\" + c.red(depR.output.trim() || `deploy exit ${depR.code}`);\n }\n parts.push(depR.output.trimEnd());\n\n writeJson(path.join(deployedBpDir(bdsRoot, levelName), DEPLOY_CATALOG_NAME), desired);\n\n await spawnDisableStale(desired, bdsRoot, levelName);\n\n const enR = await spawnEnablePacks(desired);\n if (enR.code !== 0) {\n return parts.join(\"\\n\") + \"\\n\" + c.red(enR.output.trim() || `enable-pack exit ${enR.code}`);\n }\n parts.push(enR.output.trimEnd());\n\n const perR = await spawnEnsurePermission(desired);\n if (perR.code !== 0) {\n return parts.join(\"\\n\") + \"\\n\" + c.red(perR.output.trim() || `ensure-permission exit ${perR.code}`);\n }\n parts.push(perR.output.trimEnd());\n } catch (e) {\n return parts.join(\"\\n\") + \"\\n\" + c.red((e as Error).message);\n }\n\n if (buildOnly) {\n parts.push(c.dim(t(\"reload.buildOnly\")));\n return parts.join(\"\\n\") + \"\\n\";\n }\n\n const { isServiceRunning } = await import(\"./services.js\");\n if (!(await isServiceRunning(\"bds\"))) {\n parts.push(c.yellow(t(\"reload.bdsNotRunning\")));\n return parts.join(\"\\n\") + \"\\n\";\n }\n const { cmdSend } = await import(\"./commands.js\");\n parts.push((await cmdSend(\"bds\", \"reload\")).trimEnd());\n parts.push(c.green(t(\"reload.sent\")));\n return parts.join(\"\\n\") + \"\\n\";\n}\n\nfunction reusePackIds(\n deployed: DeployCatalog\n): Parameters<typeof computeDesiredCatalog>[0] {\n return {\n bpUuid: deployed.bpUuid,\n rpUuid: deployed.rpUuid,\n bpVersion: deployed.bpVersion,\n rpVersion: deployed.rpVersion,\n ...(deployed.bpModuleUuid ? { bpModuleUuid: deployed.bpModuleUuid } : {}),\n ...(deployed.rpModuleUuid ? { rpModuleUuid: deployed.rpModuleUuid } : {}),\n };\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * module-pack-build.ts \u2014 `mod build` / `mod reload` \u7684 spawn-based \u5B9E\u73B0\n *\n * CLI \u6D3E\u53D1\u7684 module build / reload \u5B50\u547D\u4EE4\u8D70\u8FD9\u91CC\uFF1Bpack-lifecycle.ts \u4FDD\u7559\n * ensurePacksReady \u542F\u52A8\u94A9\u5B50\u4E0E wizard \u5185\u90E8\u6D88\u8D39\u65B9\u7684 in-process \u5165\u53E3\u3002\n *\n * \u5B9E\u9645\u6587\u4EF6\u5199\u5165\uFF08assemble-bp / assemble-rp / deploy / enable-pack / disable-pack /\n * ensure-permission\uFF09\u901A\u8FC7 spawn bds-tools/cli-pack-manager.ts \u7684 verb \u6267\u884C\uFF1B\n * \u4E0E module install/uninstall\uFF08\u2192 scripts/module-install/fetch-module.mjs\uFF09\u4FDD\u6301\u540C\u4E00\u67B6\u6784\uFF1A\n * CLI \u662F thin wrapper\uFF1B\u5EFA\u4ED3\u811A\u624B\u67B6\u5728 @sfmc-bds/create-module\uFF08npm create\uFF09\u3002\n *\n * \u552F\u4E00\u6743\u5A01\uFF1A\u672C\u6587\u4EF6 = `sfmc mod build|reload` \u7684\u6D3E\u53D1\u5165\u53E3\uFF1B\u5176\u4ED6\u6587\u4EF6\u4E0D\u5F97\u518D\n * \u76F4\u63A5 import pack-lifecycle \u7684 cmdPackBuild / deployPacks\uFF08\u786E\u4FDD\u53EA\u6709\u4E00\u4E2A spawn \u5165\u53E3\uFF09\u3002\n */\nimport { writeJson } from \"@sfmc-bds/sdk/node/config\";\nimport { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { t } from \"./i18n/index.js\";\nimport { pushLog } from \"./logs.js\";\nimport {\n BP_NAME,\n DEPLOY_CATALOG_NAME,\n RP_NAME,\n bpOut,\n bpSrc,\n buildRoot,\n catalogsEqual,\n computeDesiredCatalog,\n createSdkResolvePlugin,\n deployedBpDir,\n formatPackLoadInfo,\n readDeployedCatalog,\n resolveBdsContext,\n rpOut,\n scanLocalModules,\n type DeployCatalog,\n} from \"./pack-lifecycle.js\";\nimport { ROOT, getRoot, resolveSdkPackageRoot, resolveServiceScript } from \"./runtime.js\";\nimport { c } from \"./theme.js\";\n\ntype SpawnResult = { code: number | null; output: string };\n\n/** spawn bds-tools/cli-pack-manager.ts \u5B50\u8FDB\u7A0B\uFF1B\u6355\u83B7 stdout+stderr\u3002 */\nfunction spawnPackManager(args: string[]): Promise<SpawnResult> {\n return new Promise((resolve) => {\n const script = resolveServiceScript(\"pack-manager\");\n const proc = spawn(process.execPath, [script, ...args], {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env, SFMC_ROOT: getRoot(), SFMC_SERVICE: \"pack-manager\" },\n });\n let output = \"\";\n proc.stdout?.on(\"data\", (d: Buffer) => {\n output += d.toString();\n });\n proc.stderr?.on(\"data\", (d: Buffer) => {\n output += d.toString();\n });\n proc.on(\"exit\", (code) => resolve({ code, output }));\n proc.on(\"error\", (e) => resolve({ code: 1, output: `${output}${e.message}` }));\n });\n}\n\n/* esbuild bundle \u2014\u2014 JS bundler \u662F in-process \u5E93\uFF0C\u4E0D\u8D70 spawn\u3002 */\nasync function bundleBehaviorPackScript(): Promise<void> {\n const mods = await scanLocalModules();\n const entries = mods.filter((m) => m.enabled && m.entryPath).map((m) => m.entryPath!);\n const outFile = path.join(bpSrc(), \"scripts\", \"main.js\");\n await fs.mkdir(path.dirname(outFile), { recursive: true });\n\n if (entries.length === 0) {\n await fs.writeFile(outFile, \"/* no modules enabled */\\n\", \"utf8\");\n pushLog(\"no enabled SAPI modules \u2014 empty main.js\", \"pack\", \"warn\");\n return;\n }\n\n const { build } = await import(\"esbuild\");\n const sdkRoot = resolveSdkPackageRoot();\n await build({\n stdin: {\n contents: [\n 'import \"sfmc:host\";',\n ...entries.map((e) => `import ${JSON.stringify(path.resolve(e).replace(/\\\\/g, \"/\"))};`),\n ].join(\"\\n\"),\n resolveDir: ROOT,\n sourcefile: \"bootstrap.ts\",\n loader: \"ts\",\n },\n outfile: outFile,\n bundle: true,\n platform: \"neutral\",\n format: \"esm\",\n target: \"es2022\",\n logLevel: \"warning\",\n sourcemap: true,\n external: [\"@minecraft/*\"],\n tsconfigRaw: JSON.stringify({\n compilerOptions: {\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n target: \"ES2022\",\n strict: true,\n skipLibCheck: true,\n },\n }),\n plugins: [createSdkResolvePlugin(sdkRoot)],\n });\n pushLog(`esbuild bundled ${entries.length} entr(y/ies)`, \"pack\", \"info\");\n}\n\n/** spawn assemble-bp verb\u3002 */\nasync function spawnAssembleBp(catalog: DeployCatalog): Promise<SpawnResult> {\n const args = [\n \"assemble-bp\",\n \"--src\",\n bpSrc(),\n \"--out\",\n bpOut(),\n \"--name\",\n BP_NAME,\n \"--uuid\",\n catalog.bpUuid,\n \"--version\",\n catalog.bpVersion.join(\",\"),\n ];\n if (catalog.bpModuleUuid) args.push(\"--module-uuid\", catalog.bpModuleUuid);\n if (catalog.dependencies && catalog.dependencies.length > 0) {\n const depsFile = path.join(buildRoot(), \"bp-dependencies.json\");\n await fs.mkdir(buildRoot(), { recursive: true });\n await fs.writeFile(depsFile, JSON.stringify(catalog.dependencies), \"utf8\");\n args.push(\"--dependencies-json\", depsFile);\n }\n const r = await spawnPackManager(args);\n if (r.code === 0) {\n pushLog(`assembled BP uuid=${catalog.bpUuid}`, \"pack\", \"info\");\n }\n return r;\n}\n\n/** spawn assemble-rp verb\uFF1B\u65E0 RP \u65F6\u6E05\u7406\u65E7\u4EA7\u7269\u3002 */\nasync function spawnAssembleRp(catalog: DeployCatalog, rpDirs: Record<string, string>): Promise<SpawnResult> {\n if (!catalog.rpUuid || Object.keys(rpDirs).length === 0) {\n await fs.rm(rpOut(), { recursive: true, force: true });\n pushLog(\"no enabled resource packs \u2014 RP skipped\", \"pack\", \"info\");\n return { code: 0, output: \"[pack-manager] no enabled resource packs \u2014 RP skipped\\n\" };\n }\n const mapFile = path.join(buildRoot(), \"rp-map.json\");\n await fs.mkdir(buildRoot(), { recursive: true });\n await fs.writeFile(mapFile, JSON.stringify(rpDirs), \"utf8\");\n const args = [\n \"assemble-rp\",\n \"--modules-json\",\n mapFile,\n \"--out\",\n rpOut(),\n \"--name\",\n RP_NAME,\n \"--uuid\",\n catalog.rpUuid,\n \"--version\",\n (catalog.rpVersion ?? [1, 0, 0]).join(\",\"),\n ];\n if (catalog.rpModuleUuid) args.push(\"--module-uuid\", catalog.rpModuleUuid);\n const r = await spawnPackManager(args);\n if (r.code === 0) {\n pushLog(`assembled RP uuid=${catalog.rpUuid} (${Object.keys(rpDirs).length} modules)`, \"pack\", \"info\");\n }\n return r;\n}\n\n/** spawn deploy verb\uFF1B\u65E0 RP \u65F6\u5E26 --clear-rp\u3002 */\nasync function spawnDeploy(catalog: DeployCatalog): Promise<SpawnResult> {\n const { bdsRoot, levelName } = resolveBdsContext();\n const args = [\n \"deploy\",\n \"--bds-root\",\n bdsRoot,\n \"--level\",\n levelName,\n \"--bp-src\",\n bpOut(),\n \"--bp-name\",\n BP_NAME,\n \"--rp-name\",\n RP_NAME,\n ];\n if (catalog.rpUuid && existsSync(rpOut())) {\n args.push(\"--rp-src\", rpOut());\n } else {\n args.push(\"--clear-rp\");\n }\n const r = await spawnPackManager(args);\n if (r.code === 0) {\n pushLog(`deployed to worlds/${levelName}`, \"pack\", \"info\");\n }\n return r;\n}\n\n/** spawn enable-pack verb\uFF1ABP \u5FC5\u987B\uFF0CRP \u4EC5\u5728\u6709 UUID \u65F6\u3002 */\nasync function spawnEnablePacks(catalog: DeployCatalog): Promise<SpawnResult> {\n const { bdsRoot, levelName } = resolveBdsContext();\n const worldsDir = path.join(bdsRoot, \"worlds\");\n let output = \"\";\n const bpArgs = [\n \"enable-pack\",\n \"--worlds-dir\",\n worldsDir,\n \"--level\",\n levelName,\n \"--kind\",\n \"behavior\",\n \"--pack-id\",\n catalog.bpUuid,\n \"--version\",\n catalog.bpVersion.join(\",\"),\n ];\n const bpR = await spawnPackManager(bpArgs);\n output += bpR.output;\n if (bpR.code !== 0) return { code: bpR.code, output };\n pushLog(`enabled behavior pack ${catalog.bpUuid} in world list`, \"pack\", \"info\");\n if (catalog.rpUuid && catalog.rpVersion) {\n const rpArgs = [\n \"enable-pack\",\n \"--worlds-dir\",\n worldsDir,\n \"--level\",\n levelName,\n \"--kind\",\n \"resource\",\n \"--pack-id\",\n catalog.rpUuid,\n \"--version\",\n catalog.rpVersion.join(\",\"),\n ];\n const rpR = await spawnPackManager(rpArgs);\n output += rpR.output;\n if (rpR.code !== 0) return { code: rpR.code, output };\n pushLog(`enabled resource pack ${catalog.rpUuid} in world list`, \"pack\", \"info\");\n }\n return { code: 0, output };\n}\n\n/** spawn disable-pack verb\uFF1A\u6E05\u7406\u8FC7\u671F UUID\uFF08uuid \u8F6E\u6362 / \u4E0D\u518D\u63D0\u4F9B RP\uFF09\u3002 */\nasync function spawnDisableStale(current: DeployCatalog, bdsRoot: string, levelName: string): Promise<void> {\n const previous = await collectDeployedPackUuids(bdsRoot, levelName);\n const worldsDir = path.join(bdsRoot, \"worlds\");\n for (const staleRp of previous.rp) {\n if (staleRp === (current.rpUuid ?? null)) continue;\n const r = await spawnPackManager([\n \"disable-pack\",\n \"--worlds-dir\",\n worldsDir,\n \"--level\",\n levelName,\n \"--kind\",\n \"resource\",\n \"--pack-id\",\n staleRp,\n \"--version\",\n \"1,0,0\",\n ]);\n if (r.code === 0) {\n pushLog(`disabled stale resource pack ${staleRp}`, \"pack\", \"info\");\n } else {\n pushLog(`disable stale RP ${staleRp} failed: ${r.output.trim()}`, \"pack\", \"warn\");\n }\n }\n for (const staleBp of previous.bp) {\n if (staleBp === current.bpUuid) continue;\n const r = await spawnPackManager([\n \"disable-pack\",\n \"--worlds-dir\",\n worldsDir,\n \"--level\",\n levelName,\n \"--kind\",\n \"behavior\",\n \"--pack-id\",\n staleBp,\n \"--version\",\n \"1,0,0\",\n ]);\n if (r.code === 0) {\n pushLog(`disabled stale behavior pack ${staleBp}`, \"pack\", \"info\");\n } else {\n pushLog(`disable stale BP ${staleBp} failed: ${r.output.trim()}`, \"pack\", \"warn\");\n }\n }\n}\n\n/** \u901A\u8FC7 bds-tools \u7684 list-installed + read-manifest \u62FF\u5230 deployed UUID\uFF08spawn\uFF09\u3002 */\nasync function collectDeployedPackUuids(\n bdsRoot: string,\n levelName: string\n): Promise<{ bp: Set<string>; rp: Set<string> }> {\n const bp = new Set<string>();\n const rp = new Set<string>();\n const cat = readDeployedCatalog(bdsRoot, levelName);\n if (cat?.bpUuid) bp.add(cat.bpUuid);\n if (cat?.rpUuid) rp.add(cat.rpUuid);\n // \u901A\u8FC7 read-manifest \u770B\u4E16\u754C\u78C1\u76D8 BP/RP manifest \u7684 uuid\uFF0C\u4F5C\u4E3A catalog \u7F3A\u5931\u65F6\u7684\u515C\u5E95\u3002\n const bpDir = path.join(bdsRoot, \"worlds\", levelName, \"behavior_packs\", BP_NAME);\n const rpDir = path.join(bdsRoot, \"worlds\", levelName, \"resource_packs\", RP_NAME);\n const bpR = await spawnPackManager([\"read-manifest\", \"--pack-dir\", bpDir]);\n if (bpR.code === 0) {\n try {\n const j = JSON.parse(bpR.output.trim()) as { uuid?: string } | null;\n if (j?.uuid) bp.add(j.uuid);\n } catch {\n /* ignore */\n }\n }\n const rpR = await spawnPackManager([\"read-manifest\", \"--pack-dir\", rpDir]);\n if (rpR.code === 0) {\n try {\n const j = JSON.parse(rpR.output.trim()) as { uuid?: string } | null;\n if (j?.uuid) rp.add(j.uuid);\n } catch {\n /* ignore */\n }\n }\n return { bp, rp };\n}\n\n/** spawn ensure-permission verb\u3002 */\nasync function spawnEnsurePermission(catalog: DeployCatalog): Promise<SpawnResult> {\n const { bdsRoot } = resolveBdsContext();\n const r = await spawnPackManager([\"ensure-permission\", \"--bds-root\", bdsRoot, \"--pack-id\", catalog.bpUuid]);\n return r;\n}\n\nexport type BuildModulePacksResult = {\n success: boolean;\n message: string;\n catalog?: DeployCatalog;\n};\n\n/**\n * \u7EC4\u88C5 BP + RP \u7EAF\u903B\u8F91\uFF08\u4E0D\u90E8\u7F72\uFF09\u3002\n * \u4EC5\u5F53 catalog \u4E0E\u4E16\u754C\u5185\u5DF2\u90E8\u7F72\u4E0D\u4E00\u81F4\u65F6\u6267\u884C\uFF1B\u5426\u5219\u76F4\u63A5\u6253\"\u5DF2\u540C\u6B65\"\u3002\n */\nexport async function buildModulePacks(force = false): Promise<BuildModulePacksResult> {\n try {\n const { bdsRoot, levelName } = resolveBdsContext();\n const deployed = readDeployedCatalog(bdsRoot, levelName);\n const desired = await computeDesiredCatalog(deployed ? reusePackIds(deployed) : undefined);\n\n if (!force && deployed && catalogsEqual(desired, deployed)) {\n return {\n success: true,\n message: formatPackLoadInfo(desired, false),\n catalog: deployed,\n };\n }\n\n pushLog(`building BP/RP (modules=${Object.keys(desired.modules).length})\u2026`, \"pack\", \"info\");\n await bundleBehaviorPackScript();\n\n const mods = await scanLocalModules();\n const rpDirs: Record<string, string> = {};\n for (const m of mods) {\n if (!m.enabled || !m.hasResourcePack) continue;\n rpDirs[m.folderId] = path.join(\"modules\", \"packages\", m.folderId, \"resource_pack\");\n }\n\n const bpR = await spawnAssembleBp(desired);\n if (bpR.code !== 0) {\n return {\n success: false,\n message: c.red(bpR.output.trim() || `assemble-bp exit ${bpR.code}`),\n };\n }\n const rpR = await spawnAssembleRp(desired, rpDirs);\n if (rpR.code !== 0) {\n return {\n success: false,\n message: c.red(rpR.output.trim() || `assemble-rp exit ${rpR.code}`),\n };\n }\n\n desired.generatedAt = Date.now();\n if (Object.keys(rpDirs).length === 0) {\n desired.rpUuid = null;\n desired.rpVersion = null;\n }\n writeJson(path.join(bpOut(), DEPLOY_CATALOG_NAME), desired);\n\n return {\n success: true,\n message: formatPackLoadInfo(desired, true),\n catalog: desired,\n };\n } catch (e) {\n return {\n success: false,\n message: c.red((e as Error).message),\n };\n }\n}\n\n/**\n * `sfmc mod build` \u2014\u2014 \u7EC4\u88C5 BP + RP\uFF08\u4E0D\u90E8\u7F72\uFF09\u3002\n */\nexport async function cmdModuleBuild(_args: string[] = []): Promise<string> {\n // \u663E\u5F0F `mod build` \u5FC5\u987B\u91CD\u5EFA\uFF1B\u589E\u91CF\u8DF3\u8FC7\u53EA\u5C5E\u4E8E\u542F\u52A8\u81EA\u68C0\u4E0E\u975E\u5F3A\u5236 reload\u3002\n const res = await buildModulePacks(true);\n return res.message;\n}\n\n/**\n * `sfmc mod reload [--build-only] [--force]` \u2014\u2014 \u7EC4\u88C5 + \u90E8\u7F72 + \u6E05\u7406\u8FC7\u671F + \u5199\u6743\u9650 + \uFF08\u9ED8\u8BA4\uFF09\u53D1 reload \u5230 BDS\u3002\n */\nexport async function cmdModuleReload(args: string[] = []): Promise<string> {\n const buildOnly = args?.includes(\"--build-only\") ?? false;\n const force = args?.includes(\"--force\") || args?.includes(\"-f\");\n const parts: string[] = [];\n\n const buildRes = await buildModulePacks(force);\n parts.push(buildRes.message.trimEnd());\n if (!buildRes.success || !buildRes.catalog) {\n return parts.join(\"\\n\") + \"\\n\";\n }\n\n try {\n const { bdsRoot, levelName } = resolveBdsContext();\n const desired = buildRes.catalog;\n\n const depR = await spawnDeploy(desired);\n if (depR.code !== 0) {\n return parts.join(\"\\n\") + \"\\n\" + c.red(depR.output.trim() || `deploy exit ${depR.code}`);\n }\n parts.push(depR.output.trimEnd());\n\n writeJson(path.join(deployedBpDir(bdsRoot, levelName), DEPLOY_CATALOG_NAME), desired);\n\n await spawnDisableStale(desired, bdsRoot, levelName);\n\n const enR = await spawnEnablePacks(desired);\n if (enR.code !== 0) {\n return parts.join(\"\\n\") + \"\\n\" + c.red(enR.output.trim() || `enable-pack exit ${enR.code}`);\n }\n parts.push(enR.output.trimEnd());\n\n const perR = await spawnEnsurePermission(desired);\n if (perR.code !== 0) {\n return parts.join(\"\\n\") + \"\\n\" + c.red(perR.output.trim() || `ensure-permission exit ${perR.code}`);\n }\n parts.push(perR.output.trimEnd());\n } catch (e) {\n return parts.join(\"\\n\") + \"\\n\" + c.red((e as Error).message);\n }\n\n if (buildOnly) {\n parts.push(c.dim(t(\"reload.buildOnly\")));\n return parts.join(\"\\n\") + \"\\n\";\n }\n\n const { isServiceRunning } = await import(\"./services.js\");\n if (!(await isServiceRunning(\"bds\"))) {\n parts.push(c.yellow(t(\"reload.bdsNotRunning\")));\n return parts.join(\"\\n\") + \"\\n\";\n }\n const { cmdSend } = await import(\"./commands.js\");\n parts.push((await cmdSend(\"bds\", \"reload\")).trimEnd());\n parts.push(c.green(t(\"reload.sent\")));\n return parts.join(\"\\n\") + \"\\n\";\n}\n\nfunction reusePackIds(deployed: DeployCatalog): Parameters<typeof computeDesiredCatalog>[0] {\n return {\n bpUuid: deployed.bpUuid,\n rpUuid: deployed.rpUuid,\n bpVersion: deployed.bpVersion,\n rpVersion: deployed.rpVersion,\n ...(deployed.bpModuleUuid ? { bpModuleUuid: deployed.bpModuleUuid } : {}),\n ...(deployed.rpModuleUuid ? { rpModuleUuid: deployed.rpModuleUuid } : {}),\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -14,7 +14,9 @@ test("pack bundling: sfmc:host bundles installHostBootstrap without unbundled SD
14
14
  dummyModFile,
15
15
  `
16
16
  import { ModuleRegistry } from "@sfmc-bds/sdk/module-loader";
17
+ import { Command, Permission } from "@sfmc-bds/sdk/sapi/runtime";
17
18
  globalThis.__testEvalOrder = (globalThis.__testEvalOrder || []).concat("module");
19
+ Command.register("dummy", Permission.Any, () => undefined, "dummy", "test-feature");
18
20
  ModuleRegistry.register({ id: "test-feature", lifecycle: {} });
19
21
  `
20
22
  );
@@ -60,6 +62,10 @@ ModuleRegistry.register({ id: "test-feature", lifecycle: {} });
60
62
  hostCallIdx < modMarkerIdx,
61
63
  `installHostBootstrap() (idx: ${hostCallIdx}) must execute before module evaluation (idx: ${modMarkerIdx})`
62
64
  );
65
+ const commandStateRefs = code.match(/__sfmcCommandState/g)?.length ?? 0;
66
+ const permissionStateRefs = code.match(/__sfmcPermissionRegistry/g)?.length ?? 0;
67
+ assert.ok(commandStateRefs >= 2, "Bundled SDK copies must share __sfmcCommandState");
68
+ assert.ok(permissionStateRefs >= 2, "Bundled SDK copies must share __sfmcPermissionRegistry");
63
69
  } finally {
64
70
  fs.rmSync(tmpDir, { recursive: true, force: true });
65
71
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/pack-bundle.test.ts"],
4
- "sourcesContent": ["import assert from \"node:assert/strict\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport test from \"node:test\";\nimport { build } from \"esbuild\";\nimport { createSdkResolvePlugin } from \"./pack-lifecycle.js\";\nimport { resolveSdkPackageRoot } from \"./runtime.js\";\n\ntest(\"pack bundling: sfmc:host bundles installHostBootstrap without unbundled SDK imports\", async () => {\n const sdkRoot = resolveSdkPackageRoot();\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"sfmc-bundle-test-\"));\n const dummyModFile = path.join(tmpDir, \"dummy-mod.ts\");\n\n fs.writeFileSync(\n dummyModFile,\n `\nimport { ModuleRegistry } from \"@sfmc-bds/sdk/module-loader\";\nglobalThis.__testEvalOrder = (globalThis.__testEvalOrder || []).concat(\"module\");\nModuleRegistry.register({ id: \"test-feature\", lifecycle: {} });\n`\n );\n\n try {\n const res = await build({\n stdin: {\n contents: [\n 'import \"sfmc:host\";',\n `import ${JSON.stringify(dummyModFile.replace(/\\\\/g, \"/\"))};`,\n ].join(\"\\n\"),\n resolveDir: tmpDir,\n sourcefile: \"bootstrap.ts\",\n loader: \"ts\",\n },\n write: false,\n bundle: true,\n platform: \"neutral\",\n format: \"esm\",\n target: \"es2022\",\n external: [\"@minecraft/*\"],\n plugins: [createSdkResolvePlugin(sdkRoot)],\n });\n\n const code = res.outputFiles[0].text;\n\n // 1. \u786E\u4FDD\u672A\u6B8B\u7559\u672A\u6253\u5305\u7684 @sfmc-bds/sdk import\n assert.doesNotMatch(\n code,\n /import\\s+.*from\\s+[\"']@sfmc(?:-bds)?\\/sdk/i,\n \"Bundle must not contain unbundled @sfmc-bds/sdk bare imports\"\n );\n\n // 2. \u786E\u4FDD installHostBootstrap \u5305\u542B\u5728\u4EA7\u7269\u4E2D\u4E14\u5DF2\u88AB\u8C03\u7528\n assert.match(code, /installHostBootstrap\\(\\)/, \"Bundle must call installHostBootstrap()\");\n\n // 3. \u786E\u4FDD\u6240\u6709\u5916\u90E8 import \u5747\u5C40\u9650\u4E8E @minecraft/* \u539F\u751F\u6A21\u5757\n const importLines = code\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter((l) => l.startsWith(\"import \") && l.includes(\" from \"));\n for (const line of importLines) {\n assert.match(\n line,\n /from\\s+[\"']@minecraft\\//,\n `Unexpected external import line in bundle: ${line}`\n );\n }\n\n // 4. \u786E\u4FDD installHostBootstrap \u5728\u4E1A\u52A1\u6A21\u5757 evaluation \u4E4B\u524D\u6267\u884C\n const hostCallIdx = code.indexOf(\"installHostBootstrap();\");\n const modMarkerIdx = code.indexOf(\"__testEvalOrder\");\n assert.ok(hostCallIdx !== -1, \"installHostBootstrap call exists\");\n assert.ok(modMarkerIdx !== -1, \"module eval marker exists\");\n assert.ok(\n hostCallIdx < modMarkerIdx,\n `installHostBootstrap() (idx: ${hostCallIdx}) must execute before module evaluation (idx: ${modMarkerIdx})`\n );\n } finally {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n }\n});\n\ntest(\"extractModuleBedrockDependencies: \u4ECE sapi/manifest.json \u4E0E package.json \u63D0\u53D6\u539F\u751F\u4F9D\u8D56\", async () => {\n const { extractModuleBedrockDependencies } = await import(\"./pack-lifecycle.js\");\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"sfmc-extract-dep-test-\"));\n try {\n fs.mkdirSync(path.join(tmpDir, \"sapi\"), { recursive: true });\n fs.writeFileSync(\n path.join(tmpDir, \"sapi\", \"manifest.json\"),\n JSON.stringify({\n schemaVersion: 2,\n id: \"test-menu\",\n name: \"\u6D4B\u8BD5\u83DC\u5355\",\n configKey: \"test\",\n requires: [],\n permissions: [],\n dependencies: [\n { module_name: \"@minecraft/server-ui\", version: \"2.0.0-beta\" },\n ],\n })\n );\n fs.writeFileSync(\n path.join(tmpDir, \"package.json\"),\n JSON.stringify({\n peerDependencies: {\n \"@minecraft/server\": \">=1.18.0\",\n },\n devDependencies: {\n \"@minecraft/server\": \"2.10.0-beta.1.26.40-preview.30\",\n },\n })\n );\n\n const deps = await extractModuleBedrockDependencies(tmpDir);\n assert.equal(deps.length, 2);\n assert.ok(deps.some((d) => d.module_name === \"@minecraft/server-ui\" && d.version === \"2.0.0-beta\"));\n assert.ok(deps.some((d) => d.module_name === \"@minecraft/server\" && d.version === \">=1.18.0\"));\n } finally {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n }\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import assert from \"node:assert/strict\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport test from \"node:test\";\nimport { build } from \"esbuild\";\nimport { createSdkResolvePlugin } from \"./pack-lifecycle.js\";\nimport { resolveSdkPackageRoot } from \"./runtime.js\";\n\ntest(\"pack bundling: sfmc:host bundles installHostBootstrap without unbundled SDK imports\", async () => {\n const sdkRoot = resolveSdkPackageRoot();\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"sfmc-bundle-test-\"));\n const dummyModFile = path.join(tmpDir, \"dummy-mod.ts\");\n\n fs.writeFileSync(\n dummyModFile,\n `\nimport { ModuleRegistry } from \"@sfmc-bds/sdk/module-loader\";\nimport { Command, Permission } from \"@sfmc-bds/sdk/sapi/runtime\";\nglobalThis.__testEvalOrder = (globalThis.__testEvalOrder || []).concat(\"module\");\nCommand.register(\"dummy\", Permission.Any, () => undefined, \"dummy\", \"test-feature\");\nModuleRegistry.register({ id: \"test-feature\", lifecycle: {} });\n`\n );\n\n try {\n const res = await build({\n stdin: {\n contents: [\n 'import \"sfmc:host\";',\n `import ${JSON.stringify(dummyModFile.replace(/\\\\/g, \"/\"))};`,\n ].join(\"\\n\"),\n resolveDir: tmpDir,\n sourcefile: \"bootstrap.ts\",\n loader: \"ts\",\n },\n write: false,\n bundle: true,\n platform: \"neutral\",\n format: \"esm\",\n target: \"es2022\",\n external: [\"@minecraft/*\"],\n plugins: [createSdkResolvePlugin(sdkRoot)],\n });\n\n const code = res.outputFiles[0].text;\n\n // 1. \u786E\u4FDD\u672A\u6B8B\u7559\u672A\u6253\u5305\u7684 @sfmc-bds/sdk import\n assert.doesNotMatch(\n code,\n /import\\s+.*from\\s+[\"']@sfmc(?:-bds)?\\/sdk/i,\n \"Bundle must not contain unbundled @sfmc-bds/sdk bare imports\"\n );\n\n // 2. \u786E\u4FDD installHostBootstrap \u5305\u542B\u5728\u4EA7\u7269\u4E2D\u4E14\u5DF2\u88AB\u8C03\u7528\n assert.match(code, /installHostBootstrap\\(\\)/, \"Bundle must call installHostBootstrap()\");\n\n // 3. \u786E\u4FDD\u6240\u6709\u5916\u90E8 import \u5747\u5C40\u9650\u4E8E @minecraft/* \u539F\u751F\u6A21\u5757\n const importLines = code\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter((l) => l.startsWith(\"import \") && l.includes(\" from \"));\n for (const line of importLines) {\n assert.match(\n line,\n /from\\s+[\"']@minecraft\\//,\n `Unexpected external import line in bundle: ${line}`\n );\n }\n\n // 4. \u786E\u4FDD installHostBootstrap \u5728\u4E1A\u52A1\u6A21\u5757 evaluation \u4E4B\u524D\u6267\u884C\n const hostCallIdx = code.indexOf(\"installHostBootstrap();\");\n const modMarkerIdx = code.indexOf(\"__testEvalOrder\");\n assert.ok(hostCallIdx !== -1, \"installHostBootstrap call exists\");\n assert.ok(modMarkerIdx !== -1, \"module eval marker exists\");\n assert.ok(\n hostCallIdx < modMarkerIdx,\n `installHostBootstrap() (idx: ${hostCallIdx}) must execute before module evaluation (idx: ${modMarkerIdx})`\n );\n\n // 5. SDK \u5B50\u8DEF\u5F84\u4F1A\u5206\u522B\u9884\u6253\u5305\uFF0C\u4F46\u6240\u6709\u526F\u672C\u5FC5\u987B\u7ED1\u5B9A\u540C\u4E00\u4E2A\u5168\u5C40\u547D\u4EE4/\u6743\u9650\u72B6\u6001\u3002\n const commandStateRefs = code.match(/__sfmcCommandState/g)?.length ?? 0;\n const permissionStateRefs = code.match(/__sfmcPermissionRegistry/g)?.length ?? 0;\n assert.ok(commandStateRefs >= 2, \"Bundled SDK copies must share __sfmcCommandState\");\n assert.ok(permissionStateRefs >= 2, \"Bundled SDK copies must share __sfmcPermissionRegistry\");\n } finally {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n }\n});\n\ntest(\"extractModuleBedrockDependencies: \u4ECE sapi/manifest.json \u4E0E package.json \u63D0\u53D6\u539F\u751F\u4F9D\u8D56\", async () => {\n const { extractModuleBedrockDependencies } = await import(\"./pack-lifecycle.js\");\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"sfmc-extract-dep-test-\"));\n try {\n fs.mkdirSync(path.join(tmpDir, \"sapi\"), { recursive: true });\n fs.writeFileSync(\n path.join(tmpDir, \"sapi\", \"manifest.json\"),\n JSON.stringify({\n schemaVersion: 2,\n id: \"test-menu\",\n name: \"\u6D4B\u8BD5\u83DC\u5355\",\n configKey: \"test\",\n requires: [],\n permissions: [],\n dependencies: [\n { module_name: \"@minecraft/server-ui\", version: \"2.0.0-beta\" },\n ],\n })\n );\n fs.writeFileSync(\n path.join(tmpDir, \"package.json\"),\n JSON.stringify({\n peerDependencies: {\n \"@minecraft/server\": \">=1.18.0\",\n },\n devDependencies: {\n \"@minecraft/server\": \"2.10.0-beta.1.26.40-preview.30\",\n },\n })\n );\n\n const deps = await extractModuleBedrockDependencies(tmpDir);\n assert.equal(deps.length, 2);\n assert.ok(deps.some((d) => d.module_name === \"@minecraft/server-ui\" && d.version === \"2.0.0-beta\"));\n assert.ok(deps.some((d) => d.module_name === \"@minecraft/server\" && d.version === \">=1.18.0\"));\n } finally {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n }\n});\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pack-lifecycle.d.ts","sourceRoot":"","sources":["../src/pack-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgBH,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEvE,OAAO,EAkBL,KAAK,sBAAsB,EAC5B,MAAM,sCAAsC,CAAC;AAI9C,eAAO,MAAM,OAAO,iBAAiB,CAAC;AACtC,eAAO,MAAM,OAAO,oBAAoB,CAAC;AACzC,eAAO,MAAM,mBAAmB,6BAA6B,CAAC;AAC9D,eAAO,MAAM,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAa,CAAC;AAExE,uEAAuE;AACvE,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,SAAS,EAAE,MAAM,CAoJhF;AAED,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AACD,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AACD,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AACD,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AA0BD,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,MAAkB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAQlG;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9E;AA6BD;;;;;GAKG;AACH,wBAAsB,gCAAgC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CA2EzG;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAC/C,KAAK,CAAC;IACJ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,oBAAoB,EAAE,sBAAsB,EAAE,CAAC;CAChD,CAAC,CACH,CAwEA;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,CAAC,EAAE;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,aAAa,CAAC,CAmEzB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAQ5F;AAED,4FAA4F;AAC5F,wBAAgB,aAAa,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,OAAO,CAoCzE;AAOD,4CAA4C;AAC5C,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAoGhF;AAED,gDAAgD;AAChD,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiGvE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAuBnF;AAoBD;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAiElE;AAID,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAQtE;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAevE;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAiCpE;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBlE;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA0BxG"}
1
+ {"version":3,"file":"pack-lifecycle.d.ts","sourceRoot":"","sources":["../src/pack-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -114,7 +114,7 @@ function createSdkResolvePlugin(sdkRoot) {
114
114
  ]
115
115
  };
116
116
  }
117
- return { path: resolved };
117
+ return { path: resolved, namespace: "file" };
118
118
  });
119
119
  build.onLoad({ filter: /.*/, namespace: "sfmc-scoped-db" }, (args) => {
120
120
  const u = new URL(args.path);