@sfmc-bds/cli 0.2.0-beta.9 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/LICENSE +663 -0
  2. package/README.md +4 -5
  3. package/dist/bds-runtime-version.d.ts +3 -0
  4. package/dist/bds-runtime-version.d.ts.map +1 -0
  5. package/dist/bds-runtime-version.js +15 -0
  6. package/dist/bds-runtime-version.js.map +7 -0
  7. package/dist/command-surface.d.ts.map +1 -1
  8. package/dist/command-surface.js +3 -1
  9. package/dist/command-surface.js.map +2 -2
  10. package/dist/commands.d.ts +57 -4
  11. package/dist/commands.d.ts.map +1 -1
  12. package/dist/commands.js +78 -75
  13. package/dist/commands.js.map +2 -2
  14. package/dist/directory-picker.d.ts +27 -0
  15. package/dist/directory-picker.d.ts.map +1 -0
  16. package/dist/directory-picker.js +112 -0
  17. package/dist/directory-picker.js.map +7 -0
  18. package/dist/i18n/locales/en.d.ts +25 -1
  19. package/dist/i18n/locales/en.d.ts.map +1 -1
  20. package/dist/i18n/locales/en.js +25 -1
  21. package/dist/i18n/locales/en.js.map +2 -2
  22. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  23. package/dist/i18n/locales/zh-CN.js +26 -2
  24. package/dist/i18n/locales/zh-CN.js.map +2 -2
  25. package/dist/interactive-prompts.d.ts +1 -2
  26. package/dist/interactive-prompts.d.ts.map +1 -1
  27. package/dist/interactive-prompts.js +12 -23
  28. package/dist/interactive-prompts.js.map +3 -3
  29. package/dist/llbot-launch.d.ts +3 -3
  30. package/dist/llbot-launch.js.map +1 -1
  31. package/dist/log-filter.d.ts +18 -2
  32. package/dist/log-filter.d.ts.map +1 -1
  33. package/dist/log-filter.js +54 -4
  34. package/dist/log-filter.js.map +2 -2
  35. package/dist/log-translator.d.ts +36 -0
  36. package/dist/log-translator.d.ts.map +1 -0
  37. package/dist/log-translator.js +279 -0
  38. package/dist/log-translator.js.map +7 -0
  39. package/dist/logs.d.ts +2 -0
  40. package/dist/logs.d.ts.map +1 -1
  41. package/dist/logs.js +24 -11
  42. package/dist/logs.js.map +2 -2
  43. package/dist/main.js +5 -0
  44. package/dist/main.js.map +2 -2
  45. package/dist/module-commands.d.ts.map +1 -1
  46. package/dist/module-commands.js +22 -8
  47. package/dist/module-commands.js.map +2 -2
  48. package/dist/module-fingerprint.d.ts.map +1 -1
  49. package/dist/module-fingerprint.js +1 -0
  50. package/dist/module-fingerprint.js.map +2 -2
  51. package/dist/module-pack-build.d.ts +14 -4
  52. package/dist/module-pack-build.d.ts.map +1 -1
  53. package/dist/module-pack-build.js +81 -108
  54. package/dist/module-pack-build.js.map +2 -2
  55. package/dist/module-toggle.d.ts +1 -1
  56. package/dist/module-toggle.d.ts.map +1 -1
  57. package/dist/module-toggle.js.map +1 -1
  58. package/dist/pack-lifecycle.d.ts +15 -1
  59. package/dist/pack-lifecycle.d.ts.map +1 -1
  60. package/dist/pack-lifecycle.js +242 -15
  61. package/dist/pack-lifecycle.js.map +2 -2
  62. package/dist/player-session.d.ts +13 -0
  63. package/dist/player-session.d.ts.map +1 -0
  64. package/dist/player-session.js +26 -0
  65. package/dist/player-session.js.map +7 -0
  66. package/dist/registry.d.ts +1 -1
  67. package/dist/registry.d.ts.map +1 -1
  68. package/dist/registry.js +4 -1
  69. package/dist/registry.js.map +2 -2
  70. package/dist/repl-windows/format-display.d.ts.map +1 -1
  71. package/dist/repl-windows/format-display.js +5 -1
  72. package/dist/repl-windows/format-display.js.map +2 -2
  73. package/dist/repl-windows/host.d.ts +6 -3
  74. package/dist/repl-windows/host.d.ts.map +1 -1
  75. package/dist/repl-windows/host.js +12 -6
  76. package/dist/repl-windows/host.js.map +2 -2
  77. package/dist/repl-windows/index.d.ts +1 -0
  78. package/dist/repl-windows/index.d.ts.map +1 -1
  79. package/dist/repl-windows/index.js +3 -0
  80. package/dist/repl-windows/index.js.map +2 -2
  81. package/dist/repl-windows/service-window.d.ts.map +1 -1
  82. package/dist/repl-windows/service-window.js +1 -0
  83. package/dist/repl-windows/service-window.js.map +2 -2
  84. package/dist/repl-windows/sfmc-window.d.ts +7 -0
  85. package/dist/repl-windows/sfmc-window.d.ts.map +1 -0
  86. package/dist/repl-windows/sfmc-window.js +28 -0
  87. package/dist/repl-windows/sfmc-window.js.map +7 -0
  88. package/dist/repl.d.ts.map +1 -1
  89. package/dist/repl.js +38 -13
  90. package/dist/repl.js.map +2 -2
  91. package/dist/runtime.d.ts +2 -2
  92. package/dist/runtime.d.ts.map +1 -1
  93. package/dist/runtime.js +15 -2
  94. package/dist/runtime.js.map +2 -2
  95. package/dist/send-target.d.ts +2 -0
  96. package/dist/send-target.d.ts.map +1 -1
  97. package/dist/send-target.js +6 -0
  98. package/dist/send-target.js.map +2 -2
  99. package/dist/services.d.ts +26 -1
  100. package/dist/services.d.ts.map +1 -1
  101. package/dist/services.js +179 -45
  102. package/dist/services.js.map +2 -2
  103. package/dist/sfmc-modules-root.d.ts.map +1 -1
  104. package/dist/sfmc-modules-root.js +6 -2
  105. package/dist/sfmc-modules-root.js.map +2 -2
  106. package/dist/ui-command.d.ts +6 -0
  107. package/dist/ui-command.d.ts.map +1 -0
  108. package/dist/ui-command.js +68 -0
  109. package/dist/ui-command.js.map +7 -0
  110. package/dist/wizard.d.ts.map +1 -1
  111. package/dist/wizard.js +36 -31
  112. package/dist/wizard.js.map +2 -2
  113. package/dist/world-packs.d.ts +2 -0
  114. package/dist/world-packs.d.ts.map +1 -1
  115. package/dist/world-packs.js +161 -18
  116. package/dist/world-packs.js.map +2 -2
  117. package/package.json +22 -15
  118. package/scripts/module-install/check-modules.mjs +178 -0
  119. package/scripts/module-install/fetch-module.mjs +1083 -0
  120. package/scripts/module-install/lib/catalog.mjs +96 -0
  121. package/scripts/module-install/lib/config-seeding.mjs +128 -0
  122. package/scripts/module-install/lib/io.mjs +37 -0
  123. package/scripts/module-install/lib/link-from.mjs +80 -0
  124. package/scripts/module-install/lib/lock.mjs +78 -0
  125. package/scripts/module-install/lib/npm-resolver.mjs +55 -0
  126. package/scripts/module-install/lib/packages.mjs +136 -0
  127. package/scripts/module-install/lib/paths.mjs +48 -0
  128. package/scripts/module-install/lib/registry-index.mjs +50 -0
@@ -1,35 +1,36 @@
1
+ import { writeJson } from "@sfmc-bds/sdk/node/config";
1
2
  import { spawn } from "node:child_process";
2
- import { existsSync, readFileSync } from "node:fs";
3
+ import { existsSync } from "node:fs";
3
4
  import fs from "node:fs/promises";
4
5
  import path from "node:path";
5
6
  import process from "node:process";
6
- import { writeJson } from "@sfmc-bds/sdk/node/config";
7
+ import { t } from "./i18n/index.js";
8
+ import { pushLog } from "./logs.js";
7
9
  import {
8
10
  BP_NAME,
9
- RP_NAME,
10
11
  DEPLOY_CATALOG_NAME,
12
+ RP_NAME,
11
13
  bpOut,
12
14
  bpSrc,
13
- rpOut,
14
15
  buildRoot,
15
- computeDesiredCatalog,
16
- readDeployedCatalog,
17
16
  catalogsEqual,
18
- resolveBdsContext,
17
+ computeDesiredCatalog,
18
+ createSdkResolvePlugin,
19
19
  deployedBpDir,
20
20
  formatPackLoadInfo,
21
+ readDeployedCatalog,
22
+ resolveBdsContext,
23
+ rpOut,
21
24
  scanLocalModules
22
25
  } from "./pack-lifecycle.js";
23
- import { ROOT, resolveServiceScript } from "./runtime.js";
26
+ import { ROOT, getRoot, resolveSdkPackageRoot, resolveServiceScript } from "./runtime.js";
24
27
  import { c } from "./theme.js";
25
- import { t } from "./i18n/index.js";
26
- import { pushLog } from "./logs.js";
27
28
  function spawnPackManager(args) {
28
29
  return new Promise((resolve) => {
29
30
  const script = resolveServiceScript("pack-manager");
30
31
  const proc = spawn(process.execPath, [script, ...args], {
31
32
  stdio: ["ignore", "pipe", "pipe"],
32
- env: { ...process.env, SFMC_ROOT: ROOT, SFMC_SERVICE: "pack-manager" }
33
+ env: { ...process.env, SFMC_ROOT: getRoot(), SFMC_SERVICE: "pack-manager" }
33
34
  });
34
35
  let output = "";
35
36
  proc.stdout?.on("data", (d) => {
@@ -42,7 +43,7 @@ function spawnPackManager(args) {
42
43
  proc.on("error", (e) => resolve({ code: 1, output: `${output}${e.message}` }));
43
44
  });
44
45
  }
45
- async function bundleBehaviorPackScript() {
46
+ async function bundleBehaviorPackScript(dbPort) {
46
47
  const mods = await scanLocalModules();
47
48
  const entries = mods.filter((m) => m.enabled && m.entryPath).map((m) => m.entryPath);
48
49
  const outFile = path.join(bpSrc(), "scripts", "main.js");
@@ -53,21 +54,25 @@ async function bundleBehaviorPackScript() {
53
54
  return;
54
55
  }
55
56
  const { build } = await import("esbuild");
56
- const sdkRoot = await resolveSdkRootForEsbuild();
57
+ const sdkRoot = resolveSdkPackageRoot();
57
58
  await build({
58
- entryPoints: entries,
59
+ stdin: {
60
+ contents: [
61
+ 'import "sfmc:host";',
62
+ ...entries.map((e) => `import ${JSON.stringify(path.resolve(e).replace(/\\/g, "/"))};`)
63
+ ].join("\n"),
64
+ resolveDir: ROOT,
65
+ sourcefile: "bootstrap.ts",
66
+ loader: "ts"
67
+ },
59
68
  outfile: outFile,
60
69
  bundle: true,
61
70
  platform: "neutral",
62
71
  format: "esm",
63
72
  target: "es2022",
64
73
  logLevel: "warning",
65
- sourcemap: false,
74
+ sourcemap: true,
66
75
  external: ["@minecraft/*"],
67
- // BDS host 启动:与 module-loader barrel 分离(DIP),须在模块 register 之前执行
68
- banner: {
69
- js: 'import { installHostBootstrap } from "@sfmc-bds/sdk/module-loader/install";\ninstallHostBootstrap();\n'
70
- },
71
76
  tsconfigRaw: JSON.stringify({
72
77
  compilerOptions: {
73
78
  module: "ESNext",
@@ -77,47 +82,10 @@ async function bundleBehaviorPackScript() {
77
82
  skipLibCheck: true
78
83
  }
79
84
  }),
80
- plugins: [createSdkResolvePlugin(sdkRoot)]
85
+ plugins: [createSdkResolvePlugin(sdkRoot, dbPort)]
81
86
  });
82
87
  pushLog(`esbuild bundled ${entries.length} entr(y/ies)`, "pack", "info");
83
88
  }
84
- async function resolveSdkRootForEsbuild() {
85
- const { resolveSdkPackageRoot } = await import("./runtime.js");
86
- return resolveSdkPackageRoot();
87
- }
88
- function createSdkResolvePlugin(sdkRoot) {
89
- const pkg = JSON.parse(readFileSync(path.join(sdkRoot, "package.json"), "utf8"));
90
- const exportsMap = pkg.exports ?? {};
91
- function resolveExportSubpath(subpath) {
92
- const key = subpath === "" ? "." : `./${subpath}`;
93
- const entry = exportsMap[key];
94
- if (!entry) return null;
95
- const rel = typeof entry === "string" ? entry : entry.import ?? entry.default;
96
- if (!rel || typeof rel !== "string") return null;
97
- const abs = path.join(sdkRoot, rel);
98
- return existsSync(abs) ? abs : null;
99
- }
100
- return {
101
- name: "sfmc-sdk-resolve",
102
- setup(build) {
103
- build.onResolve({ filter: /^@sfmc(?:-bds)?\/sdk(?:\/|$)/ }, (args) => {
104
- const normalized = args.path.replace(/^@sfmc\/sdk/, "@sfmc-bds/sdk");
105
- const sub = normalized === "@sfmc-bds/sdk" ? "" : normalized.slice("@sfmc-bds/sdk/".length);
106
- const resolved = resolveExportSubpath(sub);
107
- if (!resolved) {
108
- return {
109
- errors: [
110
- {
111
- text: `Cannot resolve ${args.path} under SDK at ${sdkRoot} (export "./${sub || "."}" missing or file absent; run sdk:build?)`
112
- }
113
- ]
114
- };
115
- }
116
- return { path: resolved };
117
- });
118
- }
119
- };
120
- }
121
89
  async function spawnAssembleBp(catalog) {
122
90
  const args = [
123
91
  "assemble-bp",
@@ -133,6 +101,12 @@ async function spawnAssembleBp(catalog) {
133
101
  catalog.bpVersion.join(",")
134
102
  ];
135
103
  if (catalog.bpModuleUuid) args.push("--module-uuid", catalog.bpModuleUuid);
104
+ if (catalog.dependencies && catalog.dependencies.length > 0) {
105
+ const depsFile = path.join(buildRoot(), "bp-dependencies.json");
106
+ await fs.mkdir(buildRoot(), { recursive: true });
107
+ await fs.writeFile(depsFile, JSON.stringify(catalog.dependencies), "utf8");
108
+ args.push("--dependencies-json", depsFile);
109
+ }
136
110
  const r = await spawnPackManager(args);
137
111
  if (r.code === 0) {
138
112
  pushLog(`assembled BP uuid=${catalog.bpUuid}`, "pack", "info");
@@ -164,11 +138,7 @@ async function spawnAssembleRp(catalog, rpDirs) {
164
138
  if (catalog.rpModuleUuid) args.push("--module-uuid", catalog.rpModuleUuid);
165
139
  const r = await spawnPackManager(args);
166
140
  if (r.code === 0) {
167
- pushLog(
168
- `assembled RP uuid=${catalog.rpUuid} (${Object.keys(rpDirs).length} modules)`,
169
- "pack",
170
- "info"
171
- );
141
+ pushLog(`assembled RP uuid=${catalog.rpUuid} (${Object.keys(rpDirs).length} modules)`, "pack", "info");
172
142
  }
173
143
  return r;
174
144
  }
@@ -218,11 +188,7 @@ async function spawnEnablePacks(catalog) {
218
188
  const bpR = await spawnPackManager(bpArgs);
219
189
  output += bpR.output;
220
190
  if (bpR.code !== 0) return { code: bpR.code, output };
221
- pushLog(
222
- `enabled behavior pack ${catalog.bpUuid} in world list`,
223
- "pack",
224
- "info"
225
- );
191
+ pushLog(`enabled behavior pack ${catalog.bpUuid} in world list`, "pack", "info");
226
192
  if (catalog.rpUuid && catalog.rpVersion) {
227
193
  const rpArgs = [
228
194
  "enable-pack",
@@ -240,11 +206,7 @@ async function spawnEnablePacks(catalog) {
240
206
  const rpR = await spawnPackManager(rpArgs);
241
207
  output += rpR.output;
242
208
  if (rpR.code !== 0) return { code: rpR.code, output };
243
- pushLog(
244
- `enabled resource pack ${catalog.rpUuid} in world list`,
245
- "pack",
246
- "info"
247
- );
209
+ pushLog(`enabled resource pack ${catalog.rpUuid} in world list`, "pack", "info");
248
210
  }
249
211
  return { code: 0, output };
250
212
  }
@@ -269,11 +231,7 @@ async function spawnDisableStale(current, bdsRoot, levelName) {
269
231
  if (r.code === 0) {
270
232
  pushLog(`disabled stale resource pack ${staleRp}`, "pack", "info");
271
233
  } else {
272
- pushLog(
273
- `disable stale RP ${staleRp} failed: ${r.output.trim()}`,
274
- "pack",
275
- "warn"
276
- );
234
+ pushLog(`disable stale RP ${staleRp} failed: ${r.output.trim()}`, "pack", "warn");
277
235
  }
278
236
  }
279
237
  for (const staleBp of previous.bp) {
@@ -294,11 +252,7 @@ async function spawnDisableStale(current, bdsRoot, levelName) {
294
252
  if (r.code === 0) {
295
253
  pushLog(`disabled stale behavior pack ${staleBp}`, "pack", "info");
296
254
  } else {
297
- pushLog(
298
- `disable stale BP ${staleBp} failed: ${r.output.trim()}`,
299
- "pack",
300
- "warn"
301
- );
255
+ pushLog(`disable stale BP ${staleBp} failed: ${r.output.trim()}`, "pack", "warn");
302
256
  }
303
257
  }
304
258
  }
@@ -330,29 +284,23 @@ async function collectDeployedPackUuids(bdsRoot, levelName) {
330
284
  }
331
285
  async function spawnEnsurePermission(catalog) {
332
286
  const { bdsRoot } = resolveBdsContext();
333
- const r = await spawnPackManager([
334
- "ensure-permission",
335
- "--bds-root",
336
- bdsRoot,
337
- "--pack-id",
338
- catalog.bpUuid
339
- ]);
287
+ const r = await spawnPackManager(["ensure-permission", "--bds-root", bdsRoot, "--pack-id", catalog.bpUuid]);
340
288
  return r;
341
289
  }
342
- async function cmdModuleBuild(_args) {
290
+ async function buildModulePacks(force = false) {
343
291
  try {
344
292
  const { bdsRoot, levelName } = resolveBdsContext();
345
293
  const deployed = readDeployedCatalog(bdsRoot, levelName);
346
294
  const desired = await computeDesiredCatalog(deployed ? reusePackIds(deployed) : void 0);
347
- if (deployed && catalogsEqual(desired, deployed)) {
348
- return formatPackLoadInfo(desired, false);
295
+ if (!force && deployed && catalogsEqual(desired, deployed)) {
296
+ return {
297
+ success: true,
298
+ message: formatPackLoadInfo(desired, false),
299
+ catalog: deployed
300
+ };
349
301
  }
350
- pushLog(
351
- `building BP/RP (modules=${Object.keys(desired.modules).length})\u2026`,
352
- "pack",
353
- "info"
354
- );
355
- await bundleBehaviorPackScript();
302
+ pushLog(`building BP/RP (modules=${Object.keys(desired.modules).length})\u2026`, "pack", "info");
303
+ await bundleBehaviorPackScript(desired.dbPort);
356
304
  const mods = await scanLocalModules();
357
305
  const rpDirs = {};
358
306
  for (const m of mods) {
@@ -360,29 +308,53 @@ async function cmdModuleBuild(_args) {
360
308
  rpDirs[m.folderId] = path.join("modules", "packages", m.folderId, "resource_pack");
361
309
  }
362
310
  const bpR = await spawnAssembleBp(desired);
363
- if (bpR.code !== 0) return c.red(bpR.output.trim() || `assemble-bp exit ${bpR.code}`);
311
+ if (bpR.code !== 0) {
312
+ return {
313
+ success: false,
314
+ message: c.red(bpR.output.trim() || `assemble-bp exit ${bpR.code}`)
315
+ };
316
+ }
364
317
  const rpR = await spawnAssembleRp(desired, rpDirs);
365
- if (rpR.code !== 0) return c.red(rpR.output.trim() || `assemble-rp exit ${rpR.code}`);
318
+ if (rpR.code !== 0) {
319
+ return {
320
+ success: false,
321
+ message: c.red(rpR.output.trim() || `assemble-rp exit ${rpR.code}`)
322
+ };
323
+ }
366
324
  desired.generatedAt = Date.now();
367
325
  if (Object.keys(rpDirs).length === 0) {
368
326
  desired.rpUuid = null;
369
327
  desired.rpVersion = null;
370
328
  }
371
329
  writeJson(path.join(bpOut(), DEPLOY_CATALOG_NAME), desired);
372
- return c.green(t("pack.built", { path: bpOut() })) + "\n" + formatPackLoadInfo(desired, true);
330
+ return {
331
+ success: true,
332
+ message: formatPackLoadInfo(desired, true),
333
+ catalog: desired
334
+ };
373
335
  } catch (e) {
374
- return c.red(e.message);
336
+ return {
337
+ success: false,
338
+ message: c.red(e.message)
339
+ };
375
340
  }
376
341
  }
377
- async function cmdModuleReload(args) {
378
- const buildOnly = args.includes("--build-only");
342
+ async function cmdModuleBuild(_args = []) {
343
+ const res = await buildModulePacks(true);
344
+ return res.message;
345
+ }
346
+ async function cmdModuleReload(args = []) {
347
+ const buildOnly = args?.includes("--build-only") ?? false;
348
+ const force = args?.includes("--force") || args?.includes("-f");
379
349
  const parts = [];
380
- const buildMsg = await cmdModuleBuild([]);
381
- parts.push(buildMsg.trimEnd());
382
- if (buildMsg.startsWith(c.red(""))) return parts.join("\n") + "\n";
350
+ const buildRes = await buildModulePacks(force);
351
+ parts.push(buildRes.message.trimEnd());
352
+ if (!buildRes.success || !buildRes.catalog) {
353
+ return parts.join("\n") + "\n";
354
+ }
383
355
  try {
384
356
  const { bdsRoot, levelName } = resolveBdsContext();
385
- const desired = await computeDesiredCatalog();
357
+ const desired = buildRes.catalog;
386
358
  const depR = await spawnDeploy(desired);
387
359
  if (depR.code !== 0) {
388
360
  return parts.join("\n") + "\n" + c.red(depR.output.trim() || `deploy exit ${depR.code}`);
@@ -428,6 +400,7 @@ function reusePackIds(deployed) {
428
400
  };
429
401
  }
430
402
  export {
403
+ buildModulePacks,
431
404
  cmdModuleBuild,
432
405
  cmdModuleReload
433
406
  };
@@ -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 tools/fetch-module.mjs\uFF09\u3001\u811A\u624B\u67B6\n * \uFF08\u2192 tools/new-module.mjs\uFF09\u4FDD\u6301\u540C\u4E00\u67B6\u6784\uFF1ACLI \u662F thin wrapper\uFF0C\u5DE5\u4F5C\u5728\u5916\u90E8\u5DE5\u5177\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, readFileSync } 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 type DeployCatalog,\n} from \"./pack-lifecycle.js\";\nimport { ROOT, resolveServiceScript } 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: ROOT, 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 = await resolveSdkRootForEsbuild();\n await build({\n entryPoints: entries,\n outfile: outFile,\n bundle: true,\n platform: \"neutral\",\n format: \"esm\",\n target: \"es2022\",\n logLevel: \"warning\",\n sourcemap: false,\n external: [\"@minecraft/*\"],\n // BDS host \u542F\u52A8\uFF1A\u4E0E module-loader barrel \u5206\u79BB\uFF08DIP\uFF09\uFF0C\u987B\u5728\u6A21\u5757 register \u4E4B\u524D\u6267\u884C\n banner: {\n js: 'import { installHostBootstrap } from \"@sfmc-bds/sdk/module-loader/install\";\\ninstallHostBootstrap();\\n',\n },\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\nasync function resolveSdkRootForEsbuild(): Promise<string> {\n const { resolveSdkPackageRoot } = await import(\"./runtime.js\");\n return resolveSdkPackageRoot();\n}\n\n/** esbuild \u63D2\u4EF6\uFF1A\u89E3\u6790 @sfmc-bds/sdk \u7684 exports \u5B57\u6BB5\uFF08\u4E0E pack-lifecycle.ts \u5185\u90E8\u5B9E\u73B0\u540C\u6B65\uFF09\u3002 */\nfunction createSdkResolvePlugin(sdkRoot: string): import(\"esbuild\").Plugin {\n const pkg = JSON.parse(readFileSync(path.join(sdkRoot, \"package.json\"), \"utf8\")) as {\n exports?: Record<string, string | { import?: string; default?: string; types?: string }>;\n };\n const exportsMap = pkg.exports ?? {};\n\n function resolveExportSubpath(subpath: string): string | null {\n const key = subpath === \"\" ? \".\" : `./${subpath}`;\n const entry = exportsMap[key];\n if (!entry) return null;\n const rel = typeof entry === \"string\" ? entry : (entry.import ?? entry.default);\n if (!rel || typeof rel !== \"string\") return null;\n const abs = path.join(sdkRoot, rel);\n return existsSync(abs) ? abs : null;\n }\n\n return {\n name: \"sfmc-sdk-resolve\",\n setup(build) {\n build.onResolve({ filter: /^@sfmc(?:-bds)?\\/sdk(?:\\/|$)/ }, (args) => {\n const normalized = args.path.replace(/^@sfmc\\/sdk/, \"@sfmc-bds/sdk\");\n const sub = normalized === \"@sfmc-bds/sdk\" ? \"\" : normalized.slice(\"@sfmc-bds/sdk/\".length);\n const resolved = resolveExportSubpath(sub);\n if (!resolved) {\n return {\n errors: [\n {\n text: `Cannot resolve ${args.path} under SDK at ${sdkRoot} (export \"./${sub || \".\"}\" missing or file absent; run sdk:build?)`,\n },\n ],\n };\n }\n return { path: resolved };\n });\n },\n };\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 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\n/**\n * `sfmc mod build` \u2014\u2014 \u7EC4\u88C5 BP + RP\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 cmdModuleBuild(_args: string[]): Promise<string> {\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 (deployed && catalogsEqual(desired, deployed)) {\n return formatPackLoadInfo(desired, false);\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) return c.red(bpR.output.trim() || `assemble-bp exit ${bpR.code}`);\n const rpR = await spawnAssembleRp(desired, rpDirs);\n if (rpR.code !== 0) return c.red(rpR.output.trim() || `assemble-rp exit ${rpR.code}`);\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 c.green(t(\"pack.built\", { path: bpOut() })) + \"\\n\" + formatPackLoadInfo(desired, true);\n } catch (e) {\n return c.red((e as Error).message);\n }\n}\n\n/**\n * `sfmc mod reload [--build-only]` \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\");\n const parts: string[] = [];\n\n const buildMsg = await cmdModuleBuild([]);\n parts.push(buildMsg.trimEnd());\n if (buildMsg.startsWith(c.red(\"\"))) return parts.join(\"\\n\") + \"\\n\";\n\n try {\n const { bdsRoot, levelName } = resolveBdsContext();\n const desired = await computeDesiredCatalog();\n\n const depR = await spawnDeploy(desired);\n if (depR.code !== 0) {\n return parts.join(\"\\n\") + \"\\n\" + c.red(depR.output.trim() || `deploy exit ${depR.code}`);\n }\n parts.push(depR.output.trimEnd());\n\n writeJson(path.join(deployedBpDir(bdsRoot, levelName), DEPLOY_CATALOG_NAME), desired);\n\n await spawnDisableStale(desired, bdsRoot, levelName);\n\n const enR = await spawnEnablePacks(desired);\n if (enR.code !== 0) {\n return parts.join(\"\\n\") + \"\\n\" + c.red(enR.output.trim() || `enable-pack exit ${enR.code}`);\n }\n parts.push(enR.output.trimEnd());\n\n const perR = await spawnEnsurePermission(desired);\n if (perR.code !== 0) {\n return parts.join(\"\\n\") + \"\\n\" + c.red(perR.output.trim() || `ensure-permission exit ${perR.code}`);\n }\n parts.push(perR.output.trimEnd());\n } catch (e) {\n return parts.join(\"\\n\") + \"\\n\" + c.red((e as Error).message);\n }\n\n if (buildOnly) {\n parts.push(c.dim(t(\"reload.buildOnly\")));\n return parts.join(\"\\n\") + \"\\n\";\n }\n\n const { isServiceRunning } = await import(\"./services.js\");\n if (!(await isServiceRunning(\"bds\"))) {\n parts.push(c.yellow(t(\"reload.bdsNotRunning\")));\n return parts.join(\"\\n\") + \"\\n\";\n }\n const { cmdSend } = await import(\"./commands.js\");\n parts.push((await cmdSend(\"bds\", \"reload\")).trimEnd());\n parts.push(c.green(t(\"reload.sent\")));\n return parts.join(\"\\n\") + \"\\n\";\n}\n\nfunction reusePackIds(\n deployed: DeployCatalog\n): Parameters<typeof computeDesiredCatalog>[0] {\n return {\n bpUuid: deployed.bpUuid,\n rpUuid: deployed.rpUuid,\n bpVersion: deployed.bpVersion,\n rpVersion: deployed.rpVersion,\n ...(deployed.bpModuleUuid ? { bpModuleUuid: deployed.bpModuleUuid } : {}),\n ...(deployed.rpModuleUuid ? { rpModuleUuid: deployed.rpModuleUuid } : {}),\n };\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * module-pack-build.ts \u2014 `mod build` / `mod reload` \u7684 spawn-based \u5B9E\u73B0\n *\n * CLI \u6D3E\u53D1\u7684 module build / reload \u5B50\u547D\u4EE4\u8D70\u8FD9\u91CC\uFF1Bpack-lifecycle.ts \u4FDD\u7559\n * ensurePacksReady \u542F\u52A8\u94A9\u5B50\u4E0E wizard \u5185\u90E8\u6D88\u8D39\u65B9\u7684 in-process \u5165\u53E3\u3002\n *\n * \u5B9E\u9645\u6587\u4EF6\u5199\u5165\uFF08assemble-bp / assemble-rp / deploy / enable-pack / disable-pack /\n * ensure-permission\uFF09\u901A\u8FC7 spawn bds-tools/cli-pack-manager.ts \u7684 verb \u6267\u884C\uFF1B\n * \u4E0E module install/uninstall\uFF08\u2192 scripts/module-install/fetch-module.mjs\uFF09\u4FDD\u6301\u540C\u4E00\u67B6\u6784\uFF1A\n * CLI \u662F thin wrapper\uFF1B\u5EFA\u4ED3\u811A\u624B\u67B6\u5728 @sfmc-bds/create-module\uFF08pnpm dlx\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(dbPort: number): 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, dbPort)],\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(desired.dbPort);\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
  }
@@ -4,7 +4,7 @@
4
4
  * CLI 先写 module-lock.json;db 在线时再 best-effort HTTP 热同步。
5
5
  * 纯函数与 IO 分离,供单测覆盖 resolve / lock patch / 结果判定。
6
6
  */
7
- import type { ModuleLock } from "@sfmc-bds/sdk/node/config";
7
+ import type { ModuleLock } from "@sfmc-bds/sdk/contracts";
8
8
  export type ToggleCandidate = {
9
9
  logicalId: string;
10
10
  folderId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"module-toggle.d.ts","sourceRoot":"","sources":["../src/module-toggle.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,cAAc,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC;AAElE,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,eAAe,GAAG,IAAI,CAQxG;AAED,gDAAgD;AAChD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU,CASlG;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,cAAc,CAI1F"}
1
+ {"version":3,"file":"module-toggle.d.ts","sourceRoot":"","sources":["../src/module-toggle.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,cAAc,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC;AAElE,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,eAAe,GAAG,IAAI,CAQxG;AAED,gDAAgD;AAChD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU,CASlG;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,cAAc,CAI1F"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/module-toggle.ts"],
4
- "sourcesContent": ["/**\n * module-toggle.ts \u2014 \u6A21\u5757\u542F\u505C\uFF1A\u672C\u5730 lock \u6743\u5A01 + \u901A\u77E5\u7ED3\u679C\u4FE1\u5C01\n *\n * CLI \u5148\u5199 module-lock.json\uFF1Bdb \u5728\u7EBF\u65F6\u518D best-effort HTTP \u70ED\u540C\u6B65\u3002\n * \u7EAF\u51FD\u6570\u4E0E IO \u5206\u79BB\uFF0C\u4F9B\u5355\u6D4B\u8986\u76D6 resolve / lock patch / \u7ED3\u679C\u5224\u5B9A\u3002\n */\n\nimport type { ModuleLock } from \"@sfmc-bds/sdk/node/config\";\n\nexport type ToggleCandidate = {\n logicalId: string;\n folderId: string;\n configKey?: string;\n canDisable: boolean;\n};\n\nexport type ToggleNotify =\n | { ok: true }\n | { ok: false; reason: \"unreachable\" | \"http\"; detail?: string };\n\nexport type ToggleFinalize = { ok: boolean; warnNotify: boolean };\n\n/** \u6309 folderId / logicalId / configKey \u89E3\u6790\u542F\u505C\u76EE\u6807\uFF08\u4E0E db resolveModuleByKey \u5BF9\u9F50\uFF09\u3002 */\nexport function resolveToggleTarget(query: string, candidates: ToggleCandidate[]): ToggleCandidate | null {\n const k = String(query || \"\").trim();\n if (!k) return null;\n return (\n candidates.find(\n (c) => c.folderId === k || c.logicalId === k || (c.configKey != null && c.configKey === k)\n ) ?? null\n );\n}\n\n/** \u5C31\u5730\u66F4\u65B0 lock \u6761\u76EE\uFF08\u952E\u4E3A manifest.id / logicalId\uFF09\u3002 */\nexport function applyLockEnabled(lock: ModuleLock, logicalId: string, enabled: boolean): ModuleLock {\n const modules = lock.modules && typeof lock.modules === \"object\" ? lock.modules : {};\n lock.modules = modules;\n lock.version = typeof lock.version === \"number\" ? lock.version : 1;\n modules[logicalId] = {\n enabled: !!enabled,\n updatedAt: Date.now(),\n };\n return lock;\n}\n\n/**\n * \u672C\u5730\u5DF2\u843D\u76D8\u65F6\uFF0C\u901A\u77E5\u5931\u8D25\u4ECD\u7B97\u6210\u529F\uFF08warnNotify\uFF09\uFF1B\u672C\u5730\u672A\u5199\u5219\u5931\u8D25\u3002\n */\nexport function finalizeToggle(localWritten: boolean, notify: ToggleNotify): ToggleFinalize {\n if (!localWritten) return { ok: false, warnNotify: false };\n if (notify.ok) return { ok: true, warnNotify: false };\n return { ok: true, warnNotify: true };\n}\n"],
4
+ "sourcesContent": ["/**\n * module-toggle.ts \u2014 \u6A21\u5757\u542F\u505C\uFF1A\u672C\u5730 lock \u6743\u5A01 + \u901A\u77E5\u7ED3\u679C\u4FE1\u5C01\n *\n * CLI \u5148\u5199 module-lock.json\uFF1Bdb \u5728\u7EBF\u65F6\u518D best-effort HTTP \u70ED\u540C\u6B65\u3002\n * \u7EAF\u51FD\u6570\u4E0E IO \u5206\u79BB\uFF0C\u4F9B\u5355\u6D4B\u8986\u76D6 resolve / lock patch / \u7ED3\u679C\u5224\u5B9A\u3002\n */\n\nimport type { ModuleLock } from \"@sfmc-bds/sdk/contracts\";\n\nexport type ToggleCandidate = {\n logicalId: string;\n folderId: string;\n configKey?: string;\n canDisable: boolean;\n};\n\nexport type ToggleNotify =\n | { ok: true }\n | { ok: false; reason: \"unreachable\" | \"http\"; detail?: string };\n\nexport type ToggleFinalize = { ok: boolean; warnNotify: boolean };\n\n/** \u6309 folderId / logicalId / configKey \u89E3\u6790\u542F\u505C\u76EE\u6807\uFF08\u4E0E db resolveModuleByKey \u5BF9\u9F50\uFF09\u3002 */\nexport function resolveToggleTarget(query: string, candidates: ToggleCandidate[]): ToggleCandidate | null {\n const k = String(query || \"\").trim();\n if (!k) return null;\n return (\n candidates.find(\n (c) => c.folderId === k || c.logicalId === k || (c.configKey != null && c.configKey === k)\n ) ?? null\n );\n}\n\n/** \u5C31\u5730\u66F4\u65B0 lock \u6761\u76EE\uFF08\u952E\u4E3A manifest.id / logicalId\uFF09\u3002 */\nexport function applyLockEnabled(lock: ModuleLock, logicalId: string, enabled: boolean): ModuleLock {\n const modules = lock.modules && typeof lock.modules === \"object\" ? lock.modules : {};\n lock.modules = modules;\n lock.version = typeof lock.version === \"number\" ? lock.version : 1;\n modules[logicalId] = {\n enabled: !!enabled,\n updatedAt: Date.now(),\n };\n return lock;\n}\n\n/**\n * \u672C\u5730\u5DF2\u843D\u76D8\u65F6\uFF0C\u901A\u77E5\u5931\u8D25\u4ECD\u7B97\u6210\u529F\uFF08warnNotify\uFF09\uFF1B\u672C\u5730\u672A\u5199\u5219\u5931\u8D25\u3002\n */\nexport function finalizeToggle(localWritten: boolean, notify: ToggleNotify): ToggleFinalize {\n if (!localWritten) return { ok: false, warnNotify: false };\n if (notify.ok) return { ok: true, warnNotify: false };\n return { ok: true, warnNotify: true };\n}\n"],
5
5
  "mappings": "AAuBO,SAAS,oBAAoB,OAAe,YAAuD;AACxG,QAAM,IAAI,OAAO,SAAS,EAAE,EAAE,KAAK;AACnC,MAAI,CAAC,EAAG,QAAO;AACf,SACE,WAAW;AAAA,IACT,CAAC,MAAM,EAAE,aAAa,KAAK,EAAE,cAAc,KAAM,EAAE,aAAa,QAAQ,EAAE,cAAc;AAAA,EAC1F,KAAK;AAET;AAGO,SAAS,iBAAiB,MAAkB,WAAmB,SAA8B;AAClG,QAAM,UAAU,KAAK,WAAW,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,CAAC;AACnF,OAAK,UAAU;AACf,OAAK,UAAU,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU;AACjE,UAAQ,SAAS,IAAI;AAAA,IACnB,SAAS,CAAC,CAAC;AAAA,IACX,WAAW,KAAK,IAAI;AAAA,EACtB;AACA,SAAO;AACT;AAKO,SAAS,eAAe,cAAuB,QAAsC;AAC1F,MAAI,CAAC,aAAc,QAAO,EAAE,IAAI,OAAO,YAAY,MAAM;AACzD,MAAI,OAAO,GAAI,QAAO,EAAE,IAAI,MAAM,YAAY,MAAM;AACpD,SAAO,EAAE,IAAI,MAAM,YAAY,KAAK;AACtC;",
6
6
  "names": []
7
7
  }
@@ -8,10 +8,13 @@
8
8
  * - 启动前 ensurePacksReady;日志一律走 source=`pack`
9
9
  */
10
10
  import { type CliResult } from "./cli-result.js";
11
+ import { type PackManifestDependency } from "@sfmc-bds/bds-tools/pack-manager-lib";
11
12
  export declare const BP_NAME = "sfmc-modules";
12
13
  export declare const RP_NAME = "sfmc-modules-rp";
13
14
  export declare const DEPLOY_CATALOG_NAME = "sfmc-deploy-catalog.json";
14
15
  export declare const DEFAULT_PACK_VERSION: [number, number, number];
16
+ /** 将 @sfmc/sdk 与 @sfmc-bds/sdk 子路径解析到 SDK 包内真实文件,并注入 sfmc:host 引导入口 */
17
+ export declare function createSdkResolvePlugin(sdkRoot: string, dbPort: number): import("esbuild").Plugin;
15
18
  export declare function buildRoot(): string;
16
19
  export declare function bpSrc(): string;
17
20
  export declare function bpOut(): string;
@@ -25,6 +28,7 @@ export interface DeployCatalogModule {
25
28
  }
26
29
  export interface DeployCatalog {
27
30
  schemaVersion: 1;
31
+ dbPort: number;
28
32
  bpUuid: string;
29
33
  rpUuid: string | null;
30
34
  bpVersion: [number, number, number];
@@ -32,6 +36,8 @@ export interface DeployCatalog {
32
36
  bpModuleUuid?: string;
33
37
  rpModuleUuid?: string;
34
38
  generatedAt: number;
39
+ sdkVersion?: string;
40
+ dependencies?: PackManifestDependency[];
35
41
  modules: Record<string, DeployCatalogModule>;
36
42
  }
37
43
  export interface PackEnsureResult {
@@ -50,6 +56,13 @@ export declare function resolveBdsContext(root?: string): {
50
56
  export declare function deployedBpDir(bdsRoot: string, levelName: string): string;
51
57
  export declare function deployedRpDir(bdsRoot: string, levelName: string): string;
52
58
  export declare function deployedCatalogPath(bdsRoot: string, levelName: string): string;
59
+ /**
60
+ * 从模块目录提取声明的 @minecraft/* 原生依赖。
61
+ * 优先级:
62
+ * 1. sapi/manifest.json 的 dependencies(标准基岩数组或键值对映射)与 minecraft 字段;
63
+ * 2. package.json 的 peerDependencies 与 dependencies(不含 devDependencies,避免类型包误伤)。
64
+ */
65
+ export declare function extractModuleBedrockDependencies(modPath: string): Promise<PackManifestDependency[]>;
53
66
  /**
54
67
  * 枚举本机 packages,返回 folderId → 元数据。
55
68
  * 仅含有 sapi/src/index.ts 的模块会进入 BP bundle 候选。
@@ -63,6 +76,7 @@ export declare function scanLocalModules(): Promise<Array<{
63
76
  hasResourcePack: boolean;
64
77
  fingerprint: string;
65
78
  entryPath: string | null;
79
+ declaredDependencies: PackManifestDependency[];
66
80
  }>>;
67
81
  /** 从本机状态 + 已有 UUID 合成 desired catalog。
68
82
  * UUID 优先:deployed catalog → 本地 build manifest → 新建随机。
@@ -76,7 +90,7 @@ export declare function computeDesiredCatalog(opts?: {
76
90
  rpModuleUuid?: string;
77
91
  }): Promise<DeployCatalog>;
78
92
  export declare function readDeployedCatalog(bdsRoot: string, levelName: string): DeployCatalog | null;
79
- /** 比较键:模块集合 + enabled/version/fingerprint/hasRP + bp/rp uuid */
93
+ /** 比较键:模块集合 + enabled/version/fingerprint/hasRP + bp/rp uuid + sdkVersion + dependencies */
80
94
  export declare function catalogsEqual(a: DeployCatalog, b: DeployCatalog): boolean;
81
95
  /** esbuild 聚合启用模块 → assemble BP + RP(若有) */
82
96
  export declare function buildPacks(desired?: DeployCatalog): Promise<DeployCatalog>;
@@ -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;AAqBvE,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;AAyCxE,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AACD,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AACD,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AACD,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AA0BD,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,MAAkB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAOlG;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9E;AA6BD;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAC/C,KAAK,CAAC;IACJ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC,CACH,CAqEA;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,CAAC,EAAE;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,aAAa,CAAC,CAyCzB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAQ5F;AAED,gEAAgE;AAChE,wBAAgB,aAAa,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,OAAO,CAwBzE;AAOD,4CAA4C;AAC5C,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CA+FhF;AAED,gDAAgD;AAChD,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiGvE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAmBnF;AAoBD;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CA+DlE;AAID,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAQtE;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAevE;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAiCpE;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBlE;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA0BxG"}
1
+ {"version":3,"file":"pack-lifecycle.d.ts","sourceRoot":"","sources":["../src/pack-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkBH,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,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,SAAS,EAAE,MAAM,CAqJhG;AAED,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AACD,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AACD,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AACD,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAmCD,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,MAAkB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAQlG;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9E;AA6BD;;;;;GAKG;AACH,wBAAsB,gCAAgC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CA2EzG;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAC/C,KAAK,CAAC;IACJ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,oBAAoB,EAAE,sBAAsB,EAAE,CAAC;CAChD,CAAC,CACH,CAwEA;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,CAAC,EAAE;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,aAAa,CAAC,CAoEzB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAQ5F;AAED,4FAA4F;AAC5F,wBAAgB,aAAa,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,OAAO,CAqCzE;AAOD,4CAA4C;AAC5C,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAoGhF;AAED,gDAAgD;AAChD,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiGvE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAuBnF;AAoBD;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAiElE;AAID,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAQtE;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAevE;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAiCpE;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBlE;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA0BxG"}