@sfmc-bds/cli 0.2.0-beta.19 → 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 (75) 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/command-surface.d.ts.map +1 -1
  6. package/dist/command-surface.js +2 -0
  7. package/dist/command-surface.js.map +2 -2
  8. package/dist/commands.d.ts.map +1 -1
  9. package/dist/commands.js +78 -75
  10. package/dist/commands.js.map +2 -2
  11. package/dist/i18n/locales/en.d.ts +8 -0
  12. package/dist/i18n/locales/en.d.ts.map +1 -1
  13. package/dist/i18n/locales/en.js +8 -0
  14. package/dist/i18n/locales/en.js.map +2 -2
  15. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  16. package/dist/i18n/locales/zh-CN.js +8 -0
  17. package/dist/i18n/locales/zh-CN.js.map +2 -2
  18. package/dist/llbot-launch.d.ts +3 -3
  19. package/dist/llbot-launch.js.map +1 -1
  20. package/dist/logs.js +3 -3
  21. package/dist/logs.js.map +2 -2
  22. package/dist/main.js +5 -0
  23. package/dist/main.js.map +2 -2
  24. package/dist/repl-windows/service-window.d.ts.map +1 -1
  25. package/dist/repl-windows/service-window.js +1 -0
  26. package/dist/repl-windows/service-window.js.map +2 -2
  27. package/dist/repl.d.ts.map +1 -1
  28. package/dist/repl.js +23 -12
  29. package/dist/repl.js.map +2 -2
  30. package/dist/send-target.d.ts.map +1 -1
  31. package/dist/send-target.js +2 -0
  32. package/dist/send-target.js.map +2 -2
  33. package/dist/services.d.ts +8 -1
  34. package/dist/services.d.ts.map +1 -1
  35. package/dist/services.js +151 -15
  36. package/dist/services.js.map +2 -2
  37. package/dist/ui-command.d.ts +6 -0
  38. package/dist/ui-command.d.ts.map +1 -0
  39. package/dist/ui-command.js +68 -0
  40. package/dist/ui-command.js.map +7 -0
  41. package/dist/wizard.d.ts.map +1 -1
  42. package/dist/wizard.js +15 -8
  43. package/dist/wizard.js.map +2 -2
  44. package/package.json +4 -5
  45. package/scripts/module-install/lib/catalog.mjs +1 -1
  46. package/dist/command-surface.test.js +0 -92
  47. package/dist/command-surface.test.js.map +0 -7
  48. package/dist/debug-command.test.js +0 -76
  49. package/dist/debug-command.test.js.map +0 -7
  50. package/dist/log-filter.test.js +0 -181
  51. package/dist/log-filter.test.js.map +0 -7
  52. package/dist/log-translator.test.js +0 -120
  53. package/dist/log-translator.test.js.map +0 -7
  54. package/dist/logs-blank-line.test.js +0 -16
  55. package/dist/logs-blank-line.test.js.map +0 -7
  56. package/dist/module-toggle.test.js +0 -37
  57. package/dist/module-toggle.test.js.map +0 -7
  58. package/dist/pack-bundle.test.js +0 -111
  59. package/dist/pack-bundle.test.js.map +0 -7
  60. package/dist/player-session.test.js +0 -19
  61. package/dist/player-session.test.js.map +0 -7
  62. package/dist/repl-windows/host.test.js +0 -72
  63. package/dist/repl-windows/host.test.js.map +0 -7
  64. package/dist/services-output.test.js +0 -9
  65. package/dist/services-output.test.js.map +0 -7
  66. package/dist/world-packs-list.test.js +0 -11
  67. package/dist/world-packs-list.test.js.map +0 -7
  68. package/dist/world-packs-uninstall.test.js +0 -54
  69. package/dist/world-packs-uninstall.test.js.map +0 -7
  70. package/scripts/module-install/test/check-modules-config.test.ts +0 -46
  71. package/scripts/module-install/test/config-seeding.test.ts +0 -99
  72. package/scripts/module-install/test/install-resolver.test.ts +0 -47
  73. package/scripts/module-install/test/link-local.test.ts +0 -50
  74. package/scripts/module-install/test/local-resolver.test.ts +0 -44
  75. 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/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": "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",
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.19",
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.16",
56
- "@sfmc-bds/sdk": "0.2.0-beta.16"
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.17"
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
- }
@@ -1,181 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import test from "node:test";
3
- import { compileLogFilterRegex, evaluateLogFilter } from "./log-filter.js";
4
- const entry = (over = {}) => ({
5
- text: "Player connected: Steve",
6
- source: "bds",
7
- level: "info",
8
- ...over
9
- });
10
- const baseCfg = (over = {}) => ({
11
- enabled: true,
12
- mode: "drop",
13
- applyTo: "display",
14
- rules: [],
15
- ...over
16
- });
17
- test("enabled=false \u6C38\u4E0D\u4E22\u5F03", () => {
18
- const r = evaluateLogFilter(
19
- entry(),
20
- baseCfg({
21
- enabled: false,
22
- mode: "keep",
23
- rules: [{ sources: ["bds"] }]
24
- })
25
- );
26
- assert.equal(r.dropDisplay, false);
27
- assert.equal(r.dropDisk, false);
28
- });
29
- test("drop \xD7 sources \u547D\u4E2D\u5219\u4E22\u5F03\u5C55\u793A", () => {
30
- const r = evaluateLogFilter(entry(), baseCfg({ rules: [{ sources: ["bds", "pack"] }] }));
31
- assert.equal(r.matched, true);
32
- assert.equal(r.dropDisplay, true);
33
- assert.equal(r.dropDisk, false);
34
- });
35
- test("drop \xD7 sources \u672A\u547D\u4E2D\u5219\u4FDD\u7559", () => {
36
- const r = evaluateLogFilter(entry({ source: "system" }), baseCfg({ rules: [{ sources: ["bds"] }] }));
37
- assert.equal(r.matched, false);
38
- assert.equal(r.dropDisplay, false);
39
- });
40
- test("drop \xD7 levels", () => {
41
- const hit = evaluateLogFilter(entry({ level: "debug" }), baseCfg({ rules: [{ levels: ["debug", "info"] }] }));
42
- const miss = evaluateLogFilter(entry({ level: "error" }), baseCfg({ rules: [{ levels: ["debug"] }] }));
43
- assert.equal(hit.dropDisplay, true);
44
- assert.equal(miss.dropDisplay, false);
45
- });
46
- test("drop \xD7 contains\uFF08\u5927\u5C0F\u5199\u654F\u611F\uFF09", () => {
47
- const hit = evaluateLogFilter(entry(), baseCfg({ rules: [{ contains: "Player connected" }] }));
48
- const miss = evaluateLogFilter(entry(), baseCfg({ rules: [{ contains: "player connected" }] }));
49
- assert.equal(hit.dropDisplay, true);
50
- assert.equal(miss.dropDisplay, false);
51
- });
52
- test("drop \xD7 regex \u4E0E (?i) \u65D7\u6807", () => {
53
- const hit = evaluateLogFilter(
54
- entry({ text: "GAMERULE keepInventory" }),
55
- baseCfg({ rules: [{ regex: "(?i)gamerule|syntax error" }] })
56
- );
57
- const miss = evaluateLogFilter(entry({ text: "hello" }), baseCfg({ rules: [{ regex: "(?i)gamerule" }] }));
58
- assert.equal(hit.dropDisplay, true);
59
- assert.equal(miss.dropDisplay, false);
60
- assert.ok(compileLogFilterRegex("(?i)ABC")?.test("abc"));
61
- assert.equal(compileLogFilterRegex("("), null);
62
- });
63
- test("\u540C\u6761 AND\uFF1Asources + contains \u987B\u540C\u65F6\u6EE1\u8DB3", () => {
64
- const both = evaluateLogFilter(entry(), baseCfg({ rules: [{ sources: ["bds"], contains: "Player" }] }));
65
- const onlySource = evaluateLogFilter(
66
- entry({ text: "nope" }),
67
- baseCfg({ rules: [{ sources: ["bds"], contains: "Player" }] })
68
- );
69
- assert.equal(both.dropDisplay, true);
70
- assert.equal(onlySource.dropDisplay, false);
71
- });
72
- test("\u591A\u6761 OR\uFF1A\u4EFB\u4E00\u547D\u4E2D\u5373\u53EF", () => {
73
- const r = evaluateLogFilter(
74
- entry({ source: "pack", text: "done" }),
75
- baseCfg({
76
- rules: [{ sources: ["bds"] }, { sources: ["pack"], contains: "done" }]
77
- })
78
- );
79
- assert.equal(r.matched, true);
80
- assert.equal(r.dropDisplay, true);
81
- });
82
- test("rule.enabled=false \u8DF3\u8FC7", () => {
83
- const r = evaluateLogFilter(entry(), baseCfg({ rules: [{ enabled: false, sources: ["bds"] }] }));
84
- assert.equal(r.matched, false);
85
- assert.equal(r.dropDisplay, false);
86
- });
87
- test("keep \u6A21\u5F0F\uFF1A\u4EC5\u4FDD\u7559\u5339\u914D\uFF0C\u672A\u5339\u914D\u4E22\u5F03", () => {
88
- const cfg = baseCfg({
89
- mode: "keep",
90
- rules: [{ levels: ["error"] }]
91
- });
92
- const keep = evaluateLogFilter(entry({ level: "error" }), cfg);
93
- const drop = evaluateLogFilter(entry({ level: "info" }), cfg);
94
- assert.equal(keep.dropDisplay, false);
95
- assert.equal(drop.dropDisplay, true);
96
- });
97
- test("applyTo=all \u65F6\u843D\u76D8\u4E0E\u5C55\u793A\u4E00\u5E76\u8FC7\u6EE4", () => {
98
- const r = evaluateLogFilter(
99
- entry(),
100
- baseCfg({
101
- applyTo: "all",
102
- rules: [{ sources: ["bds"] }]
103
- })
104
- );
105
- assert.equal(r.dropDisplay, true);
106
- assert.equal(r.dropDisk, true);
107
- });
108
- test("applyTo=display \u65F6\u4EC5\u5F71\u54CD\u5C55\u793A", () => {
109
- const r = evaluateLogFilter(
110
- entry(),
111
- baseCfg({
112
- applyTo: "display",
113
- rules: [{ sources: ["bds"] }]
114
- })
115
- );
116
- assert.equal(r.dropDisplay, true);
117
- assert.equal(r.dropDisk, false);
118
- });
119
- test("evaluateLogFilter: \u5185\u7F6E BDS \u7FFB\u8BD1\u81EA\u52A8\u751F\u6548", () => {
120
- const r = evaluateLogFilter(
121
- entry({
122
- source: "bds",
123
- text: "Server started."
124
- }),
125
- baseCfg({
126
- enabled: false,
127
- translate: true
128
- })
129
- );
130
- assert.equal(r.transformedEntry.text, "[\u670D\u52A1\u7AEF] BDS \u670D\u52A1\u7AEF\u5DF2\u6210\u529F\u542F\u52A8\uFF0C\u51C6\u5907\u5C31\u7EEA\u3002");
131
- });
132
- test("evaluateLogFilter: \u81EA\u5B9A\u4E49 rule.replace \u4F18\u5148\u4E8E\u5185\u7F6E\u7FFB\u8BD1", () => {
133
- const r = evaluateLogFilter(
134
- entry({
135
- source: "bds",
136
- text: "Server started."
137
- }),
138
- baseCfg({
139
- enabled: true,
140
- rules: [
141
- {
142
- sources: ["bds"],
143
- contains: "Server started.",
144
- replace: ">> \u670D\u52A1\u5668\u51C6\u5907\u5B8C\u6BD5 <<"
145
- }
146
- ]
147
- })
148
- );
149
- assert.equal(r.transformedEntry.text, ">> \u670D\u52A1\u5668\u51C6\u5907\u5B8C\u6BD5 <<");
150
- });
151
- test("evaluateLogFilter: \u81EA\u5B9A\u4E49 rule.replace \u652F\u6301\u6B63\u5219\u6355\u83B7\u7EC4", () => {
152
- const r = evaluateLogFilter(
153
- entry({
154
- source: "system",
155
- text: "Job backup_world completed in 42ms"
156
- }),
157
- baseCfg({
158
- enabled: true,
159
- rules: [
160
- {
161
- regex: "Job (\\w+) completed in (\\d+)ms",
162
- replace: "\u4EFB\u52A1 $1 \u5B8C\u6210 (\u8017\u65F6: $2\u6BEB\u79D2)"
163
- }
164
- ]
165
- })
166
- );
167
- assert.equal(r.transformedEntry.text, "\u4EFB\u52A1 backup_world \u5B8C\u6210 (\u8017\u65F6: 42\u6BEB\u79D2)");
168
- });
169
- test("evaluateLogFilter: translate=false \u65F6\u4E0D\u89E6\u53D1\u5185\u7F6E\u7FFB\u8BD1", () => {
170
- const r = evaluateLogFilter(
171
- entry({
172
- source: "bds",
173
- text: "Server started."
174
- }),
175
- baseCfg({
176
- translate: false
177
- })
178
- );
179
- assert.equal(r.transformedEntry.text, "Server started.");
180
- });
181
- //# sourceMappingURL=log-filter.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/log-filter.test.ts"],
4
- "sourcesContent": ["/**\n * log-filter \u7EAF\u51FD\u6570\u8868\u9A71\u52A8\uFF08\u4E0D\u6D4B IO\uFF09\n */\nimport assert from \"node:assert/strict\";\nimport test from \"node:test\";\nimport { compileLogFilterRegex, evaluateLogFilter } from \"./log-filter.js\";\n\nconst entry = (over: Record<string, unknown> = {}) => ({\n text: \"Player connected: Steve\",\n source: \"bds\",\n level: \"info\",\n ...over,\n});\n\nconst baseCfg = (over: Record<string, unknown> = {}) => ({\n enabled: true,\n mode: \"drop\",\n applyTo: \"display\",\n rules: [],\n ...over,\n});\n\ntest(\"enabled=false \u6C38\u4E0D\u4E22\u5F03\", () => {\n const r = evaluateLogFilter(\n entry(),\n baseCfg({\n enabled: false,\n mode: \"keep\",\n rules: [{ sources: [\"bds\"] }],\n })\n );\n assert.equal(r.dropDisplay, false);\n assert.equal(r.dropDisk, false);\n});\n\ntest(\"drop \u00D7 sources \u547D\u4E2D\u5219\u4E22\u5F03\u5C55\u793A\", () => {\n const r = evaluateLogFilter(entry(), baseCfg({ rules: [{ sources: [\"bds\", \"pack\"] }] }));\n assert.equal(r.matched, true);\n assert.equal(r.dropDisplay, true);\n assert.equal(r.dropDisk, false);\n});\n\ntest(\"drop \u00D7 sources \u672A\u547D\u4E2D\u5219\u4FDD\u7559\", () => {\n const r = evaluateLogFilter(entry({ source: \"system\" }), baseCfg({ rules: [{ sources: [\"bds\"] }] }));\n assert.equal(r.matched, false);\n assert.equal(r.dropDisplay, false);\n});\n\ntest(\"drop \u00D7 levels\", () => {\n const hit = evaluateLogFilter(entry({ level: \"debug\" }), baseCfg({ rules: [{ levels: [\"debug\", \"info\"] }] }));\n const miss = evaluateLogFilter(entry({ level: \"error\" }), baseCfg({ rules: [{ levels: [\"debug\"] }] }));\n assert.equal(hit.dropDisplay, true);\n assert.equal(miss.dropDisplay, false);\n});\n\ntest(\"drop \u00D7 contains\uFF08\u5927\u5C0F\u5199\u654F\u611F\uFF09\", () => {\n const hit = evaluateLogFilter(entry(), baseCfg({ rules: [{ contains: \"Player connected\" }] }));\n const miss = evaluateLogFilter(entry(), baseCfg({ rules: [{ contains: \"player connected\" }] }));\n assert.equal(hit.dropDisplay, true);\n assert.equal(miss.dropDisplay, false);\n});\n\ntest(\"drop \u00D7 regex \u4E0E (?i) \u65D7\u6807\", () => {\n const hit = evaluateLogFilter(\n entry({ text: \"GAMERULE keepInventory\" }),\n baseCfg({ rules: [{ regex: \"(?i)gamerule|syntax error\" }] })\n );\n const miss = evaluateLogFilter(entry({ text: \"hello\" }), baseCfg({ rules: [{ regex: \"(?i)gamerule\" }] }));\n assert.equal(hit.dropDisplay, true);\n assert.equal(miss.dropDisplay, false);\n assert.ok(compileLogFilterRegex(\"(?i)ABC\")?.test(\"abc\"));\n assert.equal(compileLogFilterRegex(\"(\"), null);\n});\n\ntest(\"\u540C\u6761 AND\uFF1Asources + contains \u987B\u540C\u65F6\u6EE1\u8DB3\", () => {\n const both = evaluateLogFilter(entry(), baseCfg({ rules: [{ sources: [\"bds\"], contains: \"Player\" }] }));\n const onlySource = evaluateLogFilter(\n entry({ text: \"nope\" }),\n baseCfg({ rules: [{ sources: [\"bds\"], contains: \"Player\" }] })\n );\n assert.equal(both.dropDisplay, true);\n assert.equal(onlySource.dropDisplay, false);\n});\n\ntest(\"\u591A\u6761 OR\uFF1A\u4EFB\u4E00\u547D\u4E2D\u5373\u53EF\", () => {\n const r = evaluateLogFilter(\n entry({ source: \"pack\", text: \"done\" }),\n baseCfg({\n rules: [{ sources: [\"bds\"] }, { sources: [\"pack\"], contains: \"done\" }],\n })\n );\n assert.equal(r.matched, true);\n assert.equal(r.dropDisplay, true);\n});\n\ntest(\"rule.enabled=false \u8DF3\u8FC7\", () => {\n const r = evaluateLogFilter(entry(), baseCfg({ rules: [{ enabled: false, sources: [\"bds\"] }] }));\n assert.equal(r.matched, false);\n assert.equal(r.dropDisplay, false);\n});\n\ntest(\"keep \u6A21\u5F0F\uFF1A\u4EC5\u4FDD\u7559\u5339\u914D\uFF0C\u672A\u5339\u914D\u4E22\u5F03\", () => {\n const cfg = baseCfg({\n mode: \"keep\",\n rules: [{ levels: [\"error\"] }],\n });\n const keep = evaluateLogFilter(entry({ level: \"error\" }), cfg);\n const drop = evaluateLogFilter(entry({ level: \"info\" }), cfg);\n assert.equal(keep.dropDisplay, false);\n assert.equal(drop.dropDisplay, true);\n});\n\ntest(\"applyTo=all \u65F6\u843D\u76D8\u4E0E\u5C55\u793A\u4E00\u5E76\u8FC7\u6EE4\", () => {\n const r = evaluateLogFilter(\n entry(),\n baseCfg({\n applyTo: \"all\",\n rules: [{ sources: [\"bds\"] }],\n })\n );\n assert.equal(r.dropDisplay, true);\n assert.equal(r.dropDisk, true);\n});\n\ntest(\"applyTo=display \u65F6\u4EC5\u5F71\u54CD\u5C55\u793A\", () => {\n const r = evaluateLogFilter(\n entry(),\n baseCfg({\n applyTo: \"display\",\n rules: [{ sources: [\"bds\"] }],\n })\n );\n assert.equal(r.dropDisplay, true);\n assert.equal(r.dropDisk, false);\n});\n\ntest(\"evaluateLogFilter: \u5185\u7F6E BDS \u7FFB\u8BD1\u81EA\u52A8\u751F\u6548\", () => {\n const r = evaluateLogFilter(\n entry({\n source: \"bds\",\n text: \"Server started.\",\n }),\n baseCfg({\n enabled: false,\n translate: true,\n })\n );\n assert.equal(r.transformedEntry.text, \"[\u670D\u52A1\u7AEF] BDS \u670D\u52A1\u7AEF\u5DF2\u6210\u529F\u542F\u52A8\uFF0C\u51C6\u5907\u5C31\u7EEA\u3002\");\n});\n\ntest(\"evaluateLogFilter: \u81EA\u5B9A\u4E49 rule.replace \u4F18\u5148\u4E8E\u5185\u7F6E\u7FFB\u8BD1\", () => {\n const r = evaluateLogFilter(\n entry({\n source: \"bds\",\n text: \"Server started.\",\n }),\n baseCfg({\n enabled: true,\n rules: [\n {\n sources: [\"bds\"],\n contains: \"Server started.\",\n replace: \">> \u670D\u52A1\u5668\u51C6\u5907\u5B8C\u6BD5 <<\",\n },\n ],\n })\n );\n assert.equal(r.transformedEntry.text, \">> \u670D\u52A1\u5668\u51C6\u5907\u5B8C\u6BD5 <<\");\n});\n\ntest(\"evaluateLogFilter: \u81EA\u5B9A\u4E49 rule.replace \u652F\u6301\u6B63\u5219\u6355\u83B7\u7EC4\", () => {\n const r = evaluateLogFilter(\n entry({\n source: \"system\",\n text: \"Job backup_world completed in 42ms\",\n }),\n baseCfg({\n enabled: true,\n rules: [\n {\n regex: \"Job (\\\\w+) completed in (\\\\d+)ms\",\n replace: \"\u4EFB\u52A1 $1 \u5B8C\u6210 (\u8017\u65F6: $2\u6BEB\u79D2)\",\n },\n ],\n })\n );\n assert.equal(r.transformedEntry.text, \"\u4EFB\u52A1 backup_world \u5B8C\u6210 (\u8017\u65F6: 42\u6BEB\u79D2)\");\n});\n\ntest(\"evaluateLogFilter: translate=false \u65F6\u4E0D\u89E6\u53D1\u5185\u7F6E\u7FFB\u8BD1\", () => {\n const r = evaluateLogFilter(\n entry({\n source: \"bds\",\n text: \"Server started.\",\n }),\n baseCfg({\n translate: false,\n })\n );\n assert.equal(r.transformedEntry.text, \"Server started.\");\n});\n"],
5
- "mappings": "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",
6
- "names": []
7
- }