@sfmc-bds/bds-tools 0.1.0 → 0.2.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bds-manager.d.ts.map +1 -1
- package/dist/bds-manager.js +236 -263
- package/dist/bds-manager.js.map +7 -1
- package/dist/changelog.js +39 -50
- package/dist/changelog.js.map +7 -1
- package/dist/check-update.d.ts +2 -2
- package/dist/check-update.d.ts.map +1 -1
- package/dist/check-update.js +361 -401
- package/dist/check-update.js.map +7 -1
- package/dist/cli-pack-manager.d.ts +10 -6
- package/dist/cli-pack-manager.d.ts.map +1 -1
- package/dist/cli-pack-manager.js +226 -135
- package/dist/cli-pack-manager.js.map +7 -1
- package/dist/fsx.js +86 -100
- package/dist/fsx.js.map +7 -1
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +166 -185
- package/dist/http.js.map +7 -1
- package/dist/is-main.d.ts +17 -0
- package/dist/is-main.d.ts.map +1 -0
- package/dist/is-main.js +32 -0
- package/dist/is-main.js.map +7 -0
- package/dist/log.d.ts +2 -4
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +12 -19
- package/dist/log.js.map +7 -1
- package/dist/logger.js +6 -10
- package/dist/logger.js.map +7 -1
- package/dist/pack-manager.d.ts +88 -24
- package/dist/pack-manager.d.ts.map +1 -1
- package/dist/pack-manager.js +280 -245
- package/dist/pack-manager.js.map +7 -1
- package/dist/paths.d.ts +8 -3
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +53 -39
- package/dist/paths.js.map +7 -1
- package/dist/qqutil.d.ts.map +1 -1
- package/dist/qqutil.js +90 -87
- package/dist/qqutil.js.map +7 -1
- package/dist/recovery.js +26 -37
- package/dist/recovery.js.map +7 -1
- package/dist/rollback.d.ts +1 -1
- package/dist/rollback.js +55 -74
- package/dist/rollback.js.map +7 -1
- package/dist/server-properties.d.ts +12 -0
- package/dist/server-properties.d.ts.map +1 -0
- package/dist/server-properties.js +28 -0
- package/dist/server-properties.js.map +7 -0
- package/dist/taskbar.d.ts +2 -0
- package/dist/taskbar.d.ts.map +1 -1
- package/dist/taskbar.js +51 -82
- package/dist/taskbar.js.map +7 -1
- package/dist/types.js +1 -5
- package/dist/types.js.map +7 -1
- package/dist/update-result.d.ts +12 -0
- package/dist/update-result.d.ts.map +1 -0
- package/dist/update-result.js +15 -0
- package/dist/update-result.js.map +7 -0
- package/dist/upstream.js +94 -108
- package/dist/upstream.js.map +7 -1
- package/dist/version.js +63 -81
- package/dist/version.js.map +7 -1
- package/dist/world-packs.d.ts +112 -0
- package/dist/world-packs.d.ts.map +1 -0
- package/dist/world-packs.js +335 -0
- package/dist/world-packs.js.map +7 -0
- package/dist/zipx.d.ts +10 -0
- package/dist/zipx.d.ts.map +1 -0
- package/dist/zipx.js +48 -0
- package/dist/zipx.js.map +7 -0
- package/package.json +17 -6
package/dist/http.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/http.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * http.ts \u2014 \u7A33\u5B9A HTTP \u5DE5\u5177 (\u5206\u9636\u6BB5\u8D85\u65F6 + \u81EA\u52A8\u91CD\u5B9A\u5411 + \u6D41\u5F0F\u4E0B\u8F7D)\n *\n * \u6539\u8FDB:\n * - connect timeout vs total timeout \u5206\u5F00\n * - \u4E0B\u8F7D\u901A\u8FC7\u6D41\u7BA1\u9053\uFF0C\u907F\u514D\u5927\u6587\u4EF6\u52A0\u8F7D\u5230\u5185\u5B58\n * - \u5931\u8D25\u540E\u5DF2\u5199\u5165\u7684\u4E34\u65F6\u6587\u4EF6\u53EF\u88AB\u6E05\u7406\n */\n\nimport http from \"node:http\";\nimport https from \"node:https\";\nimport type { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { createWriteStream, statSync } from \"node:fs\";\nimport { log } from \"./log.js\";\n\ninterface HttpOptions {\n method?: \"GET\" | \"HEAD\" | \"POST\";\n headers?: Record<string, string>;\n body?: string;\n connectTimeoutMs?: number;\n totalTimeoutMs?: number;\n redirects?: number;\n}\n\nconst MAX_REDIRECTS = 5;\nconst DEFAULT_CONNECT_TIMEOUT = 15_000;\nconst DEFAULT_TOTAL_TIMEOUT = 600_000;\n\nexport async function httpRequest(\n url: string,\n opts: HttpOptions = {}\n): Promise<{ statusCode: number; body: Buffer; headers: Record<string, string | string[] | undefined> }> {\n const redirects = opts.redirects ?? 0;\n const totalTimeoutMs = opts.totalTimeoutMs ?? DEFAULT_TOTAL_TIMEOUT;\n const connectTimeoutMs = opts.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT;\n\n const u = new URL(url);\n const isHttps = u.protocol === \"https:\";\n const mod = isHttps ? https : http;\n\n return new Promise((resolve, reject) => {\n const req = mod.request(\n {\n hostname: u.hostname,\n port: u.port || (isHttps ? 443 : 80),\n path: u.pathname + u.search,\n method: opts.method ?? \"GET\",\n headers: { \"User-Agent\": \"BDSUpdater/2.0\", ...(opts.headers ?? {}) },\n },\n (res) => {\n const chunks: Buffer[] = [];\n res.on(\"data\", (c: Buffer) => chunks.push(c));\n res.on(\"end\", () => {\n const body = Buffer.concat(chunks);\n const status = res.statusCode ?? 0;\n // 3xx \u2192 \u8DDF\u968F Location\n if (status >= 300 && status < 400 && redirects < MAX_REDIRECTS) {\n const loc = res.headers.location;\n if (!loc) return reject(new Error(`HTTP ${status} \u4F46\u7F3A\u5C11 Location`));\n const next = loc.startsWith(\"http\") ? loc : new URL(loc, url).href;\n httpRequest(next, { ...opts, redirects: redirects + 1 })\n .then(resolve)\n .catch(reject);\n return;\n }\n if (status >= 400) {\n return reject(new Error(`HTTP ${status} for ${url}`));\n }\n resolve({ statusCode: status, body, headers: res.headers });\n });\n }\n );\n\n const totalTimer = setTimeout(() => {\n req.destroy(new Error(`HTTP \u603B\u8D85\u65F6 ${totalTimeoutMs}ms: ${url}`));\n }, totalTimeoutMs);\n const connectTimer = setTimeout(() => {\n req.destroy(new Error(`HTTP \u8FDE\u63A5\u8D85\u65F6 ${connectTimeoutMs}ms: ${url}`));\n }, connectTimeoutMs);\n\n req.on(\"socket\", () => clearTimeout(connectTimer));\n req.on(\"error\", (err) => {\n clearTimeout(totalTimer);\n clearTimeout(connectTimer);\n reject(err);\n });\n\n if (opts.body) req.write(opts.body);\n req.end();\n });\n}\n\nexport async function httpGetJson<T = unknown>(\n url: string,\n opts: HttpOptions = {}\n): Promise<T> {\n const res = await httpRequest(url, opts);\n try {\n return JSON.parse(res.body.toString(\"utf-8\")) as T;\n } catch (e) {\n throw new Error(`JSON \u89E3\u6790\u5931\u8D25 ${url}: ${(e as Error).message}`);\n }\n}\n\nexport async function httpGetText(url: string, opts: HttpOptions = {}): Promise<string> {\n const res = await httpRequest(url, opts);\n return res.body.toString(\"utf-8\");\n}\n\n/** \u591A\u4E2A\u6E90\u5E76\u53D1\u8BF7\u6C42\uFF0C\u8C01\u5148\u6210\u529F\u8FD4\u56DE\uFF08\u6BCF\u4E2A\u6E90\u90FD\u7528 JSON \u89E3\u6790\uFF0C\u89E3\u6790\u5931\u8D25\u4E5F\u5931\u8D25\uFF09 */\nexport async function fetchJsonWithFallback<T = unknown>(\n sources: string[],\n timeoutMs = 15_000\n): Promise<T> {\n const tasks = sources.map(async (url) => {\n const res = await httpGetJson<T>(url, { totalTimeoutMs: timeoutMs });\n return { url, value: res };\n });\n const settled = await Promise.allSettled(tasks);\n for (const r of settled) {\n if (r.status === \"fulfilled\") return r.value.value;\n }\n const errors = settled\n .filter((r): r is PromiseRejectedResult => r.status === \"rejected\")\n .map((r) => r.reason?.message ?? \"unknown\")\n .join(\"; \");\n throw new Error(`\u6240\u6709\u6E90\u5747\u4E0D\u53EF\u7528: ${errors}`);\n}\n\n/**\n * \u6D41\u5F0F\u4E0B\u8F7D\u5230\u6307\u5B9A\u8DEF\u5F84\uFF0C\u8FD4\u56DE\u5B57\u8282\u6570\u3002\n * - \u5931\u8D25\u65F6\u81EA\u52A8\u6E05\u7406 partial \u6587\u4EF6\n * - \u652F\u6301 progress \u56DE\u8C03\n * - \u652F\u6301 connect/total \u9636\u6BB5\u8D85\u65F6\n */\nexport interface DownloadOptions extends HttpOptions {\n onProgress?: (downloaded: number, total: number) => void;\n}\n\nexport async function httpDownload(\n url: string,\n destPath: string,\n opts: DownloadOptions = {}\n): Promise<number> {\n const totalTimeoutMs = opts.totalTimeoutMs ?? DEFAULT_TOTAL_TIMEOUT;\n const connectTimeoutMs = opts.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT;\n\n const u = new URL(url);\n const isHttps = u.protocol === \"https:\";\n const mod = isHttps ? https : http;\n let redirects = opts.redirects ?? 0;\n\n return new Promise((resolve, reject) => {\n const req = mod.request(\n {\n hostname: u.hostname,\n port: u.port || (isHttps ? 443 : 80),\n path: u.pathname + u.search,\n method: \"GET\",\n headers: { \"User-Agent\": \"BDSUpdater/2.0\", ...(opts.headers ?? {}) },\n },\n (res) => {\n const status = res.statusCode ?? 0;\n if (status >= 300 && status < 400 && redirects < MAX_REDIRECTS) {\n const loc = res.headers.location;\n if (!loc) return reject(new Error(`HTTP ${status} \u7F3A\u5C11 Location`));\n redirects++;\n const next = loc.startsWith(\"http\") ? loc : new URL(loc, url).href;\n res.resume();\n httpDownload(next, destPath, { ...opts, redirects })\n .then(resolve)\n .catch(reject);\n return;\n }\n if (status >= 400) return reject(new Error(`HTTP ${status} for ${url}`));\n\n const total = parseInt(String(res.headers[\"content-length\"] ?? 0), 10) || 0;\n const file = createWriteStream(destPath);\n let downloaded = 0;\n let failed = false;\n // \u8282\u6D41\u8FDB\u5EA6\u56DE\u8C03:\u6BCF\u4E2A tick \u6700\u591A 10 \u6B21/\u79D2(100ms \u95F4\u9694),\n // \u907F\u514D cli-progress \u9891\u7E41\u91CD\u7ED8\u62D6\u6162\u4E0B\u8F7D\n let lastProgressAt = 0;\n const PROGRESS_INTERVAL_MS = 100;\n\n const handleError = (e: Error): void => {\n if (failed) return;\n failed = true;\n file.close();\n // \u6E05\u7406 partial \u6587\u4EF6\n import(\"node:fs\").then((fs) => {\n try { fs.unlinkSync(destPath); } catch {}\n });\n reject(e);\n };\n\n const stream: Readable = res;\n stream.on(\"data\", (chunk: Buffer) => {\n downloaded += chunk.length;\n if (opts.onProgress) {\n const now = Date.now();\n if (now - lastProgressAt >= PROGRESS_INTERVAL_MS) {\n lastProgressAt = now;\n /* total=0\uFF08\u65E0 Content-Length\uFF09\u65F6\u4ECD\u56DE\u8C03\uFF0C\u8C03\u7528\u65B9\u53EF\u7528\u5DF2\u4E0B\u8F7D\u5B57\u8282\u66F4\u65B0 UI */\n opts.onProgress(downloaded, total);\n }\n }\n });\n stream.on(\"error\", (e) => handleError(e as Error));\n\n file.on(\"error\", (e) => handleError(e as Error));\n\n pipeline(stream, file).catch((e) => {\n if (!failed) handleError(e as Error);\n });\n\n // \u4E0D\u80FD\u76F4\u63A5\u76D1\u542C file 'finish' \u56E0\u4E3A\u6211\u4EEC\u5728\u9519\u8BEF\u65F6\u624B\u52A8 handleError\n file.on(\"finish\", () => {\n if (failed) return;\n try {\n const finalBytes = statSync(destPath).size;\n // \u6536\u5C3E:\u786E\u4FDD\u6700\u540E\u4E00\u6B21\u56DE\u8C03\u8BA9\u8FDB\u5EA6\u6761\u8D70\u5230 100%(\u5373\u4FBF\u6700\u8FD1\n // \u4E00\u4E2A tick \u7684\u8282\u6D41\u6CA1\u89E6\u53D1,\u4E5F\u8865\u4E00\u6B21)\u3002\n // \u65E0 Content-Length\uFF08total=0\uFF09\u65F6\u7528 finalBytes \u4F5C\u603B\u91CF\uFF0C\u4E0E\u4E2D\u9014\u300C\u4ECD\u56DE\u8C03\u300D\u5951\u7EA6\u4E00\u81F4\uFF08LSP\uFF09\u3002\n if (opts.onProgress) {\n opts.onProgress(finalBytes, total > 0 ? total : finalBytes);\n }\n resolve(finalBytes);\n } catch (e) {\n reject(e as Error);\n }\n });\n }\n );\n\n const totalTimer = setTimeout(() => {\n req.destroy(new Error(`\u4E0B\u8F7D\u603B\u8D85\u65F6 ${totalTimeoutMs}ms: ${url}`));\n }, totalTimeoutMs);\n const connectTimer = setTimeout(() => {\n req.destroy(new Error(`\u4E0B\u8F7D\u8FDE\u63A5\u8D85\u65F6 ${connectTimeoutMs}ms: ${url}`));\n }, connectTimeoutMs);\n\n req.on(\"socket\", () => clearTimeout(connectTimer));\n req.on(\"error\", (e) => {\n clearTimeout(totalTimer);\n clearTimeout(connectTimer);\n log.warn(`HTTP \u9519\u8BEF ${url}: ${(e as Error).message}`);\n reject(e);\n });\n req.end();\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* is-main.ts — ESM 下判断当前模块是否为进程入口
|
|
3
|
+
*
|
|
4
|
+
* package.json 声明 "type": "module" 后,`require` 不存在,
|
|
5
|
+
* 不能再用 `require.main === module`。
|
|
6
|
+
*
|
|
7
|
+
* 契约(与历史 endsWith 行为对齐,满足 LSP):
|
|
8
|
+
* 1. process.argv[1] 与本文件 realpath 相同 → true
|
|
9
|
+
* 2. 根目录 shim(如 recovery.js → dist/recovery.js)同 stem → true
|
|
10
|
+
* 3. 被其他入口 import 时(argv stem 不同)→ false
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* 判断 metaUrl 对应模块是否为 node 进程主入口。
|
|
14
|
+
* 替代 CommonJS 的 `require.main === module`。
|
|
15
|
+
*/
|
|
16
|
+
export declare function isMainModule(metaUrl: string): boolean;
|
|
17
|
+
//# sourceMappingURL=is-main.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-main.d.ts","sourceRoot":"","sources":["../src/is-main.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAuBH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAYrD"}
|
package/dist/is-main.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
function normPath(p) {
|
|
5
|
+
return process.platform === "win32" ? p.toLowerCase() : p;
|
|
6
|
+
}
|
|
7
|
+
function entryStem(filePath) {
|
|
8
|
+
return path.basename(filePath).replace(/\.(c|m)?(js|ts)$/i, "");
|
|
9
|
+
}
|
|
10
|
+
function tryRealpath(filePath) {
|
|
11
|
+
try {
|
|
12
|
+
return fs.realpathSync.native(filePath);
|
|
13
|
+
} catch {
|
|
14
|
+
return filePath;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function isMainModule(metaUrl) {
|
|
18
|
+
const entry = process.argv[1];
|
|
19
|
+
if (!entry) return false;
|
|
20
|
+
try {
|
|
21
|
+
const thisFile = tryRealpath(path.resolve(fileURLToPath(metaUrl)));
|
|
22
|
+
const entryFile = tryRealpath(path.resolve(entry));
|
|
23
|
+
if (normPath(thisFile) === normPath(entryFile)) return true;
|
|
24
|
+
return normPath(entryStem(thisFile)) === normPath(entryStem(entryFile));
|
|
25
|
+
} catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export {
|
|
30
|
+
isMainModule
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=is-main.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/is-main.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * is-main.ts \u2014 ESM \u4E0B\u5224\u65AD\u5F53\u524D\u6A21\u5757\u662F\u5426\u4E3A\u8FDB\u7A0B\u5165\u53E3\n *\n * package.json \u58F0\u660E \"type\": \"module\" \u540E\uFF0C`require` \u4E0D\u5B58\u5728\uFF0C\n * \u4E0D\u80FD\u518D\u7528 `require.main === module`\u3002\n *\n * \u5951\u7EA6\uFF08\u4E0E\u5386\u53F2 endsWith \u884C\u4E3A\u5BF9\u9F50\uFF0C\u6EE1\u8DB3 LSP\uFF09\uFF1A\n * 1. process.argv[1] \u4E0E\u672C\u6587\u4EF6 realpath \u76F8\u540C \u2192 true\n * 2. \u6839\u76EE\u5F55 shim\uFF08\u5982 recovery.js \u2192 dist/recovery.js\uFF09\u540C stem \u2192 true\n * 3. \u88AB\u5176\u4ED6\u5165\u53E3 import \u65F6\uFF08argv stem \u4E0D\u540C\uFF09\u2192 false\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nfunction normPath(p: string): string {\n return process.platform === \"win32\" ? p.toLowerCase() : p;\n}\n\n/** \u53BB\u6389 .js/.ts/.mjs/.cjs \u7B49\u6269\u5C55\uFF0C\u5F97\u5230\u5165\u53E3 stem */\nfunction entryStem(filePath: string): string {\n return path.basename(filePath).replace(/\\.(c|m)?(js|ts)$/i, \"\");\n}\n\nfunction tryRealpath(filePath: string): string {\n try {\n return fs.realpathSync.native(filePath);\n } catch {\n return filePath;\n }\n}\n\n/**\n * \u5224\u65AD metaUrl \u5BF9\u5E94\u6A21\u5757\u662F\u5426\u4E3A node \u8FDB\u7A0B\u4E3B\u5165\u53E3\u3002\n * \u66FF\u4EE3 CommonJS \u7684 `require.main === module`\u3002\n */\nexport function isMainModule(metaUrl: string): boolean {\n const entry = process.argv[1];\n if (!entry) return false;\n try {\n const thisFile = tryRealpath(path.resolve(fileURLToPath(metaUrl)));\n const entryFile = tryRealpath(path.resolve(entry));\n if (normPath(thisFile) === normPath(entryFile)) return true;\n // shim \u517C\u5BB9\uFF1A\u5165\u53E3\u4E0E\u672C\u6A21\u5757\u540C stem\uFF08recovery.js \u52A0\u8F7D dist/recovery.js\uFF09\n return normPath(entryStem(thisFile)) === normPath(entryStem(entryFile));\n } catch {\n return false;\n }\n}\n"],
|
|
5
|
+
"mappings": "AAYA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAE9B,SAAS,SAAS,GAAmB;AACnC,SAAO,QAAQ,aAAa,UAAU,EAAE,YAAY,IAAI;AAC1D;AAGA,SAAS,UAAU,UAA0B;AAC3C,SAAO,KAAK,SAAS,QAAQ,EAAE,QAAQ,qBAAqB,EAAE;AAChE;AAEA,SAAS,YAAY,UAA0B;AAC7C,MAAI;AACF,WAAO,GAAG,aAAa,OAAO,QAAQ;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMO,SAAS,aAAa,SAA0B;AACrD,QAAM,QAAQ,QAAQ,KAAK,CAAC;AAC5B,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI;AACF,UAAM,WAAW,YAAY,KAAK,QAAQ,cAAc,OAAO,CAAC,CAAC;AACjE,UAAM,YAAY,YAAY,KAAK,QAAQ,KAAK,CAAC;AACjD,QAAI,SAAS,QAAQ,MAAM,SAAS,SAAS,EAAG,QAAO;AAEvD,WAAO,SAAS,UAAU,QAAQ,CAAC,MAAM,SAAS,UAAU,SAAS,CAAC;AAAA,EACxE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/log.d.ts
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* log.ts — bds-tools 统一日志实例
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* 同时输出 stdout + 落盘到 LOG_PATH (update.log)。
|
|
6
|
-
*
|
|
4
|
+
* stdout bare + 落盘 LOG_PATH (<ROOT>/.sfmc/logs/bds-update.log)。
|
|
7
5
|
* check-update.ts 是独立入口,用 source = "updater" 单独创建 logger,
|
|
8
6
|
* 见该文件内的 createUpdaterLogger()。
|
|
9
7
|
*/
|
|
10
|
-
export declare const log: import("@sfmc-bds/sdk/logs").
|
|
8
|
+
export declare const log: import("@sfmc-bds/sdk/logs").NodeServiceLogger;
|
|
11
9
|
/** 关闭文件流 (进程退出前调用,确保缓冲落盘) */
|
|
12
10
|
export declare function closeLog(): void;
|
|
13
11
|
//# sourceMappingURL=log.d.ts.map
|
package/dist/log.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,eAAO,MAAM,GAAG,gDAGd,CAAC;AAEH,6BAA6B;AAC7B,wBAAgB,QAAQ,IAAI,IAAI,CAE/B"}
|
package/dist/log.js
CHANGED
|
@@ -1,22 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
* log.ts — bds-tools 统一日志实例
|
|
3
|
-
*
|
|
4
|
-
* 通过 @sfmc-bds/logs 共享包接入,source = "bds-tools"。
|
|
5
|
-
* 同时输出 stdout + 落盘到 LOG_PATH (update.log)。
|
|
6
|
-
*
|
|
7
|
-
* check-update.ts 是独立入口,用 source = "updater" 单独创建 logger,
|
|
8
|
-
* 见该文件内的 createUpdaterLogger()。
|
|
9
|
-
*/
|
|
10
|
-
import { createLogger, createStdoutSink, createFileSink } from "@sfmc-bds/sdk/logs";
|
|
1
|
+
import { createNodeServiceLogger } from "@sfmc-bds/sdk/logs";
|
|
11
2
|
import { LOG_PATH } from "./paths.js";
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
source: "bds-tools",
|
|
16
|
-
sinks: [createStdoutSink(), fileSink],
|
|
3
|
+
const log = createNodeServiceLogger({
|
|
4
|
+
source: "bds-tools",
|
|
5
|
+
logPath: LOG_PATH
|
|
17
6
|
});
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
fileSink.close();
|
|
7
|
+
function closeLog() {
|
|
8
|
+
log.close();
|
|
21
9
|
}
|
|
22
|
-
|
|
10
|
+
process.on("exit", () => closeLog());
|
|
11
|
+
export {
|
|
12
|
+
closeLog,
|
|
13
|
+
log
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=log.js.map
|
package/dist/log.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/log.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * log.ts \u2014 bds-tools \u7EDF\u4E00\u65E5\u5FD7\u5B9E\u4F8B\n *\n * stdout bare + \u843D\u76D8 LOG_PATH (<ROOT>/.sfmc/logs/bds-update.log)\u3002\n * check-update.ts \u662F\u72EC\u7ACB\u5165\u53E3,\u7528 source = \"updater\" \u5355\u72EC\u521B\u5EFA logger,\n * \u89C1\u8BE5\u6587\u4EF6\u5185\u7684 createUpdaterLogger()\u3002\n */\n\nimport { createNodeServiceLogger } from \"@sfmc-bds/sdk/logs\";\nimport { LOG_PATH } from \"./paths.js\";\n\nexport const log = createNodeServiceLogger({\n source: \"bds-tools\",\n logPath: LOG_PATH,\n});\n\n/** \u5173\u95ED\u6587\u4EF6\u6D41 (\u8FDB\u7A0B\u9000\u51FA\u524D\u8C03\u7528,\u786E\u4FDD\u7F13\u51B2\u843D\u76D8) */\nexport function closeLog(): void {\n log.close();\n}\n\nprocess.on(\"exit\", () => closeLog());\n"],
|
|
5
|
+
"mappings": "AAQA,SAAS,+BAA+B;AACxC,SAAS,gBAAgB;AAElB,MAAM,MAAM,wBAAwB;AAAA,EACzC,QAAQ;AAAA,EACR,SAAS;AACX,CAAC;AAGM,SAAS,WAAiB;AAC/B,MAAI,MAAM;AACZ;AAEA,QAAQ,GAAG,QAAQ,MAAM,SAAS,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/logger.js
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
* 新代码请直接:import { log } from "./log.js"
|
|
8
|
-
*/
|
|
9
|
-
export { log as logger, closeLog as closeLogger } from "./log.js";
|
|
10
|
-
//# sourceMappingURL=logger.js.map
|
|
1
|
+
import { log, closeLog } from "./log.js";
|
|
2
|
+
export {
|
|
3
|
+
closeLog as closeLogger,
|
|
4
|
+
log as logger
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=logger.js.map
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/logger.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * logger.ts \u2014 \u5DF2\u5E9F\u5F03,\u7EDF\u4E00\u6539\u7528 log.ts\n *\n * \u6B64\u6587\u4EF6\u4FDD\u7559\u4EC5\u4E3A\u5411\u540E\u517C\u5BB9 (safe-delete \u9650\u5236\u65E0\u6CD5\u5220\u9664)\u3002\n * \u5B9E\u9645\u65E5\u5FD7\u903B\u8F91\u5728 log.ts,\u901A\u8FC7 @sfmc-bds/logs \u5171\u4EAB\u5305\u63A5\u5165\u3002\n *\n * \u65B0\u4EE3\u7801\u8BF7\u76F4\u63A5:import { log } from \"./log.js\"\n */\nexport { log as logger, closeLog as closeLogger } from \"./log.js\";\n"],
|
|
5
|
+
"mappings": "AAQA,SAAgB,KAAoB,gBAAmB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/pack-manager.d.ts
CHANGED
|
@@ -1,25 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* pack-manager.ts — Bedrock 行为包/资源包 装配 + 部署到 BDS 根。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 纯函数库,两条消费路径:
|
|
5
5
|
*
|
|
6
|
-
* -
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* - npm: 用户跑 `sfmc behavior-pack build`,
|
|
11
|
-
* 同一 spawnService 路径。或者直接在同进程 import 这个库。
|
|
6
|
+
* - 同进程(推荐): sfmc/pack-lifecycle 经 `@sfmc-bds/bds-tools/pack-manager-lib`
|
|
7
|
+
* 直连本模块(DIP);world-packs 等同理。
|
|
8
|
+
* - CLI: `cli-pack-manager.js` 仍暴露相同动词,供外部脚本/手工调试;
|
|
9
|
+
* CLI 只是本库的薄适配,不再是 sfmc 主路径。
|
|
12
10
|
*
|
|
13
|
-
*
|
|
14
|
-
* 的一部分内嵌起来,而 SEA 是个单 exe (除 Node 内置 + bds-tools 已有依赖外)。
|
|
11
|
+
* 约束:本文件不引入 esbuild / 重型 npm-only 包,保持可被 Node 子进程直接加载。
|
|
15
12
|
*
|
|
16
13
|
* 已有依赖 (bds-tools/package.json):
|
|
17
|
-
* -
|
|
14
|
+
* - @sfmc-bds/sdk/logs createTerminalProgress: 进度条(BDS 更新等)
|
|
18
15
|
* - node-html-parser: changelog 抓取 (本文件用不到)
|
|
19
|
-
* - jszip: zip 解压(模块 zip / BDS server.zip)
|
|
20
|
-
*
|
|
21
|
-
* 没有外部依赖意味着:SEA 静态把 `bds-tools/dist/*` 解压到 exe 旁边即可,
|
|
22
|
-
*不需把 npm 整棵树带进去。
|
|
16
|
+
* - jszip: zip 解压(模块 zip / BDS server.zip)
|
|
23
17
|
*/
|
|
24
18
|
import { copyDirAsync, copyFileAsync } from "./fsx.js";
|
|
25
19
|
export interface AssembleBehaviorPackOpts {
|
|
@@ -27,7 +21,7 @@ export interface AssembleBehaviorPackOpts {
|
|
|
27
21
|
srcDir: string;
|
|
28
22
|
/** Output behavior pack directory (created if missing) */
|
|
29
23
|
outDir: string;
|
|
30
|
-
/** BP 目录名 —
|
|
24
|
+
/** BP 目录名 — 默认 'sfmc-modules' */
|
|
31
25
|
projectName: string;
|
|
32
26
|
/** manifest.json 的 header.version [major, minor, patch]; 默认 [1, 0, 0] */
|
|
33
27
|
version?: [number, number, number] | undefined;
|
|
@@ -35,6 +29,10 @@ export interface AssembleBehaviorPackOpts {
|
|
|
35
29
|
description?: string | undefined;
|
|
36
30
|
/** pack_icon.png 源文件 (optional, 不提供则跳过) */
|
|
37
31
|
iconSrc?: string | undefined;
|
|
32
|
+
/** 稳定 header.uuid;省略则随机生成(首次装配) */
|
|
33
|
+
uuid?: string | undefined;
|
|
34
|
+
/** 稳定 script module uuid;省略则随机 */
|
|
35
|
+
moduleUuid?: string | undefined;
|
|
38
36
|
}
|
|
39
37
|
export interface AssembleResourcePackOpts {
|
|
40
38
|
/** Modules whose resource_pack/** should be merged. Map<moduleId, resourcePackDir>. */
|
|
@@ -47,6 +45,14 @@ export interface AssembleResourcePackOpts {
|
|
|
47
45
|
version?: [number, number, number] | undefined;
|
|
48
46
|
/** manifest.json 的 description */
|
|
49
47
|
description?: string | undefined;
|
|
48
|
+
/** 稳定 header.uuid;省略则随机生成(首次装配) */
|
|
49
|
+
uuid?: string | undefined;
|
|
50
|
+
/** 稳定 resources module uuid;省略则随机 */
|
|
51
|
+
moduleUuid?: string | undefined;
|
|
52
|
+
}
|
|
53
|
+
export interface AssembleResult {
|
|
54
|
+
uuid: string;
|
|
55
|
+
version: [number, number, number];
|
|
50
56
|
}
|
|
51
57
|
export interface DeployOpts {
|
|
52
58
|
bdsRoot: string;
|
|
@@ -59,6 +65,15 @@ export interface DeployOpts {
|
|
|
59
65
|
bpName: string;
|
|
60
66
|
/** RP 目标目录名 (worlds/<level>/resource_packs/<rpName>);省略时复用 bpName + '-rp' */
|
|
61
67
|
rpName?: string;
|
|
68
|
+
/**
|
|
69
|
+
* 无 resourcePackSrc 时是否删除世界内已有 RP 目录。
|
|
70
|
+
* 用于模块不再提供 RP 时清理聚合包残留(默认 false,避免误删未声明的 RP)。
|
|
71
|
+
*/
|
|
72
|
+
clearResourcePack?: boolean;
|
|
73
|
+
}
|
|
74
|
+
export interface DeployResult {
|
|
75
|
+
bpDir: string;
|
|
76
|
+
rpDir: string | null;
|
|
62
77
|
}
|
|
63
78
|
export interface EnablePackOpts {
|
|
64
79
|
worldsDir: string;
|
|
@@ -69,6 +84,18 @@ export interface EnablePackOpts {
|
|
|
69
84
|
}
|
|
70
85
|
/** SFMC 合成 BP 的固定 @minecraft/* permissions,所有用到的命名空间都打开。 */
|
|
71
86
|
export declare const SFMC_PERMISSIONS: readonly ["@minecraft/server", "@minecraft/server-ui", "@minecraft/server-admin", "@minecraft/server-gametest", "@minecraft/server-net", "@minecraft/server-editor", "@minecraft/diagnostics"];
|
|
87
|
+
/** `<bdsRoot>/server.properties` — level-name / telemetry 等共用(DRY) */
|
|
88
|
+
export declare function serverPropertiesPath(bdsRoot: string): string;
|
|
89
|
+
/** `<bdsRoot>/worlds` — enable-list / 部署调用方勿再硬拼(Demeter) */
|
|
90
|
+
export declare function bdsWorldsDir(bdsRoot: string): string;
|
|
91
|
+
/** `<bdsRoot>/worlds/<level>` */
|
|
92
|
+
export declare function bdsWorldLevelDir(bdsRoot: string, levelName: string): string;
|
|
93
|
+
/** 世界 enable-list JSON 绝对路径(单一权威,供读写两侧) */
|
|
94
|
+
export declare function worldPackListFile(worldsDir: string, levelName: string, kind: "behavior" | "resource"): string;
|
|
95
|
+
/** `<bdsRoot>/config/<bpUuid>/permission.json` — Script API 权限文件权威路径 */
|
|
96
|
+
export declare function configPermissionPath(bdsRoot: string, bpUuid: string): string;
|
|
97
|
+
/** 是否已有 Script API permission.json(只读,供 preflight/status) */
|
|
98
|
+
export declare function hasConfigPermission(bdsRoot: string, bpUuid: string): boolean;
|
|
72
99
|
/** 随机生成 BP/RP manifest.json header.uuid (RFC 4122 v4) */
|
|
73
100
|
export declare function randomUuid(): string;
|
|
74
101
|
/**
|
|
@@ -77,20 +104,18 @@ export declare function randomUuid(): string;
|
|
|
77
104
|
* was bundled by esbuild) and write a fresh `manifest.json` + `permissions.json`.
|
|
78
105
|
*
|
|
79
106
|
* The caller is responsible for running esbuild first; pack-manager does not
|
|
80
|
-
* bundle scripts. That decoupling
|
|
107
|
+
* bundle scripts. That decoupling keeps pack assembly independent of the bundler.
|
|
81
108
|
*/
|
|
82
|
-
export declare function assembleBehaviorPack(opts: AssembleBehaviorPackOpts): Promise<
|
|
109
|
+
export declare function assembleBehaviorPack(opts: AssembleBehaviorPackOpts): Promise<AssembleResult>;
|
|
83
110
|
/**
|
|
84
111
|
* Merge every enabled module's `resource_pack/**` tree into one RP directory
|
|
85
112
|
* at `outDir`, with a single fresh `manifest.json`. Per-module subfolders are
|
|
86
113
|
* preserved so resource pack authors can disambiguate (e.g. `peace/textures/...`).
|
|
87
114
|
*/
|
|
88
|
-
export declare function assembleResourcePack(opts: AssembleResourcePackOpts): Promise<
|
|
89
|
-
/**
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
* the key is absent.
|
|
93
|
-
*/
|
|
115
|
+
export declare function assembleResourcePack(opts: AssembleResourcePackOpts): Promise<AssembleResult>;
|
|
116
|
+
/** 同步读 level-name(供 sfmc resolveBdsContext 等同进程调用方,DRY)。 */
|
|
117
|
+
export declare function readLevelNameSync(bdsRoot: string): string;
|
|
118
|
+
/** 与 sync 同契约;CLI / async 调用方走此入口(LSP) */
|
|
94
119
|
export declare function readLevelName(bdsRoot: string): Promise<string>;
|
|
95
120
|
/**
|
|
96
121
|
* Copy BP/RP source dirs into the world's behavior_packs/ + resource_packs/
|
|
@@ -99,7 +124,19 @@ export declare function readLevelName(bdsRoot: string): Promise<string>;
|
|
|
99
124
|
* Does NOT edit world_behavior_packs.json — that's a separate step the caller
|
|
100
125
|
* must invoke after restart, because BDS only reads that file at startup.
|
|
101
126
|
*/
|
|
102
|
-
export declare function deployToBDS(opts: DeployOpts): Promise<
|
|
127
|
+
export declare function deployToBDS(opts: DeployOpts): Promise<DeployResult>;
|
|
128
|
+
/**
|
|
129
|
+
* 确保 BDS Script API 侧 `<bdsRoot>/config/<bpUuid>/permission.json` 存在。
|
|
130
|
+
* 已存在则跳过(不覆盖用户手工改动)。
|
|
131
|
+
* @returns true = 新写入; false = 已存在跳过
|
|
132
|
+
*/
|
|
133
|
+
export declare function ensureConfigPermission(bdsRoot: string, bpUuid: string): Promise<boolean>;
|
|
134
|
+
/** 从已装配 BP/RP 目录读取 header.uuid + version;失败返回 null。 */
|
|
135
|
+
export declare function readPackManifestHeader(packDir: string): {
|
|
136
|
+
uuid: string;
|
|
137
|
+
version: [number, number, number];
|
|
138
|
+
moduleUuid?: string;
|
|
139
|
+
} | null;
|
|
103
140
|
/**
|
|
104
141
|
* Write the seven `@minecraft/*` allowed_modules into a behavior pack's
|
|
105
142
|
* `permissions.json`. Idempotent: rewrites any pre-existing file.
|
|
@@ -118,12 +155,14 @@ export declare function writeBehaviorPackManifest(outDir: string, header: {
|
|
|
118
155
|
uuid: string;
|
|
119
156
|
version: [number, number, number];
|
|
120
157
|
description?: string | undefined;
|
|
158
|
+
moduleUuid?: string | undefined;
|
|
121
159
|
}): Promise<void>;
|
|
122
160
|
export declare function writeResourcePackManifest(outDir: string, header: {
|
|
123
161
|
name: string;
|
|
124
162
|
uuid: string;
|
|
125
163
|
version: [number, number, number];
|
|
126
164
|
description?: string | undefined;
|
|
165
|
+
moduleUuid?: string | undefined;
|
|
127
166
|
}): Promise<void>;
|
|
128
167
|
export { copyFileAsync, copyDirAsync };
|
|
129
168
|
/**
|
|
@@ -133,4 +172,29 @@ export { copyFileAsync, copyDirAsync };
|
|
|
133
172
|
* modules to merge into the resource pack output.
|
|
134
173
|
*/
|
|
135
174
|
export declare function scanModuleResourcePacks(modulesDir: string): Record<string, string>;
|
|
175
|
+
/**
|
|
176
|
+
* 从 JSON 文件加载显式 moduleId → resource_pack 目录映射。
|
|
177
|
+
* 供 assemble-rp --modules-json 使用,避免调用方再做临时目录镜像(OCP/DRY)。
|
|
178
|
+
*/
|
|
179
|
+
export declare function loadModuleResourcePackMap(jsonPath: string): Record<string, string>;
|
|
180
|
+
/**
|
|
181
|
+
* 读取世界 enable-list(单一权威,供 has-pack / list-packs / 调用方复用 — DRY)。
|
|
182
|
+
* 文件缺失 → entries=[];JSON 损坏 → entries=[] 且 parseFailedFile 有值(供 doctor 区分)。
|
|
183
|
+
*/
|
|
184
|
+
export type WorldPackListReadResult = {
|
|
185
|
+
entries: Array<{
|
|
186
|
+
pack_id: string;
|
|
187
|
+
version: [number, number, number];
|
|
188
|
+
}>;
|
|
189
|
+
/** 文件存在但解析失败时为该 JSON 绝对路径 */
|
|
190
|
+
parseFailedFile?: string;
|
|
191
|
+
};
|
|
192
|
+
export declare function readWorldPackListResult(worldsDir: string, levelName: string, kind: "behavior" | "resource"): WorldPackListReadResult;
|
|
193
|
+
/** 兼容读侧:只要 entries(损坏时与缺失同为 [])。详细结果见 readWorldPackListResult。 */
|
|
194
|
+
export declare function readWorldPackList(worldsDir: string, levelName: string, kind: "behavior" | "resource"): Array<{
|
|
195
|
+
pack_id: string;
|
|
196
|
+
version: [number, number, number];
|
|
197
|
+
}>;
|
|
198
|
+
/** 世界 enable-list 是否已含指定 pack_id(只读,供 preflight 复用)。 */
|
|
199
|
+
export declare function worldPackListHas(worldsDir: string, levelName: string, kind: "behavior" | "resource", packUuid: string): boolean;
|
|
136
200
|
//# sourceMappingURL=pack-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pack-manager.d.ts","sourceRoot":"","sources":["../src/pack-manager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pack-manager.d.ts","sourceRoot":"","sources":["../src/pack-manager.ts"],"names":[],"mappings":"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"}
|