@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.
- package/dist/i18n/locales/en.d.ts +10 -5
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +5 -0
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
- package/dist/i18n/locales/zh-CN.js +5 -0
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/logs-blank-line.test.js +16 -0
- package/dist/logs-blank-line.test.js.map +7 -0
- package/dist/logs.d.ts +2 -0
- package/dist/logs.d.ts.map +1 -1
- package/dist/logs.js +8 -1
- package/dist/logs.js.map +2 -2
- package/dist/module-pack-build.d.ts +1 -1
- package/dist/module-pack-build.d.ts.map +1 -1
- package/dist/module-pack-build.js +20 -51
- package/dist/module-pack-build.js.map +2 -2
- package/dist/pack-bundle.test.js +6 -0
- package/dist/pack-bundle.test.js.map +2 -2
- package/dist/pack-lifecycle.d.ts.map +1 -1
- package/dist/pack-lifecycle.js +1 -1
- package/dist/pack-lifecycle.js.map +2 -2
- package/dist/repl-windows/host.d.ts +6 -3
- package/dist/repl-windows/host.d.ts.map +1 -1
- package/dist/repl-windows/host.js +12 -6
- package/dist/repl-windows/host.js.map +2 -2
- package/dist/repl-windows/host.test.js +72 -0
- package/dist/repl-windows/host.test.js.map +7 -0
- package/dist/repl-windows/index.d.ts +1 -0
- package/dist/repl-windows/index.d.ts.map +1 -1
- package/dist/repl-windows/index.js +3 -0
- package/dist/repl-windows/index.js.map +2 -2
- package/dist/repl-windows/sfmc-window.d.ts +7 -0
- package/dist/repl-windows/sfmc-window.d.ts.map +1 -0
- package/dist/repl-windows/sfmc-window.js +28 -0
- package/dist/repl-windows/sfmc-window.js.map +7 -0
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +21 -7
- package/dist/repl.js.map +2 -2
- package/dist/send-target.d.ts +2 -0
- package/dist/send-target.d.ts.map +1 -1
- package/dist/send-target.js +4 -0
- package/dist/send-target.js.map +2 -2
- package/dist/services-output.test.js +9 -0
- package/dist/services-output.test.js.map +7 -0
- package/dist/services.d.ts +2 -0
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +6 -2
- package/dist/services.js.map +2 -2
- package/dist/world-packs-list.test.js +11 -0
- package/dist/world-packs-list.test.js.map +7 -0
- package/dist/world-packs.d.ts +2 -0
- package/dist/world-packs.d.ts.map +1 -1
- package/dist/world-packs.js +90 -18
- package/dist/world-packs.js.map +3 -3
- package/package.json +4 -4
- package/scripts/module-install/check-modules.mjs +42 -2
- package/scripts/module-install/fetch-module.mjs +70 -46
- package/scripts/module-install/lib/config-seeding.mjs +128 -0
- package/scripts/module-install/test/check-modules-config.test.ts +46 -0
- 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
|
/** 订阅新日志事件,返回取消订阅函数 */
|
package/dist/logs.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
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": "AAeA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,OAIK;AACP,SAAS,SAAS,eAAe;AACjC,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,GAAG,wBAAwB;AACpC,SAAS,YAAY;AAOrB,SAAS,kBAAkB,yBAAAA,wBAAuB,qBAAAC,0BAAyB;AAE3E,MAAM,SAAS,mBAAmB,GAAI;AAGtC,MAAM,sBAAsB,oBAAI,IAAI,CAAC,MAAM,MAAM,QAAQ,CAAC;AAE1D,MAAM,YAAY,oBAAI,IAAsB;
|
|
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(
|
|
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":"
|
|
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 {
|
|
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
|
-
|
|
17
|
+
computeDesiredCatalog,
|
|
18
|
+
createSdkResolvePlugin,
|
|
19
19
|
deployedBpDir,
|
|
20
20
|
formatPackLoadInfo,
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
readDeployedCatalog,
|
|
22
|
+
resolveBdsContext,
|
|
23
|
+
rpOut,
|
|
24
|
+
scanLocalModules
|
|
23
25
|
} from "./pack-lifecycle.js";
|
|
24
|
-
import { ROOT, getRoot,
|
|
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(
|
|
373
|
-
const
|
|
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": "AAcA,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAC3B,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,aAAa;AACpB,SAAS,
|
|
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
|
}
|
package/dist/pack-bundle.test.js
CHANGED
|
@@ -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": "AAAA,OAAO,YAAY;AACnB,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,SAAS,aAAa;AACtB,SAAS,8BAA8B;AACvC,SAAS,6BAA6B;AAEtC,KAAK,uFAAuF,YAAY;AACtG,QAAM,UAAU,sBAAsB;AACtC,QAAM,SAAS,GAAG,YAAY,KAAK,KAAK,GAAG,OAAO,GAAG,mBAAmB,CAAC;AACzE,QAAM,eAAe,KAAK,KAAK,QAAQ,cAAc;AAErD,KAAG;AAAA,IACD;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,
|
|
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,
|
|
1
|
+
{"version":3,"file":"pack-lifecycle.d.ts","sourceRoot":"","sources":["../src/pack-lifecycle.ts"],"names":[],"mappings":"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"}
|
package/dist/pack-lifecycle.js
CHANGED
|
@@ -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);
|