@sfmc-bds/cli 0.2.0-beta.20 → 0.2.0-beta.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/bds-runtime-version.d.ts +3 -0
  2. package/dist/bds-runtime-version.d.ts.map +1 -0
  3. package/dist/bds-runtime-version.js +15 -0
  4. package/dist/bds-runtime-version.js.map +7 -0
  5. package/dist/commands.d.ts.map +1 -1
  6. package/dist/commands.js +78 -75
  7. package/dist/commands.js.map +2 -2
  8. package/dist/llbot-launch.d.ts +3 -3
  9. package/dist/llbot-launch.js.map +1 -1
  10. package/dist/logs.js +3 -3
  11. package/dist/logs.js.map +2 -2
  12. package/dist/repl-windows/service-window.d.ts.map +1 -1
  13. package/dist/repl-windows/service-window.js +1 -0
  14. package/dist/repl-windows/service-window.js.map +2 -2
  15. package/dist/repl.d.ts.map +1 -1
  16. package/dist/repl.js +18 -12
  17. package/dist/repl.js.map +2 -2
  18. package/dist/send-target.d.ts.map +1 -1
  19. package/dist/send-target.js +2 -0
  20. package/dist/send-target.js.map +2 -2
  21. package/dist/services.d.ts +8 -1
  22. package/dist/services.d.ts.map +1 -1
  23. package/dist/services.js +151 -15
  24. package/dist/services.js.map +2 -2
  25. package/dist/ui-command.d.ts.map +1 -1
  26. package/dist/ui-command.js.map +2 -2
  27. package/dist/wizard.d.ts.map +1 -1
  28. package/dist/wizard.js +15 -8
  29. package/dist/wizard.js.map +2 -2
  30. package/package.json +4 -5
  31. package/scripts/module-install/lib/catalog.mjs +1 -1
  32. package/dist/command-surface.test.js +0 -92
  33. package/dist/command-surface.test.js.map +0 -7
  34. package/dist/debug-command.test.js +0 -76
  35. package/dist/debug-command.test.js.map +0 -7
  36. package/dist/log-filter.test.js +0 -181
  37. package/dist/log-filter.test.js.map +0 -7
  38. package/dist/log-translator.test.js +0 -120
  39. package/dist/log-translator.test.js.map +0 -7
  40. package/dist/logs-blank-line.test.js +0 -16
  41. package/dist/logs-blank-line.test.js.map +0 -7
  42. package/dist/module-toggle.test.js +0 -37
  43. package/dist/module-toggle.test.js.map +0 -7
  44. package/dist/pack-bundle.test.js +0 -111
  45. package/dist/pack-bundle.test.js.map +0 -7
  46. package/dist/player-session.test.js +0 -19
  47. package/dist/player-session.test.js.map +0 -7
  48. package/dist/repl-windows/host.test.js +0 -72
  49. package/dist/repl-windows/host.test.js.map +0 -7
  50. package/dist/services-output.test.js +0 -9
  51. package/dist/services-output.test.js.map +0 -7
  52. package/dist/world-packs-list.test.js +0 -11
  53. package/dist/world-packs-list.test.js.map +0 -7
  54. package/dist/world-packs-uninstall.test.js +0 -54
  55. package/dist/world-packs-uninstall.test.js.map +0 -7
  56. package/scripts/module-install/test/check-modules-config.test.ts +0 -46
  57. package/scripts/module-install/test/config-seeding.test.ts +0 -99
  58. package/scripts/module-install/test/install-resolver.test.ts +0 -47
  59. package/scripts/module-install/test/link-local.test.ts +0 -50
  60. package/scripts/module-install/test/local-resolver.test.ts +0 -44
  61. package/scripts/module-install/test/registry-index.test.ts +0 -27
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/ui-command.ts"],
4
- "sourcesContent": ["/**\n * ui-command.ts \u2014 sfmc ui \u547D\u4EE4\uFF1AUI Studio \u58F0\u660E\u5F0F\u754C\u9762\u53EF\u89C6\u5316\u7F16\u8F91\u5668\u3002\n *\n * - `sfmc ui studio`\uFF1A\u542F\u52A8\u672C\u5730 Studio \u670D\u52A1\u5E76\u6253\u5F00\u6D4F\u89C8\u5668\uFF1B\n * argv \u6A21\u5F0F\u4E0B\u8FDB\u7A0B\u9A7B\u7559\uFF0CCtrl+C \u505C\u6B62\uFF1BREPL \u6A21\u5F0F\u4E0B\u540E\u53F0\u8FD0\u884C\uFF0C\u7528 `/ui stop` \u505C\u6B62\u3002\n * - `sfmc ui stop`\uFF1A\u505C\u6B62\u5F53\u524D\u8FDB\u7A0B\u5185\u8FD0\u884C\u7684 Studio \u670D\u52A1\u3002\n *\n * Studio \u662F\u9879\u76EE\u5316\u7684\u7EAF\u6D4F\u89C8\u5668\u5E94\u7528\uFF1A\u5DE5\u7A0B\u5B58\u4E8E\u6D4F\u89C8\u5668 IndexedDB\uFF0C\n * \u901A\u8FC7 zip \u5BFC\u5165\u5BFC\u51FA\uFF0C\u4E0D\u4F9D\u8D56\u78C1\u76D8\u4E0A\u7684\u771F\u5B9E\u6A21\u5757\u76EE\u5F55\u3002\n * \u670D\u52A1\u5B9E\u73B0\u4E3A @sfmc-bds/sdk/ui-studio \u7684\u7EAF\u9759\u6001\u6258\u7BA1\uFF0C\u672C\u6587\u4EF6\u53EA\u8D1F\u8D23\u547D\u4EE4\u884C\u88C5\u914D\u3002\n */\nimport { spawn } from \"node:child_process\";\nimport {\n startUiStudioServer,\n type UiStudioServerHandle,\n} from \"@sfmc-bds/sdk/ui-studio\";\nimport { t } from \"./i18n/index.js\";\nimport { c } from \"./theme.js\";\n\n/** \u5F53\u524D\u8FDB\u7A0B\u5185\u8FD0\u884C\u7684 Studio \u670D\u52A1\uFF08\u540C\u4E00\u65F6\u523B\u53EA\u5141\u8BB8\u4E00\u4E2A\u5B9E\u4F8B\uFF09\u3002 */\nlet running: UiStudioServerHandle | null = null;\n\nexport interface CmdUiOptions {\n /** argv \u6A21\u5F0F\u4E3A true\uFF1A\u542F\u52A8\u540E\u9A7B\u7559\u8FDB\u7A0B\u76F4\u5230 Ctrl+C\uFF1BREPL \u6A21\u5F0F\u4E3A false\uFF1A\u7ACB\u5373\u8FD4\u56DE\u3002 */\n block: boolean;\n}\n\nexport async function cmdUi(args: string[], options: CmdUiOptions): Promise<string> {\n const [sub] = args;\n switch (sub) {\n case \"studio\":\n return cmdUiStudio(options);\n case \"stop\":\n return cmdUiStop();\n default:\n return c.yellow(t(\"ui.usage\"));\n }\n}\n\nasync function cmdUiStudio(options: CmdUiOptions): Promise<string> {\n if (running) {\n return c.yellow(t(\"ui.studio.already\", { url: running.url }));\n }\n let handle: UiStudioServerHandle;\n try {\n handle = await startUiStudioServer();\n } catch (error) {\n return c.yellow(\n t(\"ui.studio.failed\", { message: (error as Error).message }),\n );\n }\n running = handle;\n\n const started = t(\"ui.studio.started\", { url: handle.url });\n openBrowser(handle.url);\n\n if (!options.block) {\n // REPL\uFF1A\u540E\u53F0\u8FD0\u884C\uFF0C\u8FD4\u56DE\u542F\u52A8\u4FE1\u606F\u7531 REPL \u6253\u5370\u3002\n return started;\n }\n\n // argv\uFF1A\u6253\u5370\u542F\u52A8\u4FE1\u606F\u540E\u9A7B\u7559\uFF0C\u76F4\u5230 Ctrl+C / SIGTERM\u3002\n console.log(started);\n console.log(c.dim(t(\"ui.studio.hint\")));\n await new Promise<void>((resolve) => {\n const done = () => resolve();\n process.once(\"SIGINT\", done);\n process.once(\"SIGTERM\", done);\n });\n await stopRunning();\n return c.dim(t(\"ui.studio.stopped\"));\n}\n\nasync function cmdUiStop(): Promise<string> {\n if (!running) return c.yellow(t(\"ui.studio.notRunning\"));\n await stopRunning();\n return t(\"ui.studio.stopped\");\n}\n\nasync function stopRunning(): Promise<void> {\n const handle = running;\n running = null;\n if (handle) await handle.close();\n}\n\n/** \u7528\u7CFB\u7EDF\u9ED8\u8BA4\u6D4F\u89C8\u5668\u6253\u5F00\u5730\u5740\uFF1B\u5931\u8D25\u4E0D\u963B\u65AD\uFF08\u7528\u6237\u53EF\u624B\u52A8\u590D\u5236 URL\uFF09\u3002 */\nfunction openBrowser(url: string): void {\n try {\n const [cmd, args] =\n process.platform === \"win32\"\n ? [\"cmd\", [\"/c\", \"start\", '\"\"', url]]\n : process.platform === \"darwin\"\n ? [\"open\", [url]]\n : [\"xdg-open\", [url]];\n const child = spawn(cmd, args, { detached: true, stdio: \"ignore\" });\n child.unref();\n } catch {\n // \u5FFD\u7565\uFF1A\u65E0\u56FE\u5F62\u73AF\u5883\u6216\u7F3A\u5C11 xdg-open \u65F6\u4EC5\u6253\u5370 URL\u3002\n }\n}\n"],
5
- "mappings": "AAWA,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,OAEK;AACP,SAAS,SAAS;AAClB,SAAS,SAAS;AAGlB,IAAI,UAAuC;AAO3C,eAAsB,MAAM,MAAgB,SAAwC;AAClF,QAAM,CAAC,GAAG,IAAI;AACd,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,YAAY,OAAO;AAAA,IAC5B,KAAK;AACH,aAAO,UAAU;AAAA,IACnB;AACE,aAAO,EAAE,OAAO,EAAE,UAAU,CAAC;AAAA,EACjC;AACF;AAEA,eAAe,YAAY,SAAwC;AACjE,MAAI,SAAS;AACX,WAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC;AAAA,EAC9D;AACA,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,oBAAoB;AAAA,EACrC,SAAS,OAAO;AACd,WAAO,EAAE;AAAA,MACP,EAAE,oBAAoB,EAAE,SAAU,MAAgB,QAAQ,CAAC;AAAA,IAC7D;AAAA,EACF;AACA,YAAU;AAEV,QAAM,UAAU,EAAE,qBAAqB,EAAE,KAAK,OAAO,IAAI,CAAC;AAC1D,cAAY,OAAO,GAAG;AAEtB,MAAI,CAAC,QAAQ,OAAO;AAElB,WAAO;AAAA,EACT;AAGA,UAAQ,IAAI,OAAO;AACnB,UAAQ,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;AACtC,QAAM,IAAI,QAAc,CAAC,YAAY;AACnC,UAAM,OAAO,MAAM,QAAQ;AAC3B,YAAQ,KAAK,UAAU,IAAI;AAC3B,YAAQ,KAAK,WAAW,IAAI;AAAA,EAC9B,CAAC;AACD,QAAM,YAAY;AAClB,SAAO,EAAE,IAAI,EAAE,mBAAmB,CAAC;AACrC;AAEA,eAAe,YAA6B;AAC1C,MAAI,CAAC,QAAS,QAAO,EAAE,OAAO,EAAE,sBAAsB,CAAC;AACvD,QAAM,YAAY;AAClB,SAAO,EAAE,mBAAmB;AAC9B;AAEA,eAAe,cAA6B;AAC1C,QAAM,SAAS;AACf,YAAU;AACV,MAAI,OAAQ,OAAM,OAAO,MAAM;AACjC;AAGA,SAAS,YAAY,KAAmB;AACtC,MAAI;AACF,UAAM,CAAC,KAAK,IAAI,IACd,QAAQ,aAAa,UACjB,CAAC,OAAO,CAAC,MAAM,SAAS,MAAM,GAAG,CAAC,IAClC,QAAQ,aAAa,WACnB,CAAC,QAAQ,CAAC,GAAG,CAAC,IACd,CAAC,YAAY,CAAC,GAAG,CAAC;AAC1B,UAAM,QAAQ,MAAM,KAAK,MAAM,EAAE,UAAU,MAAM,OAAO,SAAS,CAAC;AAClE,UAAM,MAAM;AAAA,EACd,QAAQ;AAAA,EAER;AACF;",
4
+ "sourcesContent": ["/**\n * ui-command.ts \u2014 sfmc ui \u547D\u4EE4\uFF1AUI Studio \u58F0\u660E\u5F0F\u754C\u9762\u53EF\u89C6\u5316\u7F16\u8F91\u5668\u3002\n *\n * - `sfmc ui studio`\uFF1A\u542F\u52A8\u672C\u5730 Studio \u670D\u52A1\u5E76\u6253\u5F00\u6D4F\u89C8\u5668\uFF1B\n * argv \u6A21\u5F0F\u4E0B\u8FDB\u7A0B\u9A7B\u7559\uFF0CCtrl+C \u505C\u6B62\uFF1BREPL \u6A21\u5F0F\u4E0B\u540E\u53F0\u8FD0\u884C\uFF0C\u7528 `/ui stop` \u505C\u6B62\u3002\n * - `sfmc ui stop`\uFF1A\u505C\u6B62\u5F53\u524D\u8FDB\u7A0B\u5185\u8FD0\u884C\u7684 Studio \u670D\u52A1\u3002\n *\n * Studio \u662F\u9879\u76EE\u5316\u7684\u7EAF\u6D4F\u89C8\u5668\u5E94\u7528\uFF1A\u5DE5\u7A0B\u5B58\u4E8E\u6D4F\u89C8\u5668 IndexedDB\uFF0C\n * \u901A\u8FC7 zip \u5BFC\u5165\u5BFC\u51FA\uFF0C\u4E0D\u4F9D\u8D56\u78C1\u76D8\u4E0A\u7684\u771F\u5B9E\u6A21\u5757\u76EE\u5F55\u3002\n * \u670D\u52A1\u5B9E\u73B0\u4E3A @sfmc-bds/sdk/ui-studio \u7684\u7EAF\u9759\u6001\u6258\u7BA1\uFF08\u9ED8\u8BA4 127.0.0.1:3003\uFF09\uFF0C\n * \u672C\u6587\u4EF6\u53EA\u8D1F\u8D23\u547D\u4EE4\u884C\u88C5\u914D\u3002\n */\nimport { spawn } from \"node:child_process\";\nimport {\n startUiStudioServer,\n type UiStudioServerHandle,\n} from \"@sfmc-bds/sdk/ui-studio\";\nimport { t } from \"./i18n/index.js\";\nimport { c } from \"./theme.js\";\n\n/** \u5F53\u524D\u8FDB\u7A0B\u5185\u8FD0\u884C\u7684 Studio \u670D\u52A1\uFF08\u540C\u4E00\u65F6\u523B\u53EA\u5141\u8BB8\u4E00\u4E2A\u5B9E\u4F8B\uFF09\u3002 */\nlet running: UiStudioServerHandle | null = null;\n\nexport interface CmdUiOptions {\n /** argv \u6A21\u5F0F\u4E3A true\uFF1A\u542F\u52A8\u540E\u9A7B\u7559\u8FDB\u7A0B\u76F4\u5230 Ctrl+C\uFF1BREPL \u6A21\u5F0F\u4E3A false\uFF1A\u7ACB\u5373\u8FD4\u56DE\u3002 */\n block: boolean;\n}\n\nexport async function cmdUi(args: string[], options: CmdUiOptions): Promise<string> {\n const [sub] = args;\n switch (sub) {\n case \"studio\":\n return cmdUiStudio(options);\n case \"stop\":\n return cmdUiStop();\n default:\n return c.yellow(t(\"ui.usage\"));\n }\n}\n\nasync function cmdUiStudio(options: CmdUiOptions): Promise<string> {\n if (running) {\n return c.yellow(t(\"ui.studio.already\", { url: running.url }));\n }\n let handle: UiStudioServerHandle;\n try {\n handle = await startUiStudioServer();\n } catch (error) {\n return c.yellow(\n t(\"ui.studio.failed\", { message: (error as Error).message }),\n );\n }\n running = handle;\n\n const started = t(\"ui.studio.started\", { url: handle.url });\n openBrowser(handle.url);\n\n if (!options.block) {\n // REPL\uFF1A\u540E\u53F0\u8FD0\u884C\uFF0C\u8FD4\u56DE\u542F\u52A8\u4FE1\u606F\u7531 REPL \u6253\u5370\u3002\n return started;\n }\n\n // argv\uFF1A\u6253\u5370\u542F\u52A8\u4FE1\u606F\u540E\u9A7B\u7559\uFF0C\u76F4\u5230 Ctrl+C / SIGTERM\u3002\n console.log(started);\n console.log(c.dim(t(\"ui.studio.hint\")));\n await new Promise<void>((resolve) => {\n const done = () => resolve();\n process.once(\"SIGINT\", done);\n process.once(\"SIGTERM\", done);\n });\n await stopRunning();\n return c.dim(t(\"ui.studio.stopped\"));\n}\n\nasync function cmdUiStop(): Promise<string> {\n if (!running) return c.yellow(t(\"ui.studio.notRunning\"));\n await stopRunning();\n return t(\"ui.studio.stopped\");\n}\n\nasync function stopRunning(): Promise<void> {\n const handle = running;\n running = null;\n if (handle) await handle.close();\n}\n\n/** \u7528\u7CFB\u7EDF\u9ED8\u8BA4\u6D4F\u89C8\u5668\u6253\u5F00\u5730\u5740\uFF1B\u5931\u8D25\u4E0D\u963B\u65AD\uFF08\u7528\u6237\u53EF\u624B\u52A8\u590D\u5236 URL\uFF09\u3002 */\nfunction openBrowser(url: string): void {\n try {\n const [cmd, args] =\n process.platform === \"win32\"\n ? [\"cmd\", [\"/c\", \"start\", '\"\"', url]]\n : process.platform === \"darwin\"\n ? [\"open\", [url]]\n : [\"xdg-open\", [url]];\n const child = spawn(cmd, args, { detached: true, stdio: \"ignore\" });\n child.unref();\n } catch {\n // \u5FFD\u7565\uFF1A\u65E0\u56FE\u5F62\u73AF\u5883\u6216\u7F3A\u5C11 xdg-open \u65F6\u4EC5\u6253\u5370 URL\u3002\n }\n}\n"],
5
+ "mappings": "AAYA,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,OAEK;AACP,SAAS,SAAS;AAClB,SAAS,SAAS;AAGlB,IAAI,UAAuC;AAO3C,eAAsB,MAAM,MAAgB,SAAwC;AAClF,QAAM,CAAC,GAAG,IAAI;AACd,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,YAAY,OAAO;AAAA,IAC5B,KAAK;AACH,aAAO,UAAU;AAAA,IACnB;AACE,aAAO,EAAE,OAAO,EAAE,UAAU,CAAC;AAAA,EACjC;AACF;AAEA,eAAe,YAAY,SAAwC;AACjE,MAAI,SAAS;AACX,WAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC;AAAA,EAC9D;AACA,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,oBAAoB;AAAA,EACrC,SAAS,OAAO;AACd,WAAO,EAAE;AAAA,MACP,EAAE,oBAAoB,EAAE,SAAU,MAAgB,QAAQ,CAAC;AAAA,IAC7D;AAAA,EACF;AACA,YAAU;AAEV,QAAM,UAAU,EAAE,qBAAqB,EAAE,KAAK,OAAO,IAAI,CAAC;AAC1D,cAAY,OAAO,GAAG;AAEtB,MAAI,CAAC,QAAQ,OAAO;AAElB,WAAO;AAAA,EACT;AAGA,UAAQ,IAAI,OAAO;AACnB,UAAQ,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;AACtC,QAAM,IAAI,QAAc,CAAC,YAAY;AACnC,UAAM,OAAO,MAAM,QAAQ;AAC3B,YAAQ,KAAK,UAAU,IAAI;AAC3B,YAAQ,KAAK,WAAW,IAAI;AAAA,EAC9B,CAAC;AACD,QAAM,YAAY;AAClB,SAAO,EAAE,IAAI,EAAE,mBAAmB,CAAC;AACrC;AAEA,eAAe,YAA6B;AAC1C,MAAI,CAAC,QAAS,QAAO,EAAE,OAAO,EAAE,sBAAsB,CAAC;AACvD,QAAM,YAAY;AAClB,SAAO,EAAE,mBAAmB;AAC9B;AAEA,eAAe,cAA6B;AAC1C,QAAM,SAAS;AACf,YAAU;AACV,MAAI,OAAQ,OAAM,OAAO,MAAM;AACjC;AAGA,SAAS,YAAY,KAAmB;AACtC,MAAI;AACF,UAAM,CAAC,KAAK,IAAI,IACd,QAAQ,aAAa,UACjB,CAAC,OAAO,CAAC,MAAM,SAAS,MAAM,GAAG,CAAC,IAClC,QAAQ,aAAa,WACnB,CAAC,QAAQ,CAAC,GAAG,CAAC,IACd,CAAC,YAAY,CAAC,GAAG,CAAC;AAC1B,UAAM,QAAQ,MAAM,KAAK,MAAM,EAAE,UAAU,MAAM,OAAO,SAAS,CAAC;AAClE,UAAM,MAAM;AAAA,EACd,QAAQ;AAAA,EAER;AACF;",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"AAgHA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAkV/C"}
1
+ {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"AAiHA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAyV/C"}
package/dist/wizard.js CHANGED
@@ -308,17 +308,24 @@ async function runWizard() {
308
308
  const llbotOn = qqBackend === "llbot" && !!llbotEnabled && !!llbotPath;
309
309
  const qqNotify = qqEnabled && (qqBackend === "official" || llbotOn);
310
310
  const exeName = llbotExeName();
311
+ const currentQq = readJson(configPath(rootDir, "qq_config.json")) ?? {};
311
312
  patchJson(rootDir, "qq_config.json", {
312
313
  qq_enabled: qqEnabled,
313
314
  qq_backend: qqBackend,
314
- qq_app_id: qqAppId,
315
- qq_app_secret: qqAppSecret,
316
- qq_sandbox: qqSandbox,
317
- qq_group_openid: qqGroupOpenid,
318
- llbot_enabled: llbotOn,
319
- // path = 可执行文件;cwd = 运行目录(向导选的是目录)
320
- llbot_path: llbotPath ? slashPath(path.join(llbotPath, exeName)) : "",
321
- llbot_cwd: llbotPath ? slashPath(llbotPath) : ""
315
+ official: {
316
+ ...currentQq.official,
317
+ app_id: qqAppId,
318
+ app_secret: qqAppSecret,
319
+ sandbox: qqSandbox,
320
+ group_openid: qqGroupOpenid
321
+ },
322
+ llbot: {
323
+ ...currentQq.llbot,
324
+ enabled: llbotOn,
325
+ // path = 可执行文件;cwd = 运行目录(向导选的是目录)
326
+ path: llbotPath ? slashPath(path.join(llbotPath, exeName)) : "",
327
+ cwd: llbotPath ? slashPath(llbotPath) : ""
328
+ }
322
329
  });
323
330
  patchJson(rootDir, "bds_updater.json", {
324
331
  bds_path: slashPath(bdsResolved),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/wizard.ts"],
4
- "sourcesContent": ["import { confirm, intro, isCancel, multiselect, note, outro, password, select, tasks, text } from \"@clack/prompts\";\nimport {\n configPath,\n ensureCoreConfigs,\n modulePath,\n patchJson as patchConfig,\n readJson,\n withConfigSchema,\n writeJson,\n type Catalog,\n type ConfigName,\n type ModuleLock,\n} from \"@sfmc-bds/sdk/node/config\";\nimport { bdsExePath } from \"@sfmc-bds/bds-tools/host-platform\";\nimport { execFileSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { ensureDirectory, pickDirectory } from \"./interactive-prompts.js\";\nimport { persistLocale, t, type Locale } from \"./i18n/index.js\";\nimport { llbotExeName } from \"./llbot-launch.js\";\nimport { ROOT, isMonorepoLayout, isRuntimeInitialized, resolveFetchModule, spawnService } from \"./runtime.js\";\nimport { ensurePackUpdateConfigFile } from \"./pack-update/index.js\";\nimport { c } from \"./theme.js\";\n\n/** Shallow-merge write for top-level configs. Delegates to SDK; do not mkdir+writeFileSync here. */\nfunction patchJson<T extends object>(rootDir: string, name: ConfigName, updates: Partial<T>): void {\n patchConfig<T>(configPath(rootDir, name), updates);\n}\n\nasync function waitForHealth(port: number, ms = 15000): Promise<boolean> {\n const t = Date.now();\n while (Date.now() - t < ms) {\n try {\n if ((await fetch(`http://127.0.0.1:${port}/api/health`)).ok) return true;\n } catch {\n /* retry */\n }\n await new Promise((r) => setTimeout(r, 300));\n }\n return false;\n}\n\n/** \u8FD0\u884C\u65F6\u5FC5\u9700\u76EE\u5F55\u63A2\u6D4B(configs / modules) */\nconst RUNTIME_DIRS = [\n { target: \"configs\", npmTarget: \"configs\" },\n { target: \"modules\", npmTarget: \"modules\" },\n] as const;\n\nfunction missingRuntimeAssets(rootDir: string): string[] {\n return RUNTIME_DIRS.flatMap(({ target, npmTarget }) => {\n const directory = path.join(rootDir, npmTarget);\n try {\n return fs.statSync(directory).isDirectory() && fs.readdirSync(directory).length > 0 ? [] : [target];\n } catch {\n return [target];\n }\n });\n}\n\nasync function runBdsUpdate(rootDir: string, channel: string): Promise<{ code: number | null; output: string }> {\n const child = spawnService(\"update\", [`--channel=${channel}`, \"--force\", \"--no-start\"], {\n cwd: rootDir,\n stdio: \"pipe\",\n });\n const output: string[] = [];\n child.stdout?.on(\"data\", (data: Buffer) => output.push(data.toString()));\n child.stderr?.on(\"data\", (data: Buffer) => output.push(data.toString()));\n\n return new Promise((resolve) => {\n child.once(\"error\", (error) => resolve({ code: null, output: `${output.join(\"\")}${error.message}` }));\n child.once(\"close\", (code) => resolve({ code, output: output.join(\"\") }));\n });\n}\n\nasync function prepareRuntimeAssets(rootDir: string): Promise<void> {\n /* monorepo \u5E03\u5C40\uFF1Aconfigs/ modules/ \u5E94\u7531 npm \u5DE5\u4F5C\u533A\u5DF2\u63D0\u4F9B */\n if (isMonorepoLayout(rootDir)) {\n const missing = missingRuntimeAssets(rootDir);\n if (missing.length > 0) {\n throw new Error(t(\"wizard.npmMissing\", { list: missing.join(\", \") }));\n }\n return;\n }\n\n seedNpmRuntimeLayout(rootDir);\n}\n\n/** \u975E monorepo \u7684 npm \u5B89\u88C5\u5E03\u5C40\uFF1Aensure \u914D\u7F6E\u9AA8\u67B6 + \u7A7A modules */\nfunction seedNpmRuntimeLayout(rootDir: string): void {\n ensureCoreConfigs(rootDir, [\"db_config\", \"qq_config\", \"bds_updater\", \"permissions\"]);\n /* pack-update \u7684 ensure \u4F7F\u7528 runtime ROOT\uFF1Bnpm \u5E03\u5C40\u4E0B\u5E94\u4E0E rootDir \u4E00\u81F4 */\n if (path.resolve(rootDir) === path.resolve(ROOT)) {\n ensurePackUpdateConfigFile();\n }\n\n const modulesRoot = path.join(rootDir, \"modules\");\n const packagesDir = path.join(modulesRoot, \"packages\");\n fs.mkdirSync(packagesDir, { recursive: true });\n\n const catalogPath = path.join(modulesRoot, \"catalog.json\");\n if (!fs.existsSync(catalogPath)) {\n writeJson(\n catalogPath,\n withConfigSchema({ version: 1, modules: [] }, \"module_catalog\", \"modules\")\n );\n }\n const lockPath = path.join(modulesRoot, \"module-lock.json\");\n if (!fs.existsSync(lockPath)) {\n writeJson(lockPath, { version: 1, modules: {} });\n }\n}\n\nexport async function runWizard(): Promise<void> {\n intro(c.bold(t(\"wizard.intro\")));\n\n const langPick = await select({\n message: t(\"locale.wizard\"),\n options: [\n { value: \"zh-CN\", label: t(\"locale.opt.zh\") },\n { value: \"en\", label: t(\"locale.opt.en\") },\n ],\n initialValue: \"zh-CN\",\n });\n if (!isCancel(langPick)) {\n persistLocale(ROOT, langPick as Locale);\n }\n\n // Already initialized only when runtime.json#initialized_at is set (empty db_config skeleton does not count).\n if (isRuntimeInitialized()) {\n const r = await confirm({ message: t(\"wizard.rerun\"), initialValue: false });\n if (isCancel(r) || !r) {\n outro(c.dim(t(\"wizard.skipped\")));\n return;\n }\n }\n // Step 1: Runtime Environment\uFF08\u53EA\u64AD\u79CD configs/modules\uFF0C\u4E0D\u5199 initialized_at\u3001\u4E0D\u5EFA data/\uFF09\n const rootDir = ROOT;\n note(c.text(t(\"wizard.runtimeRoot\", { root: rootDir })), t(\"wizard.step1\"));\n\n try {\n await prepareRuntimeAssets(rootDir);\n } catch (error) {\n outro(c.red(t(\"wizard.prepFailed\", { message: (error as Error).message })));\n return;\n }\n\n // Step 2: External runtime paths\n note(c.text(t(\"wizard.step2Note\")), t(\"wizard.step2\"));\n\n const bdsResolved = await pickDirectory(t(\"wizard.bdsDir\"), path.join(rootDir, \"BDS\"));\n if (!ensureDirectory(bdsResolved)) {\n outro(c.red(t(\"wizard.cannotCreateBds\", { dir: bdsResolved })));\n return;\n }\n\n /* QQ \u6865\uFF1A\u9009\u540E\u7AEF \u2192 official \u51ED\u636E / llbot \u8DEF\u5F84\uFF1B\u7981\u7528\u5219 qq_enabled=false */\n const qqBackendPick = await select({\n message: t(\"wizard.qqBackend\"),\n options: [\n { value: \"official\", label: t(\"wizard.qqBackend.official\"), hint: t(\"wizard.qqBackend.officialHint\") },\n { value: \"llbot\", label: t(\"wizard.qqBackend.llbot\"), hint: t(\"wizard.qqBackend.llbotHint\") },\n { value: \"disabled\", label: t(\"wizard.qqBackend.disabled\"), hint: t(\"wizard.qqBackend.disabledHint\") },\n ],\n initialValue: \"official\",\n });\n const qqBackendChoice =\n isCancel(qqBackendPick) || !qqBackendPick ? \"official\" : String(qqBackendPick);\n\n let qqEnabled = true;\n let qqBackend: \"official\" | \"llbot\" = \"official\";\n let qqAppId = \"\";\n let qqAppSecret = \"\";\n let qqSandbox = false;\n let qqGroupOpenid = \"\";\n let llbotPath: string | undefined;\n let llbotEnabled = false;\n\n if (qqBackendChoice === \"disabled\") {\n qqEnabled = false;\n } else if (qqBackendChoice === \"llbot\") {\n qqBackend = \"llbot\";\n llbotEnabled = true;\n const picked = await pickDirectory(t(\"wizard.llbotDir\"), path.join(rootDir, \"LLBOT\"));\n if (ensureDirectory(picked)) {\n llbotPath = picked;\n } else {\n llbotPath = path.join(rootDir, \"LLBOT\");\n note(c.text(t(\"wizard.usingDefault\", { path: llbotPath })), t(\"common.tips\"));\n }\n } else {\n qqBackend = \"official\";\n const appIdRaw = await text({\n message: t(\"wizard.qqAppId\"),\n placeholder: \"102xxxxx\",\n validate: (v: any): any => {\n if (!String(v ?? \"\").trim()) return t(\"wizard.valueRequired\");\n },\n });\n if (!isCancel(appIdRaw)) qqAppId = String(appIdRaw).trim();\n\n const secretRaw = await password({\n message: t(\"wizard.qqAppSecret\"),\n validate: (v: any): any => {\n if (!String(v ?? \"\").trim()) return t(\"wizard.valueRequired\");\n },\n });\n if (!isCancel(secretRaw)) qqAppSecret = String(secretRaw).trim();\n\n const sandboxPick = await confirm({\n message: t(\"wizard.qqSandbox\"),\n initialValue: false,\n });\n if (!isCancel(sandboxPick)) qqSandbox = !!sandboxPick;\n\n const openidRaw = await text({\n message: t(\"wizard.qqGroupOpenid\"),\n placeholder: t(\"wizard.qqGroupOpenidHint\"),\n });\n if (!isCancel(openidRaw)) qqGroupOpenid = String(openidRaw).trim();\n }\n\n const dbDirInput = await pickDirectory(t(\"wizard.dbDir\"), path.join(rootDir, \"data\"));\n const dbDir = ensureDirectory(dbDirInput) ? dbDirInput : path.join(rootDir, \"data\");\n if (dbDir !== dbDirInput) {\n note(c.text(t(\"wizard.usingDefault\", { path: dbDir })), t(\"common.tips\"));\n }\n const dbPortRaw = await text({\n message: t(\"wizard.dbPort\"),\n initialValue: \"3001\",\n validate: (v: any): any => {\n const n = parseInt(v, 10);\n if (isNaN(n) || n < 1024 || n > 65535) return t(\"wizard.portRange\");\n if (v.length === 0) return t(\"wizard.valueRequired\");\n },\n });\n const dbPort = isCancel(dbPortRaw) ? 3001 : parseInt(dbPortRaw as string, 10);\n\n // Step 3: BDS environment\n const bdsExe = bdsExePath(bdsResolved);\n const bdsExists = fs.existsSync(bdsExe);\n\n note(\n bdsExists\n ? c.green(t(\"wizard.bdsFound\", { path: bdsResolved }))\n : c.yellow(t(\"wizard.bdsNotFound\", { path: bdsResolved })),\n t(\"wizard.step3\")\n );\n\n const EULA = await confirm({\n message: t(\"wizard.eula\"),\n initialValue: false,\n });\n if (isCancel(EULA) || !EULA) {\n outro(c.yellow(t(\"wizard.disagreed\")));\n return;\n }\n\n let downloadBds = false;\n let bdsChannel = \"release\";\n let backupDir = path.join(path.dirname(bdsResolved), \"backups\");\n let preserve: string[] = [];\n\n if (!bdsExists) {\n const d = await confirm({ message: t(\"wizard.downloadBds\"), initialValue: true });\n if (!isCancel(d) && d) {\n const ch = await select({\n message: t(\"wizard.selectChannel\"),\n options: [\n { value: \"release\", label: t(\"wizard.channel.release\"), hint: t(\"wizard.channel.releaseHint\") },\n { value: \"preview\", label: t(\"wizard.channel.preview\"), hint: t(\"wizard.channel.previewHint\") },\n ],\n });\n if (!isCancel(ch)) {\n bdsChannel = ch as string;\n downloadBds = true;\n }\n if (!ensureDirectory(backupDir)) {\n outro(c.red(t(\"wizard.cannotCreateBackup\", { dir: backupDir })));\n return;\n }\n }\n }\n\n backupDir = await pickDirectory(t(\"wizard.backupDir\"), backupDir);\n const preserveOptions = [\n { value: \"server.properties\", label: \"server.properties\", hint: t(\"wizard.preserve.serverProps\") },\n { value: \"whitelist.json\", label: \"whitelist.json\" },\n { value: \"permissions.json\", label: \"permissions.json\" },\n { value: \"allowlist.json\", label: \"allowlist.json\" },\n { value: \"worlds\", label: \"worlds/\", hint: t(\"wizard.preserve.worlds\") },\n { value: \"config\", label: \"config/\", hint: t(\"wizard.preserve.config\") },\n ] as const;\n const pr = await multiselect({\n message: t(\"wizard.preserve\"),\n options: [...preserveOptions],\n initialValues: preserveOptions.map((o) => o.value),\n required: false,\n });\n if (!isCancel(pr)) preserve = pr as string[];\n note(c.yellow(t(\"wizard.updaterTip\")), t(\"common.tips\"));\n\n // Step 4: Module initialization\n const catalog = readJson<Catalog>(modulePath(rootDir, \"catalog.json\")) ?? {\n version: 1,\n modules: [],\n };\n const catalogModules: Array<{ id: string; name?: string; description?: string; canDisable?: boolean }> = [];\n if (Array.isArray(catalog.modules)) {\n for (const m of catalog.modules) {\n catalogModules.push({\n id: String(m.id ?? \"\"),\n name: String(m.name ?? m.id ?? \"\"),\n description: String(m.description ?? \"\"),\n canDisable: m.canDisable !== false,\n });\n }\n }\n\n note(\n c.text(\n catalogModules.length > 0\n ? t(\"wizard.modulesFound\", { count: catalogModules.length })\n : t(\"wizard.modulesNone\")\n ),\n t(\"wizard.step4\")\n );\n\n let selectedModules: string[] = [];\n const lockedMd: any[] = [];\n const optionalMd: any[] = [];\n catalogModules.forEach((k) => {\n const option = {\n value: k.id,\n label: String(k.name),\n hint: String(k.description ?? t(\"wizard.emptyHint\")),\n };\n if (k.canDisable === false) {\n lockedMd.push({ ...option, disabled: true });\n } else {\n optionalMd.push(option);\n }\n });\n if (catalogModules.length > 0) {\n const r = await multiselect({\n message: t(\"wizard.enableModules\"),\n options: [...lockedMd, ...optionalMd],\n required: false,\n });\n if (!isCancel(r)) selectedModules = r as string[];\n }\n\n const wizardTasks = [\n {\n title: t(\"wizard.updatingConfigs\"),\n task: () => {\n const slashPath = (value: string) => value.replace(/\\\\/g, \"/\");\n patchJson(rootDir, \"db_config.json\", {\n db_port: dbPort,\n dbDir: slashPath(path.relative(rootDir, path.join(dbDir, \"sfmc_data.db\"))),\n modulesDir: \"modules\",\n });\n\n const llbotOn = qqBackend === \"llbot\" && !!llbotEnabled && !!llbotPath;\n const qqNotify = qqEnabled && (qqBackend === \"official\" || llbotOn);\n const exeName = llbotExeName();\n patchJson(rootDir, \"qq_config.json\", {\n qq_enabled: qqEnabled,\n qq_backend: qqBackend,\n qq_app_id: qqAppId,\n qq_app_secret: qqAppSecret,\n qq_sandbox: qqSandbox,\n qq_group_openid: qqGroupOpenid,\n llbot_enabled: llbotOn,\n // path = \u53EF\u6267\u884C\u6587\u4EF6\uFF1Bcwd = \u8FD0\u884C\u76EE\u5F55\uFF08\u5411\u5BFC\u9009\u7684\u662F\u76EE\u5F55\uFF09\n llbot_path: llbotPath ? slashPath(path.join(llbotPath, exeName)) : \"\",\n llbot_cwd: llbotPath ? slashPath(llbotPath) : \"\",\n });\n patchJson(rootDir, \"bds_updater.json\", {\n bds_path: slashPath(bdsResolved),\n channel: bdsChannel,\n backup_dir: slashPath(backupDir),\n preserve,\n qq_notify: qqNotify,\n });\n /* \u8DEF\u5F84\u9009\u5B9A\u540E\u518D\u6807\u8BB0\u5DF2\u521D\u59CB\u5316\uFF0C\u907F\u514D\u534A\u9014\u53D6\u6D88\u4ECD\u7559\u4E0B data/ \u8BED\u4E49 */\n patchJson(rootDir, \"runtime.json\", {\n runtime_root: rootDir,\n initialized_at: new Date().toISOString(),\n locale: isCancel(langPick) ? undefined : (langPick as string),\n });\n return t(\"wizard.configsUpdated\");\n },\n },\n {\n title: t(\"wizard.updatingModules\"),\n task: async (): Promise<string> => {\n const lock = readJson<ModuleLock>(modulePath(rootDir, \"module-lock.json\")) ?? {\n version: 1,\n modules: {},\n };\n if (!lock.modules) lock.modules = {};\n const now = Date.now();\n for (const id of selectedModules) lock.modules[id] = { enabled: true, updatedAt: now };\n writeJson(modulePath(rootDir, \"module-lock.json\"), lock);\n return t(\"wizard.modulesUpdated\");\n },\n },\n {\n title: t(\"wizard.initDb\"),\n task: async (): Promise<string> => {\n const child = spawnService(\"db\", [], {\n cwd: rootDir,\n stdio: \"ignore\",\n env: { ...process.env, DB_PORT: String(dbPort) },\n });\n if (!(await waitForHealth(dbPort))) {\n child.kill(\"SIGTERM\");\n return t(\"wizard.dbTimeout\");\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n child.kill(\"SIGTERM\");\n setTimeout(() => child.kill(\"SIGKILL\"), 3000).unref();\n return t(\"wizard.dbOk\");\n },\n },\n ];\n if (downloadBds) {\n wizardTasks.push({\n title: t(\"wizard.downloadingBds\"),\n task: async (): Promise<string> => {\n const result = await runBdsUpdate(rootDir, bdsChannel);\n if (result.code !== 0) {\n return t(\"wizard.downloadFail\");\n }\n return t(\"wizard.bdsDownloaded\");\n },\n });\n }\n try {\n await tasks(wizardTasks);\n } catch (e) {\n outro(c.red(t(\"common.error\", { message: (e as Error).message })));\n return;\n }\n\n /* install \u2192 build \u2192 deploy chain */\n await runInstallBuildDeploy(rootDir, selectedModules, bdsResolved);\n\n outro(c.green(t(\"wizard.done\")));\n}\n\nasync function runInstallBuildDeploy(rootDir: string, selectedModules: string[], bdsResolved: string): Promise<void> {\n if (selectedModules.length > 0) {\n const fetchScript = resolveFetchModule();\n if (fetchScript) {\n const installT = [\n {\n title: t(\"wizard.installing\", { count: selectedModules.length }),\n task: async (): Promise<string> => {\n execFileSync(process.execPath, [fetchScript, \"install\", ...selectedModules], {\n cwd: rootDir,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env, SFMC_ROOT: rootDir },\n });\n return t(\"wizard.installed\", { count: selectedModules.length });\n },\n },\n ];\n try {\n await tasks(installT);\n } catch (e) {\n note(c.yellow(t(\"wizard.installFailed\", { message: (e as Error).message })));\n }\n } else {\n note(c.yellow(t(\"wizard.fetchMissing\", { list: selectedModules.join(\", \") })));\n }\n } else {\n note(c.dim(t(\"wizard.noModulesSelected\")));\n }\n\n const { cmdBehaviorPackBuild, cmdBehaviorPackDeploy } = await import(\"./commands-behavior-pack.js\");\n const buildT = [\n {\n title: t(\"wizard.buildingBp\"),\n task: async (): Promise<string> => {\n const r = await cmdBehaviorPackBuild([]);\n if (!r.ok) throw new Error(r.message);\n return r.message;\n },\n },\n ];\n try {\n await tasks(buildT);\n } catch (e) {\n note(c.yellow(t(\"wizard.buildFailed\", { message: (e as Error).message })));\n return;\n }\n\n const deployT = [\n {\n title: t(\"wizard.deploying\", { path: bdsResolved }),\n task: async (): Promise<string> => {\n const r = await cmdBehaviorPackDeploy([]);\n if (!r.ok) throw new Error(r.message);\n return r.message;\n },\n },\n ];\n try {\n await tasks(deployT);\n note(c.green(t(\"wizard.restartBds\")));\n } catch (e) {\n note(c.yellow(t(\"wizard.deployFailed\", { message: (e as Error).message })));\n }\n void rootDir;\n}\n"],
5
- "mappings": "AAAA,SAAS,SAAS,OAAO,UAAU,aAAa,MAAM,OAAO,UAAU,QAAQ,OAAO,YAAY;AAClG;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AACP,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,iBAAiB,qBAAqB;AAC/C,SAAS,eAAe,SAAsB;AAC9C,SAAS,oBAAoB;AAC7B,SAAS,MAAM,kBAAkB,sBAAsB,oBAAoB,oBAAoB;AAC/F,SAAS,kCAAkC;AAC3C,SAAS,SAAS;AAGlB,SAAS,UAA4B,SAAiB,MAAkB,SAA2B;AACjG,cAAe,WAAW,SAAS,IAAI,GAAG,OAAO;AACnD;AAEA,eAAe,cAAc,MAAc,KAAK,MAAyB;AACvE,QAAMA,KAAI,KAAK,IAAI;AACnB,SAAO,KAAK,IAAI,IAAIA,KAAI,IAAI;AAC1B,QAAI;AACF,WAAK,MAAM,MAAM,oBAAoB,IAAI,aAAa,GAAG,GAAI,QAAO;AAAA,IACtE,QAAQ;AAAA,IAER;AACA,UAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAAA,EAC7C;AACA,SAAO;AACT;AAGA,MAAM,eAAe;AAAA,EACnB,EAAE,QAAQ,WAAW,WAAW,UAAU;AAAA,EAC1C,EAAE,QAAQ,WAAW,WAAW,UAAU;AAC5C;AAEA,SAAS,qBAAqB,SAA2B;AACvD,SAAO,aAAa,QAAQ,CAAC,EAAE,QAAQ,UAAU,MAAM;AACrD,UAAM,YAAY,KAAK,KAAK,SAAS,SAAS;AAC9C,QAAI;AACF,aAAO,GAAG,SAAS,SAAS,EAAE,YAAY,KAAK,GAAG,YAAY,SAAS,EAAE,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM;AAAA,IACpG,QAAQ;AACN,aAAO,CAAC,MAAM;AAAA,IAChB;AAAA,EACF,CAAC;AACH;AAEA,eAAe,aAAa,SAAiB,SAAmE;AAC9G,QAAM,QAAQ,aAAa,UAAU,CAAC,aAAa,OAAO,IAAI,WAAW,YAAY,GAAG;AAAA,IACtF,KAAK;AAAA,IACL,OAAO;AAAA,EACT,CAAC;AACD,QAAM,SAAmB,CAAC;AAC1B,QAAM,QAAQ,GAAG,QAAQ,CAAC,SAAiB,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC;AACvE,QAAM,QAAQ,GAAG,QAAQ,CAAC,SAAiB,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC;AAEvE,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,KAAK,SAAS,CAAC,UAAU,QAAQ,EAAE,MAAM,MAAM,QAAQ,GAAG,OAAO,KAAK,EAAE,CAAC,GAAG,MAAM,OAAO,GAAG,CAAC,CAAC;AACpG,UAAM,KAAK,SAAS,CAAC,SAAS,QAAQ,EAAE,MAAM,QAAQ,OAAO,KAAK,EAAE,EAAE,CAAC,CAAC;AAAA,EAC1E,CAAC;AACH;AAEA,eAAe,qBAAqB,SAAgC;AAElE,MAAI,iBAAiB,OAAO,GAAG;AAC7B,UAAM,UAAU,qBAAqB,OAAO;AAC5C,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,IAAI,MAAM,EAAE,qBAAqB,EAAE,MAAM,QAAQ,KAAK,IAAI,EAAE,CAAC,CAAC;AAAA,IACtE;AACA;AAAA,EACF;AAEA,uBAAqB,OAAO;AAC9B;AAGA,SAAS,qBAAqB,SAAuB;AACnD,oBAAkB,SAAS,CAAC,aAAa,aAAa,eAAe,aAAa,CAAC;AAEnF,MAAI,KAAK,QAAQ,OAAO,MAAM,KAAK,QAAQ,IAAI,GAAG;AAChD,+BAA2B;AAAA,EAC7B;AAEA,QAAM,cAAc,KAAK,KAAK,SAAS,SAAS;AAChD,QAAM,cAAc,KAAK,KAAK,aAAa,UAAU;AACrD,KAAG,UAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAE7C,QAAM,cAAc,KAAK,KAAK,aAAa,cAAc;AACzD,MAAI,CAAC,GAAG,WAAW,WAAW,GAAG;AAC/B;AAAA,MACE;AAAA,MACA,iBAAiB,EAAE,SAAS,GAAG,SAAS,CAAC,EAAE,GAAG,kBAAkB,SAAS;AAAA,IAC3E;AAAA,EACF;AACA,QAAM,WAAW,KAAK,KAAK,aAAa,kBAAkB;AAC1D,MAAI,CAAC,GAAG,WAAW,QAAQ,GAAG;AAC5B,cAAU,UAAU,EAAE,SAAS,GAAG,SAAS,CAAC,EAAE,CAAC;AAAA,EACjD;AACF;AAEA,eAAsB,YAA2B;AAC/C,QAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;AAE/B,QAAM,WAAW,MAAM,OAAO;AAAA,IAC5B,SAAS,EAAE,eAAe;AAAA,IAC1B,SAAS;AAAA,MACP,EAAE,OAAO,SAAS,OAAO,EAAE,eAAe,EAAE;AAAA,MAC5C,EAAE,OAAO,MAAM,OAAO,EAAE,eAAe,EAAE;AAAA,IAC3C;AAAA,IACA,cAAc;AAAA,EAChB,CAAC;AACD,MAAI,CAAC,SAAS,QAAQ,GAAG;AACvB,kBAAc,MAAM,QAAkB;AAAA,EACxC;AAGA,MAAI,qBAAqB,GAAG;AAC1B,UAAM,IAAI,MAAM,QAAQ,EAAE,SAAS,EAAE,cAAc,GAAG,cAAc,MAAM,CAAC;AAC3E,QAAI,SAAS,CAAC,KAAK,CAAC,GAAG;AACrB,YAAM,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;AAChC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU;AAChB,OAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,QAAQ,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC;AAE1E,MAAI;AACF,UAAM,qBAAqB,OAAO;AAAA,EACpC,SAAS,OAAO;AACd,UAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,SAAU,MAAgB,QAAQ,CAAC,CAAC,CAAC;AAC1E;AAAA,EACF;AAGA,OAAK,EAAE,KAAK,EAAE,kBAAkB,CAAC,GAAG,EAAE,cAAc,CAAC;AAErD,QAAM,cAAc,MAAM,cAAc,EAAE,eAAe,GAAG,KAAK,KAAK,SAAS,KAAK,CAAC;AACrF,MAAI,CAAC,gBAAgB,WAAW,GAAG;AACjC,UAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,YAAY,CAAC,CAAC,CAAC;AAC9D;AAAA,EACF;AAGA,QAAM,gBAAgB,MAAM,OAAO;AAAA,IACjC,SAAS,EAAE,kBAAkB;AAAA,IAC7B,SAAS;AAAA,MACP,EAAE,OAAO,YAAY,OAAO,EAAE,2BAA2B,GAAG,MAAM,EAAE,+BAA+B,EAAE;AAAA,MACrG,EAAE,OAAO,SAAS,OAAO,EAAE,wBAAwB,GAAG,MAAM,EAAE,4BAA4B,EAAE;AAAA,MAC5F,EAAE,OAAO,YAAY,OAAO,EAAE,2BAA2B,GAAG,MAAM,EAAE,+BAA+B,EAAE;AAAA,IACvG;AAAA,IACA,cAAc;AAAA,EAChB,CAAC;AACD,QAAM,kBACJ,SAAS,aAAa,KAAK,CAAC,gBAAgB,aAAa,OAAO,aAAa;AAE/E,MAAI,YAAY;AAChB,MAAI,YAAkC;AACtC,MAAI,UAAU;AACd,MAAI,cAAc;AAClB,MAAI,YAAY;AAChB,MAAI,gBAAgB;AACpB,MAAI;AACJ,MAAI,eAAe;AAEnB,MAAI,oBAAoB,YAAY;AAClC,gBAAY;AAAA,EACd,WAAW,oBAAoB,SAAS;AACtC,gBAAY;AACZ,mBAAe;AACf,UAAM,SAAS,MAAM,cAAc,EAAE,iBAAiB,GAAG,KAAK,KAAK,SAAS,OAAO,CAAC;AACpF,QAAI,gBAAgB,MAAM,GAAG;AAC3B,kBAAY;AAAA,IACd,OAAO;AACL,kBAAY,KAAK,KAAK,SAAS,OAAO;AACtC,WAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC,CAAC,GAAG,EAAE,aAAa,CAAC;AAAA,IAC9E;AAAA,EACF,OAAO;AACL,gBAAY;AACZ,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,SAAS,EAAE,gBAAgB;AAAA,MAC3B,aAAa;AAAA,MACb,UAAU,CAAC,MAAgB;AACzB,YAAI,CAAC,OAAO,KAAK,EAAE,EAAE,KAAK,EAAG,QAAO,EAAE,sBAAsB;AAAA,MAC9D;AAAA,IACF,CAAC;AACD,QAAI,CAAC,SAAS,QAAQ,EAAG,WAAU,OAAO,QAAQ,EAAE,KAAK;AAEzD,UAAM,YAAY,MAAM,SAAS;AAAA,MAC/B,SAAS,EAAE,oBAAoB;AAAA,MAC/B,UAAU,CAAC,MAAgB;AACzB,YAAI,CAAC,OAAO,KAAK,EAAE,EAAE,KAAK,EAAG,QAAO,EAAE,sBAAsB;AAAA,MAC9D;AAAA,IACF,CAAC;AACD,QAAI,CAAC,SAAS,SAAS,EAAG,eAAc,OAAO,SAAS,EAAE,KAAK;AAE/D,UAAM,cAAc,MAAM,QAAQ;AAAA,MAChC,SAAS,EAAE,kBAAkB;AAAA,MAC7B,cAAc;AAAA,IAChB,CAAC;AACD,QAAI,CAAC,SAAS,WAAW,EAAG,aAAY,CAAC,CAAC;AAE1C,UAAM,YAAY,MAAM,KAAK;AAAA,MAC3B,SAAS,EAAE,sBAAsB;AAAA,MACjC,aAAa,EAAE,0BAA0B;AAAA,IAC3C,CAAC;AACD,QAAI,CAAC,SAAS,SAAS,EAAG,iBAAgB,OAAO,SAAS,EAAE,KAAK;AAAA,EACnE;AAEA,QAAM,aAAa,MAAM,cAAc,EAAE,cAAc,GAAG,KAAK,KAAK,SAAS,MAAM,CAAC;AACpF,QAAM,QAAQ,gBAAgB,UAAU,IAAI,aAAa,KAAK,KAAK,SAAS,MAAM;AAClF,MAAI,UAAU,YAAY;AACxB,SAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,MAAM,MAAM,CAAC,CAAC,GAAG,EAAE,aAAa,CAAC;AAAA,EAC1E;AACA,QAAM,YAAY,MAAM,KAAK;AAAA,IAC3B,SAAS,EAAE,eAAe;AAAA,IAC1B,cAAc;AAAA,IACd,UAAU,CAAC,MAAgB;AACzB,YAAM,IAAI,SAAS,GAAG,EAAE;AACxB,UAAI,MAAM,CAAC,KAAK,IAAI,QAAQ,IAAI,MAAO,QAAO,EAAE,kBAAkB;AAClE,UAAI,EAAE,WAAW,EAAG,QAAO,EAAE,sBAAsB;AAAA,IACrD;AAAA,EACF,CAAC;AACD,QAAM,SAAS,SAAS,SAAS,IAAI,OAAO,SAAS,WAAqB,EAAE;AAG5E,QAAM,SAAS,WAAW,WAAW;AACrC,QAAM,YAAY,GAAG,WAAW,MAAM;AAEtC;AAAA,IACE,YACI,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC,CAAC,IACnD,EAAE,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC,CAAC;AAAA,IAC3D,EAAE,cAAc;AAAA,EAClB;AAEA,QAAM,OAAO,MAAM,QAAQ;AAAA,IACzB,SAAS,EAAE,aAAa;AAAA,IACxB,cAAc;AAAA,EAChB,CAAC;AACD,MAAI,SAAS,IAAI,KAAK,CAAC,MAAM;AAC3B,UAAM,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;AACrC;AAAA,EACF;AAEA,MAAI,cAAc;AAClB,MAAI,aAAa;AACjB,MAAI,YAAY,KAAK,KAAK,KAAK,QAAQ,WAAW,GAAG,SAAS;AAC9D,MAAI,WAAqB,CAAC;AAE1B,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,QAAQ,EAAE,SAAS,EAAE,oBAAoB,GAAG,cAAc,KAAK,CAAC;AAChF,QAAI,CAAC,SAAS,CAAC,KAAK,GAAG;AACrB,YAAM,KAAK,MAAM,OAAO;AAAA,QACtB,SAAS,EAAE,sBAAsB;AAAA,QACjC,SAAS;AAAA,UACP,EAAE,OAAO,WAAW,OAAO,EAAE,wBAAwB,GAAG,MAAM,EAAE,4BAA4B,EAAE;AAAA,UAC9F,EAAE,OAAO,WAAW,OAAO,EAAE,wBAAwB,GAAG,MAAM,EAAE,4BAA4B,EAAE;AAAA,QAChG;AAAA,MACF,CAAC;AACD,UAAI,CAAC,SAAS,EAAE,GAAG;AACjB,qBAAa;AACb,sBAAc;AAAA,MAChB;AACA,UAAI,CAAC,gBAAgB,SAAS,GAAG;AAC/B,cAAM,EAAE,IAAI,EAAE,6BAA6B,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC;AAC/D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,cAAY,MAAM,cAAc,EAAE,kBAAkB,GAAG,SAAS;AAChE,QAAM,kBAAkB;AAAA,IACtB,EAAE,OAAO,qBAAqB,OAAO,qBAAqB,MAAM,EAAE,6BAA6B,EAAE;AAAA,IACjG,EAAE,OAAO,kBAAkB,OAAO,iBAAiB;AAAA,IACnD,EAAE,OAAO,oBAAoB,OAAO,mBAAmB;AAAA,IACvD,EAAE,OAAO,kBAAkB,OAAO,iBAAiB;AAAA,IACnD,EAAE,OAAO,UAAU,OAAO,WAAW,MAAM,EAAE,wBAAwB,EAAE;AAAA,IACvE,EAAE,OAAO,UAAU,OAAO,WAAW,MAAM,EAAE,wBAAwB,EAAE;AAAA,EACzE;AACA,QAAM,KAAK,MAAM,YAAY;AAAA,IAC3B,SAAS,EAAE,iBAAiB;AAAA,IAC5B,SAAS,CAAC,GAAG,eAAe;AAAA,IAC5B,eAAe,gBAAgB,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,IACjD,UAAU;AAAA,EACZ,CAAC;AACD,MAAI,CAAC,SAAS,EAAE,EAAG,YAAW;AAC9B,OAAK,EAAE,OAAO,EAAE,mBAAmB,CAAC,GAAG,EAAE,aAAa,CAAC;AAGvD,QAAM,UAAU,SAAkB,WAAW,SAAS,cAAc,CAAC,KAAK;AAAA,IACxE,SAAS;AAAA,IACT,SAAS,CAAC;AAAA,EACZ;AACA,QAAM,iBAAmG,CAAC;AAC1G,MAAI,MAAM,QAAQ,QAAQ,OAAO,GAAG;AAClC,eAAW,KAAK,QAAQ,SAAS;AAC/B,qBAAe,KAAK;AAAA,QAClB,IAAI,OAAO,EAAE,MAAM,EAAE;AAAA,QACrB,MAAM,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE;AAAA,QACjC,aAAa,OAAO,EAAE,eAAe,EAAE;AAAA,QACvC,YAAY,EAAE,eAAe;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,EACF;AAEA;AAAA,IACE,EAAE;AAAA,MACA,eAAe,SAAS,IACpB,EAAE,uBAAuB,EAAE,OAAO,eAAe,OAAO,CAAC,IACzD,EAAE,oBAAoB;AAAA,IAC5B;AAAA,IACA,EAAE,cAAc;AAAA,EAClB;AAEA,MAAI,kBAA4B,CAAC;AACjC,QAAM,WAAkB,CAAC;AACzB,QAAM,aAAoB,CAAC;AAC3B,iBAAe,QAAQ,CAAC,MAAM;AAC5B,UAAM,SAAS;AAAA,MACb,OAAO,EAAE;AAAA,MACT,OAAO,OAAO,EAAE,IAAI;AAAA,MACpB,MAAM,OAAO,EAAE,eAAe,EAAE,kBAAkB,CAAC;AAAA,IACrD;AACA,QAAI,EAAE,eAAe,OAAO;AAC1B,eAAS,KAAK,EAAE,GAAG,QAAQ,UAAU,KAAK,CAAC;AAAA,IAC7C,OAAO;AACL,iBAAW,KAAK,MAAM;AAAA,IACxB;AAAA,EACF,CAAC;AACD,MAAI,eAAe,SAAS,GAAG;AAC7B,UAAM,IAAI,MAAM,YAAY;AAAA,MAC1B,SAAS,EAAE,sBAAsB;AAAA,MACjC,SAAS,CAAC,GAAG,UAAU,GAAG,UAAU;AAAA,MACpC,UAAU;AAAA,IACZ,CAAC;AACD,QAAI,CAAC,SAAS,CAAC,EAAG,mBAAkB;AAAA,EACtC;AAEA,QAAM,cAAc;AAAA,IAClB;AAAA,MACE,OAAO,EAAE,wBAAwB;AAAA,MACjC,MAAM,MAAM;AACV,cAAM,YAAY,CAAC,UAAkB,MAAM,QAAQ,OAAO,GAAG;AAC7D,kBAAU,SAAS,kBAAkB;AAAA,UACnC,SAAS;AAAA,UACT,OAAO,UAAU,KAAK,SAAS,SAAS,KAAK,KAAK,OAAO,cAAc,CAAC,CAAC;AAAA,UACzE,YAAY;AAAA,QACd,CAAC;AAED,cAAM,UAAU,cAAc,WAAW,CAAC,CAAC,gBAAgB,CAAC,CAAC;AAC7D,cAAM,WAAW,cAAc,cAAc,cAAc;AAC3D,cAAM,UAAU,aAAa;AAC7B,kBAAU,SAAS,kBAAkB;AAAA,UACnC,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,eAAe;AAAA,UACf,YAAY;AAAA,UACZ,iBAAiB;AAAA,UACjB,eAAe;AAAA;AAAA,UAEf,YAAY,YAAY,UAAU,KAAK,KAAK,WAAW,OAAO,CAAC,IAAI;AAAA,UACnE,WAAW,YAAY,UAAU,SAAS,IAAI;AAAA,QAChD,CAAC;AACD,kBAAU,SAAS,oBAAoB;AAAA,UACrC,UAAU,UAAU,WAAW;AAAA,UAC/B,SAAS;AAAA,UACT,YAAY,UAAU,SAAS;AAAA,UAC/B;AAAA,UACA,WAAW;AAAA,QACb,CAAC;AAED,kBAAU,SAAS,gBAAgB;AAAA,UACjC,cAAc;AAAA,UACd,iBAAgB,oBAAI,KAAK,GAAE,YAAY;AAAA,UACvC,QAAQ,SAAS,QAAQ,IAAI,SAAa;AAAA,QAC5C,CAAC;AACD,eAAO,EAAE,uBAAuB;AAAA,MAClC;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO,EAAE,wBAAwB;AAAA,MACjC,MAAM,YAA6B;AACjC,cAAM,OAAO,SAAqB,WAAW,SAAS,kBAAkB,CAAC,KAAK;AAAA,UAC5E,SAAS;AAAA,UACT,SAAS,CAAC;AAAA,QACZ;AACA,YAAI,CAAC,KAAK,QAAS,MAAK,UAAU,CAAC;AACnC,cAAM,MAAM,KAAK,IAAI;AACrB,mBAAW,MAAM,gBAAiB,MAAK,QAAQ,EAAE,IAAI,EAAE,SAAS,MAAM,WAAW,IAAI;AACrF,kBAAU,WAAW,SAAS,kBAAkB,GAAG,IAAI;AACvD,eAAO,EAAE,uBAAuB;AAAA,MAClC;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO,EAAE,eAAe;AAAA,MACxB,MAAM,YAA6B;AACjC,cAAM,QAAQ,aAAa,MAAM,CAAC,GAAG;AAAA,UACnC,KAAK;AAAA,UACL,OAAO;AAAA,UACP,KAAK,EAAE,GAAG,QAAQ,KAAK,SAAS,OAAO,MAAM,EAAE;AAAA,QACjD,CAAC;AACD,YAAI,CAAE,MAAM,cAAc,MAAM,GAAI;AAClC,gBAAM,KAAK,SAAS;AACpB,iBAAO,EAAE,kBAAkB;AAAA,QAC7B;AAEA,cAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAI,CAAC;AACxD,cAAM,KAAK,SAAS;AACpB,mBAAW,MAAM,MAAM,KAAK,SAAS,GAAG,GAAI,EAAE,MAAM;AACpD,eAAO,EAAE,aAAa;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACA,MAAI,aAAa;AACf,gBAAY,KAAK;AAAA,MACf,OAAO,EAAE,uBAAuB;AAAA,MAChC,MAAM,YAA6B;AACjC,cAAM,SAAS,MAAM,aAAa,SAAS,UAAU;AACrD,YAAI,OAAO,SAAS,GAAG;AACrB,iBAAO,EAAE,qBAAqB;AAAA,QAChC;AACA,eAAO,EAAE,sBAAsB;AAAA,MACjC;AAAA,IACF,CAAC;AAAA,EACH;AACA,MAAI;AACF,UAAM,MAAM,WAAW;AAAA,EACzB,SAAS,GAAG;AACV,UAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAU,EAAY,QAAQ,CAAC,CAAC,CAAC;AACjE;AAAA,EACF;AAGA,QAAM,sBAAsB,SAAS,iBAAiB,WAAW;AAEjE,QAAM,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;AACjC;AAEA,eAAe,sBAAsB,SAAiB,iBAA2B,aAAoC;AACnH,MAAI,gBAAgB,SAAS,GAAG;AAC9B,UAAM,cAAc,mBAAmB;AACvC,QAAI,aAAa;AACf,YAAM,WAAW;AAAA,QACf;AAAA,UACE,OAAO,EAAE,qBAAqB,EAAE,OAAO,gBAAgB,OAAO,CAAC;AAAA,UAC/D,MAAM,YAA6B;AACjC,yBAAa,QAAQ,UAAU,CAAC,aAAa,WAAW,GAAG,eAAe,GAAG;AAAA,cAC3E,KAAK;AAAA,cACL,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,cAChC,KAAK,EAAE,GAAG,QAAQ,KAAK,WAAW,QAAQ;AAAA,YAC5C,CAAC;AACD,mBAAO,EAAE,oBAAoB,EAAE,OAAO,gBAAgB,OAAO,CAAC;AAAA,UAChE;AAAA,QACF;AAAA,MACF;AACA,UAAI;AACF,cAAM,MAAM,QAAQ;AAAA,MACtB,SAAS,GAAG;AACV,aAAK,EAAE,OAAO,EAAE,wBAAwB,EAAE,SAAU,EAAY,QAAQ,CAAC,CAAC,CAAC;AAAA,MAC7E;AAAA,IACF,OAAO;AACL,WAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;AAAA,IAC/E;AAAA,EACF,OAAO;AACL,SAAK,EAAE,IAAI,EAAE,0BAA0B,CAAC,CAAC;AAAA,EAC3C;AAEA,QAAM,EAAE,sBAAsB,sBAAsB,IAAI,MAAM,OAAO,6BAA6B;AAClG,QAAM,SAAS;AAAA,IACb;AAAA,MACE,OAAO,EAAE,mBAAmB;AAAA,MAC5B,MAAM,YAA6B;AACjC,cAAM,IAAI,MAAM,qBAAqB,CAAC,CAAC;AACvC,YAAI,CAAC,EAAE,GAAI,OAAM,IAAI,MAAM,EAAE,OAAO;AACpC,eAAO,EAAE;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACA,MAAI;AACF,UAAM,MAAM,MAAM;AAAA,EACpB,SAAS,GAAG;AACV,SAAK,EAAE,OAAO,EAAE,sBAAsB,EAAE,SAAU,EAAY,QAAQ,CAAC,CAAC,CAAC;AACzE;AAAA,EACF;AAEA,QAAM,UAAU;AAAA,IACd;AAAA,MACE,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAAA,MAClD,MAAM,YAA6B;AACjC,cAAM,IAAI,MAAM,sBAAsB,CAAC,CAAC;AACxC,YAAI,CAAC,EAAE,GAAI,OAAM,IAAI,MAAM,EAAE,OAAO;AACpC,eAAO,EAAE;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACA,MAAI;AACF,UAAM,MAAM,OAAO;AACnB,SAAK,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;AAAA,EACtC,SAAS,GAAG;AACV,SAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE,SAAU,EAAY,QAAQ,CAAC,CAAC,CAAC;AAAA,EAC5E;AACA,OAAK;AACP;",
4
+ "sourcesContent": ["import { confirm, intro, isCancel, multiselect, note, outro, password, select, tasks, text } from \"@clack/prompts\";\nimport {\n configPath,\n ensureCoreConfigs,\n modulePath,\n patchJson as patchConfig,\n readJson,\n withConfigSchema,\n writeJson,\n type Catalog,\n type ConfigName,\n type ModuleLock,\n type QQBridgeConfig,\n} from \"@sfmc-bds/sdk/node/config\";\nimport { bdsExePath } from \"@sfmc-bds/bds-tools/host-platform\";\nimport { execFileSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { ensureDirectory, pickDirectory } from \"./interactive-prompts.js\";\nimport { persistLocale, t, type Locale } from \"./i18n/index.js\";\nimport { llbotExeName } from \"./llbot-launch.js\";\nimport { ROOT, isMonorepoLayout, isRuntimeInitialized, resolveFetchModule, spawnService } from \"./runtime.js\";\nimport { ensurePackUpdateConfigFile } from \"./pack-update/index.js\";\nimport { c } from \"./theme.js\";\n\n/** Shallow-merge write for top-level configs. Delegates to SDK; do not mkdir+writeFileSync here. */\nfunction patchJson<T extends object>(rootDir: string, name: ConfigName, updates: Partial<T>): void {\n patchConfig<T>(configPath(rootDir, name), updates);\n}\n\nasync function waitForHealth(port: number, ms = 15000): Promise<boolean> {\n const t = Date.now();\n while (Date.now() - t < ms) {\n try {\n if ((await fetch(`http://127.0.0.1:${port}/api/health`)).ok) return true;\n } catch {\n /* retry */\n }\n await new Promise((r) => setTimeout(r, 300));\n }\n return false;\n}\n\n/** \u8FD0\u884C\u65F6\u5FC5\u9700\u76EE\u5F55\u63A2\u6D4B(configs / modules) */\nconst RUNTIME_DIRS = [\n { target: \"configs\", npmTarget: \"configs\" },\n { target: \"modules\", npmTarget: \"modules\" },\n] as const;\n\nfunction missingRuntimeAssets(rootDir: string): string[] {\n return RUNTIME_DIRS.flatMap(({ target, npmTarget }) => {\n const directory = path.join(rootDir, npmTarget);\n try {\n return fs.statSync(directory).isDirectory() && fs.readdirSync(directory).length > 0 ? [] : [target];\n } catch {\n return [target];\n }\n });\n}\n\nasync function runBdsUpdate(rootDir: string, channel: string): Promise<{ code: number | null; output: string }> {\n const child = spawnService(\"update\", [`--channel=${channel}`, \"--force\", \"--no-start\"], {\n cwd: rootDir,\n stdio: \"pipe\",\n });\n const output: string[] = [];\n child.stdout?.on(\"data\", (data: Buffer) => output.push(data.toString()));\n child.stderr?.on(\"data\", (data: Buffer) => output.push(data.toString()));\n\n return new Promise((resolve) => {\n child.once(\"error\", (error) => resolve({ code: null, output: `${output.join(\"\")}${error.message}` }));\n child.once(\"close\", (code) => resolve({ code, output: output.join(\"\") }));\n });\n}\n\nasync function prepareRuntimeAssets(rootDir: string): Promise<void> {\n /* monorepo \u5E03\u5C40\uFF1Aconfigs/ modules/ \u5E94\u7531 npm \u5DE5\u4F5C\u533A\u5DF2\u63D0\u4F9B */\n if (isMonorepoLayout(rootDir)) {\n const missing = missingRuntimeAssets(rootDir);\n if (missing.length > 0) {\n throw new Error(t(\"wizard.npmMissing\", { list: missing.join(\", \") }));\n }\n return;\n }\n\n seedNpmRuntimeLayout(rootDir);\n}\n\n/** \u975E monorepo \u7684 npm \u5B89\u88C5\u5E03\u5C40\uFF1Aensure \u914D\u7F6E\u9AA8\u67B6 + \u7A7A modules */\nfunction seedNpmRuntimeLayout(rootDir: string): void {\n ensureCoreConfigs(rootDir, [\"db_config\", \"qq_config\", \"bds_updater\", \"permissions\"]);\n /* pack-update \u7684 ensure \u4F7F\u7528 runtime ROOT\uFF1Bnpm \u5E03\u5C40\u4E0B\u5E94\u4E0E rootDir \u4E00\u81F4 */\n if (path.resolve(rootDir) === path.resolve(ROOT)) {\n ensurePackUpdateConfigFile();\n }\n\n const modulesRoot = path.join(rootDir, \"modules\");\n const packagesDir = path.join(modulesRoot, \"packages\");\n fs.mkdirSync(packagesDir, { recursive: true });\n\n const catalogPath = path.join(modulesRoot, \"catalog.json\");\n if (!fs.existsSync(catalogPath)) {\n writeJson(\n catalogPath,\n withConfigSchema({ version: 1, modules: [] }, \"module_catalog\", \"modules\")\n );\n }\n const lockPath = path.join(modulesRoot, \"module-lock.json\");\n if (!fs.existsSync(lockPath)) {\n writeJson(lockPath, { version: 1, modules: {} });\n }\n}\n\nexport async function runWizard(): Promise<void> {\n intro(c.bold(t(\"wizard.intro\")));\n\n const langPick = await select({\n message: t(\"locale.wizard\"),\n options: [\n { value: \"zh-CN\", label: t(\"locale.opt.zh\") },\n { value: \"en\", label: t(\"locale.opt.en\") },\n ],\n initialValue: \"zh-CN\",\n });\n if (!isCancel(langPick)) {\n persistLocale(ROOT, langPick as Locale);\n }\n\n // Already initialized only when runtime.json#initialized_at is set (empty db_config skeleton does not count).\n if (isRuntimeInitialized()) {\n const r = await confirm({ message: t(\"wizard.rerun\"), initialValue: false });\n if (isCancel(r) || !r) {\n outro(c.dim(t(\"wizard.skipped\")));\n return;\n }\n }\n // Step 1: Runtime Environment\uFF08\u53EA\u64AD\u79CD configs/modules\uFF0C\u4E0D\u5199 initialized_at\u3001\u4E0D\u5EFA data/\uFF09\n const rootDir = ROOT;\n note(c.text(t(\"wizard.runtimeRoot\", { root: rootDir })), t(\"wizard.step1\"));\n\n try {\n await prepareRuntimeAssets(rootDir);\n } catch (error) {\n outro(c.red(t(\"wizard.prepFailed\", { message: (error as Error).message })));\n return;\n }\n\n // Step 2: External runtime paths\n note(c.text(t(\"wizard.step2Note\")), t(\"wizard.step2\"));\n\n const bdsResolved = await pickDirectory(t(\"wizard.bdsDir\"), path.join(rootDir, \"BDS\"));\n if (!ensureDirectory(bdsResolved)) {\n outro(c.red(t(\"wizard.cannotCreateBds\", { dir: bdsResolved })));\n return;\n }\n\n /* QQ \u6865\uFF1A\u9009\u540E\u7AEF \u2192 official \u51ED\u636E / llbot \u8DEF\u5F84\uFF1B\u7981\u7528\u5219 qq_enabled=false */\n const qqBackendPick = await select({\n message: t(\"wizard.qqBackend\"),\n options: [\n { value: \"official\", label: t(\"wizard.qqBackend.official\"), hint: t(\"wizard.qqBackend.officialHint\") },\n { value: \"llbot\", label: t(\"wizard.qqBackend.llbot\"), hint: t(\"wizard.qqBackend.llbotHint\") },\n { value: \"disabled\", label: t(\"wizard.qqBackend.disabled\"), hint: t(\"wizard.qqBackend.disabledHint\") },\n ],\n initialValue: \"official\",\n });\n const qqBackendChoice =\n isCancel(qqBackendPick) || !qqBackendPick ? \"official\" : String(qqBackendPick);\n\n let qqEnabled = true;\n let qqBackend: \"official\" | \"llbot\" = \"official\";\n let qqAppId = \"\";\n let qqAppSecret = \"\";\n let qqSandbox = false;\n let qqGroupOpenid = \"\";\n let llbotPath: string | undefined;\n let llbotEnabled = false;\n\n if (qqBackendChoice === \"disabled\") {\n qqEnabled = false;\n } else if (qqBackendChoice === \"llbot\") {\n qqBackend = \"llbot\";\n llbotEnabled = true;\n const picked = await pickDirectory(t(\"wizard.llbotDir\"), path.join(rootDir, \"LLBOT\"));\n if (ensureDirectory(picked)) {\n llbotPath = picked;\n } else {\n llbotPath = path.join(rootDir, \"LLBOT\");\n note(c.text(t(\"wizard.usingDefault\", { path: llbotPath })), t(\"common.tips\"));\n }\n } else {\n qqBackend = \"official\";\n const appIdRaw = await text({\n message: t(\"wizard.qqAppId\"),\n placeholder: \"102xxxxx\",\n validate: (v: any): any => {\n if (!String(v ?? \"\").trim()) return t(\"wizard.valueRequired\");\n },\n });\n if (!isCancel(appIdRaw)) qqAppId = String(appIdRaw).trim();\n\n const secretRaw = await password({\n message: t(\"wizard.qqAppSecret\"),\n validate: (v: any): any => {\n if (!String(v ?? \"\").trim()) return t(\"wizard.valueRequired\");\n },\n });\n if (!isCancel(secretRaw)) qqAppSecret = String(secretRaw).trim();\n\n const sandboxPick = await confirm({\n message: t(\"wizard.qqSandbox\"),\n initialValue: false,\n });\n if (!isCancel(sandboxPick)) qqSandbox = !!sandboxPick;\n\n const openidRaw = await text({\n message: t(\"wizard.qqGroupOpenid\"),\n placeholder: t(\"wizard.qqGroupOpenidHint\"),\n });\n if (!isCancel(openidRaw)) qqGroupOpenid = String(openidRaw).trim();\n }\n\n const dbDirInput = await pickDirectory(t(\"wizard.dbDir\"), path.join(rootDir, \"data\"));\n const dbDir = ensureDirectory(dbDirInput) ? dbDirInput : path.join(rootDir, \"data\");\n if (dbDir !== dbDirInput) {\n note(c.text(t(\"wizard.usingDefault\", { path: dbDir })), t(\"common.tips\"));\n }\n const dbPortRaw = await text({\n message: t(\"wizard.dbPort\"),\n initialValue: \"3001\",\n validate: (v: any): any => {\n const n = parseInt(v, 10);\n if (isNaN(n) || n < 1024 || n > 65535) return t(\"wizard.portRange\");\n if (v.length === 0) return t(\"wizard.valueRequired\");\n },\n });\n const dbPort = isCancel(dbPortRaw) ? 3001 : parseInt(dbPortRaw as string, 10);\n\n // Step 3: BDS environment\n const bdsExe = bdsExePath(bdsResolved);\n const bdsExists = fs.existsSync(bdsExe);\n\n note(\n bdsExists\n ? c.green(t(\"wizard.bdsFound\", { path: bdsResolved }))\n : c.yellow(t(\"wizard.bdsNotFound\", { path: bdsResolved })),\n t(\"wizard.step3\")\n );\n\n const EULA = await confirm({\n message: t(\"wizard.eula\"),\n initialValue: false,\n });\n if (isCancel(EULA) || !EULA) {\n outro(c.yellow(t(\"wizard.disagreed\")));\n return;\n }\n\n let downloadBds = false;\n let bdsChannel = \"release\";\n let backupDir = path.join(path.dirname(bdsResolved), \"backups\");\n let preserve: string[] = [];\n\n if (!bdsExists) {\n const d = await confirm({ message: t(\"wizard.downloadBds\"), initialValue: true });\n if (!isCancel(d) && d) {\n const ch = await select({\n message: t(\"wizard.selectChannel\"),\n options: [\n { value: \"release\", label: t(\"wizard.channel.release\"), hint: t(\"wizard.channel.releaseHint\") },\n { value: \"preview\", label: t(\"wizard.channel.preview\"), hint: t(\"wizard.channel.previewHint\") },\n ],\n });\n if (!isCancel(ch)) {\n bdsChannel = ch as string;\n downloadBds = true;\n }\n if (!ensureDirectory(backupDir)) {\n outro(c.red(t(\"wizard.cannotCreateBackup\", { dir: backupDir })));\n return;\n }\n }\n }\n\n backupDir = await pickDirectory(t(\"wizard.backupDir\"), backupDir);\n const preserveOptions = [\n { value: \"server.properties\", label: \"server.properties\", hint: t(\"wizard.preserve.serverProps\") },\n { value: \"whitelist.json\", label: \"whitelist.json\" },\n { value: \"permissions.json\", label: \"permissions.json\" },\n { value: \"allowlist.json\", label: \"allowlist.json\" },\n { value: \"worlds\", label: \"worlds/\", hint: t(\"wizard.preserve.worlds\") },\n { value: \"config\", label: \"config/\", hint: t(\"wizard.preserve.config\") },\n ] as const;\n const pr = await multiselect({\n message: t(\"wizard.preserve\"),\n options: [...preserveOptions],\n initialValues: preserveOptions.map((o) => o.value),\n required: false,\n });\n if (!isCancel(pr)) preserve = pr as string[];\n note(c.yellow(t(\"wizard.updaterTip\")), t(\"common.tips\"));\n\n // Step 4: Module initialization\n const catalog = readJson<Catalog>(modulePath(rootDir, \"catalog.json\")) ?? {\n version: 1,\n modules: [],\n };\n const catalogModules: Array<{ id: string; name?: string; description?: string; canDisable?: boolean }> = [];\n if (Array.isArray(catalog.modules)) {\n for (const m of catalog.modules) {\n catalogModules.push({\n id: String(m.id ?? \"\"),\n name: String(m.name ?? m.id ?? \"\"),\n description: String(m.description ?? \"\"),\n canDisable: m.canDisable !== false,\n });\n }\n }\n\n note(\n c.text(\n catalogModules.length > 0\n ? t(\"wizard.modulesFound\", { count: catalogModules.length })\n : t(\"wizard.modulesNone\")\n ),\n t(\"wizard.step4\")\n );\n\n let selectedModules: string[] = [];\n const lockedMd: any[] = [];\n const optionalMd: any[] = [];\n catalogModules.forEach((k) => {\n const option = {\n value: k.id,\n label: String(k.name),\n hint: String(k.description ?? t(\"wizard.emptyHint\")),\n };\n if (k.canDisable === false) {\n lockedMd.push({ ...option, disabled: true });\n } else {\n optionalMd.push(option);\n }\n });\n if (catalogModules.length > 0) {\n const r = await multiselect({\n message: t(\"wizard.enableModules\"),\n options: [...lockedMd, ...optionalMd],\n required: false,\n });\n if (!isCancel(r)) selectedModules = r as string[];\n }\n\n const wizardTasks = [\n {\n title: t(\"wizard.updatingConfigs\"),\n task: () => {\n const slashPath = (value: string) => value.replace(/\\\\/g, \"/\");\n patchJson(rootDir, \"db_config.json\", {\n db_port: dbPort,\n dbDir: slashPath(path.relative(rootDir, path.join(dbDir, \"sfmc_data.db\"))),\n modulesDir: \"modules\",\n });\n\n const llbotOn = qqBackend === \"llbot\" && !!llbotEnabled && !!llbotPath;\n const qqNotify = qqEnabled && (qqBackend === \"official\" || llbotOn);\n const exeName = llbotExeName();\n const currentQq = readJson<QQBridgeConfig>(configPath(rootDir, \"qq_config.json\")) ?? {};\n patchJson(rootDir, \"qq_config.json\", {\n qq_enabled: qqEnabled,\n qq_backend: qqBackend,\n official: {\n ...currentQq.official,\n app_id: qqAppId,\n app_secret: qqAppSecret,\n sandbox: qqSandbox,\n group_openid: qqGroupOpenid,\n },\n llbot: {\n ...currentQq.llbot,\n enabled: llbotOn,\n // path = \u53EF\u6267\u884C\u6587\u4EF6\uFF1Bcwd = \u8FD0\u884C\u76EE\u5F55\uFF08\u5411\u5BFC\u9009\u7684\u662F\u76EE\u5F55\uFF09\n path: llbotPath ? slashPath(path.join(llbotPath, exeName)) : \"\",\n cwd: llbotPath ? slashPath(llbotPath) : \"\",\n },\n });\n patchJson(rootDir, \"bds_updater.json\", {\n bds_path: slashPath(bdsResolved),\n channel: bdsChannel,\n backup_dir: slashPath(backupDir),\n preserve,\n qq_notify: qqNotify,\n });\n /* \u8DEF\u5F84\u9009\u5B9A\u540E\u518D\u6807\u8BB0\u5DF2\u521D\u59CB\u5316\uFF0C\u907F\u514D\u534A\u9014\u53D6\u6D88\u4ECD\u7559\u4E0B data/ \u8BED\u4E49 */\n patchJson(rootDir, \"runtime.json\", {\n runtime_root: rootDir,\n initialized_at: new Date().toISOString(),\n locale: isCancel(langPick) ? undefined : (langPick as string),\n });\n return t(\"wizard.configsUpdated\");\n },\n },\n {\n title: t(\"wizard.updatingModules\"),\n task: async (): Promise<string> => {\n const lock = readJson<ModuleLock>(modulePath(rootDir, \"module-lock.json\")) ?? {\n version: 1,\n modules: {},\n };\n if (!lock.modules) lock.modules = {};\n const now = Date.now();\n for (const id of selectedModules) lock.modules[id] = { enabled: true, updatedAt: now };\n writeJson(modulePath(rootDir, \"module-lock.json\"), lock);\n return t(\"wizard.modulesUpdated\");\n },\n },\n {\n title: t(\"wizard.initDb\"),\n task: async (): Promise<string> => {\n const child = spawnService(\"db\", [], {\n cwd: rootDir,\n stdio: \"ignore\",\n env: { ...process.env, DB_PORT: String(dbPort) },\n });\n if (!(await waitForHealth(dbPort))) {\n child.kill(\"SIGTERM\");\n return t(\"wizard.dbTimeout\");\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n child.kill(\"SIGTERM\");\n setTimeout(() => child.kill(\"SIGKILL\"), 3000).unref();\n return t(\"wizard.dbOk\");\n },\n },\n ];\n if (downloadBds) {\n wizardTasks.push({\n title: t(\"wizard.downloadingBds\"),\n task: async (): Promise<string> => {\n const result = await runBdsUpdate(rootDir, bdsChannel);\n if (result.code !== 0) {\n return t(\"wizard.downloadFail\");\n }\n return t(\"wizard.bdsDownloaded\");\n },\n });\n }\n try {\n await tasks(wizardTasks);\n } catch (e) {\n outro(c.red(t(\"common.error\", { message: (e as Error).message })));\n return;\n }\n\n /* install \u2192 build \u2192 deploy chain */\n await runInstallBuildDeploy(rootDir, selectedModules, bdsResolved);\n\n outro(c.green(t(\"wizard.done\")));\n}\n\nasync function runInstallBuildDeploy(rootDir: string, selectedModules: string[], bdsResolved: string): Promise<void> {\n if (selectedModules.length > 0) {\n const fetchScript = resolveFetchModule();\n if (fetchScript) {\n const installT = [\n {\n title: t(\"wizard.installing\", { count: selectedModules.length }),\n task: async (): Promise<string> => {\n execFileSync(process.execPath, [fetchScript, \"install\", ...selectedModules], {\n cwd: rootDir,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env, SFMC_ROOT: rootDir },\n });\n return t(\"wizard.installed\", { count: selectedModules.length });\n },\n },\n ];\n try {\n await tasks(installT);\n } catch (e) {\n note(c.yellow(t(\"wizard.installFailed\", { message: (e as Error).message })));\n }\n } else {\n note(c.yellow(t(\"wizard.fetchMissing\", { list: selectedModules.join(\", \") })));\n }\n } else {\n note(c.dim(t(\"wizard.noModulesSelected\")));\n }\n\n const { cmdBehaviorPackBuild, cmdBehaviorPackDeploy } = await import(\"./commands-behavior-pack.js\");\n const buildT = [\n {\n title: t(\"wizard.buildingBp\"),\n task: async (): Promise<string> => {\n const r = await cmdBehaviorPackBuild([]);\n if (!r.ok) throw new Error(r.message);\n return r.message;\n },\n },\n ];\n try {\n await tasks(buildT);\n } catch (e) {\n note(c.yellow(t(\"wizard.buildFailed\", { message: (e as Error).message })));\n return;\n }\n\n const deployT = [\n {\n title: t(\"wizard.deploying\", { path: bdsResolved }),\n task: async (): Promise<string> => {\n const r = await cmdBehaviorPackDeploy([]);\n if (!r.ok) throw new Error(r.message);\n return r.message;\n },\n },\n ];\n try {\n await tasks(deployT);\n note(c.green(t(\"wizard.restartBds\")));\n } catch (e) {\n note(c.yellow(t(\"wizard.deployFailed\", { message: (e as Error).message })));\n }\n void rootDir;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["t"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sfmc-bds/cli",
3
- "version": "0.2.0-beta.20",
3
+ "version": "0.2.0-beta.21",
4
4
  "description": "SFMC management CLI — REPL, service supervisor, module install, behavior-pack build/deploy",
5
5
  "author": "Shiroha7z",
6
6
  "license": "AGPL-3.0-only",
@@ -52,11 +52,11 @@
52
52
  "@clack/prompts": "^1.7.0",
53
53
  "chalk": "^6.0.0",
54
54
  "esbuild": "^0.28.1",
55
- "@sfmc-bds/bds-tools": "0.2.0-beta.17",
56
- "@sfmc-bds/sdk": "0.2.0-beta.17"
55
+ "@sfmc-bds/bds-tools": "0.2.0-beta.18",
56
+ "@sfmc-bds/sdk": "0.2.0-beta.18"
57
57
  },
58
58
  "devDependencies": {
59
- "@sfmc-bds/tools": "0.2.0-beta.18"
59
+ "@sfmc-bds/tools": "0.2.0-beta.19"
60
60
  },
61
61
  "publishConfig": {
62
62
  "access": "public",
@@ -65,7 +65,6 @@
65
65
  "scripts": {
66
66
  "build": "sfmc-esbuild-transpile --dts",
67
67
  "start": "node ./dist/main.js",
68
- "test": "pnpm run build && node --test \"dist/**/*.test.js\" && node --test --import tsx/esm \"scripts/module-install/test/**/*.test.ts\"",
69
68
  "typecheck": "tsc7 --noEmit -p tsconfig.json"
70
69
  }
71
70
  }
@@ -12,7 +12,7 @@ import {
12
12
  } from "./packages.mjs";
13
13
 
14
14
  const CATALOG_SCHEMA =
15
- "https://cdn.jsdelivr.net/gh/DogeLakeDev/ScriptsForMinecraftServer@%40sfmc-bds/sdk@0.2.0-beta.6/modules/sdk/%40sfmc-sdk/schemas/module_catalog.schema.json";
15
+ "https://raw.githubusercontent.com/DogeLakeDev/ScriptsForMinecraftServer/main/modules/sdk/@sfmc-sdk/schemas/module_catalog.schema.json";
16
16
 
17
17
  /**
18
18
  * @typedef {import("./packages.mjs").CatalogEntry} CatalogEntry
@@ -1,92 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import test from "node:test";
3
- import { gateTopLevel } from "./cli-gate.js";
4
- import {
5
- canRunCommand,
6
- findModuleSubSpec,
7
- findTopLevelSpec,
8
- listPaletteRoots,
9
- listVisibleModuleSubs,
10
- listVisibleTopLevelNames,
11
- resolveModuleTopShorthand
12
- } from "./command-surface.js";
13
- const tty = { isTty: true };
14
- const noTty = { isTty: false };
15
- test("install \u4E24\u8FB9\u53EF\u7528\uFF08both\uFF09", () => {
16
- const spec = findModuleSubSpec("install");
17
- assert.ok(spec);
18
- assert.equal(canRunCommand(spec, { mode: "argv", ...tty }).ok, true);
19
- assert.equal(canRunCommand(spec, { mode: "repl", ...tty }).ok, true);
20
- });
21
- test("send \u4EC5 REPL\uFF1Aargv \u62D2\u7EDD", () => {
22
- const spec = findTopLevelSpec("send");
23
- assert.ok(spec);
24
- const r = canRunCommand(spec, { mode: "argv", ...tty });
25
- assert.equal(r.ok, false);
26
- assert.equal(r.reason, "replOnly");
27
- assert.equal(canRunCommand(spec, { mode: "repl", ...tty }).ok, true);
28
- });
29
- test("status \u4E24\u8FB9\u53EF\u7528", () => {
30
- const spec = findTopLevelSpec("status");
31
- assert.ok(spec);
32
- assert.equal(canRunCommand(spec, { mode: "argv", ...tty }).ok, true);
33
- assert.equal(canRunCommand(spec, { mode: "repl", ...tty }).ok, true);
34
- });
35
- test("build/reload/install \u5728 REPL \u53EF\u89C1", () => {
36
- const build = findModuleSubSpec("build");
37
- assert.equal(build?.accent, "dev");
38
- assert.equal(canRunCommand(build, { mode: "repl", ...tty }).ok, true);
39
- assert.ok(listVisibleModuleSubs("repl").includes("build"));
40
- assert.ok(listVisibleModuleSubs("repl").includes("install"));
41
- });
42
- test("argv \u9876\u5C42\u5217\u8868\u4E0D\u542B send\uFF1B\u542B debug/install/uninstall", () => {
43
- const names = listVisibleTopLevelNames("argv");
44
- assert.ok(!names.includes("send"));
45
- assert.ok(names.includes("debug"));
46
- assert.ok(names.includes("install"));
47
- assert.ok(names.includes("uninstall") || names.includes("remove"));
48
- assert.ok(names.includes("module") || names.includes("mod"));
49
- });
50
- test("REPL \u9876\u5C42\u5217\u8868\u542B send \u4E0E debug", () => {
51
- const names = listVisibleTopLevelNames("repl");
52
- assert.ok(names.includes("send"));
53
- assert.ok(names.includes("debug"));
54
- assert.ok(names.includes("init"));
55
- });
56
- test("accent \u4E0D\u53C2\u4E0E canRun\uFF1Adebug \u4E24\u8FB9\u53EF\u8DD1", () => {
57
- const spec = findTopLevelSpec("debug");
58
- assert.equal(spec?.accent, "dev");
59
- assert.equal(canRunCommand(spec, { mode: "argv", ...tty }).ok, true);
60
- assert.equal(canRunCommand(spec, { mode: "repl", ...tty }).ok, true);
61
- });
62
- test("\u6A21\u5757\u9876\u5C42\u77ED\u547D\u4EE4\u6620\u5C04", () => {
63
- assert.equal(resolveModuleTopShorthand("i"), "install");
64
- assert.equal(resolveModuleTopShorthand("remove"), "uninstall");
65
- assert.equal(resolveModuleTopShorthand("search"), "search");
66
- assert.equal(resolveModuleTopShorthand("status"), void 0);
67
- });
68
- test("logs \u4EC5 REPL\uFF08\u65E0\u53C2\u53F6\u547D\u4EE4\uFF09", () => {
69
- assert.ok(gateTopLevel("logs", "argv"), "argv \u5E94\u62D2\u7EDD logs");
70
- assert.equal(gateTopLevel("logs", "repl"), null);
71
- const logs = listPaletteRoots("repl").find((n) => n.token === "logs");
72
- assert.ok(logs);
73
- assert.equal(logs.children, void 0);
74
- assert.notEqual(logs.freeArgs, true);
75
- });
76
- test("\u547D\u4EE4\u9762\u677F\u6839\u5217\u4E0D\u542B module \u77ED\u547D\u4EE4\uFF0C\u7EDF\u4E00\u6302\u5728 /module", () => {
77
- const roots = listPaletteRoots("repl");
78
- const tokens = roots.map((n) => n.token);
79
- for (const shy of ["install", "uninstall", "search", "verify", "link", "create", "dev"]) {
80
- assert.ok(!tokens.includes(shy), `\u9762\u677F\u6839\u5217\u4E0D\u5E94\u6709 /${shy}`);
81
- }
82
- const mod = roots.find((n) => n.token === "module");
83
- assert.ok(mod?.children?.length);
84
- const childTokens = mod.children.map((n) => n.token);
85
- assert.ok(childTokens.includes("install"));
86
- assert.ok(childTokens.includes("uninstall"));
87
- assert.ok(!childTokens.includes("create"));
88
- assert.ok(!childTokens.includes("link"));
89
- assert.ok(!childTokens.includes("dev"));
90
- assert.equal(mod.label, "/module");
91
- });
92
- //# sourceMappingURL=command-surface.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/command-surface.test.ts"],
4
- "sourcesContent": ["/**\n * command-surface \u901A\u9053\u95E8\u7981\u7EAF\u51FD\u6570\u8868\u9A71\u52A8\n */\nimport assert from \"node:assert/strict\";\nimport test from \"node:test\";\nimport { gateTopLevel } from \"./cli-gate.js\";\nimport {\n canRunCommand,\n findModuleSubSpec,\n findTopLevelSpec,\n listPaletteRoots,\n listVisibleModuleSubs,\n listVisibleTopLevelNames,\n resolveModuleTopShorthand,\n} from \"./command-surface.js\";\n\nconst tty = { isTty: true };\nconst noTty = { isTty: false };\n\ntest(\"install \u4E24\u8FB9\u53EF\u7528\uFF08both\uFF09\", () => {\n const spec = findModuleSubSpec(\"install\");\n assert.ok(spec);\n assert.equal(canRunCommand(spec, { mode: \"argv\", ...tty }).ok, true);\n assert.equal(canRunCommand(spec, { mode: \"repl\", ...tty }).ok, true);\n});\n\ntest(\"send \u4EC5 REPL\uFF1Aargv \u62D2\u7EDD\", () => {\n const spec = findTopLevelSpec(\"send\");\n assert.ok(spec);\n const r = canRunCommand(spec, { mode: \"argv\", ...tty });\n assert.equal(r.ok, false);\n assert.equal(r.reason, \"replOnly\");\n assert.equal(canRunCommand(spec, { mode: \"repl\", ...tty }).ok, true);\n});\n\ntest(\"status \u4E24\u8FB9\u53EF\u7528\", () => {\n const spec = findTopLevelSpec(\"status\");\n assert.ok(spec);\n assert.equal(canRunCommand(spec, { mode: \"argv\", ...tty }).ok, true);\n assert.equal(canRunCommand(spec, { mode: \"repl\", ...tty }).ok, true);\n});\n\ntest(\"build/reload/install \u5728 REPL \u53EF\u89C1\", () => {\n const build = findModuleSubSpec(\"build\");\n assert.equal(build?.accent, \"dev\");\n assert.equal(canRunCommand(build, { mode: \"repl\", ...tty }).ok, true);\n assert.ok(listVisibleModuleSubs(\"repl\").includes(\"build\"));\n assert.ok(listVisibleModuleSubs(\"repl\").includes(\"install\"));\n});\n\ntest(\"argv \u9876\u5C42\u5217\u8868\u4E0D\u542B send\uFF1B\u542B debug/install/uninstall\", () => {\n const names = listVisibleTopLevelNames(\"argv\");\n assert.ok(!names.includes(\"send\"));\n assert.ok(names.includes(\"debug\"));\n assert.ok(names.includes(\"install\"));\n assert.ok(names.includes(\"uninstall\") || names.includes(\"remove\"));\n assert.ok(names.includes(\"module\") || names.includes(\"mod\"));\n});\n\ntest(\"REPL \u9876\u5C42\u5217\u8868\u542B send \u4E0E debug\", () => {\n const names = listVisibleTopLevelNames(\"repl\");\n assert.ok(names.includes(\"send\"));\n assert.ok(names.includes(\"debug\"));\n assert.ok(names.includes(\"init\"));\n});\n\ntest(\"accent \u4E0D\u53C2\u4E0E canRun\uFF1Adebug \u4E24\u8FB9\u53EF\u8DD1\", () => {\n const spec = findTopLevelSpec(\"debug\");\n assert.equal(spec?.accent, \"dev\");\n assert.equal(canRunCommand(spec, { mode: \"argv\", ...tty }).ok, true);\n assert.equal(canRunCommand(spec, { mode: \"repl\", ...tty }).ok, true);\n});\n\ntest(\"\u6A21\u5757\u9876\u5C42\u77ED\u547D\u4EE4\u6620\u5C04\", () => {\n assert.equal(resolveModuleTopShorthand(\"i\"), \"install\");\n assert.equal(resolveModuleTopShorthand(\"remove\"), \"uninstall\");\n assert.equal(resolveModuleTopShorthand(\"search\"), \"search\");\n assert.equal(resolveModuleTopShorthand(\"status\"), undefined);\n});\n\ntest(\"logs \u4EC5 REPL\uFF08\u65E0\u53C2\u53F6\u547D\u4EE4\uFF09\", () => {\n assert.ok(gateTopLevel(\"logs\", \"argv\"), \"argv \u5E94\u62D2\u7EDD logs\");\n assert.equal(gateTopLevel(\"logs\", \"repl\"), null);\n const logs = listPaletteRoots(\"repl\").find((n) => n.token === \"logs\");\n assert.ok(logs);\n assert.equal(logs.children, undefined);\n assert.notEqual(logs.freeArgs, true);\n});\n\ntest(\"\u547D\u4EE4\u9762\u677F\u6839\u5217\u4E0D\u542B module \u77ED\u547D\u4EE4\uFF0C\u7EDF\u4E00\u6302\u5728 /module\", () => {\n const roots = listPaletteRoots(\"repl\");\n const tokens = roots.map((n) => n.token);\n for (const shy of [\"install\", \"uninstall\", \"search\", \"verify\", \"link\", \"create\", \"dev\"]) {\n assert.ok(!tokens.includes(shy), `\u9762\u677F\u6839\u5217\u4E0D\u5E94\u6709 /${shy}`);\n }\n const mod = roots.find((n) => n.token === \"module\");\n assert.ok(mod?.children?.length);\n const childTokens = mod.children.map((n) => n.token);\n assert.ok(childTokens.includes(\"install\"));\n assert.ok(childTokens.includes(\"uninstall\"));\n assert.ok(!childTokens.includes(\"create\"));\n assert.ok(!childTokens.includes(\"link\"));\n assert.ok(!childTokens.includes(\"dev\"));\n assert.equal(mod.label, \"/module\");\n});\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,76 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import fs from "node:fs";
3
- import os from "node:os";
4
- import path from "node:path";
5
- import test from "node:test";
6
- import { cmdDebug, isDebugTruthy } from "./debug-command.js";
7
- function setupSfmcRoot(bdsRoot) {
8
- const root = fs.mkdtempSync(path.join(os.tmpdir(), "sfmc-debug-"));
9
- fs.mkdirSync(path.join(root, "configs"), { recursive: true });
10
- fs.writeFileSync(
11
- path.join(root, "configs", "bds_updater.json"),
12
- JSON.stringify({ bds_path: bdsRoot.replace(/\\/g, "/") }, null, 2)
13
- );
14
- return root;
15
- }
16
- test("isDebugTruthy \u4E0E SDK \u5951\u7EA6\u4E00\u81F4", () => {
17
- assert.equal(isDebugTruthy(true), true);
18
- assert.equal(isDebugTruthy(1), true);
19
- assert.equal(isDebugTruthy("yes"), true);
20
- assert.equal(isDebugTruthy("on"), true);
21
- assert.equal(isDebugTruthy(false), false);
22
- assert.equal(isDebugTruthy("no"), false);
23
- });
24
- test("debug enable/disable/status \u5199 BDS variables.json", async () => {
25
- const bdsRoot = fs.mkdtempSync(path.join(os.tmpdir(), "sfmc-bds-"));
26
- const sfmcRoot = setupSfmcRoot(bdsRoot);
27
- const prev = process.env.SFMC_ROOT;
28
- process.env.SFMC_ROOT = sfmcRoot;
29
- try {
30
- const variablesPath = path.join(bdsRoot, "config", "default", "variables.json");
31
- await cmdDebug(["enable"]);
32
- const afterEnable = JSON.parse(fs.readFileSync(variablesPath, "utf8"));
33
- assert.equal(afterEnable.sfmc_debug, true);
34
- const statusOn = await cmdDebug(["status"]);
35
- assert.match(statusOn, /sfmc_debug/i);
36
- await cmdDebug(["disable"]);
37
- const afterDisable = JSON.parse(fs.readFileSync(variablesPath, "utf8"));
38
- assert.equal(afterDisable.sfmc_debug, false);
39
- } finally {
40
- if (prev === void 0) delete process.env.SFMC_ROOT;
41
- else process.env.SFMC_ROOT = prev;
42
- }
43
- });
44
- test("debug sentry on/off \u5199 BDS secrets.json", async () => {
45
- const bdsRoot = fs.mkdtempSync(path.join(os.tmpdir(), "sfmc-bds-"));
46
- const sfmcRoot = setupSfmcRoot(bdsRoot);
47
- const prev = process.env.SFMC_ROOT;
48
- process.env.SFMC_ROOT = sfmcRoot;
49
- try {
50
- const secretsPath = path.join(bdsRoot, "config", "default", "secrets.json");
51
- const dsn = "https://example@o123.ingest.sentry.io/456";
52
- await cmdDebug(["sentry", "on", "--dsn", dsn]);
53
- const afterOn = JSON.parse(fs.readFileSync(secretsPath, "utf8"));
54
- assert.equal(afterOn.SENTRY_DSN, dsn);
55
- await cmdDebug(["sentry", "off"]);
56
- const afterOff = JSON.parse(fs.readFileSync(secretsPath, "utf8"));
57
- assert.equal("SENTRY_DSN" in afterOff, false);
58
- } finally {
59
- if (prev === void 0) delete process.env.SFMC_ROOT;
60
- else process.env.SFMC_ROOT = prev;
61
- }
62
- });
63
- test("debug sentry on \u7F3A --dsn \u62A5\u9519", async () => {
64
- const bdsRoot = fs.mkdtempSync(path.join(os.tmpdir(), "sfmc-bds-"));
65
- const sfmcRoot = setupSfmcRoot(bdsRoot);
66
- const prev = process.env.SFMC_ROOT;
67
- process.env.SFMC_ROOT = sfmcRoot;
68
- try {
69
- const out = await cmdDebug(["sentry", "on"]);
70
- assert.match(out, /--dsn|required|需要/i);
71
- } finally {
72
- if (prev === void 0) delete process.env.SFMC_ROOT;
73
- else process.env.SFMC_ROOT = prev;
74
- }
75
- });
76
- //# sourceMappingURL=debug-command.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/debug-command.test.ts"],
4
- "sourcesContent": ["/**\n * debug-command BDS variables.json / secrets.json \u8BFB\u5199\n */\nimport assert from \"node:assert/strict\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport test from \"node:test\";\nimport { cmdDebug, isDebugTruthy } from \"./debug-command.js\";\n\nfunction setupSfmcRoot(bdsRoot: string): string {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), \"sfmc-debug-\"));\n fs.mkdirSync(path.join(root, \"configs\"), { recursive: true });\n fs.writeFileSync(\n path.join(root, \"configs\", \"bds_updater.json\"),\n JSON.stringify({ bds_path: bdsRoot.replace(/\\\\/g, \"/\") }, null, 2)\n );\n return root;\n}\n\ntest(\"isDebugTruthy \u4E0E SDK \u5951\u7EA6\u4E00\u81F4\", () => {\n assert.equal(isDebugTruthy(true), true);\n assert.equal(isDebugTruthy(1), true);\n assert.equal(isDebugTruthy(\"yes\"), true);\n assert.equal(isDebugTruthy(\"on\"), true);\n assert.equal(isDebugTruthy(false), false);\n assert.equal(isDebugTruthy(\"no\"), false);\n});\n\ntest(\"debug enable/disable/status \u5199 BDS variables.json\", async () => {\n const bdsRoot = fs.mkdtempSync(path.join(os.tmpdir(), \"sfmc-bds-\"));\n const sfmcRoot = setupSfmcRoot(bdsRoot);\n const prev = process.env.SFMC_ROOT;\n process.env.SFMC_ROOT = sfmcRoot;\n\n try {\n const variablesPath = path.join(bdsRoot, \"config\", \"default\", \"variables.json\");\n\n await cmdDebug([\"enable\"]);\n const afterEnable = JSON.parse(fs.readFileSync(variablesPath, \"utf8\")) as { sfmc_debug?: boolean };\n assert.equal(afterEnable.sfmc_debug, true);\n\n const statusOn = await cmdDebug([\"status\"]);\n assert.match(statusOn, /sfmc_debug/i);\n\n await cmdDebug([\"disable\"]);\n const afterDisable = JSON.parse(fs.readFileSync(variablesPath, \"utf8\")) as { sfmc_debug?: boolean };\n assert.equal(afterDisable.sfmc_debug, false);\n } finally {\n if (prev === undefined) delete process.env.SFMC_ROOT;\n else process.env.SFMC_ROOT = prev;\n }\n});\n\ntest(\"debug sentry on/off \u5199 BDS secrets.json\", async () => {\n const bdsRoot = fs.mkdtempSync(path.join(os.tmpdir(), \"sfmc-bds-\"));\n const sfmcRoot = setupSfmcRoot(bdsRoot);\n const prev = process.env.SFMC_ROOT;\n process.env.SFMC_ROOT = sfmcRoot;\n\n try {\n const secretsPath = path.join(bdsRoot, \"config\", \"default\", \"secrets.json\");\n const dsn = \"https://example@o123.ingest.sentry.io/456\";\n\n await cmdDebug([\"sentry\", \"on\", \"--dsn\", dsn]);\n const afterOn = JSON.parse(fs.readFileSync(secretsPath, \"utf8\")) as { SENTRY_DSN?: string };\n assert.equal(afterOn.SENTRY_DSN, dsn);\n\n await cmdDebug([\"sentry\", \"off\"]);\n const afterOff = JSON.parse(fs.readFileSync(secretsPath, \"utf8\")) as Record<string, unknown>;\n assert.equal(\"SENTRY_DSN\" in afterOff, false);\n } finally {\n if (prev === undefined) delete process.env.SFMC_ROOT;\n else process.env.SFMC_ROOT = prev;\n }\n});\n\ntest(\"debug sentry on \u7F3A --dsn \u62A5\u9519\", async () => {\n const bdsRoot = fs.mkdtempSync(path.join(os.tmpdir(), \"sfmc-bds-\"));\n const sfmcRoot = setupSfmcRoot(bdsRoot);\n const prev = process.env.SFMC_ROOT;\n process.env.SFMC_ROOT = sfmcRoot;\n\n try {\n const out = await cmdDebug([\"sentry\", \"on\"]);\n assert.match(out, /--dsn|required|\u9700\u8981/i);\n } finally {\n if (prev === undefined) delete process.env.SFMC_ROOT;\n else process.env.SFMC_ROOT = prev;\n }\n});\n"],
5
- "mappings": "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",
6
- "names": []
7
- }