@sfmc-bds/cli 0.2.0-beta.5 → 0.2.0-beta.6

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 (163) hide show
  1. package/dist/argv-parse.d.ts +13 -0
  2. package/dist/argv-parse.d.ts.map +1 -0
  3. package/dist/argv-parse.js +32 -0
  4. package/dist/argv-parse.js.map +7 -0
  5. package/dist/cli-gate.d.ts +11 -0
  6. package/dist/cli-gate.d.ts.map +1 -0
  7. package/dist/cli-gate.js +48 -0
  8. package/dist/cli-gate.js.map +7 -0
  9. package/dist/cmd-remote.d.ts +13 -0
  10. package/dist/cmd-remote.d.ts.map +1 -0
  11. package/dist/cmd-remote.js +38 -0
  12. package/dist/cmd-remote.js.map +7 -0
  13. package/dist/command-palette.d.ts +61 -0
  14. package/dist/command-palette.d.ts.map +1 -0
  15. package/dist/command-palette.js +352 -0
  16. package/dist/command-palette.js.map +7 -0
  17. package/dist/command-surface.d.ts +92 -0
  18. package/dist/command-surface.d.ts.map +1 -0
  19. package/dist/command-surface.js +350 -0
  20. package/dist/command-surface.js.map +7 -0
  21. package/dist/commands-reload.js +2 -2
  22. package/dist/commands-reload.js.map +2 -2
  23. package/dist/commands.d.ts +1 -1
  24. package/dist/commands.d.ts.map +1 -1
  25. package/dist/commands.js +79 -17
  26. package/dist/commands.js.map +2 -2
  27. package/dist/debug-command.d.ts +5 -0
  28. package/dist/debug-command.d.ts.map +1 -0
  29. package/dist/debug-command.js +118 -0
  30. package/dist/debug-command.js.map +7 -0
  31. package/dist/help-text.d.ts +3 -0
  32. package/dist/help-text.d.ts.map +1 -0
  33. package/dist/help-text.js +168 -0
  34. package/dist/help-text.js.map +7 -0
  35. package/dist/i18n/locales/en.d.ts +101 -20
  36. package/dist/i18n/locales/en.d.ts.map +1 -1
  37. package/dist/i18n/locales/en.js +105 -20
  38. package/dist/i18n/locales/en.js.map +2 -2
  39. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  40. package/dist/i18n/locales/zh-CN.js +153 -62
  41. package/dist/i18n/locales/zh-CN.js.map +2 -2
  42. package/dist/index.d.ts +1 -1
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +6 -0
  45. package/dist/index.js.map +2 -2
  46. package/dist/logs.d.ts +16 -1
  47. package/dist/logs.d.ts.map +1 -1
  48. package/dist/logs.js +80 -11
  49. package/dist/logs.js.map +2 -2
  50. package/dist/main.js +58 -44
  51. package/dist/main.js.map +2 -2
  52. package/dist/module-commands.d.ts +29 -33
  53. package/dist/module-commands.d.ts.map +1 -1
  54. package/dist/module-commands.js +101 -37
  55. package/dist/module-commands.js.map +2 -2
  56. package/dist/module-pack-build.d.ts +10 -0
  57. package/dist/module-pack-build.d.ts.map +1 -0
  58. package/dist/module-pack-build.js +430 -0
  59. package/dist/module-pack-build.js.map +7 -0
  60. package/dist/module-publish.d.ts +69 -0
  61. package/dist/module-publish.d.ts.map +1 -0
  62. package/dist/module-publish.js +478 -0
  63. package/dist/module-publish.js.map +7 -0
  64. package/dist/module-watch.d.ts +32 -0
  65. package/dist/module-watch.d.ts.map +1 -0
  66. package/dist/module-watch.js +171 -0
  67. package/dist/module-watch.js.map +7 -0
  68. package/dist/module-wizard.d.ts +4 -6
  69. package/dist/module-wizard.d.ts.map +1 -1
  70. package/dist/module-wizard.js +108 -124
  71. package/dist/module-wizard.js.map +2 -2
  72. package/dist/pack-lifecycle.d.ts +1 -1
  73. package/dist/pack-lifecycle.d.ts.map +1 -1
  74. package/dist/pack-lifecycle.js +3 -3
  75. package/dist/pack-lifecycle.js.map +2 -2
  76. package/dist/pack-update/index.d.ts +18 -0
  77. package/dist/pack-update/index.d.ts.map +1 -0
  78. package/dist/pack-update/index.js +113 -0
  79. package/dist/pack-update/index.js.map +7 -0
  80. package/dist/registry.d.ts +6 -3
  81. package/dist/registry.d.ts.map +1 -1
  82. package/dist/registry.js +15 -3
  83. package/dist/registry.js.map +2 -2
  84. package/dist/remote-agent.d.ts.map +1 -1
  85. package/dist/remote-agent.js +7 -5
  86. package/dist/remote-agent.js.map +2 -2
  87. package/dist/repl-windows/format-display.d.ts +10 -0
  88. package/dist/repl-windows/format-display.d.ts.map +1 -0
  89. package/dist/repl-windows/format-display.js +57 -0
  90. package/dist/repl-windows/format-display.js.map +7 -0
  91. package/dist/repl-windows/host.d.ts +60 -0
  92. package/dist/repl-windows/host.d.ts.map +1 -0
  93. package/dist/repl-windows/host.js +179 -0
  94. package/dist/repl-windows/host.js.map +7 -0
  95. package/dist/repl-windows/index.d.ts +9 -0
  96. package/dist/repl-windows/index.d.ts.map +1 -0
  97. package/dist/repl-windows/index.js +13 -0
  98. package/dist/repl-windows/index.js.map +7 -0
  99. package/dist/repl-windows/logs-filter-window.d.ts +15 -0
  100. package/dist/repl-windows/logs-filter-window.d.ts.map +1 -0
  101. package/dist/repl-windows/logs-filter-window.js +77 -0
  102. package/dist/repl-windows/logs-filter-window.js.map +7 -0
  103. package/dist/repl-windows/service-window.d.ts +4 -0
  104. package/dist/repl-windows/service-window.d.ts.map +1 -0
  105. package/dist/repl-windows/service-window.js +28 -0
  106. package/dist/repl-windows/service-window.js.map +7 -0
  107. package/dist/repl-windows/types.d.ts +56 -0
  108. package/dist/repl-windows/types.d.ts.map +1 -0
  109. package/dist/repl-windows/types.js +1 -0
  110. package/dist/repl-windows/types.js.map +7 -0
  111. package/dist/repl.d.ts +7 -8
  112. package/dist/repl.d.ts.map +1 -1
  113. package/dist/repl.js +722 -412
  114. package/dist/repl.js.map +3 -3
  115. package/dist/runtime.d.ts +2 -0
  116. package/dist/runtime.d.ts.map +1 -1
  117. package/dist/runtime.js +4 -0
  118. package/dist/runtime.js.map +2 -2
  119. package/dist/send-target.d.ts +11 -0
  120. package/dist/send-target.d.ts.map +1 -0
  121. package/dist/send-target.js +38 -0
  122. package/dist/send-target.js.map +7 -0
  123. package/dist/services.d.ts +21 -1
  124. package/dist/services.d.ts.map +1 -1
  125. package/dist/services.js +146 -7
  126. package/dist/services.js.map +2 -2
  127. package/dist/theme.js +1 -1
  128. package/dist/theme.js.map +2 -2
  129. package/dist/wizard.d.ts.map +1 -1
  130. package/dist/wizard.js +11 -9
  131. package/dist/wizard.js.map +2 -2
  132. package/dist/world-packs.d.ts.map +1 -1
  133. package/dist/world-packs.js +6 -3
  134. package/dist/world-packs.js.map +2 -2
  135. package/package.json +4 -4
  136. package/dist/pack-update/bindings.d.ts +0 -12
  137. package/dist/pack-update/bindings.d.ts.map +0 -1
  138. package/dist/pack-update/bindings.js +0 -64
  139. package/dist/pack-update/bindings.js.map +0 -7
  140. package/dist/pack-update/config.d.ts +0 -22
  141. package/dist/pack-update/config.d.ts.map +0 -1
  142. package/dist/pack-update/config.js +0 -141
  143. package/dist/pack-update/config.js.map +0 -7
  144. package/dist/pack-update/providers/curseforge.d.ts +0 -23
  145. package/dist/pack-update/providers/curseforge.d.ts.map +0 -1
  146. package/dist/pack-update/providers/curseforge.js +0 -229
  147. package/dist/pack-update/providers/curseforge.js.map +0 -7
  148. package/dist/pack-update/providers/index.d.ts +0 -16
  149. package/dist/pack-update/providers/index.d.ts.map +0 -1
  150. package/dist/pack-update/providers/index.js +0 -37
  151. package/dist/pack-update/providers/index.js.map +0 -7
  152. package/dist/pack-update/service.d.ts +0 -21
  153. package/dist/pack-update/service.d.ts.map +0 -1
  154. package/dist/pack-update/service.js +0 -572
  155. package/dist/pack-update/service.js.map +0 -7
  156. package/dist/pack-update/types.d.ts +0 -126
  157. package/dist/pack-update/types.d.ts.map +0 -1
  158. package/dist/pack-update/types.js +0 -8
  159. package/dist/pack-update/types.js.map +0 -7
  160. package/dist/pack-update/version-policy.d.ts +0 -81
  161. package/dist/pack-update/version-policy.d.ts.map +0 -1
  162. package/dist/pack-update/version-policy.js +0 -210
  163. package/dist/pack-update/version-policy.js.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/module-wizard.ts"],
4
- "sourcesContent": ["/**\n * module-wizard.ts \u2014 \u6A21\u5757\u811A\u624B\u67B6 / \u672C\u5730\u8054\u8C03\u4EA4\u4E92\u5411\u5BFC\n *\n * \u590D\u7528 @clack/prompts \u4E0E init \u5411\u5BFC\u76F8\u540C\u4F9D\u8D56\uFF1B\u8584\u5305\u88C5 tools/new-module.mjs\u3001fetch-module.mjs\u3002\n */\n\nimport { confirm, intro, isCancel, note, outro, select, tasks, text } from \"@clack/prompts\";\nimport { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { t } from \"./i18n/index.js\";\nimport { cmdModuleEnable } from \"./module-commands.js\";\nimport { pickDirectory, resolveUserPath } from \"./interactive-prompts.js\";\nimport { ROOT, resolveFetchModule, resolveNewModule } from \"./runtime.js\";\nimport {\n listSfmcModulePackages,\n packageDirForId,\n persistSfmcModulesRoot,\n resolveSfmcModulesRoot,\n} from \"./sfmc-modules-root.js\";\nimport { c } from \"./theme.js\";\n\nfunction isInteractive(): boolean {\n return Boolean(process.stdin.isTTY);\n}\n\nfunction cancelMessage(): string {\n return c.dim(t(\"common.cancelled\"));\n}\n\n/** \u5B50\u8FDB\u7A0B\u6267\u884C\u5DE5\u5177\u811A\u672C\uFF1B\u7528\u53C2\u6570\u6570\u7EC4\u907F\u514D Windows \u542B # \u8DEF\u5F84\u88AB shell \u8BEF\u89E3\u6790\u3002 */\nfunction spawnTool(script: string, args: string[]): Promise<{ code: number | null; output: string }> {\n return new Promise((resolve) => {\n const proc = spawn(process.execPath, [script, ...args], {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env, SFMC_ROOT: ROOT },\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\nasync function ensureSfmcModulesRoot(): Promise<string | null> {\n let modulesRoot = resolveSfmcModulesRoot();\n if (modulesRoot) {\n note(c.text(t(\"modwiz.sfmcModulesPath\", { path: modulesRoot })), t(\"common.path\"));\n return modulesRoot;\n }\n\n const defaultGuess = path.resolve(ROOT, \"..\", \"sfmc-modules\");\n const picked = await pickDirectory(t(\"modwiz.pickModulesRoot\"), defaultGuess);\n modulesRoot = resolveUserPath(picked, ROOT);\n if (!existsSync(path.join(modulesRoot, \"packages\"))) {\n outro(c.red(t(\"modwiz.noPackages\", { path: modulesRoot })));\n return null;\n }\n persistSfmcModulesRoot(modulesRoot);\n return modulesRoot;\n}\n\nasync function runFetchModuleLink(folderId: string, pkgPath: string): Promise<{ ok: boolean; output: string }> {\n const fetchScript = resolveFetchModule();\n if (!fetchScript) {\n return { ok: false, output: c.red(t(\"modwiz.noFetch\")) };\n }\n const fromArg = `dir:${path.resolve(pkgPath)}`;\n const { code, output } = await spawnTool(fetchScript, [\"install\", folderId, \"--from\", fromArg, \"--link\"]);\n return { ok: code === 0, output };\n}\n\nasync function maybeEnableModule(folderId: string): Promise<string | undefined> {\n const enable = await confirm({ message: t(\"modwiz.enableModule\"), initialValue: true });\n if (isCancel(enable) || !enable) return undefined;\n return (await cmdModuleEnable([folderId])).message;\n}\n\nasync function maybeBuildDeploy(): Promise<void> {\n const buildDeploy = await confirm({\n message: t(\"modwiz.buildDeploy\"),\n initialValue: true,\n });\n if (isCancel(buildDeploy) || !buildDeploy) return;\n\n const { cmdBehaviorPackBuild, cmdBehaviorPackDeploy } = await import(\"./commands-behavior-pack.js\");\n await tasks([\n {\n title: t(\"modwiz.task.build\"),\n task: async () => {\n const r = await cmdBehaviorPackBuild([]);\n if (!r.ok) throw new Error(r.message.trim());\n return t(\"common.done\");\n },\n },\n {\n title: t(\"modwiz.task.deploy\"),\n task: async () => {\n const r = await cmdBehaviorPackDeploy([]);\n if (!r.ok) throw new Error(r.message.trim());\n return t(\"common.done\");\n },\n },\n ]);\n note(c.yellow(t(\"modwiz.reloadHint\")), t(\"common.hint\"));\n}\n\nfunction validateFolderId(value: string | undefined): string | undefined {\n if (!value?.trim()) return t(\"common.required\");\n if (!/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/.test(value.trim())) {\n return t(\"modwiz.kebab\");\n }\n return undefined;\n}\n\n/** \u4EA4\u4E92\u5F0F\u521B\u5EFA\u6A21\u5757\u5305\u5E76\u53EF\u9009 link / enable / build+deploy\u3002 */\nexport async function runModuleCreateWizard(): Promise<string> {\n if (!isInteractive()) {\n return c.yellow(t(\"modwiz.needTty.create\"));\n }\n\n intro(c.bold(t(\"modwiz.createIntro\")));\n\n const modulesRoot = await ensureSfmcModulesRoot();\n if (!modulesRoot) return cancelMessage();\n\n const idRaw = await text({\n message: t(\"modwiz.folderId\"),\n placeholder: \"my-feature\",\n validate: validateFolderId,\n });\n if (isCancel(idRaw) || !idRaw) {\n outro(cancelMessage());\n return cancelMessage();\n }\n const folderId = idRaw.trim();\n\n const target = packageDirForId(modulesRoot, folderId);\n if (existsSync(target)) {\n outro(c.red(t(\"modwiz.dirExists\", { path: target })));\n return c.red(t(\"modwiz.dirExists\", { path: target }));\n }\n\n const nameRaw = await text({\n message: t(\"modwiz.displayName\"),\n initialValue: folderId,\n validate: (v) => (!v?.trim() ? t(\"common.required\") : undefined),\n });\n if (isCancel(nameRaw) || !nameRaw) {\n outro(cancelMessage());\n return cancelMessage();\n }\n\n const template = await select({\n message: t(\"modwiz.template\"),\n options: [\n { value: \"minimal\", label: t(\"modwiz.tpl.minimal\"), hint: t(\"modwiz.tpl.minimalHint\") },\n { value: \"db\", label: t(\"modwiz.tpl.db\"), hint: t(\"modwiz.tpl.dbHint\") },\n ],\n });\n if (isCancel(template)) {\n outro(cancelMessage());\n return cancelMessage();\n }\n\n const siblingNewModule = path.join(modulesRoot, \"tools\", \"new-module.mjs\");\n const platformNewModule = resolveNewModule();\n const useSibling = existsSync(siblingNewModule) && template === \"minimal\";\n const newModuleScript = useSibling ? siblingNewModule : platformNewModule;\n if (!newModuleScript) {\n outro(c.red(t(\"modwiz.noNewModule\")));\n return c.red(t(\"modwiz.noNewModule\"));\n }\n\n let scaffoldOutput = \"\";\n try {\n await tasks([\n {\n title: t(\"modwiz.genPackage\", { id: folderId }),\n task: async () => {\n const spawnArgs = useSibling\n ? [folderId, nameRaw.trim()]\n : [folderId, \"--name\", nameRaw.trim(), \"--root\", modulesRoot, \"--template\", String(template)];\n const { code, output } = await spawnTool(newModuleScript, spawnArgs);\n scaffoldOutput = output;\n if (code !== 0) throw new Error(output.trim() || `exit ${code}`);\n return t(\"modwiz.skeletonWritten\");\n },\n },\n ]);\n } catch (e) {\n outro(c.red((e as Error).message));\n return c.red((e as Error).message);\n }\n\n note(scaffoldOutput.trim() || c.green(t(\"modwiz.createdNote\", { path: target })), t(\"modwiz.createIntro\"));\n\n const doLink = await confirm({\n message: t(\"modwiz.linkAsk\"),\n initialValue: true,\n });\n if (!isCancel(doLink) && doLink) {\n const { ok, output } = await runFetchModuleLink(folderId, target);\n note(output.trim(), ok ? t(\"modwiz.link\") : t(\"modwiz.linkFailed\"));\n if (ok) {\n const enableMsg = await maybeEnableModule(folderId);\n if (enableMsg) note(enableMsg, t(\"modwiz.enable\"));\n await maybeBuildDeploy();\n }\n }\n\n outro(c.green(t(\"modwiz.createDone\", { path: target })));\n return c.green(t(\"modwiz.moduleCreated\", { id: folderId }));\n}\n\n/** \u4ECE sfmc-modules/packages \u9009\u62E9\u5E76 --link \u5B89\u88C5\u3002 */\nexport async function runModuleLinkWizard(): Promise<string> {\n if (!isInteractive()) {\n return c.yellow(t(\"modwiz.needTty.link\"));\n }\n\n intro(c.bold(t(\"modwiz.linkIntro\")));\n\n const modulesRoot = await ensureSfmcModulesRoot();\n if (!modulesRoot) return cancelMessage();\n\n const packages = listSfmcModulePackages(modulesRoot);\n if (packages.length === 0) {\n outro(c.yellow(t(\"modwiz.noLinkable\", { path: modulesRoot })));\n return c.yellow(t(\"modwiz.noLinkableShort\"));\n }\n\n const picked = await select({\n message: t(\"modwiz.pickLink\"),\n options: packages.map((p) => ({\n value: p.id,\n label: p.id,\n hint: `${p.name} \u00B7 ${p.logicalId}`,\n })),\n });\n if (isCancel(picked)) {\n outro(cancelMessage());\n return cancelMessage();\n }\n\n const pkg = packages.find((p) => p.id === picked)!;\n let linkOutput = \"\";\n try {\n await tasks([\n {\n title: t(\"modwiz.linking\", { id: pkg.id }),\n task: async () => {\n const { ok, output } = await runFetchModuleLink(pkg.id, pkg.path);\n linkOutput = output;\n if (!ok) throw new Error(output.trim() || t(\"modwiz.linkFailed\"));\n return t(\"modwiz.linkSynced\");\n },\n },\n ]);\n } catch (e) {\n outro(c.red((e as Error).message));\n return c.red((e as Error).message);\n }\n\n note(linkOutput.trim(), t(\"modwiz.link\"));\n const enableMsg = await maybeEnableModule(pkg.id);\n if (enableMsg) note(enableMsg, t(\"modwiz.enable\"));\n\n outro(c.green(t(\"modwiz.linked\", { id: pkg.id })));\n return c.green(t(\"modwiz.linked\", { id: pkg.id }));\n}\n\n/** \u94FE\u63A5 + \u542F\u7528 + \u6784\u5EFA\u90E8\u7F72\uFF08\u672C\u5730\u5F00\u53D1\u4E00\u952E\u6D41\uFF09\u3002 */\nexport async function runModuleDevWizard(): Promise<string> {\n if (!isInteractive()) {\n return c.yellow(t(\"modwiz.needTty.dev\"));\n }\n\n intro(c.bold(t(\"modwiz.devIntro\")));\n\n const modulesRoot = await ensureSfmcModulesRoot();\n if (!modulesRoot) return cancelMessage();\n\n const packages = listSfmcModulePackages(modulesRoot);\n if (packages.length === 0) {\n outro(c.yellow(t(\"modwiz.noDevPackages\", { path: modulesRoot })));\n return c.yellow(t(\"modwiz.noDevShort\"));\n }\n\n const picked = await select({\n message: t(\"modwiz.pickDev\"),\n options: packages.map((p) => ({\n value: p.id,\n label: p.id,\n hint: `${p.name} \u00B7 ${p.logicalId}`,\n })),\n });\n if (isCancel(picked)) {\n outro(cancelMessage());\n return cancelMessage();\n }\n\n const pkg = packages.find((p) => p.id === picked)!;\n\n try {\n await tasks([\n {\n title: t(\"modwiz.linking\", { id: pkg.id }),\n task: async () => {\n const { ok, output } = await runFetchModuleLink(pkg.id, pkg.path);\n if (!ok) throw new Error(output.trim() || t(\"modwiz.linkFailed\"));\n return output.trim().split(\"\\n\").pop() ?? \"linked\";\n },\n },\n {\n title: t(\"modwiz.enabling\", { id: pkg.id }),\n task: async () => {\n const r = await cmdModuleEnable([pkg.id]);\n if (!r.ok) throw new Error(r.message.trim());\n return r.message.trim();\n },\n },\n {\n title: t(\"modwiz.task.build\"),\n task: async () => {\n const { cmdBehaviorPackBuild } = await import(\"./commands-behavior-pack.js\");\n const r = await cmdBehaviorPackBuild([]);\n if (!r.ok) throw new Error(r.message.trim());\n return t(\"common.done\");\n },\n },\n {\n title: t(\"modwiz.task.deploy\"),\n task: async () => {\n const { cmdBehaviorPackDeploy } = await import(\"./commands-behavior-pack.js\");\n const r = await cmdBehaviorPackDeploy([]);\n if (!r.ok) throw new Error(r.message.trim());\n return t(\"common.done\");\n },\n },\n ]);\n } catch (e) {\n outro(c.red((e as Error).message));\n return c.red((e as Error).message);\n }\n\n note(c.yellow(t(\"modwiz.devHint\")), t(\"common.hint\"));\n outro(c.green(t(\"modwiz.devDone\", { id: pkg.id })));\n return c.green(t(\"modwiz.devReady\", { id: pkg.id }));\n}\n\nexport { isInteractive as isModuleWizardInteractive };\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\r\n * module-wizard.ts \u2014 \u6A21\u5757\u811A\u624B\u67B6 / \u672C\u5730\u8054\u8C03\u4EA4\u4E92\u5411\u5BFC\r\n *\r\n * \u5355\u5305\u6839\uFF08template \u540C\u6784\uFF09\uFF1A\u4E0D\u5199\u5165\u65C1\u8DEF sfmc-modules monorepo\u3002\r\n */\r\n\r\nimport { confirm, intro, isCancel, note, outro, select, tasks, text } from \"@clack/prompts\";\r\nimport { spawn } from \"node:child_process\";\r\nimport { existsSync } from \"node:fs\";\r\nimport path from \"node:path\";\r\nimport process from \"node:process\";\r\nimport { t, type MessageKey } from \"./i18n/index.js\";\r\nimport { cmdModuleEnable } from \"./module-commands.js\";\r\nimport { pickDirectory, resolveUserPath } from \"./interactive-prompts.js\";\r\nimport { ROOT, resolveFetchModule, resolveNewModule } from \"./runtime.js\";\r\nimport { c } from \"./theme.js\";\r\n\r\nfunction isInteractive(): boolean {\r\n return Boolean(process.stdin.isTTY);\r\n}\r\n\r\nfunction cancelMessage(): string {\r\n return c.dim(t(\"common.cancelled\"));\r\n}\r\n\r\n/** \u5B50\u8FDB\u7A0B\u6267\u884C\u5DE5\u5177\u811A\u672C\uFF1B\u7528\u53C2\u6570\u6570\u7EC4\u907F\u514D Windows \u542B # \u8DEF\u5F84\u88AB shell \u8BEF\u89E3\u6790\u3002 */\r\nfunction spawnTool(script: string, args: string[]): Promise<{ code: number | null; output: string }> {\r\n return new Promise((resolve) => {\r\n const proc = spawn(process.execPath, [script, ...args], {\r\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\r\n env: { ...process.env, SFMC_ROOT: ROOT },\r\n });\r\n let output = \"\";\r\n proc.stdout?.on(\"data\", (d: Buffer) => {\r\n output += d.toString();\r\n });\r\n proc.stderr?.on(\"data\", (d: Buffer) => {\r\n output += d.toString();\r\n });\r\n proc.on(\"exit\", (code) => resolve({ code, output }));\r\n proc.on(\"error\", (e) => resolve({ code: 1, output: `${output}${e.message}` }));\r\n });\r\n}\r\n\r\nasync function runFetchModuleLink(folderId: string, pkgPath: string): Promise<{ ok: boolean; output: string }> {\r\n const fetchScript = resolveFetchModule();\r\n if (!fetchScript) {\r\n return { ok: false, output: c.red(t(\"modwiz.noFetch\")) };\r\n }\r\n const fromArg = `dir:${path.resolve(pkgPath)}`;\r\n const { code, output } = await spawnTool(fetchScript, [\"install\", folderId, \"--from\", fromArg, \"--link\"]);\r\n return { ok: code === 0, output };\r\n}\r\n\r\nasync function maybeEnableModule(folderId: string): Promise<string | undefined> {\r\n const enable = await confirm({ message: t(\"modwiz.enableModule\"), initialValue: true });\r\n if (isCancel(enable) || !enable) return undefined;\r\n return (await cmdModuleEnable([folderId])).message;\r\n}\r\n\r\nasync function maybeBuildDeploy(): Promise<void> {\r\n const buildDeploy = await confirm({\r\n message: t(\"modwiz.buildDeploy\"),\r\n initialValue: true,\r\n });\r\n if (isCancel(buildDeploy) || !buildDeploy) return;\r\n\r\n const { cmdBehaviorPackBuild, cmdBehaviorPackDeploy } = await import(\"./commands-behavior-pack.js\");\r\n await tasks([\r\n {\r\n title: t(\"modwiz.task.build\"),\r\n task: async () => {\r\n const r = await cmdBehaviorPackBuild([]);\r\n if (!r.ok) throw new Error(r.message.trim());\r\n return t(\"common.done\");\r\n },\r\n },\r\n {\r\n title: t(\"modwiz.task.deploy\"),\r\n task: async () => {\r\n const r = await cmdBehaviorPackDeploy([]);\r\n if (!r.ok) throw new Error(r.message.trim());\r\n return t(\"common.done\");\r\n },\r\n },\r\n ]);\r\n note(c.yellow(t(\"modwiz.reloadHint\")), t(\"common.hint\"));\r\n}\r\n\r\nfunction validateFolderId(value: string | undefined): string | undefined {\r\n if (!value?.trim()) return t(\"common.required\");\r\n if (!/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/.test(value.trim())) {\r\n return t(\"modwiz.kebab\");\r\n }\r\n return undefined;\r\n}\r\n\r\ntype TemplateMeta = { id: string; isDefault: boolean };\r\n\r\nasync function listTemplatesFromTool(): Promise<TemplateMeta[]> {\r\n const script = resolveNewModule();\r\n if (!script) return [];\r\n const { code, output } = await spawnTool(script, [\"--list-templates\"]);\r\n if (code !== 0) return [];\r\n const out: TemplateMeta[] = [];\r\n for (const line of output.split(/\\r?\\n/)) {\r\n const trimmed = line.trim();\r\n if (!trimmed) continue;\r\n const [id, ...flags] = trimmed.split(\"\\t\");\r\n if (!id) continue;\r\n out.push({ id, isDefault: flags.includes(\"default\") });\r\n }\r\n return out;\r\n}\r\n\r\nfunction tplLabel(id: string): string {\r\n const label = t(`modwiz.tpl.${id}` as MessageKey);\r\n return label === `modwiz.tpl.${id}` ? id : label;\r\n}\r\nfunction tplHint(id: string): string | undefined {\r\n const hint = t(`modwiz.tpl.${id}Hint` as MessageKey);\r\n return hint === `modwiz.tpl.${id}Hint` ? undefined : hint;\r\n}\r\n\r\n/** \u4EA4\u4E92\u5F0F\u521B\u5EFA\u5355\u5305\u6A21\u5757\uFF08cwd \u6216\u6307\u5B9A\u7A7A\u76EE\u5F55\uFF09\uFF0C\u53EF\u9009 link / enable / build+deploy\u3002 */\r\nexport async function runModuleCreateWizard(): Promise<string> {\r\n if (!isInteractive()) {\r\n return c.yellow(t(\"modwiz.needTty.create\"));\r\n }\r\n\r\n intro(c.bold(t(\"modwiz.createIntro\")));\r\n note(c.dim(t(\"modwiz.standaloneHint\")), t(\"common.hint\"));\r\n\r\n const idRaw = await text({\r\n message: t(\"modwiz.folderId\"),\r\n placeholder: \"my-feature\",\r\n validate: validateFolderId,\r\n });\r\n if (isCancel(idRaw) || !idRaw) {\r\n outro(cancelMessage());\r\n return cancelMessage();\r\n }\r\n const folderId = idRaw.trim();\r\n\r\n const defaultTarget = path.resolve(process.cwd(), folderId);\r\n const picked = await pickDirectory(t(\"modwiz.pickPackageRoot\"), path.dirname(defaultTarget));\r\n if (isCancel(picked) || !picked) {\r\n outro(cancelMessage());\r\n return cancelMessage();\r\n }\r\n const parentDir = resolveUserPath(String(picked), ROOT);\r\n const target = path.join(parentDir, folderId);\r\n if (existsSync(target)) {\r\n outro(c.red(t(\"modwiz.dirExists\", { path: target })));\r\n return c.red(t(\"modwiz.dirExists\", { path: target }));\r\n }\r\n\r\n const nameRaw = await text({\r\n message: t(\"modwiz.displayName\"),\r\n initialValue: folderId,\r\n validate: (v) => (!v?.trim() ? t(\"common.required\") : undefined),\r\n });\r\n if (isCancel(nameRaw) || !nameRaw) {\r\n outro(cancelMessage());\r\n return cancelMessage();\r\n }\r\n\r\n const templates = await listTemplatesFromTool();\r\n if (templates.length === 0) {\r\n outro(c.red(t(\"modwiz.noNewModule\")));\r\n return c.red(t(\"modwiz.noNewModule\"));\r\n }\r\n const defaultTpl = templates.find((tpl) => tpl.isDefault) ?? templates[0]!;\r\n const template = await select({\r\n message: t(\"modwiz.template\"),\r\n initialValue: defaultTpl.id,\r\n options: templates.map((tpl) => {\r\n const opt: { value: string; label: string; hint?: string } = {\r\n value: tpl.id,\r\n label: tplLabel(tpl.id),\r\n };\r\n const hint = tplHint(tpl.id);\r\n if (hint) opt.hint = hint;\r\n return opt;\r\n }),\r\n });\r\n if (isCancel(template)) {\r\n outro(cancelMessage());\r\n return cancelMessage();\r\n }\r\n\r\n const newModuleScript = resolveNewModule();\r\n if (!newModuleScript) {\r\n outro(c.red(t(\"modwiz.noNewModule\")));\r\n return c.red(t(\"modwiz.noNewModule\"));\r\n }\r\n\r\n const { mkdirSync } = await import(\"node:fs\");\r\n mkdirSync(target, { recursive: true });\r\n\r\n let scaffoldOutput = \"\";\r\n try {\r\n await tasks([\r\n {\r\n title: t(\"modwiz.genPackage\", { id: folderId }),\r\n task: async () => {\r\n const { spawn: spawnChild } = await import(\"node:child_process\");\r\n const result = await new Promise<{ code: number | null; output: string }>((resolve) => {\r\n const proc = spawnChild(\r\n process.execPath,\r\n [newModuleScript, folderId, \"--name\", nameRaw.trim(), \"--template\", String(template)],\r\n {\r\n cwd: target,\r\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\r\n env: { ...process.env, SFMC_ROOT: ROOT },\r\n }\r\n );\r\n let output = \"\";\r\n proc.stdout?.on(\"data\", (d: Buffer) => {\r\n output += d.toString();\r\n });\r\n proc.stderr?.on(\"data\", (d: Buffer) => {\r\n output += d.toString();\r\n });\r\n proc.on(\"exit\", (code) => resolve({ code, output }));\r\n proc.on(\"error\", (e) => resolve({ code: 1, output: e.message }));\r\n });\r\n scaffoldOutput = result.output;\r\n if (result.code !== 0) throw new Error(result.output.trim() || `exit ${result.code}`);\r\n return t(\"modwiz.skeletonWritten\");\r\n },\r\n },\r\n ]);\r\n } catch (e) {\r\n outro(c.red((e as Error).message));\r\n return c.red((e as Error).message);\r\n }\r\n\r\n note(scaffoldOutput.trim() || c.green(t(\"modwiz.createdNote\", { path: target })), t(\"modwiz.createIntro\"));\r\n\r\n const doLink = await confirm({\r\n message: t(\"modwiz.linkAsk\"),\r\n initialValue: true,\r\n });\r\n if (!isCancel(doLink) && doLink) {\r\n const { ok, output } = await runFetchModuleLink(folderId, target);\r\n note(output.trim(), ok ? t(\"modwiz.link\") : t(\"modwiz.linkFailed\"));\r\n if (ok) {\r\n const enableMsg = await maybeEnableModule(folderId);\r\n if (enableMsg) note(enableMsg, t(\"modwiz.enable\"));\r\n await maybeBuildDeploy();\r\n }\r\n }\r\n\r\n outro(c.green(t(\"modwiz.createDone\", { path: target })));\r\n return c.green(t(\"modwiz.moduleCreated\", { id: folderId }));\r\n}\r\n\r\n/** \u9009\u62E9\u672C\u5730\u4F5C\u8005\u4ED3\u76EE\u5F55\u5E76 --link \u5B89\u88C5\u3002 */\r\nexport async function runModuleLinkWizard(): Promise<string> {\r\n if (!isInteractive()) {\r\n return c.yellow(t(\"modwiz.needTty.link\"));\r\n }\r\n\r\n intro(c.bold(t(\"modwiz.linkIntro\")));\r\n\r\n const picked = await pickDirectory(t(\"modwiz.pickAuthorPkg\"), process.cwd());\r\n if (isCancel(picked) || !picked) {\r\n outro(cancelMessage());\r\n return cancelMessage();\r\n }\r\n const pkgPath = resolveUserPath(String(picked), ROOT);\r\n if (!existsSync(path.join(pkgPath, \"sapi\", \"manifest.json\"))) {\r\n outro(c.red(t(\"modwiz.notModulePkg\", { path: pkgPath })));\r\n return c.red(t(\"modwiz.notModulePkg\", { path: pkgPath }));\r\n }\r\n\r\n const fetchScript = resolveFetchModule();\r\n if (!fetchScript) {\r\n outro(c.red(t(\"modwiz.noFetch\")));\r\n return c.red(t(\"modwiz.noFetch\"));\r\n }\r\n\r\n let linkOutput = \"\";\r\n try {\r\n await tasks([\r\n {\r\n title: t(\"modwiz.linking\", { id: path.basename(pkgPath) }),\r\n task: async () => {\r\n const { code, output } = await spawnTool(fetchScript, [\r\n \"install\",\r\n \"--from\",\r\n `dir:${pkgPath}`,\r\n \"--link\",\r\n ]);\r\n linkOutput = output;\r\n if (code !== 0) throw new Error(output.trim() || `exit ${code}`);\r\n return t(\"common.done\");\r\n },\r\n },\r\n ]);\r\n } catch (e) {\r\n outro(c.red((e as Error).message));\r\n return c.red((e as Error).message);\r\n }\r\n\r\n note(linkOutput.trim(), t(\"modwiz.link\"));\r\n const folderId = path.basename(pkgPath);\r\n const enableMsg = await maybeEnableModule(folderId);\r\n if (enableMsg) note(enableMsg, t(\"modwiz.enable\"));\r\n await maybeBuildDeploy();\r\n\r\n outro(c.green(t(\"modwiz.linkDone\", { id: folderId })));\r\n return c.green(t(\"modwiz.linkDone\", { id: folderId }));\r\n}\r\n\r\n/** \u672C\u5730\u5F00\u53D1\u63D0\u793A\uFF08\u4E0D\u518D\u4F9D\u8D56\u65C1\u8DEF sfmc-modules\uFF09\u3002 */\r\nexport async function runModuleDevWizard(): Promise<string> {\r\n if (!isInteractive()) {\r\n return c.yellow(t(\"modwiz.needTty.dev\"));\r\n }\r\n intro(c.bold(t(\"modwiz.devIntro\")));\r\n note(c.text(t(\"modwiz.devStandalone\")), t(\"common.hint\"));\r\n const doReload = await confirm({\r\n message: t(\"modwiz.buildDeploy\"),\r\n initialValue: false,\r\n });\r\n if (!isCancel(doReload) && doReload) {\r\n await maybeBuildDeploy();\r\n }\r\n outro(c.green(t(\"modwiz.reloadHint\")));\r\n return c.dim(t(\"modwiz.reloadHint\"));\r\n}\r\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -43,7 +43,7 @@ export interface PackEnsureResult {
43
43
  summary: string;
44
44
  }
45
45
  /** 读 BDS 路径与 level-name(level 权威:pack-manager-lib.readLevelNameSync,DIP) */
46
- export declare function resolveBdsContext(): {
46
+ export declare function resolveBdsContext(root?: string): {
47
47
  bdsRoot: string;
48
48
  levelName: string;
49
49
  };
@@ -1 +1 @@
1
- {"version":3,"file":"pack-lifecycle.d.ts","sourceRoot":"","sources":["../src/pack-lifecycle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pack-lifecycle.d.ts","sourceRoot":"","sources":["../src/pack-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -27,7 +27,7 @@ import {
27
27
  readWorldPackList,
28
28
  worldPackListHas as pmWorldPackListHas
29
29
  } from "@sfmc-bds/bds-tools/pack-manager-lib";
30
- import { ROOT, PACKAGES_DIR, resolveSdkPackageRoot } from "./runtime.js";
30
+ import { ROOT, PACKAGES_DIR, resolveSdkPackageRoot, getRoot } from "./runtime.js";
31
31
  import { c } from "./theme.js";
32
32
  const BP_NAME = "sfmc-modules";
33
33
  const RP_NAME = "sfmc-modules-rp";
@@ -90,8 +90,8 @@ function lockPath() {
90
90
  function catalogPath() {
91
91
  return modulePath(path.join(ROOT, "modules"), "catalog.json");
92
92
  }
93
- function resolveBdsContext() {
94
- const cfg = readJson(configPath(ROOT, "bds_updater.json")) ?? {};
93
+ function resolveBdsContext(root = getRoot()) {
94
+ const cfg = readJson(configPath(root, "bds_updater.json")) ?? {};
95
95
  const bdsRoot = cfg.bds_path;
96
96
  if (!bdsRoot) {
97
97
  throw new Error("bds_path not configured. Run `sfmc init` first.");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/pack-lifecycle.ts"],
4
- "sourcesContent": ["/**\n * pack-lifecycle.ts \u2014 \u884C\u4E3A\u5305/\u8D44\u6E90\u5305\u88C5\u8F7D\u751F\u547D\u5468\u671F\n *\n * \u804C\u8D23:\n * - \u8BA1\u7B97\u672C\u673A desired deploy-catalog(\u542F\u7528\u6A21\u5757 + fingerprint)\n * - \u4E0E\u4E16\u754C BP \u5185 sfmc-deploy-catalog.json \u6BD4\u5BF9\n * - \u4E0D\u4E00\u81F4\u5219\u6574\u5305 build + deploy + \u5199\u4E16\u754C\u6E05\u5355 + Script API permission\n * - \u542F\u52A8\u524D ensurePacksReady;\u65E5\u5FD7\u4E00\u5F8B\u8D70 source=`pack`\n */\n\nimport {\n configPath,\n modulePath,\n readJson,\n writeJson,\n type BdsUpdaterConfig,\n type Catalog,\n type ModuleLock,\n} from \"@sfmc-bds/sdk/node/config\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pushLog } from \"./logs.js\";\nimport { dirFingerprint } from \"./module-fingerprint.js\";\nimport { failResult, okResult, type CliResult } from \"./cli-result.js\";\nimport { t } from \"./i18n/index.js\";\nimport {\n assembleBehaviorPack,\n assembleResourcePack,\n bdsWorldLevelDir,\n bdsWorldsDir,\n configPermissionPath,\n deployToBDS,\n disablePackInWorld,\n enablePackInWorld,\n ensureConfigPermission,\n hasConfigPermission,\n readLevelNameSync,\n readPackManifestHeader,\n readWorldPackList,\n worldPackListHas as pmWorldPackListHas,\n} from \"@sfmc-bds/bds-tools/pack-manager-lib\";\nimport { ROOT, PACKAGES_DIR, resolveSdkPackageRoot } from \"./runtime.js\";\nimport { c } from \"./theme.js\";\n\nexport const BP_NAME = \"sfmc-modules\";\nexport const RP_NAME = \"sfmc-modules-rp\";\nexport const DEPLOY_CATALOG_NAME = \"sfmc-deploy-catalog.json\";\nexport const DEFAULT_PACK_VERSION: [number, number, number] = [1, 0, 0];\n\n/** \u5C06 @sfmc/sdk \u4E0E @sfmc-bds/sdk \u5B50\u8DEF\u5F84\u89E3\u6790\u5230 SDK \u5305\u5185\u771F\u5B9E\u6587\u4EF6 */\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\nexport function buildRoot(): string {\n /* \u4E0E\u6536\u4EF6\u7BB1\u540C\u6811\uFF1Apacks/_build\uFF08_ \u524D\u7F00\u4E0D\u4F1A\u88AB inbox \u626B\u63CF\uFF09 */\n return path.join(ROOT, \"packs\", \"_build\");\n}\nexport function bpSrc(): string {\n return path.join(buildRoot(), `${BP_NAME}-bp`);\n}\nexport function bpOut(): string {\n return path.join(buildRoot(), BP_NAME);\n}\nexport function rpOut(): string {\n return path.join(buildRoot(), RP_NAME);\n}\n\nexport interface DeployCatalogModule {\n logicalId: string;\n enabled: boolean;\n version: string;\n fingerprint: string;\n hasResourcePack: boolean;\n}\n\nexport interface DeployCatalog {\n schemaVersion: 1;\n bpUuid: string;\n rpUuid: string | null;\n bpVersion: [number, number, number];\n rpVersion: [number, number, number] | null;\n bpModuleUuid?: string;\n rpModuleUuid?: string;\n generatedAt: number;\n modules: Record<string, DeployCatalogModule>;\n}\n\nexport interface PackEnsureResult {\n rebuilt: boolean;\n skipped: boolean;\n catalog: DeployCatalog;\n bdsRoot: string;\n levelName: string;\n summary: string;\n}\n\ninterface PackManifestLite {\n id?: string;\n version?: string;\n schemaVersion?: number;\n enabledByDefault?: boolean;\n name?: string;\n}\n\nfunction packLog(text: string, level: \"info\" | \"success\" | \"warn\" | \"error\" = \"info\"): void {\n pushLog(text, \"pack\", level);\n}\n\nfunction packagesDir(): string {\n return PACKAGES_DIR || path.join(ROOT, \"modules\", \"packages\");\n}\n\nfunction lockPath(): string {\n return modulePath(path.join(ROOT, \"modules\"), \"module-lock.json\");\n}\n\nfunction catalogPath(): string {\n return modulePath(path.join(ROOT, \"modules\"), \"catalog.json\");\n}\n\n/** \u8BFB BDS \u8DEF\u5F84\u4E0E level-name\uFF08level \u6743\u5A01\uFF1Apack-manager-lib.readLevelNameSync\uFF0CDIP\uFF09 */\nexport function resolveBdsContext(): { bdsRoot: string; levelName: string } {\n const cfg = (readJson<BdsUpdaterConfig>(configPath(ROOT, \"bds_updater.json\")) ?? {}) as BdsUpdaterConfig;\n const bdsRoot = cfg.bds_path;\n if (!bdsRoot) {\n throw new Error(\"bds_path not configured. Run `sfmc init` first.\");\n }\n return { bdsRoot, levelName: readLevelNameSync(bdsRoot) };\n}\n\nexport function deployedBpDir(bdsRoot: string, levelName: string): string {\n return path.join(bdsWorldLevelDir(bdsRoot, levelName), \"behavior_packs\", BP_NAME);\n}\n\nexport function deployedRpDir(bdsRoot: string, levelName: string): string {\n return path.join(bdsWorldLevelDir(bdsRoot, levelName), \"resource_packs\", RP_NAME);\n}\n\nexport function deployedCatalogPath(bdsRoot: string, levelName: string): string {\n return path.join(deployedBpDir(bdsRoot, levelName), DEPLOY_CATALOG_NAME);\n}\n\n/** \u89E3\u6790\u542F\u7528\u72B6\u6001:lock \u4F18\u5148,\u5426\u5219 catalog.enabledByDefault(\u7F3A\u7701 true\u2194!==false),\u672A\u6536\u5F55\u6A21\u5757 false */\nfunction isModuleEnabled(logicalId: string, lock: ModuleLock, catalogDefaults: Map<string, boolean>): boolean {\n const st = lock.modules?.[logicalId];\n if (st && typeof st.enabled === \"boolean\") return st.enabled;\n return catalogDefaults.get(logicalId) ?? false;\n}\n\n/**\n * \u90E8\u7F72\u524D\u6536\u96C6\u4E16\u754C\u5185\u5DF2\u51FA\u73B0\u7684 BP/RP uuid\u3002\n * \u540C\u65F6\u8BFB deploy-catalog \u4E0E\u78C1\u76D8 manifest \u2014 catalog \u7F3A\u5931\u65F6\u4ECD\u80FD\u5378\u8FC7\u671F\u6E05\u5355\u9879(Demeter/\u5B8C\u6574\u5951\u7EA6)\u3002\n */\nfunction collectDeployedPackUuids(\n bdsRoot: string,\n levelName: string\n): { 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 const liveBp = readPackManifestHeader(deployedBpDir(bdsRoot, levelName));\n const liveRp = readPackManifestHeader(deployedRpDir(bdsRoot, levelName));\n if (liveBp?.uuid) bp.add(liveBp.uuid);\n if (liveRp?.uuid) rp.add(liveRp.uuid);\n return { bp, rp };\n}\n\n/**\n * \u679A\u4E3E\u672C\u673A packages,\u8FD4\u56DE folderId \u2192 \u5143\u6570\u636E\u3002\n * \u4EC5\u542B\u6709 sapi/src/index.ts \u7684\u6A21\u5757\u4F1A\u8FDB\u5165 BP bundle \u5019\u9009\u3002\n */\nexport async function scanLocalModules(): Promise<\n Array<{\n folderId: string;\n logicalId: string;\n version: string;\n enabled: boolean;\n hasSapi: boolean;\n hasResourcePack: boolean;\n fingerprint: string;\n entryPath: string | null;\n }>\n> {\n const dir = packagesDir();\n if (!existsSync(dir)) return [];\n const lock = (readJson<ModuleLock>(lockPath()) ?? { version: 1, modules: {} }) as ModuleLock;\n const cat = (readJson<Catalog>(catalogPath()) ?? {}) as Catalog;\n const defaults = new Map<string, boolean>();\n if (Array.isArray(cat.modules)) {\n for (const m of cat.modules) {\n const id = typeof m.id === \"string\" ? m.id : \"\";\n if (!id) continue;\n /* \u4E0E db-server \u5951\u7EA6\u4E00\u81F4:enabledByDefault !== false(\u7F3A\u7701 true) \u2014 LSP */\n defaults.set(id, m.enabledByDefault !== false);\n }\n }\n\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const out: Array<{\n folderId: string;\n logicalId: string;\n version: string;\n enabled: boolean;\n hasSapi: boolean;\n hasResourcePack: boolean;\n fingerprint: string;\n entryPath: string | null;\n }> = [];\n\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const folderId = e.name;\n const modPath = path.join(dir, folderId);\n const manifestPath = path.join(modPath, \"sapi\", \"manifest.json\");\n const entryPath = path.join(modPath, \"sapi\", \"src\", \"index.ts\");\n let logicalId = folderId;\n let version = \"0.0.0\";\n if (existsSync(manifestPath)) {\n try {\n const man = JSON.parse(await fs.readFile(manifestPath, \"utf8\")) as PackManifestLite;\n if (typeof man.id === \"string\" && man.id) logicalId = man.id;\n if (typeof man.version === \"string\" && man.version) version = man.version;\n else if (typeof man.schemaVersion === \"number\") version = `schema-${man.schemaVersion}`;\n } catch {\n /* keep defaults */\n }\n }\n const hasSapi = existsSync(entryPath);\n const hasResourcePack = existsSync(path.join(modPath, \"resource_pack\"));\n const fingerprint = await dirFingerprint(modPath);\n const enabled = isModuleEnabled(logicalId, lock, defaults);\n out.push({\n folderId,\n logicalId,\n version,\n enabled,\n hasSapi,\n hasResourcePack,\n fingerprint,\n entryPath: hasSapi ? entryPath : null,\n });\n }\n out.sort((a, b) => a.folderId.localeCompare(b.folderId));\n return out;\n}\n\n/** \u4ECE\u672C\u673A\u72B6\u6001 + \u5DF2\u6709 UUID \u5408\u6210 desired catalog\u3002\n * UUID \u4F18\u5148:deployed catalog \u2192 \u672C\u5730 build manifest \u2192 \u65B0\u5EFA\u968F\u673A\u3002\n */\nexport async function computeDesiredCatalog(opts?: {\n bpUuid?: string;\n rpUuid?: string | null;\n bpVersion?: [number, number, number];\n rpVersion?: [number, number, number] | null;\n bpModuleUuid?: string;\n rpModuleUuid?: string;\n}): Promise<DeployCatalog> {\n const mods = await scanLocalModules();\n const modules: Record<string, DeployCatalogModule> = {};\n let anyRp = false;\n for (const m of mods) {\n /* catalog \u8BB0\u5F55\u5168\u90E8\u5DF2\u5B89\u88C5\u6A21\u5757\u7684\u542F\u505C\u4E0E\u6307\u7EB9,\u4FBF\u4E8E diff \u88C5\u5378/\u7981\u7528 */\n modules[m.folderId] = {\n logicalId: m.logicalId,\n enabled: m.enabled,\n version: m.version,\n fingerprint: m.fingerprint,\n hasResourcePack: m.hasResourcePack,\n };\n if (m.enabled && m.hasResourcePack) anyRp = true;\n }\n\n const localBp = readPackManifestHeader(bpOut());\n const localRp = readPackManifestHeader(rpOut());\n const bpUuid = opts?.bpUuid ?? localBp?.uuid ?? crypto.randomUUID();\n const bpVersion = opts?.bpVersion ?? localBp?.version ?? DEFAULT_PACK_VERSION;\n const bpModuleUuid = opts?.bpModuleUuid ?? localBp?.moduleUuid;\n let rpUuid: string | null = null;\n let rpVersion: [number, number, number] | null = null;\n let rpModuleUuid: string | undefined;\n if (anyRp) {\n rpUuid = opts?.rpUuid ?? localRp?.uuid ?? crypto.randomUUID();\n rpVersion = opts?.rpVersion ?? localRp?.version ?? DEFAULT_PACK_VERSION;\n rpModuleUuid = opts?.rpModuleUuid ?? localRp?.moduleUuid;\n }\n\n return {\n schemaVersion: 1,\n bpUuid,\n rpUuid,\n bpVersion,\n rpVersion,\n ...(bpModuleUuid ? { bpModuleUuid } : {}),\n ...(rpModuleUuid ? { rpModuleUuid } : {}),\n generatedAt: Date.now(),\n modules,\n };\n}\n\nexport function readDeployedCatalog(bdsRoot: string, levelName: string): DeployCatalog | null {\n const file = deployedCatalogPath(bdsRoot, levelName);\n if (!existsSync(file)) return null;\n try {\n return JSON.parse(readFileSync(file, \"utf8\")) as DeployCatalog;\n } catch {\n return null;\n }\n}\n\n/** \u6BD4\u8F83\u952E:\u6A21\u5757\u96C6\u5408 + enabled/version/fingerprint/hasRP + bp/rp uuid */\nexport function catalogsEqual(a: DeployCatalog, b: DeployCatalog): boolean {\n if (a.bpUuid !== b.bpUuid) return false;\n if ((a.rpUuid ?? null) !== (b.rpUuid ?? null)) return false;\n const aKeys = Object.keys(a.modules).sort();\n const bKeys = Object.keys(b.modules).sort();\n if (aKeys.length !== bKeys.length) return false;\n for (let i = 0; i < aKeys.length; i++) {\n if (aKeys[i] !== bKeys[i]) return false;\n }\n for (const k of aKeys) {\n const x = a.modules[k]!;\n const y = b.modules[k]!;\n if (\n x.logicalId !== y.logicalId ||\n x.enabled !== y.enabled ||\n x.version !== y.version ||\n x.fingerprint !== y.fingerprint ||\n x.hasResourcePack !== y.hasResourcePack\n ) {\n return false;\n }\n }\n /* \u4E16\u754C\u6E05\u5355\u662F\u5426\u4ECD\u542B uuid \u2014 \u8C03\u7528\u65B9\u989D\u5916\u68C0\u67E5 */\n return true;\n}\n\n/** \u4E16\u754C enable-list \u67E5\u8BE2 \u2014 \u76F4\u8FDE pack-manager-lib\uFF08DRY/DIP\uFF0C\u4E0E CLI has-pack \u540C\u5951\u7EA6\uFF09 */\nfunction worldPackListHas(bdsRoot: string, levelName: string, kind: \"behavior\" | \"resource\", uuid: string): boolean {\n return pmWorldPackListHas(bdsWorldsDir(bdsRoot), levelName, kind, uuid);\n}\n\n/** esbuild \u805A\u5408\u542F\u7528\u6A21\u5757 \u2192 assemble BP + RP(\u82E5\u6709) */\nexport async function buildPacks(desired?: DeployCatalog): Promise<DeployCatalog> {\n await fs.mkdir(buildRoot(), { recursive: true });\n const catalog = desired ?? (await computeDesiredCatalog());\n packLog(`building BP/RP (modules=${Object.keys(catalog.modules).length})\u2026`);\n\n /* \u5355\u6B21\u626B\u63CF:SAPI \u5165\u53E3 + RP \u76EE\u5F55(DRY,\u907F\u514D listEnabled* \u91CD\u590D fingerprint) */\n const mods = await scanLocalModules();\n const entries = mods.filter((m) => m.enabled && m.entryPath).map((m) => m.entryPath!);\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(packagesDir(), m.folderId, \"resource_pack\");\n }\n\n const { build } = await import(\"esbuild\");\n const outFile = path.join(bpSrc(), \"scripts\", \"main.js\");\n await fs.mkdir(path.dirname(outFile), { recursive: true });\n if (entries.length === 0) {\n await fs.writeFile(outFile, \"/* no modules enabled */\\n\", \"utf8\");\n packLog(\"no enabled SAPI modules \u2014 empty main.js\", \"warn\");\n } else {\n const sdkRoot = resolveSdkPackageRoot();\n packLog(`SDK root: ${sdkRoot}`);\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 // \u907F\u514D\u8BFB\u53D6\u6A21\u5757\u5185\u6B8B\u7F3A\u7684 extends\uFF08\u5982 ../../../sdk/@sfmc-sdk/tsconfig.json\uFF09\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 packLog(`esbuild bundled ${entries.length} entr(y/ies)`, \"success\");\n }\n\n try {\n await assembleBehaviorPack({\n srcDir: bpSrc(),\n outDir: bpOut(),\n projectName: BP_NAME,\n version: catalog.bpVersion,\n description: \"ScriptsForMinecraftServer aggregated behavior pack\",\n uuid: catalog.bpUuid,\n ...(catalog.bpModuleUuid ? { moduleUuid: catalog.bpModuleUuid } : {}),\n });\n } catch (e) {\n throw new Error(`assemble-bp failed: ${(e as Error).message}`);\n }\n packLog(`assembled BP uuid=${catalog.bpUuid}`, \"success\");\n\n if (Object.keys(rpDirs).length > 0 && catalog.rpUuid) {\n /* OCP:\u663E\u5F0F module\u2192rpDir map \u76F4\u4F20\u5E93\uFF0C\u4E0D\u518D\u4E34\u65F6\u955C\u50CF\u6574\u6811 / \u843D\u76D8 JSON */\n try {\n await assembleResourcePack({\n moduleResourceDirs: rpDirs,\n outDir: rpOut(),\n projectName: RP_NAME,\n version: catalog.rpVersion ?? DEFAULT_PACK_VERSION,\n description: \"ScriptsForMinecraftServer aggregated resource pack\",\n uuid: catalog.rpUuid,\n ...(catalog.rpModuleUuid ? { moduleUuid: catalog.rpModuleUuid } : {}),\n });\n } catch (e) {\n throw new Error(`assemble-rp failed: ${(e as Error).message}`);\n }\n packLog(`assembled RP uuid=${catalog.rpUuid} (${Object.keys(rpDirs).length} modules)`, \"success\");\n } else {\n /* \u65E0 RP:\u6E05\u7406\u65E7\u4EA7\u7269,catalog.rpUuid \u7F6E\u7A7A */\n await fs.rm(rpOut(), { recursive: true, force: true });\n catalog.rpUuid = null;\n catalog.rpVersion = null;\n packLog(\"no enabled resource packs \u2014 RP skipped\");\n }\n\n /* \u628A catalog \u5199\u5230\u672C\u5730 BP \u4EA7\u7269,deploy \u65F6\u4E00\u5E76\u62F7\u8D70 */\n catalog.generatedAt = Date.now();\n writeJson(path.join(bpOut(), DEPLOY_CATALOG_NAME), catalog);\n return catalog;\n}\n\n/** \u90E8\u7F72\u5230\u4E16\u754C + enable \u6E05\u5355 + Script API permission */\nexport async function deployPacks(catalog: DeployCatalog): Promise<void> {\n const { bdsRoot, levelName } = resolveBdsContext();\n if (!existsSync(bpOut())) {\n throw new Error(`BP not built at ${bpOut()}. Run build first.`);\n }\n\n /* \u5FC5\u987B\u5728 deploy/clear-rp \u4E4B\u524D\u91C7\u96C6 \u2014 \u6E05\u76EE\u5F55\u540E\u65E0\u6CD5\u518D\u8BFB manifest */\n const previous = collectDeployedPackUuids(bdsRoot, levelName);\n try {\n await deployToBDS({\n bdsRoot,\n levelName,\n behaviorPackSrc: bpOut(),\n bpName: BP_NAME,\n rpName: RP_NAME,\n ...(catalog.rpUuid && existsSync(rpOut())\n ? { resourcePackSrc: rpOut() }\n : { clearResourcePack: true }),\n });\n } catch (e) {\n throw new Error(`deploy failed: ${(e as Error).message}`);\n }\n packLog(`deployed to worlds/${levelName}`, \"success\");\n\n /* \u786E\u4FDD catalog \u5728\u90E8\u7F72\u540E\u7684 BP \u5185(deploy \u4F1A\u62F7\u8D1D\u6574\u4E2A\u76EE\u5F55) */\n writeJson(path.join(deployedBpDir(bdsRoot, levelName), DEPLOY_CATALOG_NAME), catalog);\n\n const worldsDir = bdsWorldsDir(bdsRoot);\n try {\n await enablePackInWorld({\n worldsDir,\n levelName,\n kind: \"behavior\",\n packUuid: catalog.bpUuid,\n version: catalog.bpVersion,\n });\n } catch (e) {\n throw new Error(`enable BP failed: ${(e as Error).message}`);\n }\n packLog(`enabled behavior pack ${catalog.bpUuid} in world list`, \"success\");\n\n if (catalog.rpUuid && catalog.rpVersion) {\n try {\n await enablePackInWorld({\n worldsDir,\n levelName,\n kind: \"resource\",\n packUuid: catalog.rpUuid,\n version: catalog.rpVersion,\n });\n } catch (e) {\n throw new Error(`enable RP failed: ${(e as Error).message}`);\n }\n packLog(`enabled resource pack ${catalog.rpUuid} in world list`, \"success\");\n }\n\n /* \u5378\u6389\u8FC7\u671F RP:UUID \u8F6E\u6362 / \u4E0D\u518D\u63D0\u4F9B RP / catalog \u7F3A\u5931\u4F46\u78C1\u76D8\u4ECD\u6709\u65E7\u5305 */\n for (const staleRp of previous.rp) {\n if (staleRp === (catalog.rpUuid ?? null)) continue;\n try {\n await disablePackInWorld({\n worldsDir,\n levelName,\n kind: \"resource\",\n packUuid: staleRp,\n version: DEFAULT_PACK_VERSION,\n });\n packLog(`disabled stale resource pack ${staleRp}`, \"success\");\n } catch (e) {\n packLog(`disable stale RP ${staleRp} failed: ${(e as Error).message}`, \"warn\");\n }\n }\n\n /* \u5378\u6389\u8FC7\u671F BP(uuid \u8F6E\u6362) */\n for (const staleBp of previous.bp) {\n if (staleBp === catalog.bpUuid) continue;\n try {\n await disablePackInWorld({\n worldsDir,\n levelName,\n kind: \"behavior\",\n packUuid: staleBp,\n version: DEFAULT_PACK_VERSION,\n });\n packLog(`disabled stale behavior pack ${staleBp}`, \"success\");\n } catch (e) {\n packLog(`disable stale BP ${staleBp} failed: ${(e as Error).message}`, \"warn\");\n }\n }\n\n try {\n const wrote = await ensureConfigPermission(bdsRoot, catalog.bpUuid);\n const permRel = path.relative(bdsRoot, configPermissionPath(bdsRoot, catalog.bpUuid));\n packLog(wrote ? `wrote ${permRel}` : `${permRel} already exists \u2014 skipped`);\n } catch (e) {\n throw new Error(`ensure-permission failed: ${(e as Error).message}`);\n }\n}\n\nexport function formatPackLoadInfo(catalog: DeployCatalog, rebuilt: boolean): string {\n const mods = Object.entries(catalog.modules);\n const enabled = mods.filter(([, m]) => m.enabled);\n const disabled = mods.filter(([, m]) => !m.enabled);\n const lines = [\n `pack load ${rebuilt ? \"(rebuilt)\" : \"(catalog match \u2014 skip rebuild)\"}`,\n ` BP ${catalog.bpUuid} v${catalog.bpVersion.join(\".\")}`,\n catalog.rpUuid\n ? ` RP ${catalog.rpUuid} v${(catalog.rpVersion ?? DEFAULT_PACK_VERSION).join(\".\")}`\n : ` RP (none)`,\n ` modules: ${enabled.length} enabled / ${disabled.length} disabled / ${mods.length} installed`,\n ];\n for (const [folderId, m] of enabled.sort((a, b) => a[0].localeCompare(b[0]))) {\n lines.push(` \u25CF ${folderId} (${m.logicalId}) ${m.version}${m.hasResourcePack ? \" +rp\" : \"\"}`);\n }\n for (const [folderId, m] of disabled.sort((a, b) => a[0].localeCompare(b[0]))) {\n lines.push(` \u25CB ${folderId} (${m.logicalId}) disabled`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction reusePackIds(deployed: DeployCatalog): {\n bpUuid?: string;\n rpUuid?: string | null;\n bpVersion?: [number, number, number];\n rpVersion?: [number, number, number] | null;\n bpModuleUuid?: string;\n rpModuleUuid?: string;\n} {\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\n/**\n * BDS \u542F\u52A8\u524D\u95F8\u95E8:catalog \u4E0D\u4E00\u81F4\u5219\u6574\u5305\u91CD\u7F16\u90E8\u7F72;\u5931\u8D25\u629B\u9519,\u7981\u6B62\u542F\u52A8\u3002\n */\nexport async function ensurePacksReady(): Promise<PackEnsureResult> {\n const { bdsRoot, levelName } = resolveBdsContext();\n packLog(`preflight: checking packs for ${bdsRoot} / ${levelName}`);\n\n const deployed = readDeployedCatalog(bdsRoot, levelName);\n /* \u590D\u7528\u5DF2\u90E8\u7F72 UUID,\u907F\u514D\u65E0\u8C13\u8F6E\u6362 */\n let desired = await computeDesiredCatalog(deployed ? reusePackIds(deployed) : undefined);\n\n /* \u82E5 desired \u9700\u8981 RP \u4F46\u590D\u7528\u4E86\u65E7 null rpUuid,\u8865\u4E00\u4E2A */\n const needsRp = Object.values(desired.modules).some((m) => m.enabled && m.hasResourcePack);\n if (needsRp && !desired.rpUuid) {\n desired = await computeDesiredCatalog({\n bpUuid: desired.bpUuid,\n bpVersion: desired.bpVersion,\n ...(desired.bpModuleUuid ? { bpModuleUuid: desired.bpModuleUuid } : {}),\n rpUuid: crypto.randomUUID(),\n rpVersion: DEFAULT_PACK_VERSION,\n });\n }\n if (!needsRp) {\n desired.rpUuid = null;\n desired.rpVersion = null;\n }\n\n let needRebuild = !deployed || !catalogsEqual(desired, deployed);\n if (!needRebuild && deployed) {\n if (!worldPackListHas(bdsRoot, levelName, \"behavior\", deployed.bpUuid)) needRebuild = true;\n if (deployed.rpUuid && !worldPackListHas(bdsRoot, levelName, \"resource\", deployed.rpUuid)) {\n needRebuild = true;\n }\n if (!hasConfigPermission(bdsRoot, deployed.bpUuid)) {\n /* permission \u7F3A\u5931\u53EA\u8865\u5199,\u4E0D\u5F3A\u5236\u6574\u5305\u91CD\u7F16 */\n try {\n const wrote = await ensureConfigPermission(bdsRoot, deployed.bpUuid);\n const permRel = path.relative(bdsRoot, configPermissionPath(bdsRoot, deployed.bpUuid));\n packLog(wrote ? `wrote ${permRel}` : `${permRel} already exists \u2014 skipped`);\n } catch (e) {\n throw new Error(`ensure-permission failed: ${(e as Error).message}`);\n }\n }\n }\n\n let rebuilt = false;\n if (needRebuild) {\n packLog(\"catalog mismatch \u2014 rebuilding packs\u2026\", \"warn\");\n desired = await buildPacks(desired);\n await deployPacks(desired);\n rebuilt = true;\n } else {\n packLog(\"catalog match \u2014 skip rebuild\", \"success\");\n }\n\n const summary = formatPackLoadInfo(desired, rebuilt);\n for (const line of summary.split(\"\\n\")) packLog(line, rebuilt ? \"success\" : \"info\");\n\n return {\n rebuilt,\n skipped: !rebuilt,\n catalog: desired,\n bdsRoot,\n levelName,\n summary,\n };\n}\n\n/* \u2500\u2500 CLI \u547D\u4EE4\u5B9E\u73B0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\nexport async function cmdPackBuild(_args: string[]): Promise<CliResult> {\n try {\n const cat = await buildPacks();\n return okResult(c.green(t(\"pack.built\", { path: bpOut() })) + `\\n` + formatPackLoadInfo(cat, true) + \"\\n\");\n } catch (e) {\n packLog((e as Error).message, \"error\");\n return failResult(c.red(t(\"pack.buildFailed\", { message: (e as Error).message })));\n }\n}\n\nexport async function cmdPackDeploy(_args: string[]): Promise<CliResult> {\n try {\n const localCatFile = path.join(bpOut(), DEPLOY_CATALOG_NAME);\n let cat: DeployCatalog;\n if (existsSync(localCatFile)) {\n cat = JSON.parse(await fs.readFile(localCatFile, \"utf8\")) as DeployCatalog;\n } else {\n cat = await buildPacks();\n }\n await deployPacks(cat);\n return okResult(c.green(t(\"pack.deployed\")) + \"\\n\" + formatPackLoadInfo(cat, true) + \"\\n\");\n } catch (e) {\n packLog((e as Error).message, \"error\");\n return failResult(c.red(t(\"pack.deployFailed\", { message: (e as Error).message })));\n }\n}\n\nexport async function cmdPackStatus(_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 const match = deployed ? catalogsEqual(desired, deployed) : false;\n const permPath = deployed ? configPermissionPath(bdsRoot, deployed.bpUuid) : null;\n const lines = [\n c.bold(\"\\nPack status\"),\n ` bds : ${bdsRoot}`,\n ` level : ${levelName}`,\n ` catalog : ${match ? c.green(\"in sync\") : c.yellow(deployed ? \"mismatch \u2014 will rebuild on start\" : \"missing\")}`,\n ` BP dir : ${deployedBpDir(bdsRoot, levelName)} ${existsSync(deployedBpDir(bdsRoot, levelName)) ? c.green(\"\u2713\") : c.red(\"\u2717\")}`,\n ` RP dir : ${deployedRpDir(bdsRoot, levelName)} ${existsSync(deployedRpDir(bdsRoot, levelName)) ? c.green(\"\u2713\") : c.dim(\"\u2014\")}`,\n ` permission : ${permPath ? (existsSync(permPath) ? c.green(permPath) : c.yellow(\"missing\")) : c.dim(\"n/a\")}`,\n ];\n if (deployed) {\n lines.push(` BP uuid : ${deployed.bpUuid}`);\n if (deployed.rpUuid) lines.push(` RP uuid : ${deployed.rpUuid}`);\n lines.push(\n ` world BP : ${worldPackListHas(bdsRoot, levelName, \"behavior\", deployed.bpUuid) ? c.green(\"listed\") : c.red(\"not listed\")}`\n );\n if (deployed.rpUuid) {\n lines.push(\n ` world RP : ${worldPackListHas(bdsRoot, levelName, \"resource\", deployed.rpUuid) ? c.green(\"listed\") : c.red(\"not listed\")}`\n );\n }\n }\n lines.push(formatPackLoadInfo(desired, false));\n return lines.join(\"\\n\") + \"\\n\";\n } catch (e) {\n return c.red(t(\"pack.statusFailed\", { message: (e as Error).message }));\n }\n}\n\nexport async function cmdPackList(_args: string[]): Promise<string> {\n try {\n const { bdsRoot, levelName } = resolveBdsContext();\n const mods = await scanLocalModules();\n const lines = [c.bold(\"\\nModules / resource packs\"), c.dim(` ${packagesDir()}`)];\n for (const m of mods) {\n const mark = m.enabled ? c.green(\"\u25CF\") : c.dim(\"\u25CB\");\n lines.push(\n ` ${mark} ${m.folderId.padEnd(24)} ${m.logicalId.padEnd(24)} ${m.enabled ? \"on \" : \"off\"} ${m.hasResourcePack ? \"+rp\" : \" \"} ${m.version}`\n );\n }\n const worldsDir = bdsWorldsDir(bdsRoot);\n lines.push(c.bold(\"\\nWorld enable lists\"));\n for (const kind of [\"behavior\", \"resource\"] as const) {\n const arr = readWorldPackList(worldsDir, levelName, kind);\n if (!arr.length) lines.push(c.dim(` ${kind}: (empty)`));\n for (const e of arr) {\n lines.push(` ${kind}: ${e.pack_id} v${(e.version ?? []).join(\".\")}`);\n }\n }\n return lines.join(\"\\n\") + \"\\n\";\n } catch (e) {\n return c.red(t(\"pack.listFailed\", { message: (e as Error).message }));\n }\n}\n\nexport async function cmdPackEnableDisable(action: \"enable\" | \"disable\", args: string[]): Promise<string> {\n try {\n const kind = (args[0] === \"resource\" || args[0] === \"rp\" ? \"resource\" : \"behavior\") as \"behavior\" | \"resource\";\n const { bdsRoot, levelName } = resolveBdsContext();\n const deployed = readDeployedCatalog(bdsRoot, levelName);\n if (!deployed) return c.red(t(\"pack.noCatalog\"));\n const uuid = kind === \"behavior\" ? deployed.bpUuid : deployed.rpUuid;\n const version = kind === \"behavior\" ? deployed.bpVersion : deployed.rpVersion;\n if (!uuid || !version) return c.red(t(\"pack.noUuid\", { kind }));\n const worldsDir = bdsWorldsDir(bdsRoot);\n try {\n const opts = { worldsDir, levelName, kind, packUuid: uuid, version };\n if (action === \"enable\") await enablePackInWorld(opts);\n else await disablePackInWorld(opts);\n } catch (e) {\n return c.red(t(\"pack.actionFailed\", { action, detail: (e as Error).message }));\n }\n packLog(`${action}d ${kind} pack ${uuid}`, \"success\");\n return c.green(\n action === \"enable\"\n ? t(\"pack.enabledOk\", { kind, uuid })\n : t(\"pack.disabledOk\", { kind, uuid })\n );\n } catch (e) {\n return c.red(t(\"pack.actionErr\", { action, message: (e as Error).message }));\n }\n}\n\n/* CLI \u8868\u9762\u5DF2\u6536\u655B\uFF1A\u6A21\u5757\u7528 mod build/reload\uFF1B\u7B2C\u4E09\u65B9\u5305\u542F\u505C\u7528 addon/packs\u3002\n * \u6B64\u5904\u4FDD\u7559 cmdPackBuild / cmdPackDeploy \u4F9B ensurePacksReady \u4E0E mod reload \u8C03\u7528\u3002 */\n\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * pack-lifecycle.ts \u2014 \u884C\u4E3A\u5305/\u8D44\u6E90\u5305\u88C5\u8F7D\u751F\u547D\u5468\u671F\n *\n * \u804C\u8D23:\n * - \u8BA1\u7B97\u672C\u673A desired deploy-catalog(\u542F\u7528\u6A21\u5757 + fingerprint)\n * - \u4E0E\u4E16\u754C BP \u5185 sfmc-deploy-catalog.json \u6BD4\u5BF9\n * - \u4E0D\u4E00\u81F4\u5219\u6574\u5305 build + deploy + \u5199\u4E16\u754C\u6E05\u5355 + Script API permission\n * - \u542F\u52A8\u524D ensurePacksReady;\u65E5\u5FD7\u4E00\u5F8B\u8D70 source=`pack`\n */\n\nimport {\n configPath,\n modulePath,\n readJson,\n writeJson,\n type BdsUpdaterConfig,\n type Catalog,\n type ModuleLock,\n} from \"@sfmc-bds/sdk/node/config\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pushLog } from \"./logs.js\";\nimport { dirFingerprint } from \"./module-fingerprint.js\";\nimport { failResult, okResult, type CliResult } from \"./cli-result.js\";\nimport { t } from \"./i18n/index.js\";\nimport {\n assembleBehaviorPack,\n assembleResourcePack,\n bdsWorldLevelDir,\n bdsWorldsDir,\n configPermissionPath,\n deployToBDS,\n disablePackInWorld,\n enablePackInWorld,\n ensureConfigPermission,\n hasConfigPermission,\n readLevelNameSync,\n readPackManifestHeader,\n readWorldPackList,\n worldPackListHas as pmWorldPackListHas,\n} from \"@sfmc-bds/bds-tools/pack-manager-lib\";\nimport { ROOT, PACKAGES_DIR, resolveSdkPackageRoot, getRoot } from \"./runtime.js\";\nimport { c } from \"./theme.js\";\n\nexport const BP_NAME = \"sfmc-modules\";\nexport const RP_NAME = \"sfmc-modules-rp\";\nexport const DEPLOY_CATALOG_NAME = \"sfmc-deploy-catalog.json\";\nexport const DEFAULT_PACK_VERSION: [number, number, number] = [1, 0, 0];\n\n/** \u5C06 @sfmc/sdk \u4E0E @sfmc-bds/sdk \u5B50\u8DEF\u5F84\u89E3\u6790\u5230 SDK \u5305\u5185\u771F\u5B9E\u6587\u4EF6 */\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\nexport function buildRoot(): string {\n /* \u4E0E\u6536\u4EF6\u7BB1\u540C\u6811\uFF1Apacks/_build\uFF08_ \u524D\u7F00\u4E0D\u4F1A\u88AB inbox \u626B\u63CF\uFF09 */\n return path.join(ROOT, \"packs\", \"_build\");\n}\nexport function bpSrc(): string {\n return path.join(buildRoot(), `${BP_NAME}-bp`);\n}\nexport function bpOut(): string {\n return path.join(buildRoot(), BP_NAME);\n}\nexport function rpOut(): string {\n return path.join(buildRoot(), RP_NAME);\n}\n\nexport interface DeployCatalogModule {\n logicalId: string;\n enabled: boolean;\n version: string;\n fingerprint: string;\n hasResourcePack: boolean;\n}\n\nexport interface DeployCatalog {\n schemaVersion: 1;\n bpUuid: string;\n rpUuid: string | null;\n bpVersion: [number, number, number];\n rpVersion: [number, number, number] | null;\n bpModuleUuid?: string;\n rpModuleUuid?: string;\n generatedAt: number;\n modules: Record<string, DeployCatalogModule>;\n}\n\nexport interface PackEnsureResult {\n rebuilt: boolean;\n skipped: boolean;\n catalog: DeployCatalog;\n bdsRoot: string;\n levelName: string;\n summary: string;\n}\n\ninterface PackManifestLite {\n id?: string;\n version?: string;\n schemaVersion?: number;\n enabledByDefault?: boolean;\n name?: string;\n}\n\nfunction packLog(text: string, level: \"info\" | \"success\" | \"warn\" | \"error\" = \"info\"): void {\n pushLog(text, \"pack\", level);\n}\n\nfunction packagesDir(): string {\n return PACKAGES_DIR || path.join(ROOT, \"modules\", \"packages\");\n}\n\nfunction lockPath(): string {\n return modulePath(path.join(ROOT, \"modules\"), \"module-lock.json\");\n}\n\nfunction catalogPath(): string {\n return modulePath(path.join(ROOT, \"modules\"), \"catalog.json\");\n}\n\n/** \u8BFB BDS \u8DEF\u5F84\u4E0E level-name\uFF08level \u6743\u5A01\uFF1Apack-manager-lib.readLevelNameSync\uFF0CDIP\uFF09 */\nexport function resolveBdsContext(root: string = getRoot()): { bdsRoot: string; levelName: string } {\n const cfg = (readJson<BdsUpdaterConfig>(configPath(root, \"bds_updater.json\")) ?? {}) as BdsUpdaterConfig;\n const bdsRoot = cfg.bds_path;\n if (!bdsRoot) {\n throw new Error(\"bds_path not configured. Run `sfmc init` first.\");\n }\n return { bdsRoot, levelName: readLevelNameSync(bdsRoot) };\n}\n\nexport function deployedBpDir(bdsRoot: string, levelName: string): string {\n return path.join(bdsWorldLevelDir(bdsRoot, levelName), \"behavior_packs\", BP_NAME);\n}\n\nexport function deployedRpDir(bdsRoot: string, levelName: string): string {\n return path.join(bdsWorldLevelDir(bdsRoot, levelName), \"resource_packs\", RP_NAME);\n}\n\nexport function deployedCatalogPath(bdsRoot: string, levelName: string): string {\n return path.join(deployedBpDir(bdsRoot, levelName), DEPLOY_CATALOG_NAME);\n}\n\n/** \u89E3\u6790\u542F\u7528\u72B6\u6001:lock \u4F18\u5148,\u5426\u5219 catalog.enabledByDefault(\u7F3A\u7701 true\u2194!==false),\u672A\u6536\u5F55\u6A21\u5757 false */\nfunction isModuleEnabled(logicalId: string, lock: ModuleLock, catalogDefaults: Map<string, boolean>): boolean {\n const st = lock.modules?.[logicalId];\n if (st && typeof st.enabled === \"boolean\") return st.enabled;\n return catalogDefaults.get(logicalId) ?? false;\n}\n\n/**\n * \u90E8\u7F72\u524D\u6536\u96C6\u4E16\u754C\u5185\u5DF2\u51FA\u73B0\u7684 BP/RP uuid\u3002\n * \u540C\u65F6\u8BFB deploy-catalog \u4E0E\u78C1\u76D8 manifest \u2014 catalog \u7F3A\u5931\u65F6\u4ECD\u80FD\u5378\u8FC7\u671F\u6E05\u5355\u9879(Demeter/\u5B8C\u6574\u5951\u7EA6)\u3002\n */\nfunction collectDeployedPackUuids(\n bdsRoot: string,\n levelName: string\n): { 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 const liveBp = readPackManifestHeader(deployedBpDir(bdsRoot, levelName));\n const liveRp = readPackManifestHeader(deployedRpDir(bdsRoot, levelName));\n if (liveBp?.uuid) bp.add(liveBp.uuid);\n if (liveRp?.uuid) rp.add(liveRp.uuid);\n return { bp, rp };\n}\n\n/**\n * \u679A\u4E3E\u672C\u673A packages,\u8FD4\u56DE folderId \u2192 \u5143\u6570\u636E\u3002\n * \u4EC5\u542B\u6709 sapi/src/index.ts \u7684\u6A21\u5757\u4F1A\u8FDB\u5165 BP bundle \u5019\u9009\u3002\n */\nexport async function scanLocalModules(): Promise<\n Array<{\n folderId: string;\n logicalId: string;\n version: string;\n enabled: boolean;\n hasSapi: boolean;\n hasResourcePack: boolean;\n fingerprint: string;\n entryPath: string | null;\n }>\n> {\n const dir = packagesDir();\n if (!existsSync(dir)) return [];\n const lock = (readJson<ModuleLock>(lockPath()) ?? { version: 1, modules: {} }) as ModuleLock;\n const cat = (readJson<Catalog>(catalogPath()) ?? {}) as Catalog;\n const defaults = new Map<string, boolean>();\n if (Array.isArray(cat.modules)) {\n for (const m of cat.modules) {\n const id = typeof m.id === \"string\" ? m.id : \"\";\n if (!id) continue;\n /* \u4E0E db-server \u5951\u7EA6\u4E00\u81F4:enabledByDefault !== false(\u7F3A\u7701 true) \u2014 LSP */\n defaults.set(id, m.enabledByDefault !== false);\n }\n }\n\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const out: Array<{\n folderId: string;\n logicalId: string;\n version: string;\n enabled: boolean;\n hasSapi: boolean;\n hasResourcePack: boolean;\n fingerprint: string;\n entryPath: string | null;\n }> = [];\n\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const folderId = e.name;\n const modPath = path.join(dir, folderId);\n const manifestPath = path.join(modPath, \"sapi\", \"manifest.json\");\n const entryPath = path.join(modPath, \"sapi\", \"src\", \"index.ts\");\n let logicalId = folderId;\n let version = \"0.0.0\";\n if (existsSync(manifestPath)) {\n try {\n const man = JSON.parse(await fs.readFile(manifestPath, \"utf8\")) as PackManifestLite;\n if (typeof man.id === \"string\" && man.id) logicalId = man.id;\n if (typeof man.version === \"string\" && man.version) version = man.version;\n else if (typeof man.schemaVersion === \"number\") version = `schema-${man.schemaVersion}`;\n } catch {\n /* keep defaults */\n }\n }\n const hasSapi = existsSync(entryPath);\n const hasResourcePack = existsSync(path.join(modPath, \"resource_pack\"));\n const fingerprint = await dirFingerprint(modPath);\n const enabled = isModuleEnabled(logicalId, lock, defaults);\n out.push({\n folderId,\n logicalId,\n version,\n enabled,\n hasSapi,\n hasResourcePack,\n fingerprint,\n entryPath: hasSapi ? entryPath : null,\n });\n }\n out.sort((a, b) => a.folderId.localeCompare(b.folderId));\n return out;\n}\n\n/** \u4ECE\u672C\u673A\u72B6\u6001 + \u5DF2\u6709 UUID \u5408\u6210 desired catalog\u3002\n * UUID \u4F18\u5148:deployed catalog \u2192 \u672C\u5730 build manifest \u2192 \u65B0\u5EFA\u968F\u673A\u3002\n */\nexport async function computeDesiredCatalog(opts?: {\n bpUuid?: string;\n rpUuid?: string | null;\n bpVersion?: [number, number, number];\n rpVersion?: [number, number, number] | null;\n bpModuleUuid?: string;\n rpModuleUuid?: string;\n}): Promise<DeployCatalog> {\n const mods = await scanLocalModules();\n const modules: Record<string, DeployCatalogModule> = {};\n let anyRp = false;\n for (const m of mods) {\n /* catalog \u8BB0\u5F55\u5168\u90E8\u5DF2\u5B89\u88C5\u6A21\u5757\u7684\u542F\u505C\u4E0E\u6307\u7EB9,\u4FBF\u4E8E diff \u88C5\u5378/\u7981\u7528 */\n modules[m.folderId] = {\n logicalId: m.logicalId,\n enabled: m.enabled,\n version: m.version,\n fingerprint: m.fingerprint,\n hasResourcePack: m.hasResourcePack,\n };\n if (m.enabled && m.hasResourcePack) anyRp = true;\n }\n\n const localBp = readPackManifestHeader(bpOut());\n const localRp = readPackManifestHeader(rpOut());\n const bpUuid = opts?.bpUuid ?? localBp?.uuid ?? crypto.randomUUID();\n const bpVersion = opts?.bpVersion ?? localBp?.version ?? DEFAULT_PACK_VERSION;\n const bpModuleUuid = opts?.bpModuleUuid ?? localBp?.moduleUuid;\n let rpUuid: string | null = null;\n let rpVersion: [number, number, number] | null = null;\n let rpModuleUuid: string | undefined;\n if (anyRp) {\n rpUuid = opts?.rpUuid ?? localRp?.uuid ?? crypto.randomUUID();\n rpVersion = opts?.rpVersion ?? localRp?.version ?? DEFAULT_PACK_VERSION;\n rpModuleUuid = opts?.rpModuleUuid ?? localRp?.moduleUuid;\n }\n\n return {\n schemaVersion: 1,\n bpUuid,\n rpUuid,\n bpVersion,\n rpVersion,\n ...(bpModuleUuid ? { bpModuleUuid } : {}),\n ...(rpModuleUuid ? { rpModuleUuid } : {}),\n generatedAt: Date.now(),\n modules,\n };\n}\n\nexport function readDeployedCatalog(bdsRoot: string, levelName: string): DeployCatalog | null {\n const file = deployedCatalogPath(bdsRoot, levelName);\n if (!existsSync(file)) return null;\n try {\n return JSON.parse(readFileSync(file, \"utf8\")) as DeployCatalog;\n } catch {\n return null;\n }\n}\n\n/** \u6BD4\u8F83\u952E:\u6A21\u5757\u96C6\u5408 + enabled/version/fingerprint/hasRP + bp/rp uuid */\nexport function catalogsEqual(a: DeployCatalog, b: DeployCatalog): boolean {\n if (a.bpUuid !== b.bpUuid) return false;\n if ((a.rpUuid ?? null) !== (b.rpUuid ?? null)) return false;\n const aKeys = Object.keys(a.modules).sort();\n const bKeys = Object.keys(b.modules).sort();\n if (aKeys.length !== bKeys.length) return false;\n for (let i = 0; i < aKeys.length; i++) {\n if (aKeys[i] !== bKeys[i]) return false;\n }\n for (const k of aKeys) {\n const x = a.modules[k]!;\n const y = b.modules[k]!;\n if (\n x.logicalId !== y.logicalId ||\n x.enabled !== y.enabled ||\n x.version !== y.version ||\n x.fingerprint !== y.fingerprint ||\n x.hasResourcePack !== y.hasResourcePack\n ) {\n return false;\n }\n }\n /* \u4E16\u754C\u6E05\u5355\u662F\u5426\u4ECD\u542B uuid \u2014 \u8C03\u7528\u65B9\u989D\u5916\u68C0\u67E5 */\n return true;\n}\n\n/** \u4E16\u754C enable-list \u67E5\u8BE2 \u2014 \u76F4\u8FDE pack-manager-lib\uFF08DRY/DIP\uFF0C\u4E0E CLI has-pack \u540C\u5951\u7EA6\uFF09 */\nfunction worldPackListHas(bdsRoot: string, levelName: string, kind: \"behavior\" | \"resource\", uuid: string): boolean {\n return pmWorldPackListHas(bdsWorldsDir(bdsRoot), levelName, kind, uuid);\n}\n\n/** esbuild \u805A\u5408\u542F\u7528\u6A21\u5757 \u2192 assemble BP + RP(\u82E5\u6709) */\nexport async function buildPacks(desired?: DeployCatalog): Promise<DeployCatalog> {\n await fs.mkdir(buildRoot(), { recursive: true });\n const catalog = desired ?? (await computeDesiredCatalog());\n packLog(`building BP/RP (modules=${Object.keys(catalog.modules).length})\u2026`);\n\n /* \u5355\u6B21\u626B\u63CF:SAPI \u5165\u53E3 + RP \u76EE\u5F55(DRY,\u907F\u514D listEnabled* \u91CD\u590D fingerprint) */\n const mods = await scanLocalModules();\n const entries = mods.filter((m) => m.enabled && m.entryPath).map((m) => m.entryPath!);\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(packagesDir(), m.folderId, \"resource_pack\");\n }\n\n const { build } = await import(\"esbuild\");\n const outFile = path.join(bpSrc(), \"scripts\", \"main.js\");\n await fs.mkdir(path.dirname(outFile), { recursive: true });\n if (entries.length === 0) {\n await fs.writeFile(outFile, \"/* no modules enabled */\\n\", \"utf8\");\n packLog(\"no enabled SAPI modules \u2014 empty main.js\", \"warn\");\n } else {\n const sdkRoot = resolveSdkPackageRoot();\n packLog(`SDK root: ${sdkRoot}`);\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 // \u907F\u514D\u8BFB\u53D6\u6A21\u5757\u5185\u6B8B\u7F3A\u7684 extends\uFF08\u5982 ../../../sdk/@sfmc-sdk/tsconfig.json\uFF09\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 packLog(`esbuild bundled ${entries.length} entr(y/ies)`, \"success\");\n }\n\n try {\n await assembleBehaviorPack({\n srcDir: bpSrc(),\n outDir: bpOut(),\n projectName: BP_NAME,\n version: catalog.bpVersion,\n description: \"ScriptsForMinecraftServer aggregated behavior pack\",\n uuid: catalog.bpUuid,\n ...(catalog.bpModuleUuid ? { moduleUuid: catalog.bpModuleUuid } : {}),\n });\n } catch (e) {\n throw new Error(`assemble-bp failed: ${(e as Error).message}`);\n }\n packLog(`assembled BP uuid=${catalog.bpUuid}`, \"success\");\n\n if (Object.keys(rpDirs).length > 0 && catalog.rpUuid) {\n /* OCP:\u663E\u5F0F module\u2192rpDir map \u76F4\u4F20\u5E93\uFF0C\u4E0D\u518D\u4E34\u65F6\u955C\u50CF\u6574\u6811 / \u843D\u76D8 JSON */\n try {\n await assembleResourcePack({\n moduleResourceDirs: rpDirs,\n outDir: rpOut(),\n projectName: RP_NAME,\n version: catalog.rpVersion ?? DEFAULT_PACK_VERSION,\n description: \"ScriptsForMinecraftServer aggregated resource pack\",\n uuid: catalog.rpUuid,\n ...(catalog.rpModuleUuid ? { moduleUuid: catalog.rpModuleUuid } : {}),\n });\n } catch (e) {\n throw new Error(`assemble-rp failed: ${(e as Error).message}`);\n }\n packLog(`assembled RP uuid=${catalog.rpUuid} (${Object.keys(rpDirs).length} modules)`, \"success\");\n } else {\n /* \u65E0 RP:\u6E05\u7406\u65E7\u4EA7\u7269,catalog.rpUuid \u7F6E\u7A7A */\n await fs.rm(rpOut(), { recursive: true, force: true });\n catalog.rpUuid = null;\n catalog.rpVersion = null;\n packLog(\"no enabled resource packs \u2014 RP skipped\");\n }\n\n /* \u628A catalog \u5199\u5230\u672C\u5730 BP \u4EA7\u7269,deploy \u65F6\u4E00\u5E76\u62F7\u8D70 */\n catalog.generatedAt = Date.now();\n writeJson(path.join(bpOut(), DEPLOY_CATALOG_NAME), catalog);\n return catalog;\n}\n\n/** \u90E8\u7F72\u5230\u4E16\u754C + enable \u6E05\u5355 + Script API permission */\nexport async function deployPacks(catalog: DeployCatalog): Promise<void> {\n const { bdsRoot, levelName } = resolveBdsContext();\n if (!existsSync(bpOut())) {\n throw new Error(`BP not built at ${bpOut()}. Run build first.`);\n }\n\n /* \u5FC5\u987B\u5728 deploy/clear-rp \u4E4B\u524D\u91C7\u96C6 \u2014 \u6E05\u76EE\u5F55\u540E\u65E0\u6CD5\u518D\u8BFB manifest */\n const previous = collectDeployedPackUuids(bdsRoot, levelName);\n try {\n await deployToBDS({\n bdsRoot,\n levelName,\n behaviorPackSrc: bpOut(),\n bpName: BP_NAME,\n rpName: RP_NAME,\n ...(catalog.rpUuid && existsSync(rpOut())\n ? { resourcePackSrc: rpOut() }\n : { clearResourcePack: true }),\n });\n } catch (e) {\n throw new Error(`deploy failed: ${(e as Error).message}`);\n }\n packLog(`deployed to worlds/${levelName}`, \"success\");\n\n /* \u786E\u4FDD catalog \u5728\u90E8\u7F72\u540E\u7684 BP \u5185(deploy \u4F1A\u62F7\u8D1D\u6574\u4E2A\u76EE\u5F55) */\n writeJson(path.join(deployedBpDir(bdsRoot, levelName), DEPLOY_CATALOG_NAME), catalog);\n\n const worldsDir = bdsWorldsDir(bdsRoot);\n try {\n await enablePackInWorld({\n worldsDir,\n levelName,\n kind: \"behavior\",\n packUuid: catalog.bpUuid,\n version: catalog.bpVersion,\n });\n } catch (e) {\n throw new Error(`enable BP failed: ${(e as Error).message}`);\n }\n packLog(`enabled behavior pack ${catalog.bpUuid} in world list`, \"success\");\n\n if (catalog.rpUuid && catalog.rpVersion) {\n try {\n await enablePackInWorld({\n worldsDir,\n levelName,\n kind: \"resource\",\n packUuid: catalog.rpUuid,\n version: catalog.rpVersion,\n });\n } catch (e) {\n throw new Error(`enable RP failed: ${(e as Error).message}`);\n }\n packLog(`enabled resource pack ${catalog.rpUuid} in world list`, \"success\");\n }\n\n /* \u5378\u6389\u8FC7\u671F RP:UUID \u8F6E\u6362 / \u4E0D\u518D\u63D0\u4F9B RP / catalog \u7F3A\u5931\u4F46\u78C1\u76D8\u4ECD\u6709\u65E7\u5305 */\n for (const staleRp of previous.rp) {\n if (staleRp === (catalog.rpUuid ?? null)) continue;\n try {\n await disablePackInWorld({\n worldsDir,\n levelName,\n kind: \"resource\",\n packUuid: staleRp,\n version: DEFAULT_PACK_VERSION,\n });\n packLog(`disabled stale resource pack ${staleRp}`, \"success\");\n } catch (e) {\n packLog(`disable stale RP ${staleRp} failed: ${(e as Error).message}`, \"warn\");\n }\n }\n\n /* \u5378\u6389\u8FC7\u671F BP(uuid \u8F6E\u6362) */\n for (const staleBp of previous.bp) {\n if (staleBp === catalog.bpUuid) continue;\n try {\n await disablePackInWorld({\n worldsDir,\n levelName,\n kind: \"behavior\",\n packUuid: staleBp,\n version: DEFAULT_PACK_VERSION,\n });\n packLog(`disabled stale behavior pack ${staleBp}`, \"success\");\n } catch (e) {\n packLog(`disable stale BP ${staleBp} failed: ${(e as Error).message}`, \"warn\");\n }\n }\n\n try {\n const wrote = await ensureConfigPermission(bdsRoot, catalog.bpUuid);\n const permRel = path.relative(bdsRoot, configPermissionPath(bdsRoot, catalog.bpUuid));\n packLog(wrote ? `wrote ${permRel}` : `${permRel} already exists \u2014 skipped`);\n } catch (e) {\n throw new Error(`ensure-permission failed: ${(e as Error).message}`);\n }\n}\n\nexport function formatPackLoadInfo(catalog: DeployCatalog, rebuilt: boolean): string {\n const mods = Object.entries(catalog.modules);\n const enabled = mods.filter(([, m]) => m.enabled);\n const disabled = mods.filter(([, m]) => !m.enabled);\n const lines = [\n `pack load ${rebuilt ? \"(rebuilt)\" : \"(catalog match \u2014 skip rebuild)\"}`,\n ` BP ${catalog.bpUuid} v${catalog.bpVersion.join(\".\")}`,\n catalog.rpUuid\n ? ` RP ${catalog.rpUuid} v${(catalog.rpVersion ?? DEFAULT_PACK_VERSION).join(\".\")}`\n : ` RP (none)`,\n ` modules: ${enabled.length} enabled / ${disabled.length} disabled / ${mods.length} installed`,\n ];\n for (const [folderId, m] of enabled.sort((a, b) => a[0].localeCompare(b[0]))) {\n lines.push(` \u25CF ${folderId} (${m.logicalId}) ${m.version}${m.hasResourcePack ? \" +rp\" : \"\"}`);\n }\n for (const [folderId, m] of disabled.sort((a, b) => a[0].localeCompare(b[0]))) {\n lines.push(` \u25CB ${folderId} (${m.logicalId}) disabled`);\n }\n return lines.join(\"\\n\");\n}\n\nfunction reusePackIds(deployed: DeployCatalog): {\n bpUuid?: string;\n rpUuid?: string | null;\n bpVersion?: [number, number, number];\n rpVersion?: [number, number, number] | null;\n bpModuleUuid?: string;\n rpModuleUuid?: string;\n} {\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\n/**\n * BDS \u542F\u52A8\u524D\u95F8\u95E8:catalog \u4E0D\u4E00\u81F4\u5219\u6574\u5305\u91CD\u7F16\u90E8\u7F72;\u5931\u8D25\u629B\u9519,\u7981\u6B62\u542F\u52A8\u3002\n */\nexport async function ensurePacksReady(): Promise<PackEnsureResult> {\n const { bdsRoot, levelName } = resolveBdsContext();\n packLog(`preflight: checking packs for ${bdsRoot} / ${levelName}`);\n\n const deployed = readDeployedCatalog(bdsRoot, levelName);\n /* \u590D\u7528\u5DF2\u90E8\u7F72 UUID,\u907F\u514D\u65E0\u8C13\u8F6E\u6362 */\n let desired = await computeDesiredCatalog(deployed ? reusePackIds(deployed) : undefined);\n\n /* \u82E5 desired \u9700\u8981 RP \u4F46\u590D\u7528\u4E86\u65E7 null rpUuid,\u8865\u4E00\u4E2A */\n const needsRp = Object.values(desired.modules).some((m) => m.enabled && m.hasResourcePack);\n if (needsRp && !desired.rpUuid) {\n desired = await computeDesiredCatalog({\n bpUuid: desired.bpUuid,\n bpVersion: desired.bpVersion,\n ...(desired.bpModuleUuid ? { bpModuleUuid: desired.bpModuleUuid } : {}),\n rpUuid: crypto.randomUUID(),\n rpVersion: DEFAULT_PACK_VERSION,\n });\n }\n if (!needsRp) {\n desired.rpUuid = null;\n desired.rpVersion = null;\n }\n\n let needRebuild = !deployed || !catalogsEqual(desired, deployed);\n if (!needRebuild && deployed) {\n if (!worldPackListHas(bdsRoot, levelName, \"behavior\", deployed.bpUuid)) needRebuild = true;\n if (deployed.rpUuid && !worldPackListHas(bdsRoot, levelName, \"resource\", deployed.rpUuid)) {\n needRebuild = true;\n }\n if (!hasConfigPermission(bdsRoot, deployed.bpUuid)) {\n /* permission \u7F3A\u5931\u53EA\u8865\u5199,\u4E0D\u5F3A\u5236\u6574\u5305\u91CD\u7F16 */\n try {\n const wrote = await ensureConfigPermission(bdsRoot, deployed.bpUuid);\n const permRel = path.relative(bdsRoot, configPermissionPath(bdsRoot, deployed.bpUuid));\n packLog(wrote ? `wrote ${permRel}` : `${permRel} already exists \u2014 skipped`);\n } catch (e) {\n throw new Error(`ensure-permission failed: ${(e as Error).message}`);\n }\n }\n }\n\n let rebuilt = false;\n if (needRebuild) {\n packLog(\"catalog mismatch \u2014 rebuilding packs\u2026\", \"warn\");\n desired = await buildPacks(desired);\n await deployPacks(desired);\n rebuilt = true;\n } else {\n packLog(\"catalog match \u2014 skip rebuild\", \"success\");\n }\n\n const summary = formatPackLoadInfo(desired, rebuilt);\n for (const line of summary.split(\"\\n\")) packLog(line, rebuilt ? \"success\" : \"info\");\n\n return {\n rebuilt,\n skipped: !rebuilt,\n catalog: desired,\n bdsRoot,\n levelName,\n summary,\n };\n}\n\n/* \u2500\u2500 CLI \u547D\u4EE4\u5B9E\u73B0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\nexport async function cmdPackBuild(_args: string[]): Promise<CliResult> {\n try {\n const cat = await buildPacks();\n return okResult(c.green(t(\"pack.built\", { path: bpOut() })) + `\\n` + formatPackLoadInfo(cat, true) + \"\\n\");\n } catch (e) {\n packLog((e as Error).message, \"error\");\n return failResult(c.red(t(\"pack.buildFailed\", { message: (e as Error).message })));\n }\n}\n\nexport async function cmdPackDeploy(_args: string[]): Promise<CliResult> {\n try {\n const localCatFile = path.join(bpOut(), DEPLOY_CATALOG_NAME);\n let cat: DeployCatalog;\n if (existsSync(localCatFile)) {\n cat = JSON.parse(await fs.readFile(localCatFile, \"utf8\")) as DeployCatalog;\n } else {\n cat = await buildPacks();\n }\n await deployPacks(cat);\n return okResult(c.green(t(\"pack.deployed\")) + \"\\n\" + formatPackLoadInfo(cat, true) + \"\\n\");\n } catch (e) {\n packLog((e as Error).message, \"error\");\n return failResult(c.red(t(\"pack.deployFailed\", { message: (e as Error).message })));\n }\n}\n\nexport async function cmdPackStatus(_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 const match = deployed ? catalogsEqual(desired, deployed) : false;\n const permPath = deployed ? configPermissionPath(bdsRoot, deployed.bpUuid) : null;\n const lines = [\n c.bold(\"\\nPack status\"),\n ` bds : ${bdsRoot}`,\n ` level : ${levelName}`,\n ` catalog : ${match ? c.green(\"in sync\") : c.yellow(deployed ? \"mismatch \u2014 will rebuild on start\" : \"missing\")}`,\n ` BP dir : ${deployedBpDir(bdsRoot, levelName)} ${existsSync(deployedBpDir(bdsRoot, levelName)) ? c.green(\"\u2713\") : c.red(\"\u2717\")}`,\n ` RP dir : ${deployedRpDir(bdsRoot, levelName)} ${existsSync(deployedRpDir(bdsRoot, levelName)) ? c.green(\"\u2713\") : c.dim(\"\u2014\")}`,\n ` permission : ${permPath ? (existsSync(permPath) ? c.green(permPath) : c.yellow(\"missing\")) : c.dim(\"n/a\")}`,\n ];\n if (deployed) {\n lines.push(` BP uuid : ${deployed.bpUuid}`);\n if (deployed.rpUuid) lines.push(` RP uuid : ${deployed.rpUuid}`);\n lines.push(\n ` world BP : ${worldPackListHas(bdsRoot, levelName, \"behavior\", deployed.bpUuid) ? c.green(\"listed\") : c.red(\"not listed\")}`\n );\n if (deployed.rpUuid) {\n lines.push(\n ` world RP : ${worldPackListHas(bdsRoot, levelName, \"resource\", deployed.rpUuid) ? c.green(\"listed\") : c.red(\"not listed\")}`\n );\n }\n }\n lines.push(formatPackLoadInfo(desired, false));\n return lines.join(\"\\n\") + \"\\n\";\n } catch (e) {\n return c.red(t(\"pack.statusFailed\", { message: (e as Error).message }));\n }\n}\n\nexport async function cmdPackList(_args: string[]): Promise<string> {\n try {\n const { bdsRoot, levelName } = resolveBdsContext();\n const mods = await scanLocalModules();\n const lines = [c.bold(\"\\nModules / resource packs\"), c.dim(` ${packagesDir()}`)];\n for (const m of mods) {\n const mark = m.enabled ? c.green(\"\u25CF\") : c.dim(\"\u25CB\");\n lines.push(\n ` ${mark} ${m.folderId.padEnd(24)} ${m.logicalId.padEnd(24)} ${m.enabled ? \"on \" : \"off\"} ${m.hasResourcePack ? \"+rp\" : \" \"} ${m.version}`\n );\n }\n const worldsDir = bdsWorldsDir(bdsRoot);\n lines.push(c.bold(\"\\nWorld enable lists\"));\n for (const kind of [\"behavior\", \"resource\"] as const) {\n const arr = readWorldPackList(worldsDir, levelName, kind);\n if (!arr.length) lines.push(c.dim(` ${kind}: (empty)`));\n for (const e of arr) {\n lines.push(` ${kind}: ${e.pack_id} v${(e.version ?? []).join(\".\")}`);\n }\n }\n return lines.join(\"\\n\") + \"\\n\";\n } catch (e) {\n return c.red(t(\"pack.listFailed\", { message: (e as Error).message }));\n }\n}\n\nexport async function cmdPackEnableDisable(action: \"enable\" | \"disable\", args: string[]): Promise<string> {\n try {\n const kind = (args[0] === \"resource\" || args[0] === \"rp\" ? \"resource\" : \"behavior\") as \"behavior\" | \"resource\";\n const { bdsRoot, levelName } = resolveBdsContext();\n const deployed = readDeployedCatalog(bdsRoot, levelName);\n if (!deployed) return c.red(t(\"pack.noCatalog\"));\n const uuid = kind === \"behavior\" ? deployed.bpUuid : deployed.rpUuid;\n const version = kind === \"behavior\" ? deployed.bpVersion : deployed.rpVersion;\n if (!uuid || !version) return c.red(t(\"pack.noUuid\", { kind }));\n const worldsDir = bdsWorldsDir(bdsRoot);\n try {\n const opts = { worldsDir, levelName, kind, packUuid: uuid, version };\n if (action === \"enable\") await enablePackInWorld(opts);\n else await disablePackInWorld(opts);\n } catch (e) {\n return c.red(t(\"pack.actionFailed\", { action, detail: (e as Error).message }));\n }\n packLog(`${action}d ${kind} pack ${uuid}`, \"success\");\n return c.green(\n action === \"enable\"\n ? t(\"pack.enabledOk\", { kind, uuid })\n : t(\"pack.disabledOk\", { kind, uuid })\n );\n } catch (e) {\n return c.red(t(\"pack.actionErr\", { action, message: (e as Error).message }));\n }\n}\n\n/* CLI \u8868\u9762\u5DF2\u6536\u655B\uFF1A\u6A21\u5757\u7528 mod build/reload\uFF1B\u7B2C\u4E09\u65B9\u5305\u542F\u505C\u7528 addon/packs\u3002\n * \u6B64\u5904\u4FDD\u7559 cmdPackBuild / cmdPackDeploy \u4F9B ensurePacksReady \u4E0E mod reload \u8C03\u7528\u3002 */\n\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,18 @@
1
+ export declare const ensurePackUpdateConfigFile: () => string, loadPackUpdateConfig: () => import("@sfmc-bds/bds-tools/pack-update").PackUpdateConfig, getPackMatchConfig: (cfg: import("@sfmc-bds/bds-tools/pack-update").PackUpdateConfig) => import("@sfmc-bds/bds-tools/pack-update").PackUpdateMatchConfig, packUpdateConfigPath: () => string, resolvePackTrashDir: (cfg?: import("@sfmc-bds/bds-tools/pack-update").PackUpdateConfig) => string, isPackUninstallRecycleBin: (cfg?: import("@sfmc-bds/bds-tools/pack-update").PackUpdateConfig) => boolean, resolveUninstallTrashDir: (opts?: {
2
+ purge?: boolean;
3
+ cfg?: import("@sfmc-bds/bds-tools/pack-update").PackUpdateConfig;
4
+ }) => string | null, packSourcesPath: () => string, readPackSources: () => import("@sfmc-bds/bds-tools/pack-update").PackSourcesFile, writePackSources: (data: import("@sfmc-bds/bds-tools/pack-update").PackSourcesFile) => void, getBinding: (bpUuid: string) => import("@sfmc-bds/bds-tools/pack-update").PackSourceBinding | null, setBinding: (bpUuid: string, binding: import("@sfmc-bds/bds-tools/pack-update").PackSourceBinding) => void, removeBinding: (bpUuid: string) => boolean, listBindings: () => Array<{
5
+ bpUuid: string;
6
+ binding: import("@sfmc-bds/bds-tools/pack-update").PackSourceBinding;
7
+ }>, createPackSourceProvider: typeof import("@sfmc-bds/bds-tools/pack-update").createPackSourceProvider, providerShortLabel: typeof import("@sfmc-bds/bds-tools/pack-update").providerShortLabel, resolveConfiguredPackProvider: typeof import("@sfmc-bds/bds-tools/pack-update").resolveConfiguredPackProvider, pairedRpUuidFromBpDir: (bpDir: string) => string | null, probeSourceAfterInstall: (opts: {
8
+ info: import("@sfmc-bds/bds-tools/world-packs").PackManifestInfo;
9
+ packDir?: string;
10
+ folderName?: string;
11
+ interactive?: boolean;
12
+ }) => Promise<void>, searchRemote: (query: string) => Promise<string>, bindPackSource: (packId: string, ref: string) => Promise<string>, formatSourcesList: () => string, checkPackUpdates: (opts?: {
13
+ packId?: string;
14
+ apply?: boolean;
15
+ }) => Promise<string>, runPackUpdatesOnBdsStart: () => Promise<void>, bindingLabelForUuid: (uuid: string) => string;
16
+ export type { CurseForgeProviderConfig, PackProviderId, PackReleaseType, PackSourceBinding, PackSourceProvider, PackSourcesFile, PackUpdateConfig, PackUpdateMatchConfig, PackUninstallConfig, SemVer3, SourceFileRef, SourceSearchHit, VersionCompareResult, VersionPolicyConfig, } from "@sfmc-bds/bds-tools/pack-update";
17
+ export { DEFAULT_PACK_UNINSTALL, buildSearchQueries, buildSearchQueriesFromSources, bumpSemVer3, collectQuerySeeds, compareSemVer3, decideVersionPolicy, extractLatinPhrase, insertCjkLatinBoundaries, isNewer, maxSemVer3, nextEnabledVersion, normalizePackSearchName, packSourceScore, toCfSlugCandidate, } from "@sfmc-bds/bds-tools/pack-update";
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pack-update/index.ts"],"names":[],"mappings":"AAiCA,eAAO,MACL,0BAA0B,gBAC1B,oBAAoB,oEACpB,kBAAkB,wIAClB,oBAAoB,gBACpB,mBAAmB,gFACnB,yBAAyB,iFACzB,wBAAwB;;;qBACxB,eAAe,gBACf,eAAe,mEACf,gBAAgB,6EAChB,UAAU,0FACV,UAAU,kGACV,aAAa,+BACb,YAAY;;;IACZ,wBAAwB,6EACxB,kBAAkB,uEAClB,6BAA6B,kFAC7B,qBAAqB,oCACrB,uBAAuB;;;;;qBACvB,YAAY,sCACZ,cAAc,oDACd,iBAAiB,gBACjB,gBAAgB;;;uBAChB,wBAAwB,uBACxB,mBAAmB,0BACd,CAAC;AAER,YAAY,EACV,wBAAwB,EACxB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,OAAO,EACP,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,6BAA6B,EAC7B,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,OAAO,EACP,UAAU,EACV,kBAAkB,EAClB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,GAClB,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1,113 @@
1
+ import { createPackUpdateApi } from "@sfmc-bds/bds-tools/pack-update";
2
+ import { confirm, isCancel } from "@clack/prompts";
3
+ import { t } from "../i18n/index.js";
4
+ import { pushLog } from "../logs.js";
5
+ import { resolveBdsContext } from "../pack-lifecycle.js";
6
+ import { ROOT } from "../runtime.js";
7
+ import { c } from "../theme.js";
8
+ const api = createPackUpdateApi({
9
+ rootDir: ROOT,
10
+ resolveBdsContext,
11
+ log: (text, level = "info") => pushLog(text, "pack", level === "success" ? "info" : level),
12
+ askConfirm: async (message) => {
13
+ const ans = await confirm({ message, initialValue: true });
14
+ if (isCancel(ans)) return false;
15
+ return !!ans;
16
+ },
17
+ t: (key, params) => t(key, params),
18
+ paint: {
19
+ green: (s) => c.green(s),
20
+ yellow: (s) => c.yellow(s),
21
+ red: (s) => c.red(s),
22
+ dim: (s) => c.dim(s),
23
+ cyan: (s) => c.cyan(s),
24
+ bold: (s) => c.bold(s)
25
+ }
26
+ });
27
+ const {
28
+ ensurePackUpdateConfigFile,
29
+ loadPackUpdateConfig,
30
+ getPackMatchConfig,
31
+ packUpdateConfigPath,
32
+ resolvePackTrashDir,
33
+ isPackUninstallRecycleBin,
34
+ resolveUninstallTrashDir,
35
+ packSourcesPath,
36
+ readPackSources,
37
+ writePackSources,
38
+ getBinding,
39
+ setBinding,
40
+ removeBinding,
41
+ listBindings,
42
+ createPackSourceProvider,
43
+ providerShortLabel,
44
+ resolveConfiguredPackProvider,
45
+ pairedRpUuidFromBpDir,
46
+ probeSourceAfterInstall,
47
+ searchRemote,
48
+ bindPackSource,
49
+ formatSourcesList,
50
+ checkPackUpdates,
51
+ runPackUpdatesOnBdsStart,
52
+ bindingLabelForUuid
53
+ } = api;
54
+ import {
55
+ DEFAULT_PACK_UNINSTALL,
56
+ buildSearchQueries,
57
+ buildSearchQueriesFromSources,
58
+ bumpSemVer3,
59
+ collectQuerySeeds,
60
+ compareSemVer3,
61
+ decideVersionPolicy,
62
+ extractLatinPhrase,
63
+ insertCjkLatinBoundaries,
64
+ isNewer,
65
+ maxSemVer3,
66
+ nextEnabledVersion,
67
+ normalizePackSearchName,
68
+ packSourceScore,
69
+ toCfSlugCandidate
70
+ } from "@sfmc-bds/bds-tools/pack-update";
71
+ export {
72
+ DEFAULT_PACK_UNINSTALL,
73
+ bindPackSource,
74
+ bindingLabelForUuid,
75
+ buildSearchQueries,
76
+ buildSearchQueriesFromSources,
77
+ bumpSemVer3,
78
+ checkPackUpdates,
79
+ collectQuerySeeds,
80
+ compareSemVer3,
81
+ createPackSourceProvider,
82
+ decideVersionPolicy,
83
+ ensurePackUpdateConfigFile,
84
+ extractLatinPhrase,
85
+ formatSourcesList,
86
+ getBinding,
87
+ getPackMatchConfig,
88
+ insertCjkLatinBoundaries,
89
+ isNewer,
90
+ isPackUninstallRecycleBin,
91
+ listBindings,
92
+ loadPackUpdateConfig,
93
+ maxSemVer3,
94
+ nextEnabledVersion,
95
+ normalizePackSearchName,
96
+ packSourceScore,
97
+ packSourcesPath,
98
+ packUpdateConfigPath,
99
+ pairedRpUuidFromBpDir,
100
+ probeSourceAfterInstall,
101
+ providerShortLabel,
102
+ readPackSources,
103
+ removeBinding,
104
+ resolveConfiguredPackProvider,
105
+ resolvePackTrashDir,
106
+ resolveUninstallTrashDir,
107
+ runPackUpdatesOnBdsStart,
108
+ searchRemote,
109
+ setBinding,
110
+ toCfSlugCandidate,
111
+ writePackSources
112
+ };
113
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/pack-update/index.ts"],
4
+ "sourcesContent": ["/**\n * sfmc \u8584\u5C01\u88C5\uFF1A\u6CE8\u5165 ROOT / i18n / theme / clack / logs\uFF0C\u518D\u5BFC\u51FA pack-update API\n */\nimport { createPackUpdateApi } from \"@sfmc-bds/bds-tools/pack-update\";\nimport { confirm, isCancel } from \"@clack/prompts\";\nimport { t } from \"../i18n/index.js\";\nimport { pushLog } from \"../logs.js\";\nimport { resolveBdsContext } from \"../pack-lifecycle.js\";\nimport { ROOT } from \"../runtime.js\";\nimport { c } from \"../theme.js\";\n\nconst api = createPackUpdateApi({\n rootDir: ROOT,\n resolveBdsContext,\n log: (text: string, level: \"info\" | \"warn\" | \"error\" | \"success\" = \"info\") =>\n pushLog(text, \"pack\", level === \"success\" ? \"info\" : level),\n askConfirm: async (message: string) => {\n const ans = await confirm({ message, initialValue: true });\n if (isCancel(ans)) return false;\n return !!ans;\n },\n t: (key: string, params?: Record<string, string | number>) =>\n t(key as Parameters<typeof t>[0], params),\n paint: {\n green: (s: string) => c.green(s),\n yellow: (s: string) => c.yellow(s),\n red: (s: string) => c.red(s),\n dim: (s: string) => c.dim(s),\n cyan: (s: string) => c.cyan(s),\n bold: (s: string) => c.bold(s),\n },\n});\n\nexport const {\n ensurePackUpdateConfigFile,\n loadPackUpdateConfig,\n getPackMatchConfig,\n packUpdateConfigPath,\n resolvePackTrashDir,\n isPackUninstallRecycleBin,\n resolveUninstallTrashDir,\n packSourcesPath,\n readPackSources,\n writePackSources,\n getBinding,\n setBinding,\n removeBinding,\n listBindings,\n createPackSourceProvider,\n providerShortLabel,\n resolveConfiguredPackProvider,\n pairedRpUuidFromBpDir,\n probeSourceAfterInstall,\n searchRemote,\n bindPackSource,\n formatSourcesList,\n checkPackUpdates,\n runPackUpdatesOnBdsStart,\n bindingLabelForUuid,\n} = api;\n\nexport type {\n CurseForgeProviderConfig,\n PackProviderId,\n PackReleaseType,\n PackSourceBinding,\n PackSourceProvider,\n PackSourcesFile,\n PackUpdateConfig,\n PackUpdateMatchConfig,\n PackUninstallConfig,\n SemVer3,\n SourceFileRef,\n SourceSearchHit,\n VersionCompareResult,\n VersionPolicyConfig,\n} from \"@sfmc-bds/bds-tools/pack-update\";\n\nexport {\n DEFAULT_PACK_UNINSTALL,\n buildSearchQueries,\n buildSearchQueriesFromSources,\n bumpSemVer3,\n collectQuerySeeds,\n compareSemVer3,\n decideVersionPolicy,\n extractLatinPhrase,\n insertCjkLatinBoundaries,\n isNewer,\n maxSemVer3,\n nextEnabledVersion,\n normalizePackSearchName,\n packSourceScore,\n toCfSlugCandidate,\n} from \"@sfmc-bds/bds-tools/pack-update\";\n"],
5
+ "mappings": "AAGA,SAAS,2BAA2B;AACpC,SAAS,SAAS,gBAAgB;AAClC,SAAS,SAAS;AAClB,SAAS,eAAe;AACxB,SAAS,yBAAyB;AAClC,SAAS,YAAY;AACrB,SAAS,SAAS;AAElB,MAAM,MAAM,oBAAoB;AAAA,EAC9B,SAAS;AAAA,EACT;AAAA,EACA,KAAK,CAAC,MAAc,QAA+C,WACjE,QAAQ,MAAM,QAAQ,UAAU,YAAY,SAAS,KAAK;AAAA,EAC5D,YAAY,OAAO,YAAoB;AACrC,UAAM,MAAM,MAAM,QAAQ,EAAE,SAAS,cAAc,KAAK,CAAC;AACzD,QAAI,SAAS,GAAG,EAAG,QAAO;AAC1B,WAAO,CAAC,CAAC;AAAA,EACX;AAAA,EACA,GAAG,CAAC,KAAa,WACf,EAAE,KAAgC,MAAM;AAAA,EAC1C,OAAO;AAAA,IACL,OAAO,CAAC,MAAc,EAAE,MAAM,CAAC;AAAA,IAC/B,QAAQ,CAAC,MAAc,EAAE,OAAO,CAAC;AAAA,IACjC,KAAK,CAAC,MAAc,EAAE,IAAI,CAAC;AAAA,IAC3B,KAAK,CAAC,MAAc,EAAE,IAAI,CAAC;AAAA,IAC3B,MAAM,CAAC,MAAc,EAAE,KAAK,CAAC;AAAA,IAC7B,MAAM,CAAC,MAAc,EAAE,KAAK,CAAC;AAAA,EAC/B;AACF,CAAC;AAEM,MAAM;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,IAAI;AAmBJ;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;",
6
+ "names": []
7
+ }
@@ -14,14 +14,17 @@
14
14
  declare const DEFAULT_REGISTRY_REPO = "Tanya7z/sfmc-modules";
15
15
  declare const DEFAULT_REGISTRY_TAG = "main";
16
16
  export interface RegistryEntry {
17
- repo: string;
18
- tag: string;
17
+ npm?: string;
18
+ version?: string;
19
+ sdk?: string;
20
+ repo?: string;
21
+ tag?: string;
19
22
  }
20
23
  export type RegistryIndex = Record<string, RegistryEntry>;
21
24
  /**
22
25
  * 解析 first-party index.json。
23
26
  * 契约与 tools/lib/registry-index.mjs#parseRegistryIndex 保持一致:
24
- * `{ modules: { <folder>: { repo, tag } } }`。忽略 `_` 前缀元数据键。
27
+ * `{ modules: { <id>: { npm? | repo+tag } } }`。忽略 `_` 前缀元数据键。
25
28
  */
26
29
  export declare function parseRegistryIndex(json: unknown): RegistryIndex;
27
30
  export interface RegistryResult {
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,QAAA,MAAM,qBAAqB,yBAAyB,CAAC;AACrD,QAAA,MAAM,oBAAoB,SAAS,CAAC;AAGpC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AACD,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAyB1D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CAkB/D;AAQD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,iFAAiF;IACjF,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAmB9F;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAIpD;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQlF;AAED,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,QAAA,MAAM,qBAAqB,yBAAyB,CAAC;AACrD,QAAA,MAAM,oBAAoB,SAAS,CAAC;AAGpC,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AACD,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAyB1D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CA8B/D;AAQD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,iFAAiF;IACjF,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAmB9F;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAIpD;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQlF;AAED,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,CAAC"}