@sfmc-bds/cli 0.2.0-beta.12 → 0.2.0-beta.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/command-surface.js +1 -1
- package/dist/command-surface.js.map +2 -2
- package/dist/i18n/locales/en.d.ts +10 -0
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +10 -0
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
- package/dist/i18n/locales/zh-CN.js +11 -1
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/log-filter.d.ts +18 -2
- package/dist/log-filter.d.ts.map +1 -1
- package/dist/log-filter.js +54 -4
- package/dist/log-filter.js.map +2 -2
- package/dist/log-filter.test.js +62 -0
- package/dist/log-filter.test.js.map +2 -2
- package/dist/log-translator.d.ts +36 -0
- package/dist/log-translator.d.ts.map +1 -0
- package/dist/log-translator.js +279 -0
- package/dist/log-translator.js.map +7 -0
- package/dist/log-translator.test.js +120 -0
- package/dist/log-translator.test.js.map +7 -0
- package/dist/logs.d.ts.map +1 -1
- package/dist/logs.js +13 -7
- package/dist/logs.js.map +2 -2
- package/dist/module-commands.d.ts.map +1 -1
- package/dist/module-commands.js +16 -5
- package/dist/module-commands.js.map +2 -2
- package/dist/module-fingerprint.d.ts.map +1 -1
- package/dist/module-fingerprint.js +1 -0
- package/dist/module-fingerprint.js.map +2 -2
- package/dist/module-pack-build.d.ts +14 -4
- package/dist/module-pack-build.d.ts.map +1 -1
- package/dist/module-pack-build.js +65 -61
- package/dist/module-pack-build.js.map +2 -2
- package/dist/pack-bundle.test.js +105 -0
- package/dist/pack-bundle.test.js.map +7 -0
- package/dist/pack-lifecycle.d.ts +14 -1
- package/dist/pack-lifecycle.d.ts.map +1 -1
- package/dist/pack-lifecycle.js +227 -11
- package/dist/pack-lifecycle.js.map +2 -2
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +4 -1
- package/dist/registry.js.map +2 -2
- package/dist/repl-windows/format-display.d.ts.map +1 -1
- package/dist/repl-windows/format-display.js +5 -1
- package/dist/repl-windows/format-display.js.map +2 -2
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +10 -0
- package/dist/runtime.js.map +2 -2
- package/dist/sfmc-modules-root.d.ts.map +1 -1
- package/dist/sfmc-modules-root.js +6 -2
- package/dist/sfmc-modules-root.js.map +2 -2
- package/dist/world-packs.d.ts.map +1 -1
- package/dist/world-packs.js +84 -13
- package/dist/world-packs.js.map +3 -3
- package/package.json +5 -4
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,QAAA,MAAM,qBAAqB,yBAAyB,CAAC;AACrD,QAAA,MAAM,oBAAoB,SAAS,CAAC;AAGpC,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AACD,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAyB1D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CA8B/D;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,QAAA,MAAM,qBAAqB,yBAAyB,CAAC;AACrD,QAAA,MAAM,oBAAoB,SAAS,CAAC;AAGpC,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AACD,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAyB1D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CA8B/D;AAWD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,iFAAiF;IACjF,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAmB9F;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAIpD;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQlF;AAED,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,CAAC"}
|
package/dist/registry.js
CHANGED
|
@@ -55,7 +55,10 @@ function parseRegistryIndex(json) {
|
|
|
55
55
|
return filtered;
|
|
56
56
|
}
|
|
57
57
|
async function fetchFresh() {
|
|
58
|
-
const res = await fetch(INDEX_URL, {
|
|
58
|
+
const res = await fetch(INDEX_URL, {
|
|
59
|
+
headers: { "User-Agent": "sfmc-cli" },
|
|
60
|
+
signal: AbortSignal.timeout(3e3)
|
|
61
|
+
});
|
|
59
62
|
if (!res.ok) throw new Error(`HTTP ${res.status} for ${INDEX_URL}`);
|
|
60
63
|
return parseRegistryIndex(await res.json());
|
|
61
64
|
}
|
package/dist/registry.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/registry.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * registry.ts \u2014 first-party sfmc-modules index resolution, shared between\n * the module CLI and the startup unknown-source warning.\n *\n * Talks to https://raw.githubusercontent.com/Tanya7z/sfmc-modules/main/index.json\n * (the registry lives in a separate repo to keep this one free of \"what\n * modules exist\" governance). Caches to <sfmc/src/.sfmc-registry-cache.json>\n * with a 1h TTL so a brief network blip doesn't degrade the CLI.\n *\n * Both helpers are best-effort: failures are surfaced as `null` and a\n * console warning, never an exception, because the CLI must still boot\n * when the registry is unreachable.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst CACHE_PATH = path.join(__dirname, \".sfmc-registry-cache.json\");\nconst TTL_MS = 60 * 60 * 1000;\n\nconst DEFAULT_REGISTRY_REPO = \"Tanya7z/sfmc-modules\";\nconst DEFAULT_REGISTRY_TAG = \"main\";\nconst INDEX_URL = `https://raw.githubusercontent.com/${DEFAULT_REGISTRY_REPO}/${DEFAULT_REGISTRY_TAG}/index.json`;\n\nexport interface RegistryEntry {\n npm?: string;\n version?: string;\n sdk?: string;\n repo?: string;\n tag?: string;\n}\nexport type RegistryIndex = Record<string, RegistryEntry>;\n\ninterface RegistryCache {\n fetchedAt: number;\n index: RegistryIndex;\n}\n\nfunction readCache(): RegistryCache | null {\n try {\n if (!existsSync(CACHE_PATH)) return null;\n return JSON.parse(readFileSync(CACHE_PATH, \"utf8\")) as RegistryCache;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(cache: RegistryCache): void {\n try {\n mkdirSync(path.dirname(CACHE_PATH), { recursive: true });\n writeFileSync(CACHE_PATH, JSON.stringify(cache, null, 2));\n } catch {\n /* cache write is best-effort */\n }\n}\n\n/**\n * \u89E3\u6790 first-party index.json\u3002\n * \u5951\u7EA6\u4E0E scripts/module-install/lib/registry-index.mjs#parseRegistryIndex \u4FDD\u6301\u4E00\u81F4\uFF1A\n * `{ modules: { <id>: { npm? | repo+tag } } }`\u3002\u5FFD\u7565 `_` \u524D\u7F00\u5143\u6570\u636E\u952E\u3002\n */\nexport function parseRegistryIndex(json: unknown): RegistryIndex {\n if (typeof json !== \"object\" || json === null || Array.isArray(json)) {\n throw new Error(\"registry index must be a JSON object with a 'modules' field\");\n }\n const root = json as Record<string, unknown>;\n const modulesRaw = root.modules;\n if (typeof modulesRaw !== \"object\" || modulesRaw === null || Array.isArray(modulesRaw)) {\n throw new Error(\"registry index must have a 'modules' object mapping id \u2192 entry\");\n }\n const filtered: RegistryIndex = {};\n for (const [k, v] of Object.entries(modulesRaw as Record<string, unknown>)) {\n if (k.startsWith(\"_\")) continue;\n if (typeof v !== \"object\" || v === null || Array.isArray(v)) continue;\n const entry = v as Record<string, unknown>;\n const hasNpm = typeof entry.npm === \"string\" && entry.npm.length > 0;\n const hasGh = typeof entry.repo === \"string\" && typeof entry.tag === \"string\";\n if (!hasNpm && !hasGh) continue;\n const out: RegistryEntry = {};\n if (hasNpm) {\n out.npm = entry.npm as string;\n if (typeof entry.version === \"string\") out.version = entry.version;\n if (typeof entry.sdk === \"string\") out.sdk = entry.sdk;\n }\n if (hasGh) {\n out.repo = entry.repo as string;\n out.tag = entry.tag as string;\n }\n filtered[k] = out;\n }\n return filtered;\n}\n\nasync function fetchFresh(): Promise<RegistryIndex> {\n const res = await fetch(INDEX_URL, {
|
|
5
|
-
"mappings": "AAcA,SAAS,YAAY,WAAW,cAAc,qBAAqB;AACnE,OAAO,UAAU;AACjB,OAAO,aAAa;AACpB,SAAS,qBAAqB;AAE9B,MAAM,YAAY,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAC7D,MAAM,aAAa,KAAK,KAAK,WAAW,2BAA2B;AACnE,MAAM,SAAS,KAAK,KAAK;AAEzB,MAAM,wBAAwB;AAC9B,MAAM,uBAAuB;AAC7B,MAAM,YAAY,qCAAqC,qBAAqB,IAAI,oBAAoB;AAgBpG,SAAS,YAAkC;AACzC,MAAI;AACF,QAAI,CAAC,WAAW,UAAU,EAAG,QAAO;AACpC,WAAO,KAAK,MAAM,aAAa,YAAY,MAAM,CAAC;AAAA,EACpD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,WAAW,OAA4B;AAC9C,MAAI;AACF,cAAU,KAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,kBAAc,YAAY,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,EAC1D,QAAQ;AAAA,EAER;AACF;AAOO,SAAS,mBAAmB,MAA8B;AAC/D,MAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,MAAM,QAAQ,IAAI,GAAG;AACpE,UAAM,IAAI,MAAM,6DAA6D;AAAA,EAC/E;AACA,QAAM,OAAO;AACb,QAAM,aAAa,KAAK;AACxB,MAAI,OAAO,eAAe,YAAY,eAAe,QAAQ,MAAM,QAAQ,UAAU,GAAG;AACtF,UAAM,IAAI,MAAM,qEAAgE;AAAA,EAClF;AACA,QAAM,WAA0B,CAAC;AACjC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,UAAqC,GAAG;AAC1E,QAAI,EAAE,WAAW,GAAG,EAAG;AACvB,QAAI,OAAO,MAAM,YAAY,MAAM,QAAQ,MAAM,QAAQ,CAAC,EAAG;AAC7D,UAAM,QAAQ;AACd,UAAM,SAAS,OAAO,MAAM,QAAQ,YAAY,MAAM,IAAI,SAAS;AACnE,UAAM,QAAQ,OAAO,MAAM,SAAS,YAAY,OAAO,MAAM,QAAQ;AACrE,QAAI,CAAC,UAAU,CAAC,MAAO;AACvB,UAAM,MAAqB,CAAC;AAC5B,QAAI,QAAQ;AACV,UAAI,MAAM,MAAM;AAChB,UAAI,OAAO,MAAM,YAAY,SAAU,KAAI,UAAU,MAAM;AAC3D,UAAI,OAAO,MAAM,QAAQ,SAAU,KAAI,MAAM,MAAM;AAAA,IACrD;AACA,QAAI,OAAO;AACT,UAAI,OAAO,MAAM;AACjB,UAAI,MAAM,MAAM;AAAA,IAClB;AACA,aAAS,CAAC,IAAI;AAAA,EAChB;AACA,SAAO;AACT;AAEA,eAAe,aAAqC;AAClD,QAAM,MAAM,MAAM,MAAM,WAAW,
|
|
4
|
+
"sourcesContent": ["/**\n * registry.ts \u2014 first-party sfmc-modules index resolution, shared between\n * the module CLI and the startup unknown-source warning.\n *\n * Talks to https://raw.githubusercontent.com/Tanya7z/sfmc-modules/main/index.json\n * (the registry lives in a separate repo to keep this one free of \"what\n * modules exist\" governance). Caches to <sfmc/src/.sfmc-registry-cache.json>\n * with a 1h TTL so a brief network blip doesn't degrade the CLI.\n *\n * Both helpers are best-effort: failures are surfaced as `null` and a\n * console warning, never an exception, because the CLI must still boot\n * when the registry is unreachable.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst CACHE_PATH = path.join(__dirname, \".sfmc-registry-cache.json\");\nconst TTL_MS = 60 * 60 * 1000;\n\nconst DEFAULT_REGISTRY_REPO = \"Tanya7z/sfmc-modules\";\nconst DEFAULT_REGISTRY_TAG = \"main\";\nconst INDEX_URL = `https://raw.githubusercontent.com/${DEFAULT_REGISTRY_REPO}/${DEFAULT_REGISTRY_TAG}/index.json`;\n\nexport interface RegistryEntry {\n npm?: string;\n version?: string;\n sdk?: string;\n repo?: string;\n tag?: string;\n}\nexport type RegistryIndex = Record<string, RegistryEntry>;\n\ninterface RegistryCache {\n fetchedAt: number;\n index: RegistryIndex;\n}\n\nfunction readCache(): RegistryCache | null {\n try {\n if (!existsSync(CACHE_PATH)) return null;\n return JSON.parse(readFileSync(CACHE_PATH, \"utf8\")) as RegistryCache;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(cache: RegistryCache): void {\n try {\n mkdirSync(path.dirname(CACHE_PATH), { recursive: true });\n writeFileSync(CACHE_PATH, JSON.stringify(cache, null, 2));\n } catch {\n /* cache write is best-effort */\n }\n}\n\n/**\n * \u89E3\u6790 first-party index.json\u3002\n * \u5951\u7EA6\u4E0E scripts/module-install/lib/registry-index.mjs#parseRegistryIndex \u4FDD\u6301\u4E00\u81F4\uFF1A\n * `{ modules: { <id>: { npm? | repo+tag } } }`\u3002\u5FFD\u7565 `_` \u524D\u7F00\u5143\u6570\u636E\u952E\u3002\n */\nexport function parseRegistryIndex(json: unknown): RegistryIndex {\n if (typeof json !== \"object\" || json === null || Array.isArray(json)) {\n throw new Error(\"registry index must be a JSON object with a 'modules' field\");\n }\n const root = json as Record<string, unknown>;\n const modulesRaw = root.modules;\n if (typeof modulesRaw !== \"object\" || modulesRaw === null || Array.isArray(modulesRaw)) {\n throw new Error(\"registry index must have a 'modules' object mapping id \u2192 entry\");\n }\n const filtered: RegistryIndex = {};\n for (const [k, v] of Object.entries(modulesRaw as Record<string, unknown>)) {\n if (k.startsWith(\"_\")) continue;\n if (typeof v !== \"object\" || v === null || Array.isArray(v)) continue;\n const entry = v as Record<string, unknown>;\n const hasNpm = typeof entry.npm === \"string\" && entry.npm.length > 0;\n const hasGh = typeof entry.repo === \"string\" && typeof entry.tag === \"string\";\n if (!hasNpm && !hasGh) continue;\n const out: RegistryEntry = {};\n if (hasNpm) {\n out.npm = entry.npm as string;\n if (typeof entry.version === \"string\") out.version = entry.version;\n if (typeof entry.sdk === \"string\") out.sdk = entry.sdk;\n }\n if (hasGh) {\n out.repo = entry.repo as string;\n out.tag = entry.tag as string;\n }\n filtered[k] = out;\n }\n return filtered;\n}\n\nasync function fetchFresh(): Promise<RegistryIndex> {\n const res = await fetch(INDEX_URL, {\n headers: { \"User-Agent\": \"sfmc-cli\" },\n signal: AbortSignal.timeout(3000),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status} for ${INDEX_URL}`);\n return parseRegistryIndex(await res.json());\n}\n\nexport interface RegistryResult {\n index: RegistryIndex;\n /** True when the index came from a stale cache because the live fetch failed. */\n stale: boolean;\n}\n\n/**\n * Resolve the first-party index.\n *\n * Order (default):\n * 1. If the cache is fresh (< TTL): return it without trying the network.\n * 2. Otherwise attempt a live fetch.\n * - success \u2192 write cache, return fresh.\n * - failure + cache exists \u2192 return cache with `stale: true` and a warning.\n * - failure + no cache \u2192 return `{ index: {}, stale: true }` and warn.\n *\n * `force: true` \u8DF3\u8FC7 TTL \u65E9\u9000,\u59CB\u7EC8\u5C1D\u8BD5\u62C9\u7F51(\u4F9B `mod search` \u4E3B\u52A8\u5237\u65B0\u5217\u8868)\u3002\n * \u5931\u8D25\u65F6\u4ECD\u56DE\u9000\u5230\u7F13\u5B58,\u6C38\u4E0D\u629B\u5F02\u5E38\u3002\n */\nexport async function resolveRegistryIndex(opts?: { force?: boolean }): Promise<RegistryResult> {\n const cache = readCache();\n if (!opts?.force && cache && Date.now() - cache.fetchedAt < TTL_MS) {\n return { index: cache.index, stale: false };\n }\n try {\n const fresh = await fetchFresh();\n writeCache({ fetchedAt: Date.now(), index: fresh });\n return { index: fresh, stale: false };\n } catch (err) {\n if (cache) {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`[sfmc] registry offline (${msg}); using cached index from ${new Date(cache.fetchedAt).toISOString()}\\n`);\n return { index: cache.index, stale: true };\n }\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`[sfmc] registry unreachable and no cache: ${msg}\\n`);\n return { index: {}, stale: true };\n }\n}\n\n/**\n * \u4ECE\u672C\u5730\u7F13\u5B58\u540C\u6B65\u8BFB\u51FA registry \u6A21\u5757 id(\u4F9B Tab \u8865\u5168)\u3002\n * \u65E0\u7F13\u5B58\u65F6\u8FD4\u56DE\u7A7A\u6570\u7EC4,\u4E0D\u89E6\u53D1\u7F51\u7EDC\u3002\n */\nexport function listRegistryModuleIdsSync(): string[] {\n const cache = readCache();\n if (!cache) return [];\n return Object.keys(cache.index).sort((a, b) => a.localeCompare(b));\n}\n\n/**\n * Compare a set of installed module ids to the registry and return the\n * subset that isn't published in the first-party index. The \"best-effort\"\n * guarantee: this returns an empty array when the registry can't be reached\n * (we don't want a network outage to mark every local module as unknown).\n */\nexport async function findUnknownModules(installedIds: string[]): Promise<string[]> {\n const { index, stale } = await resolveRegistryIndex();\n if (stale && Object.keys(index).length === 0) {\n /* No cache either \u2014 silently treat every module as \"we couldn't tell\".\n * Otherwise offline mode would scream warnings at every boot. */\n return [];\n }\n return installedIds.filter((id) => !index[id]);\n}\n\nexport { DEFAULT_REGISTRY_REPO, DEFAULT_REGISTRY_TAG };"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["msg"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-display.d.ts","sourceRoot":"","sources":["../../src/repl-windows/format-display.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,UAAU,EAEhB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"format-display.d.ts","sourceRoot":"","sources":["../../src/repl-windows/format-display.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,UAAU,EAEhB,MAAM,YAAY,CAAC;AAiCpB,MAAM,MAAM,iBAAiB,GAAG;IAC9B,yBAAyB;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,gBAAgB;AAChB,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,GAAE,iBAAsB,GAAG,MAAM,CAapF;AAED,mCAAmC;AACnC,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,GAAE,iBAAsB,GAAG,MAAM,CAQzF"}
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
resolveDisplayLevel,
|
|
5
5
|
visibleWidth
|
|
6
6
|
} from "../logs.js";
|
|
7
|
+
import { getCompiledLogFilter, transformLogEntry } from "../log-filter.js";
|
|
7
8
|
import { c, highlightLogLine } from "../theme.js";
|
|
8
9
|
const LEVEL_PLAIN = {
|
|
9
10
|
error: "[ERR]",
|
|
@@ -34,7 +35,10 @@ function formatLogDisplay(l, opts = {}) {
|
|
|
34
35
|
const ts = c.dim(l.time.toLocaleTimeString());
|
|
35
36
|
const level = resolveDisplayLevel(l);
|
|
36
37
|
const lvl = levelTagDisplay(level);
|
|
37
|
-
const
|
|
38
|
+
const body = l.source === "bds" ? stripBdsLogPrefix(l.text) : l.text;
|
|
39
|
+
const filter = getCompiledLogFilter();
|
|
40
|
+
const { entry } = transformLogEntry({ text: body, source: l.source, level }, filter);
|
|
41
|
+
const txt = highlightLogLine(entry.text);
|
|
38
42
|
if (opts.omitSource) {
|
|
39
43
|
return `${ts} ${lvl} ${txt}`;
|
|
40
44
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/repl-windows/format-display.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * repl-windows/format-display.ts \u2014 \u4EC5 TTY \u5C55\u793A\uFF1B\u843D\u76D8\u4ECD\u7528 logs.formatLog / SDK formatLogLine\n */\nimport { stripBdsLogPrefix } from \"@sfmc-bds/sdk/logs\";\nimport {\n formatSourceTag,\n resolveDisplayLevel,\n type UnifiedLog,\n visibleWidth,\n} from \"../logs.js\";\nimport { c, highlightLogLine } from \"../theme.js\";\n\n/** \u4E0E logs.ts LEVEL_TAG_TEXT \u5BF9\u9F50\u7684\u65E0\u8272\u7EA7\u522B\uFF08\u907F\u514D\u6539\u52A8\u843D\u76D8\u8DEF\u5F84\uFF09 */\nconst LEVEL_PLAIN: Record<string, string> = {\n error: \"[ERR]\",\n warn: \"[WRN]\",\n success: \"[SUC]\",\n debug: \"[DBG]\",\n info: \"[INF]\",\n};\n\nfunction levelTagDisplay(lvl: string): string {\n const text = LEVEL_PLAIN[lvl] ?? LEVEL_PLAIN.info!;\n switch (lvl) {\n case \"error\":\n return c.red(text);\n case \"warn\":\n return c.yellow(text);\n case \"success\":\n return c.green(c.bold(text));\n case \"debug\":\n return c.dim(text);\n default:\n return c.blue(text);\n }\n}\n\nfunction levelTagPlain(lvl: string): string {\n return LEVEL_PLAIN[lvl] ?? LEVEL_PLAIN.info!;\n}\n\nexport type FormatDisplayOpts = {\n /** \u670D\u52A1\u7A97\u5185\u7701\u7565\u6765\u6E90\u6807\u7B7E\uFF08\u843D\u76D8\u4E0D\u53D7\u5F71\u54CD\uFF09 */\n omitSource?: boolean;\n};\n\n/** TTY \u5C55\u793A\u683C\u5F0F\u5316 */\nexport function formatLogDisplay(l: UnifiedLog, opts: FormatDisplayOpts = {}): string {\n const ts = c.dim(l.time.toLocaleTimeString());\n const level = resolveDisplayLevel(l);\n const lvl = levelTagDisplay(level);\n const
|
|
5
|
-
"mappings": "AAGA,SAAS,yBAAyB;AAClC;AAAA,EACE;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AACP,SAAS,GAAG,wBAAwB;AAGpC,MAAM,cAAsC;AAAA,EAC1C,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR;AAEA,SAAS,gBAAgB,KAAqB;AAC5C,QAAM,OAAO,YAAY,GAAG,KAAK,YAAY;AAC7C,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,EAAE,IAAI,IAAI;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,OAAO,IAAI;AAAA,IACtB,KAAK;AACH,aAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,IAC7B,KAAK;AACH,aAAO,EAAE,IAAI,IAAI;AAAA,IACnB;AACE,aAAO,EAAE,KAAK,IAAI;AAAA,EACtB;AACF;AAEA,SAAS,cAAc,KAAqB;AAC1C,SAAO,YAAY,GAAG,KAAK,YAAY;AACzC;AAQO,SAAS,iBAAiB,GAAe,OAA0B,CAAC,GAAW;AACpF,QAAM,KAAK,EAAE,IAAI,EAAE,KAAK,mBAAmB,CAAC;AAC5C,QAAM,QAAQ,oBAAoB,CAAC;AACnC,QAAM,MAAM,gBAAgB,KAAK;AACjC,QAAM,
|
|
4
|
+
"sourcesContent": ["/**\n * repl-windows/format-display.ts \u2014 \u4EC5 TTY \u5C55\u793A\uFF1B\u843D\u76D8\u4ECD\u7528 logs.formatLog / SDK formatLogLine\n */\nimport { stripBdsLogPrefix } from \"@sfmc-bds/sdk/logs\";\nimport {\n formatSourceTag,\n resolveDisplayLevel,\n type UnifiedLog,\n visibleWidth,\n} from \"../logs.js\";\nimport { getCompiledLogFilter, transformLogEntry } from \"../log-filter.js\";\nimport { c, highlightLogLine } from \"../theme.js\";\n\n/** \u4E0E logs.ts LEVEL_TAG_TEXT \u5BF9\u9F50\u7684\u65E0\u8272\u7EA7\u522B\uFF08\u907F\u514D\u6539\u52A8\u843D\u76D8\u8DEF\u5F84\uFF09 */\nconst LEVEL_PLAIN: Record<string, string> = {\n error: \"[ERR]\",\n warn: \"[WRN]\",\n success: \"[SUC]\",\n debug: \"[DBG]\",\n info: \"[INF]\",\n};\n\nfunction levelTagDisplay(lvl: string): string {\n const text = LEVEL_PLAIN[lvl] ?? LEVEL_PLAIN.info!;\n switch (lvl) {\n case \"error\":\n return c.red(text);\n case \"warn\":\n return c.yellow(text);\n case \"success\":\n return c.green(c.bold(text));\n case \"debug\":\n return c.dim(text);\n default:\n return c.blue(text);\n }\n}\n\nfunction levelTagPlain(lvl: string): string {\n return LEVEL_PLAIN[lvl] ?? LEVEL_PLAIN.info!;\n}\n\nexport type FormatDisplayOpts = {\n /** \u670D\u52A1\u7A97\u5185\u7701\u7565\u6765\u6E90\u6807\u7B7E\uFF08\u843D\u76D8\u4E0D\u53D7\u5F71\u54CD\uFF09 */\n omitSource?: boolean;\n};\n\n/** TTY \u5C55\u793A\u683C\u5F0F\u5316 */\nexport function formatLogDisplay(l: UnifiedLog, opts: FormatDisplayOpts = {}): string {\n const ts = c.dim(l.time.toLocaleTimeString());\n const level = resolveDisplayLevel(l);\n const lvl = levelTagDisplay(level);\n const body = l.source === \"bds\" ? stripBdsLogPrefix(l.text) : l.text;\n const filter = getCompiledLogFilter();\n const { entry } = transformLogEntry({ text: body, source: l.source, level }, filter);\n const txt = highlightLogLine(entry.text);\n if (opts.omitSource) {\n return `${ts} ${lvl} ${txt}`;\n }\n const src = formatSourceTag(l.source);\n return `${ts} ${src} ${lvl} ${txt}`;\n}\n\n/** \u4E0E formatLogDisplay \u5BF9\u9F50\u7684\u60AC\u6302\u7F29\u8FDB\u5BBD\u5EA6 */\nexport function logDisplayPrefixWidth(l: UnifiedLog, opts: FormatDisplayOpts = {}): number {\n const ts = l.time.toLocaleTimeString();\n const level = resolveDisplayLevel(l);\n const lvl = levelTagPlain(level);\n if (opts.omitSource) {\n return visibleWidth(`${ts} ${lvl} `);\n }\n return visibleWidth(`${ts} ${formatSourceTag(l.source)} ${lvl} `);\n}\n"],
|
|
5
|
+
"mappings": "AAGA,SAAS,yBAAyB;AAClC;AAAA,EACE;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AACP,SAAS,sBAAsB,yBAAyB;AACxD,SAAS,GAAG,wBAAwB;AAGpC,MAAM,cAAsC;AAAA,EAC1C,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR;AAEA,SAAS,gBAAgB,KAAqB;AAC5C,QAAM,OAAO,YAAY,GAAG,KAAK,YAAY;AAC7C,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,EAAE,IAAI,IAAI;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,OAAO,IAAI;AAAA,IACtB,KAAK;AACH,aAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,IAC7B,KAAK;AACH,aAAO,EAAE,IAAI,IAAI;AAAA,IACnB;AACE,aAAO,EAAE,KAAK,IAAI;AAAA,EACtB;AACF;AAEA,SAAS,cAAc,KAAqB;AAC1C,SAAO,YAAY,GAAG,KAAK,YAAY;AACzC;AAQO,SAAS,iBAAiB,GAAe,OAA0B,CAAC,GAAW;AACpF,QAAM,KAAK,EAAE,IAAI,EAAE,KAAK,mBAAmB,CAAC;AAC5C,QAAM,QAAQ,oBAAoB,CAAC;AACnC,QAAM,MAAM,gBAAgB,KAAK;AACjC,QAAM,OAAO,EAAE,WAAW,QAAQ,kBAAkB,EAAE,IAAI,IAAI,EAAE;AAChE,QAAM,SAAS,qBAAqB;AACpC,QAAM,EAAE,MAAM,IAAI,kBAAkB,EAAE,MAAM,MAAM,QAAQ,EAAE,QAAQ,MAAM,GAAG,MAAM;AACnF,QAAM,MAAM,iBAAiB,MAAM,IAAI;AACvC,MAAI,KAAK,YAAY;AACnB,WAAO,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG;AAAA,EAC5B;AACA,QAAM,MAAM,gBAAgB,EAAE,MAAM;AACpC,SAAO,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG;AACnC;AAGO,SAAS,sBAAsB,GAAe,OAA0B,CAAC,GAAW;AACzF,QAAM,KAAK,EAAE,KAAK,mBAAmB;AACrC,QAAM,QAAQ,oBAAoB,CAAC;AACnC,QAAM,MAAM,cAAc,KAAK;AAC/B,MAAI,KAAK,YAAY;AACnB,WAAO,aAAa,GAAG,EAAE,IAAI,GAAG,GAAG;AAAA,EACrC;AACA,SAAO,aAAa,GAAG,EAAE,IAAI,gBAAgB,EAAE,MAAM,CAAC,IAAI,GAAG,GAAG;AAClE;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAOA,OAAO,EAAoB,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAWhG;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKtD;AASD;;;;GAIG;AACH,eAAO,MAAM,IAAI,EAAE,MAAiD,CAAC;AAErE,+CAA+C;AAC/C,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,MAAa,GAAG,OAAO,CAGjE;AAED,eAAO,MAAM,YAAY,EAAE,MAA+C,CAAC;AAE3E,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,CAAC;AAsD5E;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAOA,OAAO,EAAoB,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAWhG;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKtD;AASD;;;;GAIG;AACH,eAAO,MAAM,IAAI,EAAE,MAAiD,CAAC;AAErE,+CAA+C;AAC/C,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,MAAa,GAAG,OAAO,CAGjE;AAED,eAAO,MAAM,YAAY,EAAE,MAA+C,CAAC;AAE3E,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,CAAC;AAsD5E;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAyB/D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAiBlD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAmE9C;AAgBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,GAAE,YAAiB,6CAI5F;AAED,yBAAyB;AACzB,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,GAAE,gBAAqB,2EAIpG"}
|
package/dist/runtime.js
CHANGED
|
@@ -78,6 +78,11 @@ function resolveServiceScript(service) {
|
|
|
78
78
|
if (fromEnv && fs.existsSync(fromEnv)) return fromEnv;
|
|
79
79
|
const mono = path.join(ROOT, SERVICE_SCRIPT[service]);
|
|
80
80
|
if (fs.existsSync(mono)) return mono;
|
|
81
|
+
const monoFromCli = findMonorepoRoot(__dirname);
|
|
82
|
+
if (monoFromCli) {
|
|
83
|
+
const monoDev = path.join(monoFromCli, SERVICE_SCRIPT[service]);
|
|
84
|
+
if (fs.existsSync(monoDev)) return monoDev;
|
|
85
|
+
}
|
|
81
86
|
const { pkg, exportPath, rel } = SERVICE_NPM[service];
|
|
82
87
|
const fromNpm = tryResolveNpm(pkg, {
|
|
83
88
|
...exportPath ? { exportPath } : {},
|
|
@@ -93,6 +98,11 @@ function resolveFetchModule() {
|
|
|
93
98
|
if (fromEnv && fs.existsSync(fromEnv)) return fromEnv;
|
|
94
99
|
const mono = path.join(ROOT, "packages", "cli", "scripts", "module-install", "fetch-module.mjs");
|
|
95
100
|
if (fs.existsSync(mono)) return mono;
|
|
101
|
+
const monoFromCli = findMonorepoRoot(__dirname);
|
|
102
|
+
if (monoFromCli) {
|
|
103
|
+
const monoDev = path.join(monoFromCli, "packages", "cli", "scripts", "module-install", "fetch-module.mjs");
|
|
104
|
+
if (fs.existsSync(monoDev)) return monoDev;
|
|
105
|
+
}
|
|
96
106
|
return tryResolveNpm("@sfmc-bds/cli", {
|
|
97
107
|
rel: "scripts/module-install/fetch-module.mjs",
|
|
98
108
|
exportPath: "@sfmc-bds/cli/fetch-module.mjs"
|
package/dist/runtime.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/runtime.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n configPath,\n findMonorepoRoot,\n readJson,\n resolveRuntimeRoot,\n type RuntimeConfig,\n} from \"@sfmc-bds/sdk/node/config\";\nimport { spawn, spawnSync, type SpawnOptions, type SpawnSyncOptions } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport fs from \"node:fs\";\nimport path, { dirname } from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst requireFromCli = createRequire(import.meta.url);\n\n/**\n * \u662F\u5426\u4E3A monorepo \u5E03\u5C40\uFF08\u4ED3\u6839\u540C\u65F6\u6709 packages/db-server \u4E0E packages/cli\uFF09\u3002\n * npm \u5168\u5C40/\u672C\u5730\u5B89\u88C5\u65F6 ROOT \u901A\u5E38\u662F cwd,\u4E0D\u6EE1\u8DB3\u6B64\u6761\u4EF6\u3002\n */\nexport function isMonorepoLayout(root: string): boolean {\n return (\n fs.existsSync(path.join(root, \"packages\", \"db-server\", \"package.json\")) &&\n fs.existsSync(path.join(root, \"packages\", \"cli\", \"package.json\"))\n );\n}\n\nfunction detectFallbackRoot(): string {\n const found = findMonorepoRoot(__dirname);\n if (found && isMonorepoLayout(found)) return found;\n /* npm \u5B89\u88C5:@sfmc-bds/sfmc \u5305\u88C5\u5668\u4F1A\u8BBE SFMC_ROOT;\u88F8\u8DD1 cli \u65F6\u7528 cwd \u4F5C\u6570\u636E\u6839 */\n return process.cwd();\n}\n\n/**\n * \u9879\u76EE\u6839\u76EE\u5F55\u3002\u4F18\u5148\u7EA7:`process.env.SFMC_ROOT` > fallback\u3002\n * - monorepo: walk-up \u5230 sfmc-monorepo\n * - npm \u805A\u5408\u5305 / \u5168\u5C40\u5B89\u88C5:cwd(\u914D\u7F6E\u4E0E\u6570\u636E\u843D\u5728\u5F53\u524D\u76EE\u5F55)\n */\nexport const ROOT: string = resolveRuntimeRoot(detectFallbackRoot());\n\n/** \u6BCF\u6B21\u8C03\u7528\u91CD\u65B0\u89E3\u6790\uFF08\u5C0A\u91CD\u8FD0\u884C\u4E2D\u53D8\u66F4\u7684 `SFMC_ROOT`\uFF1B\u5355\u6D4B/\u5B50\u8FDB\u7A0B\u53CB\u597D\uFF09\u3002 */\nexport function getRoot(): string {\n return resolveRuntimeRoot(detectFallbackRoot());\n}\n\n/**\n * \u662F\u5426\u5DF2\u5B8C\u6210\u9996\u6B21\u5411\u5BFC\u521D\u59CB\u5316\u3002\n * \u4EE5 `configs/runtime.json#initialized_at` \u4E3A\u51C6(wizard \u5199\u5165);\n * \u4E0D\u518D\u7528\u300Cdb_config.json \u662F\u5426\u5B58\u5728\u300D\u2014\u2014\u9AA8\u67B6\u7531 ensureJsonConfig \u5728\u8FDB\u7A0B\u542F\u52A8\u65F6\u521B\u5EFA\u3002\n */\nexport function isRuntimeInitialized(root: string = ROOT): boolean {\n const runtime = readJson<RuntimeConfig>(configPath(root, \"runtime.json\"));\n return Boolean(runtime?.initialized_at);\n}\n\nexport const PACKAGES_DIR: string = path.join(ROOT, \"modules\", \"packages\");\n\nexport type ServiceId = \"db\" | \"qq\" | \"update\" | \"manager\" | \"pack-manager\";\n\n/** monorepo \u76F8\u5BF9 ROOT \u7684\u5165\u53E3(\u5F00\u53D1\u5E03\u5C40) */\nconst SERVICE_SCRIPT: Record<ServiceId, string> = {\n db: \"packages/db-server/dist/index.js\",\n qq: \"packages/qq-bridge/dist/index.js\",\n update: \"packages/bds-tools/dist/check-update.js\",\n manager: \"packages/bds-tools/dist/bds-manager.js\",\n \"pack-manager\": \"packages/bds-tools/dist/cli-pack-manager.js\",\n};\n\n/** \u73AF\u5883\u53D8\u91CF\u8986\u76D6(\u7531 @sfmc-bds/sfmc bin \u6CE8\u5165) */\nconst SERVICE_ENV: Record<ServiceId, string> = {\n db: \"SFMC_SERVICE_DB_ENTRY\",\n qq: \"SFMC_SERVICE_QQ_ENTRY\",\n update: \"SFMC_SERVICE_UPDATE_ENTRY\",\n manager: \"SFMC_SERVICE_MANAGER_ENTRY\",\n \"pack-manager\": \"SFMC_SERVICE_PACK_MANAGER_ENTRY\",\n};\n\n/** npm \u5305\u89E3\u6790\u56DE\u9000 */\nconst SERVICE_NPM: Record<ServiceId, { pkg: string; exportPath?: string; rel?: string }> = {\n db: { pkg: \"@sfmc-bds/db-server\" },\n qq: { pkg: \"@sfmc-bds/qq-bridge\" },\n update: { pkg: \"@sfmc-bds/bds-tools\", exportPath: \"@sfmc-bds/bds-tools/check-update\", rel: \"dist/check-update.js\" },\n manager: { pkg: \"@sfmc-bds/bds-tools\", exportPath: \"@sfmc-bds/bds-tools/bds-manager\", rel: \"dist/bds-manager.js\" },\n \"pack-manager\": {\n pkg: \"@sfmc-bds/bds-tools\",\n exportPath: \"@sfmc-bds/bds-tools/pack-manager\",\n rel: \"dist/cli-pack-manager.js\",\n },\n};\n\nfunction tryResolveNpm(pkg: string, opts?: { exportPath?: string; rel?: string }): string | null {\n const attempts = [requireFromCli];\n try {\n attempts.push(createRequire(path.join(process.cwd(), \"package.json\")));\n } catch {\n /* cwd \u65E0 package.json */\n }\n for (const req of attempts) {\n try {\n if (opts?.exportPath) return req.resolve(opts.exportPath);\n if (!opts?.rel) return req.resolve(pkg);\n const root = path.dirname(req.resolve(`${pkg}/package.json`));\n const full = path.join(root, opts.rel);\n if (fs.existsSync(full)) return full;\n } catch {\n /* try next */\n }\n }\n return null;\n}\n\n/**\n * \u89E3\u6790\u5B50\u670D\u52A1\u5165\u53E3\u811A\u672C\u7EDD\u5BF9\u8DEF\u5F84\u3002\n * \u4F18\u5148\u7EA7: env \u6CE8\u5165 > monorepo \u76F8\u5BF9 ROOT > npm \u5305 resolve\u3002\n */\nexport function resolveServiceScript(service: ServiceId): string {\n const fromEnv = process.env[SERVICE_ENV[service]];\n if (fromEnv && fs.existsSync(fromEnv)) return fromEnv;\n\n const mono = path.join(ROOT, SERVICE_SCRIPT[service]);\n if (fs.existsSync(mono)) return mono;\n\n const { pkg, exportPath, rel } = SERVICE_NPM[service];\n const fromNpm = tryResolveNpm(pkg, {\n ...(exportPath ? { exportPath } : {}),\n ...(rel ? { rel } : {}),\n });\n if (fromNpm) return fromNpm;\n\n throw new Error(\n `Cannot resolve service \"${service}\". Install @sfmc-bds/sfmc (all-in-one) or run inside the monorepo. ` +\n `Looked for ${mono} and npm package ${pkg}.`\n );\n}\n\n/**\n * \u89E3\u6790 fetch-module\uFF08@sfmc-bds/cli/scripts/module-install\uFF09\u3002\n * \u4F18\u5148\u7EA7: SFMC_FETCH_MODULE > monorepo cli/scripts > @sfmc-bds/cli export\u3002\n */\nexport function resolveFetchModule(): string | null {\n const fromEnv = process.env.SFMC_FETCH_MODULE;\n if (fromEnv && fs.existsSync(fromEnv)) return fromEnv;\n\n const mono = path.join(ROOT, \"packages\", \"cli\", \"scripts\", \"module-install\", \"fetch-module.mjs\");\n if (fs.existsSync(mono)) return mono;\n\n return tryResolveNpm(\"@sfmc-bds/cli\", {\n rel: \"scripts/module-install/fetch-module.mjs\",\n exportPath: \"@sfmc-bds/cli/fetch-module.mjs\",\n });\n}\n\n/**\n * \u89E3\u6790 `@sfmc-bds/sdk` \u5305\u6839\u76EE\u5F55\uFF08\u542B package.json\uFF09\u3002\n * \u4F18\u5148\u7EA7: SFMC_SDK_ROOT > createRequire(@sfmc-bds/sdk/package.json) > \u516C\u5F00 export \u5411\u4E0A\u627E > monorepo\u3002\n */\nexport function resolveSdkPackageRoot(): string {\n const fromEnv = process.env.SFMC_SDK_ROOT;\n if (fromEnv && fs.existsSync(path.join(fromEnv, \"package.json\"))) {\n return path.resolve(fromEnv);\n }\n\n function findSdkRootFromRequire(req: NodeRequire): string | null {\n try {\n // SDK \u5DF2\u66B4\u9732 ./package.json export\uFF1B\u4F18\u5148\u76F4\u89E3\n try {\n const pkgJson = req.resolve(\"@sfmc-bds/sdk/package.json\");\n return path.dirname(pkgJson);\n } catch {\n /* \u65E7\u5305\u672A\u66B4\u9732\u65F6\u56DE\u9000 */\n }\n // \u4EFB\u4E00\u516C\u5F00 export \u5373\u53EF\uFF1B\u518D\u5411\u4E0A\u627E\u542B name=@sfmc-bds/sdk \u7684 package.json\n const hit = req.resolve(\"@sfmc-bds/sdk/sapi/runtime\");\n let dir = path.dirname(hit);\n for (let i = 0; i < 8; i++) {\n const cand = path.join(dir, \"package.json\");\n if (fs.existsSync(cand)) {\n try {\n const name = JSON.parse(fs.readFileSync(cand, \"utf8\")).name;\n if (name === \"@sfmc-bds/sdk\" || name === \"@sfmc/sdk\") return dir;\n } catch {\n /* continue */\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n } catch {\n return null;\n }\n return null;\n }\n\n for (const req of [\n requireFromCli,\n (() => {\n try {\n return createRequire(path.join(process.cwd(), \"package.json\"));\n } catch {\n return null;\n }\n })(),\n ]) {\n if (!req) continue;\n const found = findSdkRootFromRequire(req);\n if (found) return found;\n }\n\n const mono = path.join(ROOT, \"modules\", \"sdk\", \"@sfmc-sdk\");\n if (fs.existsSync(path.join(mono, \"package.json\"))) return mono;\n\n // SFMC_ROOT \u53EF\u80FD\u662F\u6570\u636E\u76EE\u5F55\uFF1B\u518D\u4ECE CLI \u4F4D\u7F6E walk-up monorepo\n const monoFromCli = findMonorepoRoot(__dirname);\n if (monoFromCli) {\n const fromCli = path.join(monoFromCli, \"modules\", \"sdk\", \"@sfmc-sdk\");\n if (fs.existsSync(path.join(fromCli, \"package.json\"))) return fromCli;\n }\n\n throw new Error(\n `Cannot resolve @sfmc-bds/sdk for behavior-pack build. ` +\n `Install @sfmc-bds/sdk next to the CLI, set SFMC_SDK_ROOT, or run inside the monorepo.`\n );\n}\n\nfunction nodeBinary(): string {\n return process.execPath;\n}\n\nfunction serviceChildEnv(service: ServiceId, optsEnv?: NodeJS.ProcessEnv | null) {\n return {\n ...process.env,\n ...optsEnv,\n SFMC_SERVICE: service,\n SFMC_ROOT: ROOT,\n SFMC_PACKAGES_DIR: PACKAGES_DIR,\n };\n}\n\n/**\n * \u542F\u52A8\u4E00\u4E2A\u5B50\u670D\u52A1\u3002\n *\n * \u900F\u4F20\u7ED9\u5B50\u8FDB\u7A0B\u7684 env:\n * - SFMC_SERVICE / SFMC_ROOT / SFMC_PACKAGES_DIR\n */\nexport function spawnService(service: ServiceId, args: string[] = [], opts: SpawnOptions = {}) {\n const env = serviceChildEnv(service, opts.env as NodeJS.ProcessEnv | undefined);\n const script = resolveServiceScript(service);\n return spawn(nodeBinary(), [script, ...args], { ...opts, env });\n}\n\n/** spawnService \u7684\u540C\u6B65\u7248\u672C */\nexport function spawnServiceSync(service: ServiceId, args: string[] = [], opts: SpawnSyncOptions = {}) {\n const env = serviceChildEnv(service, opts.env as NodeJS.ProcessEnv | undefined);\n const script = resolveServiceScript(service);\n return spawnSync(nodeBinary(), [script, ...args], { ...opts, env });\n}\n"],
|
|
5
|
-
"mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,OAAO,iBAA2D;AAC3E,SAAS,qBAAqB;AAC9B,OAAO,QAAQ;AACf,OAAO,QAAQ,eAAe;AAC9B,OAAO,aAAa;AACpB,SAAS,qBAAqB;AAE9B,MAAM,aAAa,cAAc,YAAY,GAAG;AAChD,MAAM,YAAY,QAAQ,UAAU;AACpC,MAAM,iBAAiB,cAAc,YAAY,GAAG;AAM7C,SAAS,iBAAiB,MAAuB;AACtD,SACE,GAAG,WAAW,KAAK,KAAK,MAAM,YAAY,aAAa,cAAc,CAAC,KACtE,GAAG,WAAW,KAAK,KAAK,MAAM,YAAY,OAAO,cAAc,CAAC;AAEpE;AAEA,SAAS,qBAA6B;AACpC,QAAM,QAAQ,iBAAiB,SAAS;AACxC,MAAI,SAAS,iBAAiB,KAAK,EAAG,QAAO;AAE7C,SAAO,QAAQ,IAAI;AACrB;AAOO,MAAM,OAAe,mBAAmB,mBAAmB,CAAC;AAG5D,SAAS,UAAkB;AAChC,SAAO,mBAAmB,mBAAmB,CAAC;AAChD;AAOO,SAAS,qBAAqB,OAAe,MAAe;AACjE,QAAM,UAAU,SAAwB,WAAW,MAAM,cAAc,CAAC;AACxE,SAAO,QAAQ,SAAS,cAAc;AACxC;AAEO,MAAM,eAAuB,KAAK,KAAK,MAAM,WAAW,UAAU;AAKzE,MAAM,iBAA4C;AAAA,EAChD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,gBAAgB;AAClB;AAGA,MAAM,cAAyC;AAAA,EAC7C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,gBAAgB;AAClB;AAGA,MAAM,cAAqF;AAAA,EACzF,IAAI,EAAE,KAAK,sBAAsB;AAAA,EACjC,IAAI,EAAE,KAAK,sBAAsB;AAAA,EACjC,QAAQ,EAAE,KAAK,uBAAuB,YAAY,oCAAoC,KAAK,uBAAuB;AAAA,EAClH,SAAS,EAAE,KAAK,uBAAuB,YAAY,mCAAmC,KAAK,sBAAsB;AAAA,EACjH,gBAAgB;AAAA,IACd,KAAK;AAAA,IACL,YAAY;AAAA,IACZ,KAAK;AAAA,EACP;AACF;AAEA,SAAS,cAAc,KAAa,MAA6D;AAC/F,QAAM,WAAW,CAAC,cAAc;AAChC,MAAI;AACF,aAAS,KAAK,cAAc,KAAK,KAAK,QAAQ,IAAI,GAAG,cAAc,CAAC,CAAC;AAAA,EACvE,QAAQ;AAAA,EAER;AACA,aAAW,OAAO,UAAU;AAC1B,QAAI;AACF,UAAI,MAAM,WAAY,QAAO,IAAI,QAAQ,KAAK,UAAU;AACxD,UAAI,CAAC,MAAM,IAAK,QAAO,IAAI,QAAQ,GAAG;AACtC,YAAM,OAAO,KAAK,QAAQ,IAAI,QAAQ,GAAG,GAAG,eAAe,CAAC;AAC5D,YAAM,OAAO,KAAK,KAAK,MAAM,KAAK,GAAG;AACrC,UAAI,GAAG,WAAW,IAAI,EAAG,QAAO;AAAA,IAClC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,qBAAqB,SAA4B;AAC/D,QAAM,UAAU,QAAQ,IAAI,YAAY,OAAO,CAAC;AAChD,MAAI,WAAW,GAAG,WAAW,OAAO,EAAG,QAAO;AAE9C,QAAM,OAAO,KAAK,KAAK,MAAM,eAAe,OAAO,CAAC;AACpD,MAAI,GAAG,WAAW,IAAI,EAAG,QAAO;
|
|
4
|
+
"sourcesContent": ["import {\n configPath,\n findMonorepoRoot,\n readJson,\n resolveRuntimeRoot,\n type RuntimeConfig,\n} from \"@sfmc-bds/sdk/node/config\";\nimport { spawn, spawnSync, type SpawnOptions, type SpawnSyncOptions } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport fs from \"node:fs\";\nimport path, { dirname } from \"node:path\";\nimport process from \"node:process\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst requireFromCli = createRequire(import.meta.url);\n\n/**\n * \u662F\u5426\u4E3A monorepo \u5E03\u5C40\uFF08\u4ED3\u6839\u540C\u65F6\u6709 packages/db-server \u4E0E packages/cli\uFF09\u3002\n * npm \u5168\u5C40/\u672C\u5730\u5B89\u88C5\u65F6 ROOT \u901A\u5E38\u662F cwd,\u4E0D\u6EE1\u8DB3\u6B64\u6761\u4EF6\u3002\n */\nexport function isMonorepoLayout(root: string): boolean {\n return (\n fs.existsSync(path.join(root, \"packages\", \"db-server\", \"package.json\")) &&\n fs.existsSync(path.join(root, \"packages\", \"cli\", \"package.json\"))\n );\n}\n\nfunction detectFallbackRoot(): string {\n const found = findMonorepoRoot(__dirname);\n if (found && isMonorepoLayout(found)) return found;\n /* npm \u5B89\u88C5:@sfmc-bds/sfmc \u5305\u88C5\u5668\u4F1A\u8BBE SFMC_ROOT;\u88F8\u8DD1 cli \u65F6\u7528 cwd \u4F5C\u6570\u636E\u6839 */\n return process.cwd();\n}\n\n/**\n * \u9879\u76EE\u6839\u76EE\u5F55\u3002\u4F18\u5148\u7EA7:`process.env.SFMC_ROOT` > fallback\u3002\n * - monorepo: walk-up \u5230 sfmc-monorepo\n * - npm \u805A\u5408\u5305 / \u5168\u5C40\u5B89\u88C5:cwd(\u914D\u7F6E\u4E0E\u6570\u636E\u843D\u5728\u5F53\u524D\u76EE\u5F55)\n */\nexport const ROOT: string = resolveRuntimeRoot(detectFallbackRoot());\n\n/** \u6BCF\u6B21\u8C03\u7528\u91CD\u65B0\u89E3\u6790\uFF08\u5C0A\u91CD\u8FD0\u884C\u4E2D\u53D8\u66F4\u7684 `SFMC_ROOT`\uFF1B\u5355\u6D4B/\u5B50\u8FDB\u7A0B\u53CB\u597D\uFF09\u3002 */\nexport function getRoot(): string {\n return resolveRuntimeRoot(detectFallbackRoot());\n}\n\n/**\n * \u662F\u5426\u5DF2\u5B8C\u6210\u9996\u6B21\u5411\u5BFC\u521D\u59CB\u5316\u3002\n * \u4EE5 `configs/runtime.json#initialized_at` \u4E3A\u51C6(wizard \u5199\u5165);\n * \u4E0D\u518D\u7528\u300Cdb_config.json \u662F\u5426\u5B58\u5728\u300D\u2014\u2014\u9AA8\u67B6\u7531 ensureJsonConfig \u5728\u8FDB\u7A0B\u542F\u52A8\u65F6\u521B\u5EFA\u3002\n */\nexport function isRuntimeInitialized(root: string = ROOT): boolean {\n const runtime = readJson<RuntimeConfig>(configPath(root, \"runtime.json\"));\n return Boolean(runtime?.initialized_at);\n}\n\nexport const PACKAGES_DIR: string = path.join(ROOT, \"modules\", \"packages\");\n\nexport type ServiceId = \"db\" | \"qq\" | \"update\" | \"manager\" | \"pack-manager\";\n\n/** monorepo \u76F8\u5BF9 ROOT \u7684\u5165\u53E3(\u5F00\u53D1\u5E03\u5C40) */\nconst SERVICE_SCRIPT: Record<ServiceId, string> = {\n db: \"packages/db-server/dist/index.js\",\n qq: \"packages/qq-bridge/dist/index.js\",\n update: \"packages/bds-tools/dist/check-update.js\",\n manager: \"packages/bds-tools/dist/bds-manager.js\",\n \"pack-manager\": \"packages/bds-tools/dist/cli-pack-manager.js\",\n};\n\n/** \u73AF\u5883\u53D8\u91CF\u8986\u76D6(\u7531 @sfmc-bds/sfmc bin \u6CE8\u5165) */\nconst SERVICE_ENV: Record<ServiceId, string> = {\n db: \"SFMC_SERVICE_DB_ENTRY\",\n qq: \"SFMC_SERVICE_QQ_ENTRY\",\n update: \"SFMC_SERVICE_UPDATE_ENTRY\",\n manager: \"SFMC_SERVICE_MANAGER_ENTRY\",\n \"pack-manager\": \"SFMC_SERVICE_PACK_MANAGER_ENTRY\",\n};\n\n/** npm \u5305\u89E3\u6790\u56DE\u9000 */\nconst SERVICE_NPM: Record<ServiceId, { pkg: string; exportPath?: string; rel?: string }> = {\n db: { pkg: \"@sfmc-bds/db-server\" },\n qq: { pkg: \"@sfmc-bds/qq-bridge\" },\n update: { pkg: \"@sfmc-bds/bds-tools\", exportPath: \"@sfmc-bds/bds-tools/check-update\", rel: \"dist/check-update.js\" },\n manager: { pkg: \"@sfmc-bds/bds-tools\", exportPath: \"@sfmc-bds/bds-tools/bds-manager\", rel: \"dist/bds-manager.js\" },\n \"pack-manager\": {\n pkg: \"@sfmc-bds/bds-tools\",\n exportPath: \"@sfmc-bds/bds-tools/pack-manager\",\n rel: \"dist/cli-pack-manager.js\",\n },\n};\n\nfunction tryResolveNpm(pkg: string, opts?: { exportPath?: string; rel?: string }): string | null {\n const attempts = [requireFromCli];\n try {\n attempts.push(createRequire(path.join(process.cwd(), \"package.json\")));\n } catch {\n /* cwd \u65E0 package.json */\n }\n for (const req of attempts) {\n try {\n if (opts?.exportPath) return req.resolve(opts.exportPath);\n if (!opts?.rel) return req.resolve(pkg);\n const root = path.dirname(req.resolve(`${pkg}/package.json`));\n const full = path.join(root, opts.rel);\n if (fs.existsSync(full)) return full;\n } catch {\n /* try next */\n }\n }\n return null;\n}\n\n/**\n * \u89E3\u6790\u5B50\u670D\u52A1\u5165\u53E3\u811A\u672C\u7EDD\u5BF9\u8DEF\u5F84\u3002\n * \u4F18\u5148\u7EA7: env \u6CE8\u5165 > monorepo \u76F8\u5BF9 ROOT > npm \u5305 resolve\u3002\n */\nexport function resolveServiceScript(service: ServiceId): string {\n const fromEnv = process.env[SERVICE_ENV[service]];\n if (fromEnv && fs.existsSync(fromEnv)) return fromEnv;\n\n const mono = path.join(ROOT, SERVICE_SCRIPT[service]);\n if (fs.existsSync(mono)) return mono;\n\n // SFMC_ROOT \u53EF\u80FD\u662F\u5916\u90E8\u6570\u636E\u76EE\u5F55\uFF1B\u518D\u4ECE CLI \u4F4D\u7F6E walk-up monorepo\n const monoFromCli = findMonorepoRoot(__dirname);\n if (monoFromCli) {\n const monoDev = path.join(monoFromCli, SERVICE_SCRIPT[service]);\n if (fs.existsSync(monoDev)) return monoDev;\n }\n\n const { pkg, exportPath, rel } = SERVICE_NPM[service];\n const fromNpm = tryResolveNpm(pkg, {\n ...(exportPath ? { exportPath } : {}),\n ...(rel ? { rel } : {}),\n });\n if (fromNpm) return fromNpm;\n\n throw new Error(\n `Cannot resolve service \"${service}\". Install @sfmc-bds/sfmc (all-in-one) or run inside the monorepo. ` +\n `Looked for ${mono} and npm package ${pkg}.`\n );\n}\n\n/**\n * \u89E3\u6790 fetch-module\uFF08@sfmc-bds/cli/scripts/module-install\uFF09\u3002\n * \u4F18\u5148\u7EA7: SFMC_FETCH_MODULE > monorepo cli/scripts > @sfmc-bds/cli export\u3002\n */\nexport function resolveFetchModule(): string | null {\n const fromEnv = process.env.SFMC_FETCH_MODULE;\n if (fromEnv && fs.existsSync(fromEnv)) return fromEnv;\n\n const mono = path.join(ROOT, \"packages\", \"cli\", \"scripts\", \"module-install\", \"fetch-module.mjs\");\n if (fs.existsSync(mono)) return mono;\n\n const monoFromCli = findMonorepoRoot(__dirname);\n if (monoFromCli) {\n const monoDev = path.join(monoFromCli, \"packages\", \"cli\", \"scripts\", \"module-install\", \"fetch-module.mjs\");\n if (fs.existsSync(monoDev)) return monoDev;\n }\n\n return tryResolveNpm(\"@sfmc-bds/cli\", {\n rel: \"scripts/module-install/fetch-module.mjs\",\n exportPath: \"@sfmc-bds/cli/fetch-module.mjs\",\n });\n}\n\n/**\n * \u89E3\u6790 `@sfmc-bds/sdk` \u5305\u6839\u76EE\u5F55\uFF08\u542B package.json\uFF09\u3002\n * \u4F18\u5148\u7EA7: SFMC_SDK_ROOT > createRequire(@sfmc-bds/sdk/package.json) > \u516C\u5F00 export \u5411\u4E0A\u627E > monorepo\u3002\n */\nexport function resolveSdkPackageRoot(): string {\n const fromEnv = process.env.SFMC_SDK_ROOT;\n if (fromEnv && fs.existsSync(path.join(fromEnv, \"package.json\"))) {\n return path.resolve(fromEnv);\n }\n\n function findSdkRootFromRequire(req: NodeRequire): string | null {\n try {\n // SDK \u5DF2\u66B4\u9732 ./package.json export\uFF1B\u4F18\u5148\u76F4\u89E3\n try {\n const pkgJson = req.resolve(\"@sfmc-bds/sdk/package.json\");\n return path.dirname(pkgJson);\n } catch {\n /* \u65E7\u5305\u672A\u66B4\u9732\u65F6\u56DE\u9000 */\n }\n // \u4EFB\u4E00\u516C\u5F00 export \u5373\u53EF\uFF1B\u518D\u5411\u4E0A\u627E\u542B name=@sfmc-bds/sdk \u7684 package.json\n const hit = req.resolve(\"@sfmc-bds/sdk/sapi/runtime\");\n let dir = path.dirname(hit);\n for (let i = 0; i < 8; i++) {\n const cand = path.join(dir, \"package.json\");\n if (fs.existsSync(cand)) {\n try {\n const name = JSON.parse(fs.readFileSync(cand, \"utf8\")).name;\n if (name === \"@sfmc-bds/sdk\" || name === \"@sfmc/sdk\") return dir;\n } catch {\n /* continue */\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n } catch {\n return null;\n }\n return null;\n }\n\n for (const req of [\n requireFromCli,\n (() => {\n try {\n return createRequire(path.join(process.cwd(), \"package.json\"));\n } catch {\n return null;\n }\n })(),\n ]) {\n if (!req) continue;\n const found = findSdkRootFromRequire(req);\n if (found) return found;\n }\n\n const mono = path.join(ROOT, \"modules\", \"sdk\", \"@sfmc-sdk\");\n if (fs.existsSync(path.join(mono, \"package.json\"))) return mono;\n\n // SFMC_ROOT \u53EF\u80FD\u662F\u6570\u636E\u76EE\u5F55\uFF1B\u518D\u4ECE CLI \u4F4D\u7F6E walk-up monorepo\n const monoFromCli = findMonorepoRoot(__dirname);\n if (monoFromCli) {\n const fromCli = path.join(monoFromCli, \"modules\", \"sdk\", \"@sfmc-sdk\");\n if (fs.existsSync(path.join(fromCli, \"package.json\"))) return fromCli;\n }\n\n throw new Error(\n `Cannot resolve @sfmc-bds/sdk for behavior-pack build. ` +\n `Install @sfmc-bds/sdk next to the CLI, set SFMC_SDK_ROOT, or run inside the monorepo.`\n );\n}\n\nfunction nodeBinary(): string {\n return process.execPath;\n}\n\nfunction serviceChildEnv(service: ServiceId, optsEnv?: NodeJS.ProcessEnv | null) {\n return {\n ...process.env,\n ...optsEnv,\n SFMC_SERVICE: service,\n SFMC_ROOT: ROOT,\n SFMC_PACKAGES_DIR: PACKAGES_DIR,\n };\n}\n\n/**\n * \u542F\u52A8\u4E00\u4E2A\u5B50\u670D\u52A1\u3002\n *\n * \u900F\u4F20\u7ED9\u5B50\u8FDB\u7A0B\u7684 env:\n * - SFMC_SERVICE / SFMC_ROOT / SFMC_PACKAGES_DIR\n */\nexport function spawnService(service: ServiceId, args: string[] = [], opts: SpawnOptions = {}) {\n const env = serviceChildEnv(service, opts.env as NodeJS.ProcessEnv | undefined);\n const script = resolveServiceScript(service);\n return spawn(nodeBinary(), [script, ...args], { ...opts, env });\n}\n\n/** spawnService \u7684\u540C\u6B65\u7248\u672C */\nexport function spawnServiceSync(service: ServiceId, args: string[] = [], opts: SpawnSyncOptions = {}) {\n const env = serviceChildEnv(service, opts.env as NodeJS.ProcessEnv | undefined);\n const script = resolveServiceScript(service);\n return spawnSync(nodeBinary(), [script, ...args], { ...opts, env });\n}\n"],
|
|
5
|
+
"mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,OAAO,iBAA2D;AAC3E,SAAS,qBAAqB;AAC9B,OAAO,QAAQ;AACf,OAAO,QAAQ,eAAe;AAC9B,OAAO,aAAa;AACpB,SAAS,qBAAqB;AAE9B,MAAM,aAAa,cAAc,YAAY,GAAG;AAChD,MAAM,YAAY,QAAQ,UAAU;AACpC,MAAM,iBAAiB,cAAc,YAAY,GAAG;AAM7C,SAAS,iBAAiB,MAAuB;AACtD,SACE,GAAG,WAAW,KAAK,KAAK,MAAM,YAAY,aAAa,cAAc,CAAC,KACtE,GAAG,WAAW,KAAK,KAAK,MAAM,YAAY,OAAO,cAAc,CAAC;AAEpE;AAEA,SAAS,qBAA6B;AACpC,QAAM,QAAQ,iBAAiB,SAAS;AACxC,MAAI,SAAS,iBAAiB,KAAK,EAAG,QAAO;AAE7C,SAAO,QAAQ,IAAI;AACrB;AAOO,MAAM,OAAe,mBAAmB,mBAAmB,CAAC;AAG5D,SAAS,UAAkB;AAChC,SAAO,mBAAmB,mBAAmB,CAAC;AAChD;AAOO,SAAS,qBAAqB,OAAe,MAAe;AACjE,QAAM,UAAU,SAAwB,WAAW,MAAM,cAAc,CAAC;AACxE,SAAO,QAAQ,SAAS,cAAc;AACxC;AAEO,MAAM,eAAuB,KAAK,KAAK,MAAM,WAAW,UAAU;AAKzE,MAAM,iBAA4C;AAAA,EAChD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,gBAAgB;AAClB;AAGA,MAAM,cAAyC;AAAA,EAC7C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,gBAAgB;AAClB;AAGA,MAAM,cAAqF;AAAA,EACzF,IAAI,EAAE,KAAK,sBAAsB;AAAA,EACjC,IAAI,EAAE,KAAK,sBAAsB;AAAA,EACjC,QAAQ,EAAE,KAAK,uBAAuB,YAAY,oCAAoC,KAAK,uBAAuB;AAAA,EAClH,SAAS,EAAE,KAAK,uBAAuB,YAAY,mCAAmC,KAAK,sBAAsB;AAAA,EACjH,gBAAgB;AAAA,IACd,KAAK;AAAA,IACL,YAAY;AAAA,IACZ,KAAK;AAAA,EACP;AACF;AAEA,SAAS,cAAc,KAAa,MAA6D;AAC/F,QAAM,WAAW,CAAC,cAAc;AAChC,MAAI;AACF,aAAS,KAAK,cAAc,KAAK,KAAK,QAAQ,IAAI,GAAG,cAAc,CAAC,CAAC;AAAA,EACvE,QAAQ;AAAA,EAER;AACA,aAAW,OAAO,UAAU;AAC1B,QAAI;AACF,UAAI,MAAM,WAAY,QAAO,IAAI,QAAQ,KAAK,UAAU;AACxD,UAAI,CAAC,MAAM,IAAK,QAAO,IAAI,QAAQ,GAAG;AACtC,YAAM,OAAO,KAAK,QAAQ,IAAI,QAAQ,GAAG,GAAG,eAAe,CAAC;AAC5D,YAAM,OAAO,KAAK,KAAK,MAAM,KAAK,GAAG;AACrC,UAAI,GAAG,WAAW,IAAI,EAAG,QAAO;AAAA,IAClC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,qBAAqB,SAA4B;AAC/D,QAAM,UAAU,QAAQ,IAAI,YAAY,OAAO,CAAC;AAChD,MAAI,WAAW,GAAG,WAAW,OAAO,EAAG,QAAO;AAE9C,QAAM,OAAO,KAAK,KAAK,MAAM,eAAe,OAAO,CAAC;AACpD,MAAI,GAAG,WAAW,IAAI,EAAG,QAAO;AAGhC,QAAM,cAAc,iBAAiB,SAAS;AAC9C,MAAI,aAAa;AACf,UAAM,UAAU,KAAK,KAAK,aAAa,eAAe,OAAO,CAAC;AAC9D,QAAI,GAAG,WAAW,OAAO,EAAG,QAAO;AAAA,EACrC;AAEA,QAAM,EAAE,KAAK,YAAY,IAAI,IAAI,YAAY,OAAO;AACpD,QAAM,UAAU,cAAc,KAAK;AAAA,IACjC,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,IACnC,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC;AAAA,EACvB,CAAC;AACD,MAAI,QAAS,QAAO;AAEpB,QAAM,IAAI;AAAA,IACR,2BAA2B,OAAO,iFAClB,IAAI,oBAAoB,GAAG;AAAA,EAC7C;AACF;AAMO,SAAS,qBAAoC;AAClD,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,WAAW,GAAG,WAAW,OAAO,EAAG,QAAO;AAE9C,QAAM,OAAO,KAAK,KAAK,MAAM,YAAY,OAAO,WAAW,kBAAkB,kBAAkB;AAC/F,MAAI,GAAG,WAAW,IAAI,EAAG,QAAO;AAEhC,QAAM,cAAc,iBAAiB,SAAS;AAC9C,MAAI,aAAa;AACf,UAAM,UAAU,KAAK,KAAK,aAAa,YAAY,OAAO,WAAW,kBAAkB,kBAAkB;AACzG,QAAI,GAAG,WAAW,OAAO,EAAG,QAAO;AAAA,EACrC;AAEA,SAAO,cAAc,iBAAiB;AAAA,IACpC,KAAK;AAAA,IACL,YAAY;AAAA,EACd,CAAC;AACH;AAMO,SAAS,wBAAgC;AAC9C,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,WAAW,GAAG,WAAW,KAAK,KAAK,SAAS,cAAc,CAAC,GAAG;AAChE,WAAO,KAAK,QAAQ,OAAO;AAAA,EAC7B;AAEA,WAAS,uBAAuB,KAAiC;AAC/D,QAAI;AAEF,UAAI;AACF,cAAM,UAAU,IAAI,QAAQ,4BAA4B;AACxD,eAAO,KAAK,QAAQ,OAAO;AAAA,MAC7B,QAAQ;AAAA,MAER;AAEA,YAAM,MAAM,IAAI,QAAQ,4BAA4B;AACpD,UAAI,MAAM,KAAK,QAAQ,GAAG;AAC1B,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAM,OAAO,KAAK,KAAK,KAAK,cAAc;AAC1C,YAAI,GAAG,WAAW,IAAI,GAAG;AACvB,cAAI;AACF,kBAAM,OAAO,KAAK,MAAM,GAAG,aAAa,MAAM,MAAM,CAAC,EAAE;AACvD,gBAAI,SAAS,mBAAmB,SAAS,YAAa,QAAO;AAAA,UAC/D,QAAQ;AAAA,UAER;AAAA,QACF;AACA,cAAM,SAAS,KAAK,QAAQ,GAAG;AAC/B,YAAI,WAAW,IAAK;AACpB,cAAM;AAAA,MACR;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,aAAW,OAAO;AAAA,IAChB;AAAA,KACC,MAAM;AACL,UAAI;AACF,eAAO,cAAc,KAAK,KAAK,QAAQ,IAAI,GAAG,cAAc,CAAC;AAAA,MAC/D,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,GAAG;AAAA,EACL,GAAG;AACD,QAAI,CAAC,IAAK;AACV,UAAM,QAAQ,uBAAuB,GAAG;AACxC,QAAI,MAAO,QAAO;AAAA,EACpB;AAEA,QAAM,OAAO,KAAK,KAAK,MAAM,WAAW,OAAO,WAAW;AAC1D,MAAI,GAAG,WAAW,KAAK,KAAK,MAAM,cAAc,CAAC,EAAG,QAAO;AAG3D,QAAM,cAAc,iBAAiB,SAAS;AAC9C,MAAI,aAAa;AACf,UAAM,UAAU,KAAK,KAAK,aAAa,WAAW,OAAO,WAAW;AACpE,QAAI,GAAG,WAAW,KAAK,KAAK,SAAS,cAAc,CAAC,EAAG,QAAO;AAAA,EAChE;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EAEF;AACF;AAEA,SAAS,aAAqB;AAC5B,SAAO,QAAQ;AACjB;AAEA,SAAS,gBAAgB,SAAoB,SAAoC;AAC/E,SAAO;AAAA,IACL,GAAG,QAAQ;AAAA,IACX,GAAG;AAAA,IACH,cAAc;AAAA,IACd,WAAW;AAAA,IACX,mBAAmB;AAAA,EACrB;AACF;AAQO,SAAS,aAAa,SAAoB,OAAiB,CAAC,GAAG,OAAqB,CAAC,GAAG;AAC7F,QAAM,MAAM,gBAAgB,SAAS,KAAK,GAAoC;AAC9E,QAAM,SAAS,qBAAqB,OAAO;AAC3C,SAAO,MAAM,WAAW,GAAG,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,GAAG,MAAM,IAAI,CAAC;AAChE;AAGO,SAAS,iBAAiB,SAAoB,OAAiB,CAAC,GAAG,OAAyB,CAAC,GAAG;AACrG,QAAM,MAAM,gBAAgB,SAAS,KAAK,GAAoC;AAC9E,QAAM,SAAS,qBAAqB,OAAO;AAC3C,SAAO,UAAU,WAAW,GAAG,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,GAAG,MAAM,IAAI,CAAC;AACpE;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sfmc-modules-root.d.ts","sourceRoot":"","sources":["../src/sfmc-modules-root.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAOD,iDAAiD;AACjD,wBAAgB,4BAA4B,IAAI,MAAM,GAAG,IAAI,CAG5D;AAED,4CAA4C;AAC5C,wBAAgB,4BAA4B,CAAC,OAAO,GAAE,MAAa,GAAG,MAAM,GAAG,IAAI,CAMlF;AAED,8BAA8B;AAC9B,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,MAAa,GAAG,IAAI,CAGxF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,MAAa,GAAG,MAAM,GAAG,IAAI,CAS5E;AAED,yCAAyC;AACzC,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"sfmc-modules-root.d.ts","sourceRoot":"","sources":["../src/sfmc-modules-root.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAOD,iDAAiD;AACjD,wBAAgB,4BAA4B,IAAI,MAAM,GAAG,IAAI,CAG5D;AAED,4CAA4C;AAC5C,wBAAgB,4BAA4B,CAAC,OAAO,GAAE,MAAa,GAAG,MAAM,GAAG,IAAI,CAMlF;AAED,8BAA8B;AAC9B,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,MAAa,GAAG,IAAI,CAGxF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,MAAa,GAAG,MAAM,GAAG,IAAI,CAS5E;AAED,yCAAyC;AACzC,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,EAAE,CA+B/E;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7E"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { configPath, patchJson, readJson } from "@sfmc-bds/sdk/node/config";
|
|
2
|
-
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { ROOT } from "./runtime.js";
|
|
5
5
|
const PACKAGES_DIRNAME = "packages";
|
|
@@ -37,9 +37,13 @@ function listSfmcModulePackages(modulesRoot) {
|
|
|
37
37
|
if (!existsSync(packagesDir)) return [];
|
|
38
38
|
const out = [];
|
|
39
39
|
for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {
|
|
40
|
-
if (!entry.isDirectory()) continue;
|
|
41
40
|
const id = entry.name;
|
|
42
41
|
const pkgPath = path.join(packagesDir, id);
|
|
42
|
+
try {
|
|
43
|
+
if (!statSync(pkgPath).isDirectory()) continue;
|
|
44
|
+
} catch {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
43
47
|
const manifestPath = path.join(pkgPath, "sapi", "manifest.json");
|
|
44
48
|
let logicalId = `feature-${id}`;
|
|
45
49
|
let name = id;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/sfmc-modules-root.ts"],
|
|
4
|
-
"sourcesContent": ["import { configPath, patchJson, readJson, type RuntimeConfig } from \"@sfmc-bds/sdk/node/config\";\nimport { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { ROOT } from \"./runtime.js\";\n\nconst PACKAGES_DIRNAME = \"packages\";\n\nexport interface SfmcModulePackage {\n /** packages/ \u4E0B\u7684\u6587\u4EF6\u5939\u540D\uFF08install id\uFF09 */\n id: string;\n /** \u7EDD\u5BF9\u8DEF\u5F84 */\n path: string;\n /** manifest \u4E2D\u7684\u903B\u8F91 id\uFF0C\u7F3A\u7701\u4E3A feature-<folder> */\n logicalId: string;\n name: string;\n}\n\nfunction isSfmcModulesRoot(dir: string): boolean {\n const packagesDir = path.join(dir, PACKAGES_DIRNAME);\n return existsSync(packagesDir) && existsSync(path.join(dir, \"index.json\"));\n}\n\n/** \u81EA\u52A8\u63A2\u6D4B\u65C1\u8DEF sfmc-modules\uFF08\u4E0D\u8981\u6C42\u6839\u76EE\u5F55\u6709 package.json\uFF09\u3002 */\nexport function detectSiblingSfmcModulesRoot(): string | null {\n const sibling = path.resolve(ROOT, \"..\", \"sfmc-modules\");\n return isSfmcModulesRoot(sibling) ? sibling : null;\n}\n\n/** \u4ECE runtime.json \u8BFB\u53D6\u66FE\u4FDD\u5B58\u7684 sfmc-modules \u6839\u3002 */\nexport function readPersistedSfmcModulesRoot(rootDir: string = ROOT): string | null {\n const runtime = readJson<RuntimeConfig>(configPath(rootDir, \"runtime.json\"));\n const saved = runtime?.sfmc_modules_root;\n if (typeof saved !== \"string\" || !saved.trim()) return null;\n const resolved = path.resolve(saved);\n return isSfmcModulesRoot(resolved) ? resolved : null;\n}\n\n/** \u5199\u5165 runtime.json\uFF0C\u4E0B\u6B21\u514D\u8F93\u8DEF\u5F84\u3002 */\nexport function persistSfmcModulesRoot(modulesRoot: string, rootDir: string = ROOT): void {\n const slash = modulesRoot.replace(/\\\\/g, \"/\");\n patchJson<RuntimeConfig>(configPath(rootDir, \"runtime.json\"), { sfmc_modules_root: slash });\n}\n\n/**\n * \u89E3\u6790 sfmc-modules \u6839\u76EE\u5F55\u3002\n * \u4F18\u5148\u7EA7\uFF1ASFMC_MODULES_ROOT \u73AF\u5883\u53D8\u91CF \u2192 runtime.json \u2192 \u65C1\u8DEF ../sfmc-modules\n */\nexport function resolveSfmcModulesRoot(rootDir: string = ROOT): string | null {\n const fromEnv = process.env.SFMC_MODULES_ROOT;\n if (fromEnv) {\n const resolved = path.resolve(fromEnv);\n if (isSfmcModulesRoot(resolved)) return resolved;\n }\n const persisted = readPersistedSfmcModulesRoot(rootDir);\n if (persisted) return persisted;\n return detectSiblingSfmcModulesRoot();\n}\n\n/** \u679A\u4E3E sfmc-modules/packages \u4E0B\u53EF\u5B89\u88C5\u7684\u6A21\u5757\u5305\u3002 */\nexport function listSfmcModulePackages(modulesRoot: string): SfmcModulePackage[] {\n const packagesDir = path.join(modulesRoot, PACKAGES_DIRNAME);\n if (!existsSync(packagesDir)) return [];\n const out: SfmcModulePackage[] = [];\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n
|
|
5
|
-
"mappings": "AAAA,SAAS,YAAY,WAAW,gBAAoC;AACpE,SAAS,YAAY,aAAa,
|
|
4
|
+
"sourcesContent": ["import { configPath, patchJson, readJson, type RuntimeConfig } from \"@sfmc-bds/sdk/node/config\";\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { ROOT } from \"./runtime.js\";\n\nconst PACKAGES_DIRNAME = \"packages\";\n\nexport interface SfmcModulePackage {\n /** packages/ \u4E0B\u7684\u6587\u4EF6\u5939\u540D\uFF08install id\uFF09 */\n id: string;\n /** \u7EDD\u5BF9\u8DEF\u5F84 */\n path: string;\n /** manifest \u4E2D\u7684\u903B\u8F91 id\uFF0C\u7F3A\u7701\u4E3A feature-<folder> */\n logicalId: string;\n name: string;\n}\n\nfunction isSfmcModulesRoot(dir: string): boolean {\n const packagesDir = path.join(dir, PACKAGES_DIRNAME);\n return existsSync(packagesDir) && existsSync(path.join(dir, \"index.json\"));\n}\n\n/** \u81EA\u52A8\u63A2\u6D4B\u65C1\u8DEF sfmc-modules\uFF08\u4E0D\u8981\u6C42\u6839\u76EE\u5F55\u6709 package.json\uFF09\u3002 */\nexport function detectSiblingSfmcModulesRoot(): string | null {\n const sibling = path.resolve(ROOT, \"..\", \"sfmc-modules\");\n return isSfmcModulesRoot(sibling) ? sibling : null;\n}\n\n/** \u4ECE runtime.json \u8BFB\u53D6\u66FE\u4FDD\u5B58\u7684 sfmc-modules \u6839\u3002 */\nexport function readPersistedSfmcModulesRoot(rootDir: string = ROOT): string | null {\n const runtime = readJson<RuntimeConfig>(configPath(rootDir, \"runtime.json\"));\n const saved = runtime?.sfmc_modules_root;\n if (typeof saved !== \"string\" || !saved.trim()) return null;\n const resolved = path.resolve(saved);\n return isSfmcModulesRoot(resolved) ? resolved : null;\n}\n\n/** \u5199\u5165 runtime.json\uFF0C\u4E0B\u6B21\u514D\u8F93\u8DEF\u5F84\u3002 */\nexport function persistSfmcModulesRoot(modulesRoot: string, rootDir: string = ROOT): void {\n const slash = modulesRoot.replace(/\\\\/g, \"/\");\n patchJson<RuntimeConfig>(configPath(rootDir, \"runtime.json\"), { sfmc_modules_root: slash });\n}\n\n/**\n * \u89E3\u6790 sfmc-modules \u6839\u76EE\u5F55\u3002\n * \u4F18\u5148\u7EA7\uFF1ASFMC_MODULES_ROOT \u73AF\u5883\u53D8\u91CF \u2192 runtime.json \u2192 \u65C1\u8DEF ../sfmc-modules\n */\nexport function resolveSfmcModulesRoot(rootDir: string = ROOT): string | null {\n const fromEnv = process.env.SFMC_MODULES_ROOT;\n if (fromEnv) {\n const resolved = path.resolve(fromEnv);\n if (isSfmcModulesRoot(resolved)) return resolved;\n }\n const persisted = readPersistedSfmcModulesRoot(rootDir);\n if (persisted) return persisted;\n return detectSiblingSfmcModulesRoot();\n}\n\n/** \u679A\u4E3E sfmc-modules/packages \u4E0B\u53EF\u5B89\u88C5\u7684\u6A21\u5757\u5305\u3002 */\nexport function listSfmcModulePackages(modulesRoot: string): SfmcModulePackage[] {\n const packagesDir = path.join(modulesRoot, PACKAGES_DIRNAME);\n if (!existsSync(packagesDir)) return [];\n const out: SfmcModulePackage[] = [];\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n const id = entry.name;\n const pkgPath = path.join(packagesDir, id);\n try {\n if (!statSync(pkgPath).isDirectory()) continue;\n } catch {\n continue;\n }\n const manifestPath = path.join(pkgPath, \"sapi\", \"manifest.json\");\n let logicalId = `feature-${id}`;\n let name = id;\n if (existsSync(manifestPath)) {\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as {\n id?: string;\n name?: string;\n };\n if (manifest.id) logicalId = manifest.id;\n if (manifest.name) name = manifest.name;\n } catch {\n /* \u635F\u574F manifest \u4ECD\u5217\u51FA\u6587\u4EF6\u5939 */\n }\n }\n out.push({ id, path: pkgPath, logicalId, name });\n }\n out.sort((a, b) => a.id.localeCompare(b.id));\n return out;\n}\n\nexport function packageDirForId(modulesRoot: string, folderId: string): string {\n return path.join(modulesRoot, PACKAGES_DIRNAME, folderId);\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,YAAY,WAAW,gBAAoC;AACpE,SAAS,YAAY,aAAa,cAAc,gBAAgB;AAChE,OAAO,UAAU;AACjB,SAAS,YAAY;AAErB,MAAM,mBAAmB;AAYzB,SAAS,kBAAkB,KAAsB;AAC/C,QAAM,cAAc,KAAK,KAAK,KAAK,gBAAgB;AACnD,SAAO,WAAW,WAAW,KAAK,WAAW,KAAK,KAAK,KAAK,YAAY,CAAC;AAC3E;AAGO,SAAS,+BAA8C;AAC5D,QAAM,UAAU,KAAK,QAAQ,MAAM,MAAM,cAAc;AACvD,SAAO,kBAAkB,OAAO,IAAI,UAAU;AAChD;AAGO,SAAS,6BAA6B,UAAkB,MAAqB;AAClF,QAAM,UAAU,SAAwB,WAAW,SAAS,cAAc,CAAC;AAC3E,QAAM,QAAQ,SAAS;AACvB,MAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,EAAG,QAAO;AACvD,QAAM,WAAW,KAAK,QAAQ,KAAK;AACnC,SAAO,kBAAkB,QAAQ,IAAI,WAAW;AAClD;AAGO,SAAS,uBAAuB,aAAqB,UAAkB,MAAY;AACxF,QAAM,QAAQ,YAAY,QAAQ,OAAO,GAAG;AAC5C,YAAyB,WAAW,SAAS,cAAc,GAAG,EAAE,mBAAmB,MAAM,CAAC;AAC5F;AAMO,SAAS,uBAAuB,UAAkB,MAAqB;AAC5E,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,SAAS;AACX,UAAM,WAAW,KAAK,QAAQ,OAAO;AACrC,QAAI,kBAAkB,QAAQ,EAAG,QAAO;AAAA,EAC1C;AACA,QAAM,YAAY,6BAA6B,OAAO;AACtD,MAAI,UAAW,QAAO;AACtB,SAAO,6BAA6B;AACtC;AAGO,SAAS,uBAAuB,aAA0C;AAC/E,QAAM,cAAc,KAAK,KAAK,aAAa,gBAAgB;AAC3D,MAAI,CAAC,WAAW,WAAW,EAAG,QAAO,CAAC;AACtC,QAAM,MAA2B,CAAC;AAClC,aAAW,SAAS,YAAY,aAAa,EAAE,eAAe,KAAK,CAAC,GAAG;AACrE,UAAM,KAAK,MAAM;AACjB,UAAM,UAAU,KAAK,KAAK,aAAa,EAAE;AACzC,QAAI;AACF,UAAI,CAAC,SAAS,OAAO,EAAE,YAAY,EAAG;AAAA,IACxC,QAAQ;AACN;AAAA,IACF;AACA,UAAM,eAAe,KAAK,KAAK,SAAS,QAAQ,eAAe;AAC/D,QAAI,YAAY,WAAW,EAAE;AAC7B,QAAI,OAAO;AACX,QAAI,WAAW,YAAY,GAAG;AAC5B,UAAI;AACF,cAAM,WAAW,KAAK,MAAM,aAAa,cAAc,MAAM,CAAC;AAI9D,YAAI,SAAS,GAAI,aAAY,SAAS;AACtC,YAAI,SAAS,KAAM,QAAO,SAAS;AAAA,MACrC,QAAQ;AAAA,MAER;AAAA,IACF;AACA,QAAI,KAAK,EAAE,IAAI,MAAM,SAAS,WAAW,KAAK,CAAC;AAAA,EACjD;AACA,MAAI,KAAK,CAAC,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC;AAC3C,SAAO;AACT;AAEO,SAAS,gBAAgB,aAAqB,UAA0B;AAC7E,SAAO,KAAK,KAAK,aAAa,kBAAkB,QAAQ;AAC1D;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"world-packs.d.ts","sourceRoot":"","sources":["../src/world-packs.ts"],"names":[],"mappings":"AAKA,OAAO,
|
|
1
|
+
{"version":3,"file":"world-packs.d.ts","sourceRoot":"","sources":["../src/world-packs.ts"],"names":[],"mappings":"AAKA,OAAO,EAiBL,KAAK,kBAAkB,EAExB,MAAM,iCAAiC,CAAC;AAuBzC,eAAO,MAAM,eAAe,YAAI,OAAO,EAAE,OAAO,CAAU,CAAC;AAC3D,eAAO,MAAM,iBAAiB,YAC5B,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,WAAW,EACX,MAAM,EACN,SAAS,EACT,MAAM,EACN,QAAQ,EACR,MAAM,EACN,MAAM,EACN,QAAQ,EACR,SAAS,EACT,OAAO,EACP,QAAQ,CACA,CAAC;AAcX,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,GAAG,IAAI,MAAM,CAErE;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AA4ED,gDAAgD;AAChD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,GAAG,OAAO,CAGzF;AAqED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,kBAAkB,EAAE,EAC3B,GAAG,EAAE,MAAM,EAAE,GAEX;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAA;CAAE,GAChD;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAC1C;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAgB1C;AAmND;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,CAAC,EAAE;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAiJlE;AAwND,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA8PnG;AAED,wBAAgB,UAAU,IAAI,MAAM,CAuBnC"}
|
package/dist/world-packs.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { confirm, isCancel, multiselect } from "@clack/prompts";
|
|
2
2
|
import {
|
|
3
3
|
bumpPackPatchVersion,
|
|
4
|
+
checkWorldBetaApiRequirements,
|
|
5
|
+
checkWorldScriptPermissions,
|
|
4
6
|
disableInstalledPack,
|
|
5
7
|
enableInstalledPack,
|
|
6
8
|
findInstalledPackById,
|
|
@@ -10,6 +12,7 @@ import {
|
|
|
10
12
|
listWorldEnableListResult,
|
|
11
13
|
readPackDependencyUuids,
|
|
12
14
|
readPackManifestInfo,
|
|
15
|
+
repairWorldPacksWiring,
|
|
13
16
|
resolvePackRoots,
|
|
14
17
|
uninstallInstalledPack,
|
|
15
18
|
worldPackParentDir
|
|
@@ -542,10 +545,64 @@ function parseListFlags(args) {
|
|
|
542
545
|
function hasFlag(args, name) {
|
|
543
546
|
return args.includes(name);
|
|
544
547
|
}
|
|
545
|
-
async function cmdDoctor() {
|
|
548
|
+
async function cmdDoctor(args = []) {
|
|
549
|
+
const isFix = hasFlag(args, "--fix") || hasFlag(args, "-y") || hasFlag(args, "fix");
|
|
546
550
|
const { bdsRoot, levelName } = resolveBdsContext();
|
|
547
551
|
const packs = listInstalledWorldPacks(bdsRoot, levelName);
|
|
552
|
+
if (isFix) {
|
|
553
|
+
const betaDiag2 = checkWorldBetaApiRequirements(bdsRoot, levelName, packs);
|
|
554
|
+
const shouldFixBeta = !betaDiag2.hasBetaApis && betaDiag2.requiringPacks.length > 0;
|
|
555
|
+
const repRes = await repairWorldPacksWiring(bdsRoot, levelName, { fixBetaApis: shouldFixBeta });
|
|
556
|
+
const fixLogs = [];
|
|
557
|
+
if (repRes.betaApisResult?.attempted) {
|
|
558
|
+
if (repRes.betaApisResult.changed) {
|
|
559
|
+
fixLogs.push(
|
|
560
|
+
c.green(
|
|
561
|
+
t("packs.doctor.betaApisFixed", {
|
|
562
|
+
level: levelName,
|
|
563
|
+
backup: repRes.betaApisResult.backupPath ?? "level.dat.bak"
|
|
564
|
+
})
|
|
565
|
+
)
|
|
566
|
+
);
|
|
567
|
+
} else if (repRes.betaApisResult.error) {
|
|
568
|
+
fixLogs.push(
|
|
569
|
+
c.red(t("packs.doctor.betaApisFailed", { level: levelName, error: repRes.betaApisResult.error }))
|
|
570
|
+
);
|
|
571
|
+
} else {
|
|
572
|
+
fixLogs.push(c.dim(t("packs.doctor.betaApisAlreadyOn", { level: levelName })));
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
for (const g of repRes.cleanedGhostPacks) {
|
|
576
|
+
fixLogs.push(c.green(t("packs.doctor.ghostPackCleaned", { kind: g.kind, uuid: g.uuid })));
|
|
577
|
+
}
|
|
578
|
+
for (const s of repRes.syncedVersions) {
|
|
579
|
+
fixLogs.push(
|
|
580
|
+
c.green(
|
|
581
|
+
t("packs.doctor.versionSynced", {
|
|
582
|
+
kind: s.kind,
|
|
583
|
+
folder: s.folder,
|
|
584
|
+
listVer: s.listVer,
|
|
585
|
+
diskVer: s.diskVer
|
|
586
|
+
})
|
|
587
|
+
)
|
|
588
|
+
);
|
|
589
|
+
}
|
|
590
|
+
if (repRes.fixedPermissions && repRes.fixedPermissions.length > 0) {
|
|
591
|
+
fixLogs.push(
|
|
592
|
+
c.green(
|
|
593
|
+
t("packs.doctor.permissionsFixed", {
|
|
594
|
+
perms: repRes.fixedPermissions.map((x) => `${x.packName} (${x.moduleName})`).join(", ")
|
|
595
|
+
})
|
|
596
|
+
)
|
|
597
|
+
);
|
|
598
|
+
}
|
|
599
|
+
const totalHealed = (repRes.betaApisResult?.changed ? 1 : 0) + repRes.cleanedGhostPacks.length + repRes.syncedVersions.length + (repRes.fixedPermissions?.length ?? 0);
|
|
600
|
+
if (totalHealed > 0) {
|
|
601
|
+
return fixLogs.map((x) => ` - ${x}`).join("\n") + "\n" + c.green(t("packs.doctor.fixedSummary", { count: totalHealed }));
|
|
602
|
+
}
|
|
603
|
+
}
|
|
548
604
|
const issues = [];
|
|
605
|
+
let fixableCount = 0;
|
|
549
606
|
for (const kind of ["behavior", "resource"]) {
|
|
550
607
|
const snap = listWorldEnableListResult(bdsRoot, levelName, kind);
|
|
551
608
|
if (snap.parseFailedFile) {
|
|
@@ -556,6 +613,7 @@ async function cmdDoctor() {
|
|
|
556
613
|
const p = byUuid.get(e.pack_id);
|
|
557
614
|
if (!p) {
|
|
558
615
|
issues.push(t("packs.doctor.missingDir", { kind, uuid: e.pack_id }));
|
|
616
|
+
fixableCount++;
|
|
559
617
|
continue;
|
|
560
618
|
}
|
|
561
619
|
const ev = e.version;
|
|
@@ -568,25 +626,38 @@ async function cmdDoctor() {
|
|
|
568
626
|
diskVer: fmtVer(p.version)
|
|
569
627
|
})
|
|
570
628
|
);
|
|
629
|
+
fixableCount++;
|
|
571
630
|
}
|
|
572
631
|
}
|
|
573
632
|
}
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
633
|
+
const betaDiag = checkWorldBetaApiRequirements(bdsRoot, levelName, packs);
|
|
634
|
+
if (betaDiag.requiringPacks.length > 0 && !betaDiag.hasBetaApis) {
|
|
635
|
+
const packLines = betaDiag.requiringPacks.map((rp) => {
|
|
636
|
+
const depStr = rp.betaDependencies.map((d) => `${d.module_name ?? d.uuid}@${d.version ?? ""}`).join(", ");
|
|
637
|
+
const name = !rp.pack.name || rp.pack.name.startsWith("pack.") || rp.pack.name === "pack" ? rp.pack.folderName : `${rp.pack.name} (${rp.pack.folderName})`;
|
|
638
|
+
return ` * ${name} (v${fmtVer(rp.pack.version)}) -> \u4F9D\u8D56 ${depStr}`;
|
|
639
|
+
}).join("\n");
|
|
640
|
+
issues.push(t("packs.doctor.betaApisMissing", { level: levelName, packs: packLines }));
|
|
641
|
+
fixableCount++;
|
|
642
|
+
}
|
|
643
|
+
const permDiag = checkWorldScriptPermissions(bdsRoot, levelName, packs);
|
|
644
|
+
if (permDiag.missingPermissions.length > 0) {
|
|
645
|
+
const list = permDiag.missingPermissions.map((m) => {
|
|
646
|
+
const name = !m.pack.name || m.pack.name.startsWith("pack.") || m.pack.name === "pack" ? m.pack.folderName : `${m.pack.name} (${m.pack.folderName})`;
|
|
647
|
+
return ` * ${name} -> \u4F9D\u8D56\u6A21\u5757 ${m.moduleName}`;
|
|
648
|
+
}).join("\n");
|
|
649
|
+
issues.push(t("packs.doctor.permissionsMissing", { list }));
|
|
650
|
+
fixableCount++;
|
|
584
651
|
}
|
|
585
652
|
if (issues.length === 0) return c.green(t("packs.doctor.ok"));
|
|
586
|
-
|
|
653
|
+
let res = t("packs.doctor.found", {
|
|
587
654
|
count: issues.length,
|
|
588
655
|
list: issues.map((x) => ` - ${x}`).join("\n")
|
|
589
656
|
});
|
|
657
|
+
if (fixableCount > 0 && !isFix) {
|
|
658
|
+
res += "\n\n " + c.cyan(t("packs.doctor.fixPrompt"));
|
|
659
|
+
}
|
|
660
|
+
return res;
|
|
590
661
|
}
|
|
591
662
|
async function dispatchPacksCommand(sub, args) {
|
|
592
663
|
const verb = (sub ?? "").toLowerCase();
|
|
@@ -815,7 +886,7 @@ async function dispatchPacksCommand(sub, args) {
|
|
|
815
886
|
);
|
|
816
887
|
}
|
|
817
888
|
case "doctor":
|
|
818
|
-
return await cmdDoctor();
|
|
889
|
+
return await cmdDoctor(args);
|
|
819
890
|
case "path": {
|
|
820
891
|
ensureInboxLayout();
|
|
821
892
|
const { bdsRoot, levelName } = resolveBdsContext();
|