@sfmc-bds/bds-tools 0.2.0-beta.0 → 0.2.0-beta.10
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/LICENSE +663 -0
- package/dist/bds-manager.d.ts +16 -6
- package/dist/bds-manager.d.ts.map +1 -1
- package/dist/bds-manager.js +40 -65
- package/dist/bds-manager.js.map +2 -2
- package/dist/check-update.d.ts.map +1 -1
- package/dist/check-update.js +15 -17
- package/dist/check-update.js.map +2 -2
- package/dist/cli-pack-manager.js +7 -3
- package/dist/cli-pack-manager.js.map +2 -2
- package/dist/fsx.d.ts +6 -1
- package/dist/fsx.d.ts.map +1 -1
- package/dist/fsx.js +9 -1
- package/dist/fsx.js.map +2 -2
- package/dist/host-platform.d.ts +25 -0
- package/dist/host-platform.d.ts.map +1 -0
- package/dist/host-platform.js +50 -0
- package/dist/host-platform.js.map +7 -0
- package/dist/http.d.ts +49 -11
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js.map +2 -2
- package/dist/log.d.ts +2 -3
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +0 -1
- package/dist/log.js.map +2 -2
- package/dist/pack-manager-lifecycle.test.js +252 -0
- package/dist/pack-manager-lifecycle.test.js.map +7 -0
- package/dist/pack-manager.d.ts +24 -29
- package/dist/pack-manager.d.ts.map +1 -1
- package/dist/pack-manager.js +11 -4
- package/dist/pack-manager.js.map +2 -2
- package/dist/pack-update/bindings.d.ts +16 -0
- package/dist/pack-update/bindings.d.ts.map +1 -0
- package/dist/pack-update/bindings.js +69 -0
- package/dist/pack-update/bindings.js.map +7 -0
- package/dist/pack-update/config.d.ts +16 -0
- package/dist/pack-update/config.d.ts.map +1 -0
- package/dist/pack-update/config.js +146 -0
- package/dist/pack-update/config.js.map +7 -0
- package/dist/pack-update/config.test.js +75 -0
- package/dist/pack-update/config.test.js.map +7 -0
- package/dist/pack-update/deps.d.ts +28 -0
- package/dist/pack-update/deps.d.ts.map +1 -0
- package/dist/pack-update/deps.js +20 -0
- package/dist/pack-update/deps.js.map +7 -0
- package/dist/pack-update/index.d.ts +55 -0
- package/dist/pack-update/index.d.ts.map +1 -0
- package/dist/pack-update/index.js +72 -0
- package/dist/pack-update/index.js.map +7 -0
- package/dist/pack-update/providers/curseforge.d.ts +23 -0
- package/dist/pack-update/providers/curseforge.d.ts.map +1 -0
- package/dist/pack-update/providers/curseforge.js +229 -0
- package/dist/pack-update/providers/curseforge.js.map +7 -0
- package/dist/pack-update/providers/index.d.ts +16 -0
- package/dist/pack-update/providers/index.d.ts.map +1 -0
- package/dist/pack-update/providers/index.js +37 -0
- package/dist/pack-update/providers/index.js.map +7 -0
- package/dist/pack-update/service.d.ts +28 -0
- package/dist/pack-update/service.d.ts.map +1 -0
- package/dist/pack-update/service.js +570 -0
- package/dist/pack-update/service.js.map +7 -0
- package/dist/pack-update/types.d.ts +126 -0
- package/dist/pack-update/types.d.ts.map +1 -0
- package/dist/pack-update/types.js +8 -0
- package/dist/pack-update/types.js.map +7 -0
- package/dist/pack-update/version-policy.d.ts +81 -0
- package/dist/pack-update/version-policy.d.ts.map +1 -0
- package/dist/pack-update/version-policy.js +210 -0
- package/dist/pack-update/version-policy.js.map +7 -0
- package/dist/pack-update/version-policy.test.js +137 -0
- package/dist/pack-update/version-policy.test.js.map +7 -0
- package/dist/paths.d.ts +1 -1
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +3 -5
- package/dist/paths.js.map +2 -2
- package/dist/process-probe.d.ts +34 -0
- package/dist/process-probe.d.ts.map +1 -0
- package/dist/process-probe.js +152 -0
- package/dist/process-probe.js.map +7 -0
- package/dist/process-probe.test.js +76 -0
- package/dist/process-probe.test.js.map +7 -0
- package/dist/qq-events-notify.d.ts +16 -0
- package/dist/qq-events-notify.d.ts.map +1 -0
- package/dist/qq-events-notify.js +70 -0
- package/dist/qq-events-notify.js.map +7 -0
- package/dist/qqutil.d.ts +10 -5
- package/dist/qqutil.d.ts.map +1 -1
- package/dist/qqutil.js +49 -8
- package/dist/qqutil.js.map +2 -2
- package/dist/update-result.d.ts +8 -2
- package/dist/update-result.d.ts.map +1 -1
- package/dist/update-result.js +7 -5
- package/dist/update-result.js.map +2 -2
- package/dist/upstream.d.ts +18 -9
- package/dist/upstream.d.ts.map +1 -1
- package/dist/upstream.js +8 -7
- package/dist/upstream.js.map +2 -2
- package/dist/version.js +2 -2
- package/dist/version.js.map +2 -2
- package/dist/world-packs.d.ts +158 -5
- package/dist/world-packs.d.ts.map +1 -1
- package/dist/world-packs.js +294 -48
- package/dist/world-packs.js.map +2 -2
- package/dist/world-packs.test.js +676 -0
- package/dist/world-packs.test.js.map +7 -0
- package/dist/zipx.test.js +36 -0
- package/dist/zipx.test.js.map +7 -0
- package/package.json +43 -39
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PackUpdateDeps } from "./deps.js";
|
|
2
|
+
import type { PackSourceBinding, PackSourcesFile } from "./types.js";
|
|
3
|
+
export declare function createPackUpdateBindingsApi(deps: Pick<PackUpdateDeps, "rootDir">): {
|
|
4
|
+
packSourcesPath: () => string;
|
|
5
|
+
readPackSources: () => PackSourcesFile;
|
|
6
|
+
writePackSources: (data: PackSourcesFile) => void;
|
|
7
|
+
getBinding: (bpUuid: string) => PackSourceBinding | null;
|
|
8
|
+
setBinding: (bpUuid: string, binding: PackSourceBinding) => void;
|
|
9
|
+
removeBinding: (bpUuid: string) => boolean;
|
|
10
|
+
listBindings: () => Array<{
|
|
11
|
+
bpUuid: string;
|
|
12
|
+
binding: PackSourceBinding;
|
|
13
|
+
}>;
|
|
14
|
+
};
|
|
15
|
+
export type PackUpdateBindingsApi = ReturnType<typeof createPackUpdateBindingsApi>;
|
|
16
|
+
//# sourceMappingURL=bindings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindings.d.ts","sourceRoot":"","sources":["../../src/pack-update/bindings.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAErE,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC;2BAGnD,MAAM;2BAIN,eAAe;6BAWX,eAAe,KAAG,IAAI;yBAO1B,MAAM,KAAG,iBAAiB,GAAG,IAAI;yBAKjC,MAAM,WAAW,iBAAiB,KAAG,IAAI;4BAWtC,MAAM,KAAG,OAAO;wBActB,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,iBAAiB,CAAA;KAAE,CAAC;EAc/E;AAED,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { withConfigSchema } from "@sfmc-bds/sdk/node/config";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
function createPackUpdateBindingsApi(deps) {
|
|
5
|
+
const { rootDir } = deps;
|
|
6
|
+
function packSourcesPath() {
|
|
7
|
+
return path.join(rootDir, "packs", "pack-sources.json");
|
|
8
|
+
}
|
|
9
|
+
function readPackSources() {
|
|
10
|
+
const file = packSourcesPath();
|
|
11
|
+
if (!fs.existsSync(file)) return { bindings: {} };
|
|
12
|
+
try {
|
|
13
|
+
const raw = JSON.parse(fs.readFileSync(file, "utf8"));
|
|
14
|
+
return { bindings: raw.bindings ?? {} };
|
|
15
|
+
} catch {
|
|
16
|
+
return { bindings: {} };
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function writePackSources(data) {
|
|
20
|
+
const file = packSourcesPath();
|
|
21
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
22
|
+
const body = withConfigSchema({ bindings: data.bindings ?? {} }, "pack_sources", "packs");
|
|
23
|
+
fs.writeFileSync(file, `${JSON.stringify(body, null, 2)}
|
|
24
|
+
`, "utf8");
|
|
25
|
+
}
|
|
26
|
+
function getBinding(bpUuid) {
|
|
27
|
+
const all = readPackSources();
|
|
28
|
+
return all.bindings[bpUuid.toLowerCase()] ?? all.bindings[bpUuid] ?? null;
|
|
29
|
+
}
|
|
30
|
+
function setBinding(bpUuid, binding) {
|
|
31
|
+
const all = readPackSources();
|
|
32
|
+
const key = bpUuid.toLowerCase();
|
|
33
|
+
for (const k of Object.keys(all.bindings)) {
|
|
34
|
+
if (k.toLowerCase() === key) delete all.bindings[k];
|
|
35
|
+
}
|
|
36
|
+
all.bindings[key] = binding;
|
|
37
|
+
writePackSources(all);
|
|
38
|
+
}
|
|
39
|
+
function removeBinding(bpUuid) {
|
|
40
|
+
const all = readPackSources();
|
|
41
|
+
const key = bpUuid.toLowerCase();
|
|
42
|
+
let removed = false;
|
|
43
|
+
for (const k of Object.keys(all.bindings)) {
|
|
44
|
+
if (k.toLowerCase() === key) {
|
|
45
|
+
delete all.bindings[k];
|
|
46
|
+
removed = true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (removed) writePackSources(all);
|
|
50
|
+
return removed;
|
|
51
|
+
}
|
|
52
|
+
function listBindings() {
|
|
53
|
+
const all = readPackSources();
|
|
54
|
+
return Object.entries(all.bindings).map(([bpUuid, binding]) => ({ bpUuid, binding }));
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
packSourcesPath,
|
|
58
|
+
readPackSources,
|
|
59
|
+
writePackSources,
|
|
60
|
+
getBinding,
|
|
61
|
+
setBinding,
|
|
62
|
+
removeBinding,
|
|
63
|
+
listBindings
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
createPackUpdateBindingsApi
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=bindings.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/pack-update/bindings.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * packs/pack-sources.json \u2014 \u4E16\u754C\u5305\u8FDC\u7A0B\u6E90\u7ED1\u5B9A\n */\nimport { withConfigSchema } from \"@sfmc-bds/sdk/node/config\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { PackUpdateDeps } from \"./deps.js\";\nimport type { PackSourceBinding, PackSourcesFile } from \"./types.js\";\n\nexport function createPackUpdateBindingsApi(deps: Pick<PackUpdateDeps, \"rootDir\">) {\n const { rootDir } = deps;\n\n function packSourcesPath(): string {\n return path.join(rootDir, \"packs\", \"pack-sources.json\");\n }\n\n function readPackSources(): PackSourcesFile {\n const file = packSourcesPath();\n if (!fs.existsSync(file)) return { bindings: {} };\n try {\n const raw = JSON.parse(fs.readFileSync(file, \"utf8\")) as PackSourcesFile & { $schema?: string };\n return { bindings: raw.bindings ?? {} };\n } catch {\n return { bindings: {} };\n }\n }\n\n function writePackSources(data: PackSourcesFile): void {\n const file = packSourcesPath();\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const body = withConfigSchema({ bindings: data.bindings ?? {} }, \"pack_sources\", \"packs\");\n fs.writeFileSync(file, `${JSON.stringify(body, null, 2)}\\n`, \"utf8\");\n }\n\n function getBinding(bpUuid: string): PackSourceBinding | null {\n const all = readPackSources();\n return all.bindings[bpUuid.toLowerCase()] ?? all.bindings[bpUuid] ?? null;\n }\n\n function setBinding(bpUuid: string, binding: PackSourceBinding): void {\n const all = readPackSources();\n const key = bpUuid.toLowerCase();\n /* \u6E05\u7406\u65E7\u5927\u5C0F\u5199\u952E */\n for (const k of Object.keys(all.bindings)) {\n if (k.toLowerCase() === key) delete all.bindings[k];\n }\n all.bindings[key] = binding;\n writePackSources(all);\n }\n\n function removeBinding(bpUuid: string): boolean {\n const all = readPackSources();\n const key = bpUuid.toLowerCase();\n let removed = false;\n for (const k of Object.keys(all.bindings)) {\n if (k.toLowerCase() === key) {\n delete all.bindings[k];\n removed = true;\n }\n }\n if (removed) writePackSources(all);\n return removed;\n }\n\n function listBindings(): Array<{ bpUuid: string; binding: PackSourceBinding }> {\n const all = readPackSources();\n return Object.entries(all.bindings).map(([bpUuid, binding]) => ({ bpUuid, binding }));\n }\n\n return {\n packSourcesPath,\n readPackSources,\n writePackSources,\n getBinding,\n setBinding,\n removeBinding,\n listBindings,\n };\n}\n\nexport type PackUpdateBindingsApi = ReturnType<typeof createPackUpdateBindingsApi>;\n"],
|
|
5
|
+
"mappings": "AAGA,SAAS,wBAAwB;AACjC,OAAO,QAAQ;AACf,OAAO,UAAU;AAIV,SAAS,4BAA4B,MAAuC;AACjF,QAAM,EAAE,QAAQ,IAAI;AAEpB,WAAS,kBAA0B;AACjC,WAAO,KAAK,KAAK,SAAS,SAAS,mBAAmB;AAAA,EACxD;AAEA,WAAS,kBAAmC;AAC1C,UAAM,OAAO,gBAAgB;AAC7B,QAAI,CAAC,GAAG,WAAW,IAAI,EAAG,QAAO,EAAE,UAAU,CAAC,EAAE;AAChD,QAAI;AACF,YAAM,MAAM,KAAK,MAAM,GAAG,aAAa,MAAM,MAAM,CAAC;AACpD,aAAO,EAAE,UAAU,IAAI,YAAY,CAAC,EAAE;AAAA,IACxC,QAAQ;AACN,aAAO,EAAE,UAAU,CAAC,EAAE;AAAA,IACxB;AAAA,EACF;AAEA,WAAS,iBAAiB,MAA6B;AACrD,UAAM,OAAO,gBAAgB;AAC7B,OAAG,UAAU,KAAK,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,UAAM,OAAO,iBAAiB,EAAE,UAAU,KAAK,YAAY,CAAC,EAAE,GAAG,gBAAgB,OAAO;AACxF,OAAG,cAAc,MAAM,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAAA,EACrE;AAEA,WAAS,WAAW,QAA0C;AAC5D,UAAM,MAAM,gBAAgB;AAC5B,WAAO,IAAI,SAAS,OAAO,YAAY,CAAC,KAAK,IAAI,SAAS,MAAM,KAAK;AAAA,EACvE;AAEA,WAAS,WAAW,QAAgB,SAAkC;AACpE,UAAM,MAAM,gBAAgB;AAC5B,UAAM,MAAM,OAAO,YAAY;AAE/B,eAAW,KAAK,OAAO,KAAK,IAAI,QAAQ,GAAG;AACzC,UAAI,EAAE,YAAY,MAAM,IAAK,QAAO,IAAI,SAAS,CAAC;AAAA,IACpD;AACA,QAAI,SAAS,GAAG,IAAI;AACpB,qBAAiB,GAAG;AAAA,EACtB;AAEA,WAAS,cAAc,QAAyB;AAC9C,UAAM,MAAM,gBAAgB;AAC5B,UAAM,MAAM,OAAO,YAAY;AAC/B,QAAI,UAAU;AACd,eAAW,KAAK,OAAO,KAAK,IAAI,QAAQ,GAAG;AACzC,UAAI,EAAE,YAAY,MAAM,KAAK;AAC3B,eAAO,IAAI,SAAS,CAAC;AACrB,kBAAU;AAAA,MACZ;AAAA,IACF;AACA,QAAI,QAAS,kBAAiB,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,WAAS,eAAsE;AAC7E,UAAM,MAAM,gBAAgB;AAC5B,WAAO,OAAO,QAAQ,IAAI,QAAQ,EAAE,IAAI,CAAC,CAAC,QAAQ,OAAO,OAAO,EAAE,QAAQ,QAAQ,EAAE;AAAA,EACtF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PackUpdateDeps } from "./deps.js";
|
|
2
|
+
import type { PackUpdateConfig, PackUpdateMatchConfig } from "./types.js";
|
|
3
|
+
export declare function createPackUpdateConfigApi(deps: Pick<PackUpdateDeps, "rootDir">): {
|
|
4
|
+
packUpdateConfigPath: () => string;
|
|
5
|
+
loadPackUpdateConfig: () => PackUpdateConfig;
|
|
6
|
+
getPackMatchConfig: (cfg: PackUpdateConfig) => PackUpdateMatchConfig;
|
|
7
|
+
resolvePackTrashDir: (cfg?: PackUpdateConfig) => string;
|
|
8
|
+
isPackUninstallRecycleBin: (cfg?: PackUpdateConfig) => boolean;
|
|
9
|
+
resolveUninstallTrashDir: (opts?: {
|
|
10
|
+
purge?: boolean;
|
|
11
|
+
cfg?: PackUpdateConfig;
|
|
12
|
+
}) => string | null;
|
|
13
|
+
ensurePackUpdateConfigFile: () => string;
|
|
14
|
+
};
|
|
15
|
+
export type PackUpdateConfigApi = ReturnType<typeof createPackUpdateConfigApi>;
|
|
16
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/pack-update/config.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAA4B,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAkFpG,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC;gCAG5C,MAAM;gCAIN,gBAAgB;8BAuChB,gBAAgB,KAAG,qBAAqB;gCAKtC,gBAAgB,KAAG,MAAM;sCAQnB,gBAAgB,KAAG,OAAO;sCAS1B;QACvC,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,GAAG,CAAC,EAAE,gBAAgB,CAAC;KACxB,KAAG,MAAM,GAAG,IAAI;sCASsB,MAAM;EAkB9C;AAED,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { withConfigSchema } from "@sfmc-bds/sdk/node/config";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { DEFAULT_PACK_UNINSTALL } from "./types.js";
|
|
5
|
+
const DEFAULT_MATCH = {
|
|
6
|
+
nameMinScore: 0.6,
|
|
7
|
+
stripFolderTags: true
|
|
8
|
+
};
|
|
9
|
+
const DEFAULTS = {
|
|
10
|
+
enabled: true,
|
|
11
|
+
checkOnBdsStart: true,
|
|
12
|
+
applyOnBdsStart: true,
|
|
13
|
+
askConfirmOnBind: true,
|
|
14
|
+
probeSourceAfterInstall: true,
|
|
15
|
+
/* 探测绑定默认关闭,避免误更新;可在 pack-update.json 改为 true */
|
|
16
|
+
defaultBindingEnabled: false,
|
|
17
|
+
match: { ...DEFAULT_MATCH },
|
|
18
|
+
providers: {
|
|
19
|
+
curseforge: {
|
|
20
|
+
enabled: true,
|
|
21
|
+
apiKey: "",
|
|
22
|
+
baseUrl: "https://api.curseforge.com",
|
|
23
|
+
searchBaseUrl: "https://api.curse.tools/v1/cf",
|
|
24
|
+
gameId: 78022,
|
|
25
|
+
classId: 4984,
|
|
26
|
+
pageSize: 10,
|
|
27
|
+
preferredReleaseTypes: ["release", "beta", "alpha"]
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
versionPolicy: {
|
|
31
|
+
authority: "behavior_pack",
|
|
32
|
+
onUpdateOverwriteBoth: true,
|
|
33
|
+
rpBumpWhenSameMajor: true,
|
|
34
|
+
rpBumpComponent: "patch",
|
|
35
|
+
majorHigherSkipRpBump: true
|
|
36
|
+
},
|
|
37
|
+
startup: {
|
|
38
|
+
sequential: true,
|
|
39
|
+
delayMsBetweenPacks: 0,
|
|
40
|
+
skipDisabledBindings: true,
|
|
41
|
+
failMode: "continue"
|
|
42
|
+
},
|
|
43
|
+
uninstall: { ...DEFAULT_PACK_UNINSTALL }
|
|
44
|
+
};
|
|
45
|
+
function deepMerge(base, over) {
|
|
46
|
+
const out = { ...base };
|
|
47
|
+
for (const [k, v] of Object.entries(over)) {
|
|
48
|
+
if (v && typeof v === "object" && !Array.isArray(v) && typeof base[k] === "object") {
|
|
49
|
+
out[k] = deepMerge(
|
|
50
|
+
base[k],
|
|
51
|
+
v
|
|
52
|
+
);
|
|
53
|
+
} else if (v !== void 0) {
|
|
54
|
+
out[k] = v;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
function hoistLegacyMatch(raw) {
|
|
60
|
+
const top = raw.match;
|
|
61
|
+
const providers = raw.providers;
|
|
62
|
+
const cf = providers?.curseforge;
|
|
63
|
+
const nested = cf?.match;
|
|
64
|
+
const pick = top && typeof top === "object" && !Array.isArray(top) ? top : nested && typeof nested === "object" && !Array.isArray(nested) ? nested : void 0;
|
|
65
|
+
if (!pick) return void 0;
|
|
66
|
+
return deepMerge(
|
|
67
|
+
DEFAULT_MATCH,
|
|
68
|
+
pick
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
function createPackUpdateConfigApi(deps) {
|
|
72
|
+
const { rootDir } = deps;
|
|
73
|
+
function packUpdateConfigPath() {
|
|
74
|
+
return path.join(rootDir, "configs", "pack-update.json");
|
|
75
|
+
}
|
|
76
|
+
function loadPackUpdateConfig() {
|
|
77
|
+
const cfgPath = packUpdateConfigPath();
|
|
78
|
+
let raw = {};
|
|
79
|
+
if (fs.existsSync(cfgPath)) {
|
|
80
|
+
try {
|
|
81
|
+
raw = JSON.parse(fs.readFileSync(cfgPath, "utf8"));
|
|
82
|
+
} catch {
|
|
83
|
+
raw = {};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
delete raw.$schema;
|
|
87
|
+
const legacyMatch = hoistLegacyMatch(raw);
|
|
88
|
+
const merged = deepMerge(
|
|
89
|
+
DEFAULTS,
|
|
90
|
+
raw
|
|
91
|
+
);
|
|
92
|
+
if (legacyMatch) {
|
|
93
|
+
merged.match = legacyMatch;
|
|
94
|
+
}
|
|
95
|
+
const envKey = process.env.CURSEFORGE_API_KEY?.trim();
|
|
96
|
+
if (envKey) {
|
|
97
|
+
merged.providers.curseforge.apiKey = envKey;
|
|
98
|
+
}
|
|
99
|
+
const cf = merged.providers.curseforge;
|
|
100
|
+
delete cf.match;
|
|
101
|
+
const match = merged.match;
|
|
102
|
+
delete match.byUuidInArchive;
|
|
103
|
+
delete match.byName;
|
|
104
|
+
return merged;
|
|
105
|
+
}
|
|
106
|
+
function getPackMatchConfig(cfg) {
|
|
107
|
+
return cfg.match;
|
|
108
|
+
}
|
|
109
|
+
function resolvePackTrashDir(cfg) {
|
|
110
|
+
const c = cfg ?? loadPackUpdateConfig();
|
|
111
|
+
const fallback = DEFAULT_PACK_UNINSTALL.trashRelativeDir;
|
|
112
|
+
const rel = (c.uninstall?.trashRelativeDir || fallback).trim() || fallback;
|
|
113
|
+
return path.isAbsolute(rel) ? rel : path.join(rootDir, rel);
|
|
114
|
+
}
|
|
115
|
+
function isPackUninstallRecycleBin(cfg) {
|
|
116
|
+
const c = cfg ?? loadPackUpdateConfig();
|
|
117
|
+
return c.uninstall?.recycleBin !== false;
|
|
118
|
+
}
|
|
119
|
+
function resolveUninstallTrashDir(opts) {
|
|
120
|
+
const cfg = opts?.cfg ?? loadPackUpdateConfig();
|
|
121
|
+
if (opts?.purge || !isPackUninstallRecycleBin(cfg)) return null;
|
|
122
|
+
return resolvePackTrashDir(cfg);
|
|
123
|
+
}
|
|
124
|
+
function ensurePackUpdateConfigFile() {
|
|
125
|
+
const dest = packUpdateConfigPath();
|
|
126
|
+
if (fs.existsSync(dest)) return dest;
|
|
127
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
128
|
+
const seeded = withConfigSchema({ ...DEFAULTS }, "pack_update");
|
|
129
|
+
fs.writeFileSync(dest, `${JSON.stringify(seeded, null, 2)}
|
|
130
|
+
`, "utf8");
|
|
131
|
+
return dest;
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
packUpdateConfigPath,
|
|
135
|
+
loadPackUpdateConfig,
|
|
136
|
+
getPackMatchConfig,
|
|
137
|
+
resolvePackTrashDir,
|
|
138
|
+
isPackUninstallRecycleBin,
|
|
139
|
+
resolveUninstallTrashDir,
|
|
140
|
+
ensurePackUpdateConfigFile
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
export {
|
|
144
|
+
createPackUpdateConfigApi
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/pack-update/config.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * pack-update \u914D\u7F6E\u52A0\u8F7D\n */\nimport { withConfigSchema } from \"@sfmc-bds/sdk/node/config\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { PackUpdateDeps } from \"./deps.js\";\nimport type { CurseForgeProviderConfig, PackUpdateConfig, PackUpdateMatchConfig } from \"./types.js\";\nimport { DEFAULT_PACK_UNINSTALL } from \"./types.js\";\n\nconst DEFAULT_MATCH: PackUpdateMatchConfig = {\n nameMinScore: 0.6,\n stripFolderTags: true,\n};\n\nconst DEFAULTS: PackUpdateConfig = {\n enabled: true,\n checkOnBdsStart: true,\n applyOnBdsStart: true,\n askConfirmOnBind: true,\n probeSourceAfterInstall: true,\n /* \u63A2\u6D4B\u7ED1\u5B9A\u9ED8\u8BA4\u5173\u95ED\uFF0C\u907F\u514D\u8BEF\u66F4\u65B0\uFF1B\u53EF\u5728 pack-update.json \u6539\u4E3A true */\n defaultBindingEnabled: false,\n match: { ...DEFAULT_MATCH },\n providers: {\n curseforge: {\n enabled: true,\n apiKey: \"\",\n baseUrl: \"https://api.curseforge.com\",\n searchBaseUrl: \"https://api.curse.tools/v1/cf\",\n gameId: 78022,\n classId: 4984,\n pageSize: 10,\n preferredReleaseTypes: [\"release\", \"beta\", \"alpha\"],\n },\n },\n versionPolicy: {\n authority: \"behavior_pack\",\n onUpdateOverwriteBoth: true,\n rpBumpWhenSameMajor: true,\n rpBumpComponent: \"patch\",\n majorHigherSkipRpBump: true,\n },\n startup: {\n sequential: true,\n delayMsBetweenPacks: 0,\n skipDisabledBindings: true,\n failMode: \"continue\",\n },\n uninstall: { ...DEFAULT_PACK_UNINSTALL },\n};\n\nfunction deepMerge<T extends Record<string, unknown>>(base: T, over: Partial<T>): T {\n const out = { ...base };\n for (const [k, v] of Object.entries(over)) {\n if (v && typeof v === \"object\" && !Array.isArray(v) && typeof (base as Record<string, unknown>)[k] === \"object\") {\n (out as Record<string, unknown>)[k] = deepMerge(\n (base as Record<string, unknown>)[k] as Record<string, unknown>,\n v as Record<string, unknown>\n );\n } else if (v !== undefined) {\n (out as Record<string, unknown>)[k] = v;\n }\n }\n return out;\n}\n\n/**\n * \u5C06\u65E7\u7248\u6302\u5728 providers.curseforge.match \u7684\u5B57\u6BB5\u63D0\u5347\u5230\u9876\u5C42 match\uFF08\u517C\u5BB9\u4E00\u7248\uFF09\u3002\n * \u9876\u5C42\u663E\u5F0F\u914D\u7F6E\u4F18\u5148\u4E8E\u5D4C\u5957\u9057\u7559\u3002\n */\nfunction hoistLegacyMatch(raw: Record<string, unknown>): PackUpdateMatchConfig | undefined {\n const top = raw.match;\n const providers = raw.providers as Record<string, unknown> | undefined;\n const cf = providers?.curseforge as Record<string, unknown> | undefined;\n const nested = cf?.match;\n const pick =\n top && typeof top === \"object\" && !Array.isArray(top)\n ? (top as Partial<PackUpdateMatchConfig>)\n : nested && typeof nested === \"object\" && !Array.isArray(nested)\n ? (nested as Partial<PackUpdateMatchConfig>)\n : undefined;\n if (!pick) return undefined;\n return deepMerge(\n DEFAULT_MATCH as unknown as Record<string, unknown>,\n pick as Record<string, unknown>\n ) as unknown as PackUpdateMatchConfig;\n}\n\nexport function createPackUpdateConfigApi(deps: Pick<PackUpdateDeps, \"rootDir\">) {\n const { rootDir } = deps;\n\n function packUpdateConfigPath(): string {\n return path.join(rootDir, \"configs\", \"pack-update.json\");\n }\n\n function loadPackUpdateConfig(): PackUpdateConfig {\n const cfgPath = packUpdateConfigPath();\n let raw: Record<string, unknown> = {};\n if (fs.existsSync(cfgPath)) {\n try {\n raw = JSON.parse(fs.readFileSync(cfgPath, \"utf8\")) as Record<string, unknown>;\n } catch {\n raw = {};\n }\n }\n\n delete raw.$schema;\n\n const legacyMatch = hoistLegacyMatch(raw);\n const merged = deepMerge(\n DEFAULTS as unknown as Record<string, unknown>,\n raw as Record<string, unknown>\n ) as unknown as PackUpdateConfig;\n\n if (legacyMatch) {\n merged.match = legacyMatch;\n }\n\n const envKey = process.env.CURSEFORGE_API_KEY?.trim();\n if (envKey) {\n merged.providers.curseforge.apiKey = envKey;\n }\n\n /* \u5265\u79BB\u66FE\u6302\u5728 CF \u4E0B\u7684 match / \u672A\u63A5\u7EBF\u6B7B\u5B57\u6BB5\uFF0C\u907F\u514D\u810F\u914D\u7F6E\u6E17\u5165 Provider\uFF08Demeter/\u5951\u7EA6\uFF09 */\n const cf = merged.providers.curseforge as CurseForgeProviderConfig & Record<string, unknown>;\n delete cf.match;\n const match = merged.match as PackUpdateMatchConfig & Record<string, unknown>;\n delete match.byUuidInArchive;\n delete match.byName;\n\n return merged;\n }\n\n /** \u5339\u914D\u7B56\u7565\u8BBF\u95EE\u5668\uFF1A\u7F16\u6392\u5C42\u53EA\u8BFB\u9876\u5C42 match\uFF0C\u52FF\u6316 providers.*\uFF08Demeter\uFF09 */\n function getPackMatchConfig(cfg: PackUpdateConfig): PackUpdateMatchConfig {\n return cfg.match;\n }\n\n /** \u5378\u8F7D\u56DE\u6536\u7AD9\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u76F8\u5BF9 SFMC_ROOT\uFF1B\u7F3A\u7701\u8D70 DEFAULT_PACK_UNINSTALL\uFF09 */\n function resolvePackTrashDir(cfg?: PackUpdateConfig): string {\n const c = cfg ?? loadPackUpdateConfig();\n const fallback = DEFAULT_PACK_UNINSTALL.trashRelativeDir;\n const rel = (c.uninstall?.trashRelativeDir || fallback).trim() || fallback;\n return path.isAbsolute(rel) ? rel : path.join(rootDir, rel);\n }\n\n /** \u662F\u5426\u4F7F\u7528\u5378\u8F7D\u56DE\u6536\u7AD9 */\n function isPackUninstallRecycleBin(cfg?: PackUpdateConfig): boolean {\n const c = cfg ?? loadPackUpdateConfig();\n return c.uninstall?.recycleBin !== false;\n }\n\n /**\n * \u89E3\u6790\u672C\u6B21\u5378\u8F7D\u7684 trash \u76EE\u6807\uFF08DRY\uFF1Apurge + recycleBin \u53EA\u5728\u4E00\u5904\u7EC4\u5408\uFF09\u3002\n * \u8FD4\u56DE null \u8868\u793A\u76F4\u63A5\u5220\u9664\u3002\n */\n function resolveUninstallTrashDir(opts?: {\n purge?: boolean;\n cfg?: PackUpdateConfig;\n }): string | null {\n const cfg = opts?.cfg ?? loadPackUpdateConfig();\n if (opts?.purge || !isPackUninstallRecycleBin(cfg)) return null;\n return resolvePackTrashDir(cfg);\n }\n\n /**\n * \u786E\u4FDD configs/pack-update.json \u5B58\u5728\uFF1B\u7F3A\u5931\u5219\u5199\u5165\u5185\u7F6E DEFAULTS + $schema\u3002\n */\n function ensurePackUpdateConfigFile(): string {\n const dest = packUpdateConfigPath();\n if (fs.existsSync(dest)) return dest;\n fs.mkdirSync(path.dirname(dest), { recursive: true });\n const seeded = withConfigSchema({ ...DEFAULTS } as unknown as Record<string, unknown>, \"pack_update\");\n fs.writeFileSync(dest, `${JSON.stringify(seeded, null, 2)}\\n`, \"utf8\");\n return dest;\n }\n\n return {\n packUpdateConfigPath,\n loadPackUpdateConfig,\n getPackMatchConfig,\n resolvePackTrashDir,\n isPackUninstallRecycleBin,\n resolveUninstallTrashDir,\n ensurePackUpdateConfigFile,\n };\n}\n\nexport type PackUpdateConfigApi = ReturnType<typeof createPackUpdateConfigApi>;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { after, before, describe, it } from "node:test";
|
|
6
|
+
import {
|
|
7
|
+
DEFAULT_PACK_UNINSTALL,
|
|
8
|
+
createPackSourceProvider,
|
|
9
|
+
createPackUpdateApi,
|
|
10
|
+
createTestPackUpdateDeps,
|
|
11
|
+
providerShortLabel,
|
|
12
|
+
resolveConfiguredPackProvider
|
|
13
|
+
} from "./index.js";
|
|
14
|
+
const tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), "bds-pack-upd-cfg-"));
|
|
15
|
+
const api = createPackUpdateApi(createTestPackUpdateDeps(tmpRoot));
|
|
16
|
+
const { loadPackUpdateConfig, getPackMatchConfig, resolveUninstallTrashDir } = api;
|
|
17
|
+
describe("pack-update config + provider resolve", () => {
|
|
18
|
+
before(() => {
|
|
19
|
+
fs.mkdirSync(path.join(tmpRoot, "configs"), { recursive: true });
|
|
20
|
+
});
|
|
21
|
+
after(() => {
|
|
22
|
+
try {
|
|
23
|
+
fs.rmSync(tmpRoot, { recursive: true, force: true });
|
|
24
|
+
} catch {
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
it("defaultBindingEnabled \u9ED8\u8BA4 false\uFF0C\u4E14\u51FA\u73B0\u5728\u7C7B\u578B\u5316\u914D\u7F6E\u4E0A", () => {
|
|
28
|
+
const cfgPath = path.join(tmpRoot, "configs", "pack-update.json");
|
|
29
|
+
if (fs.existsSync(cfgPath)) fs.unlinkSync(cfgPath);
|
|
30
|
+
const cfg = loadPackUpdateConfig();
|
|
31
|
+
assert.equal(cfg.defaultBindingEnabled, false);
|
|
32
|
+
assert.equal(typeof cfg.match.nameMinScore, "number");
|
|
33
|
+
assert.equal(cfg.uninstall.recycleBin, true);
|
|
34
|
+
assert.equal(cfg.uninstall.trashRelativeDir, "packs/_trash");
|
|
35
|
+
assert.equal(cfg.uninstall.trashRelativeDir, DEFAULT_PACK_UNINSTALL.trashRelativeDir);
|
|
36
|
+
assert.equal(resolveUninstallTrashDir({ purge: true }), null);
|
|
37
|
+
const trashAbs = String(resolveUninstallTrashDir({})).replace(/\\/g, "/");
|
|
38
|
+
assert.ok(
|
|
39
|
+
trashAbs.includes(DEFAULT_PACK_UNINSTALL.trashRelativeDir),
|
|
40
|
+
`trash dir should contain ${DEFAULT_PACK_UNINSTALL.trashRelativeDir}: ${trashAbs}`
|
|
41
|
+
);
|
|
42
|
+
});
|
|
43
|
+
it("\u65E7\u7248 providers.curseforge.match \u63D0\u5347\u5230\u9876\u5C42 match", () => {
|
|
44
|
+
const cfgPath = path.join(tmpRoot, "configs", "pack-update.json");
|
|
45
|
+
fs.writeFileSync(
|
|
46
|
+
cfgPath,
|
|
47
|
+
JSON.stringify({
|
|
48
|
+
providers: {
|
|
49
|
+
curseforge: {
|
|
50
|
+
enabled: true,
|
|
51
|
+
apiKey: "",
|
|
52
|
+
match: { nameMinScore: 0.91, stripFolderTags: false }
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}),
|
|
56
|
+
"utf8"
|
|
57
|
+
);
|
|
58
|
+
const cfg = loadPackUpdateConfig();
|
|
59
|
+
assert.equal(cfg.match.nameMinScore, 0.91);
|
|
60
|
+
assert.equal(cfg.match.stripFolderTags, false);
|
|
61
|
+
assert.equal(getPackMatchConfig(cfg).nameMinScore, 0.91);
|
|
62
|
+
assert.equal("match" in cfg.providers.curseforge, false);
|
|
63
|
+
});
|
|
64
|
+
it("providerShortLabel / resolveConfiguredPackProvider \u5951\u7EA6", () => {
|
|
65
|
+
assert.equal(providerShortLabel("curseforge"), "cf");
|
|
66
|
+
const cfg = loadPackUpdateConfig();
|
|
67
|
+
assert.equal(resolveConfiguredPackProvider(cfg), null);
|
|
68
|
+
cfg.providers.curseforge.apiKey = "test-key-not-real";
|
|
69
|
+
const p = resolveConfiguredPackProvider(cfg);
|
|
70
|
+
assert.ok(p);
|
|
71
|
+
assert.equal(p.id, "curseforge");
|
|
72
|
+
assert.equal(createPackSourceProvider(cfg, "curseforge").id, "curseforge");
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=config.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/pack-update/config.test.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * pack-update \u914D\u7F6E / provider \u89E3\u6790\u5951\u7EA6\u6D4B\u8BD5\n */\nimport assert from \"node:assert/strict\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { after, before, describe, it } from \"node:test\";\nimport {\n DEFAULT_PACK_UNINSTALL,\n createPackSourceProvider,\n createPackUpdateApi,\n createTestPackUpdateDeps,\n providerShortLabel,\n resolveConfiguredPackProvider,\n} from \"./index.js\";\n\nconst tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), \"bds-pack-upd-cfg-\"));\nconst api = createPackUpdateApi(createTestPackUpdateDeps(tmpRoot));\nconst { loadPackUpdateConfig, getPackMatchConfig, resolveUninstallTrashDir } = api;\n\ndescribe(\"pack-update config + provider resolve\", () => {\n before(() => {\n fs.mkdirSync(path.join(tmpRoot, \"configs\"), { recursive: true });\n });\n\n after(() => {\n try {\n fs.rmSync(tmpRoot, { recursive: true, force: true });\n } catch {\n /* ignore */\n }\n });\n\n it(\"defaultBindingEnabled \u9ED8\u8BA4 false\uFF0C\u4E14\u51FA\u73B0\u5728\u7C7B\u578B\u5316\u914D\u7F6E\u4E0A\", () => {\n const cfgPath = path.join(tmpRoot, \"configs\", \"pack-update.json\");\n if (fs.existsSync(cfgPath)) fs.unlinkSync(cfgPath);\n const cfg = loadPackUpdateConfig();\n assert.equal(cfg.defaultBindingEnabled, false);\n assert.equal(typeof cfg.match.nameMinScore, \"number\");\n assert.equal(cfg.uninstall.recycleBin, true);\n assert.equal(cfg.uninstall.trashRelativeDir, \"packs/_trash\");\n\n assert.equal(cfg.uninstall.trashRelativeDir, DEFAULT_PACK_UNINSTALL.trashRelativeDir);\n assert.equal(resolveUninstallTrashDir({ purge: true }), null);\n const trashAbs = String(resolveUninstallTrashDir({})).replace(/\\\\/g, \"/\");\n assert.ok(\n trashAbs.includes(DEFAULT_PACK_UNINSTALL.trashRelativeDir),\n `trash dir should contain ${DEFAULT_PACK_UNINSTALL.trashRelativeDir}: ${trashAbs}`\n );\n });\n\n it(\"\u65E7\u7248 providers.curseforge.match \u63D0\u5347\u5230\u9876\u5C42 match\", () => {\n const cfgPath = path.join(tmpRoot, \"configs\", \"pack-update.json\");\n fs.writeFileSync(\n cfgPath,\n JSON.stringify({\n providers: {\n curseforge: {\n enabled: true,\n apiKey: \"\",\n match: { nameMinScore: 0.91, stripFolderTags: false },\n },\n },\n }),\n \"utf8\"\n );\n const cfg = loadPackUpdateConfig();\n assert.equal(cfg.match.nameMinScore, 0.91);\n assert.equal(cfg.match.stripFolderTags, false);\n assert.equal(getPackMatchConfig(cfg).nameMinScore, 0.91);\n assert.equal(\"match\" in cfg.providers.curseforge, false);\n });\n\n it(\"providerShortLabel / resolveConfiguredPackProvider \u5951\u7EA6\", () => {\n assert.equal(providerShortLabel(\"curseforge\"), \"cf\");\n const cfg = loadPackUpdateConfig();\n assert.equal(resolveConfiguredPackProvider(cfg), null);\n cfg.providers.curseforge.apiKey = \"test-key-not-real\";\n const p = resolveConfiguredPackProvider(cfg);\n assert.ok(p);\n assert.equal(p.id, \"curseforge\");\n assert.equal(createPackSourceProvider(cfg, \"curseforge\").id, \"curseforge\");\n });\n});\n"],
|
|
5
|
+
"mappings": "AAGA,OAAO,YAAY;AACnB,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,OAAO,QAAQ,UAAU,UAAU;AAC5C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,MAAM,UAAU,GAAG,YAAY,KAAK,KAAK,GAAG,OAAO,GAAG,mBAAmB,CAAC;AAC1E,MAAM,MAAM,oBAAoB,yBAAyB,OAAO,CAAC;AACjE,MAAM,EAAE,sBAAsB,oBAAoB,yBAAyB,IAAI;AAE/E,SAAS,yCAAyC,MAAM;AACtD,SAAO,MAAM;AACX,OAAG,UAAU,KAAK,KAAK,SAAS,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EACjE,CAAC;AAED,QAAM,MAAM;AACV,QAAI;AACF,SAAG,OAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACrD,QAAQ;AAAA,IAER;AAAA,EACF,CAAC;AAED,KAAG,8GAA6C,MAAM;AACpD,UAAM,UAAU,KAAK,KAAK,SAAS,WAAW,kBAAkB;AAChE,QAAI,GAAG,WAAW,OAAO,EAAG,IAAG,WAAW,OAAO;AACjD,UAAM,MAAM,qBAAqB;AACjC,WAAO,MAAM,IAAI,uBAAuB,KAAK;AAC7C,WAAO,MAAM,OAAO,IAAI,MAAM,cAAc,QAAQ;AACpD,WAAO,MAAM,IAAI,UAAU,YAAY,IAAI;AAC3C,WAAO,MAAM,IAAI,UAAU,kBAAkB,cAAc;AAE3D,WAAO,MAAM,IAAI,UAAU,kBAAkB,uBAAuB,gBAAgB;AACpF,WAAO,MAAM,yBAAyB,EAAE,OAAO,KAAK,CAAC,GAAG,IAAI;AAC5D,UAAM,WAAW,OAAO,yBAAyB,CAAC,CAAC,CAAC,EAAE,QAAQ,OAAO,GAAG;AACxE,WAAO;AAAA,MACL,SAAS,SAAS,uBAAuB,gBAAgB;AAAA,MACzD,4BAA4B,uBAAuB,gBAAgB,KAAK,QAAQ;AAAA,IAClF;AAAA,EACF,CAAC;AAED,KAAG,gFAA6C,MAAM;AACpD,UAAM,UAAU,KAAK,KAAK,SAAS,WAAW,kBAAkB;AAChE,OAAG;AAAA,MACD;AAAA,MACA,KAAK,UAAU;AAAA,QACb,WAAW;AAAA,UACT,YAAY;AAAA,YACV,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,OAAO,EAAE,cAAc,MAAM,iBAAiB,MAAM;AAAA,UACtD;AAAA,QACF;AAAA,MACF,CAAC;AAAA,MACD;AAAA,IACF;AACA,UAAM,MAAM,qBAAqB;AACjC,WAAO,MAAM,IAAI,MAAM,cAAc,IAAI;AACzC,WAAO,MAAM,IAAI,MAAM,iBAAiB,KAAK;AAC7C,WAAO,MAAM,mBAAmB,GAAG,EAAE,cAAc,IAAI;AACvD,WAAO,MAAM,WAAW,IAAI,UAAU,YAAY,KAAK;AAAA,EACzD,CAAC;AAED,KAAG,mEAAyD,MAAM;AAChE,WAAO,MAAM,mBAAmB,YAAY,GAAG,IAAI;AACnD,UAAM,MAAM,qBAAqB;AACjC,WAAO,MAAM,8BAA8B,GAAG,GAAG,IAAI;AACrD,QAAI,UAAU,WAAW,SAAS;AAClC,UAAM,IAAI,8BAA8B,GAAG;AAC3C,WAAO,GAAG,CAAC;AACX,WAAO,MAAM,EAAE,IAAI,YAAY;AAC/B,WAAO,MAAM,yBAAyB,KAAK,YAAY,EAAE,IAAI,YAAY;AAAA,EAC3E,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pack-update 依赖注入契约(CLI 注入 i18n/theme/log;库测试可传英文回退)
|
|
3
|
+
*/
|
|
4
|
+
export type PackUpdateDeps = {
|
|
5
|
+
rootDir: string;
|
|
6
|
+
resolveBdsContext: () => {
|
|
7
|
+
bdsRoot: string;
|
|
8
|
+
levelName: string;
|
|
9
|
+
};
|
|
10
|
+
log: (text: string, level?: "info" | "warn" | "error" | "success") => void;
|
|
11
|
+
askConfirm: (message: string) => Promise<boolean>;
|
|
12
|
+
/** i18n:CLI 传 t();测试可传 key 或英文回退 */
|
|
13
|
+
t: (key: string, params?: Record<string, string | number>) => string;
|
|
14
|
+
/** 可选着色;省略时用 identity */
|
|
15
|
+
paint: {
|
|
16
|
+
green: (s: string) => string;
|
|
17
|
+
yellow: (s: string) => string;
|
|
18
|
+
red: (s: string) => string;
|
|
19
|
+
dim: (s: string) => string;
|
|
20
|
+
cyan: (s: string) => string;
|
|
21
|
+
bold: (s: string) => string;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
/** 无 ANSI 的 identity paint(测试 / 非 TTY 回退) */
|
|
25
|
+
export declare function identityPaint(): PackUpdateDeps["paint"];
|
|
26
|
+
/** 最小测试依赖:仅 rootDir,其余 noop / identity */
|
|
27
|
+
export declare function createTestPackUpdateDeps(rootDir: string): PackUpdateDeps;
|
|
28
|
+
//# sourceMappingURL=deps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../src/pack-update/deps.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,KAAK,IAAI,CAAC;IAC3E,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,oCAAoC;IACpC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CAAC;IACrE,yBAAyB;IACzB,KAAK,EAAE;QACL,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;QAC7B,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;QAC9B,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;QAC3B,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;QAC3B,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;QAC5B,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;KAC7B,CAAC;CACH,CAAC;AAIF,6CAA6C;AAC7C,wBAAgB,aAAa,IAAI,cAAc,CAAC,OAAO,CAAC,CAEvD;AAED,0CAA0C;AAC1C,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CASxE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const id = (s) => s;
|
|
2
|
+
function identityPaint() {
|
|
3
|
+
return { green: id, yellow: id, red: id, dim: id, cyan: id, bold: id };
|
|
4
|
+
}
|
|
5
|
+
function createTestPackUpdateDeps(rootDir) {
|
|
6
|
+
return {
|
|
7
|
+
rootDir,
|
|
8
|
+
resolveBdsContext: () => ({ bdsRoot: "", levelName: "" }),
|
|
9
|
+
log: () => {
|
|
10
|
+
},
|
|
11
|
+
askConfirm: async () => true,
|
|
12
|
+
t: (key) => key,
|
|
13
|
+
paint: identityPaint()
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
createTestPackUpdateDeps,
|
|
18
|
+
identityPaint
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=deps.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/pack-update/deps.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * pack-update \u4F9D\u8D56\u6CE8\u5165\u5951\u7EA6\uFF08CLI \u6CE8\u5165 i18n/theme/log\uFF1B\u5E93\u6D4B\u8BD5\u53EF\u4F20\u82F1\u6587\u56DE\u9000\uFF09\n */\n\nexport type PackUpdateDeps = {\n rootDir: string;\n resolveBdsContext: () => { bdsRoot: string; levelName: string };\n log: (text: string, level?: \"info\" | \"warn\" | \"error\" | \"success\") => void;\n askConfirm: (message: string) => Promise<boolean>;\n /** i18n\uFF1ACLI \u4F20 t()\uFF1B\u6D4B\u8BD5\u53EF\u4F20 key \u6216\u82F1\u6587\u56DE\u9000 */\n t: (key: string, params?: Record<string, string | number>) => string;\n /** \u53EF\u9009\u7740\u8272\uFF1B\u7701\u7565\u65F6\u7528 identity */\n paint: {\n green: (s: string) => string;\n yellow: (s: string) => string;\n red: (s: string) => string;\n dim: (s: string) => string;\n cyan: (s: string) => string;\n bold: (s: string) => string;\n };\n};\n\nconst id = (s: string): string => s;\n\n/** \u65E0 ANSI \u7684 identity paint\uFF08\u6D4B\u8BD5 / \u975E TTY \u56DE\u9000\uFF09 */\nexport function identityPaint(): PackUpdateDeps[\"paint\"] {\n return { green: id, yellow: id, red: id, dim: id, cyan: id, bold: id };\n}\n\n/** \u6700\u5C0F\u6D4B\u8BD5\u4F9D\u8D56\uFF1A\u4EC5 rootDir\uFF0C\u5176\u4F59 noop / identity */\nexport function createTestPackUpdateDeps(rootDir: string): PackUpdateDeps {\n return {\n rootDir,\n resolveBdsContext: () => ({ bdsRoot: \"\", levelName: \"\" }),\n log: () => {},\n askConfirm: async () => true,\n t: (key) => key,\n paint: identityPaint(),\n };\n}\n"],
|
|
5
|
+
"mappings": "AAsBA,MAAM,KAAK,CAAC,MAAsB;AAG3B,SAAS,gBAAyC;AACvD,SAAO,EAAE,OAAO,IAAI,QAAQ,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,GAAG;AACvE;AAGO,SAAS,yBAAyB,SAAiC;AACxE,SAAO;AAAA,IACL;AAAA,IACA,mBAAmB,OAAO,EAAE,SAAS,IAAI,WAAW,GAAG;AAAA,IACvD,KAAK,MAAM;AAAA,IAAC;AAAA,IACZ,YAAY,YAAY;AAAA,IACxB,GAAG,CAAC,QAAQ;AAAA,IACZ,OAAO,cAAc;AAAA,EACvB;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { createTestPackUpdateDeps, identityPaint, type PackUpdateDeps } from "./deps.js";
|
|
2
|
+
import { createPackSourceProvider, providerShortLabel, resolveConfiguredPackProvider } from "./providers/index.js";
|
|
3
|
+
export type { PackUpdateDeps };
|
|
4
|
+
export { createTestPackUpdateDeps, identityPaint };
|
|
5
|
+
export type { CurseForgeProviderConfig, PackProviderId, PackReleaseType, PackSourceBinding, PackSourceProvider, PackSourcesFile, PackUpdateConfig, PackUpdateMatchConfig, PackUninstallConfig, SemVer3, SourceFileRef, SourceSearchHit, VersionCompareResult, VersionPolicyConfig, } from "./types.js";
|
|
6
|
+
export { DEFAULT_PACK_UNINSTALL } from "./types.js";
|
|
7
|
+
export { buildSearchQueries, buildSearchQueriesFromSources, bumpSemVer3, collectQuerySeeds, compareSemVer3, decideVersionPolicy, extractLatinPhrase, insertCjkLatinBoundaries, isNewer, maxSemVer3, nextEnabledVersion, normalizePackSearchName, packSourceScore, toCfSlugCandidate, } from "./version-policy.js";
|
|
8
|
+
export type { SearchQueryPlan, SearchQuerySource } from "./version-policy.js";
|
|
9
|
+
export { createPackSourceProvider, CurseForgeBedrockProvider, providerShortLabel, resolveConfiguredPackProvider, } from "./providers/index.js";
|
|
10
|
+
export type { PackUpdateBindingsApi } from "./bindings.js";
|
|
11
|
+
export type { PackUpdateConfigApi } from "./config.js";
|
|
12
|
+
export type { PackUpdateServiceApi } from "./service.js";
|
|
13
|
+
export declare function createPackUpdateApi(deps: PackUpdateDeps): {
|
|
14
|
+
packSourcesPath: () => string;
|
|
15
|
+
readPackSources: () => import("./types.js").PackSourcesFile;
|
|
16
|
+
writePackSources: (data: import("./types.js").PackSourcesFile) => void;
|
|
17
|
+
getBinding: (bpUuid: string) => import("./types.js").PackSourceBinding | null;
|
|
18
|
+
setBinding: (bpUuid: string, binding: import("./types.js").PackSourceBinding) => void;
|
|
19
|
+
removeBinding: (bpUuid: string) => boolean;
|
|
20
|
+
listBindings: () => Array<{
|
|
21
|
+
bpUuid: string;
|
|
22
|
+
binding: import("./types.js").PackSourceBinding;
|
|
23
|
+
}>;
|
|
24
|
+
packUpdateConfigPath: () => string;
|
|
25
|
+
loadPackUpdateConfig: () => import("./types.js").PackUpdateConfig;
|
|
26
|
+
getPackMatchConfig: (cfg: import("./types.js").PackUpdateConfig) => import("./types.js").PackUpdateMatchConfig;
|
|
27
|
+
resolvePackTrashDir: (cfg?: import("./types.js").PackUpdateConfig) => string;
|
|
28
|
+
isPackUninstallRecycleBin: (cfg?: import("./types.js").PackUpdateConfig) => boolean;
|
|
29
|
+
resolveUninstallTrashDir: (opts?: {
|
|
30
|
+
purge?: boolean;
|
|
31
|
+
cfg?: import("./types.js").PackUpdateConfig;
|
|
32
|
+
}) => string | null;
|
|
33
|
+
ensurePackUpdateConfigFile: () => string;
|
|
34
|
+
pairedRpUuidFromBpDir: (bpDir: string) => string | null;
|
|
35
|
+
probeSourceAfterInstall: (opts: {
|
|
36
|
+
info: import("../world-packs.js").PackManifestInfo;
|
|
37
|
+
packDir?: string;
|
|
38
|
+
folderName?: string;
|
|
39
|
+
interactive?: boolean;
|
|
40
|
+
}) => Promise<void>;
|
|
41
|
+
searchRemote: (query: string) => Promise<string>;
|
|
42
|
+
bindPackSource: (packId: string, ref: string) => Promise<string>;
|
|
43
|
+
formatSourcesList: () => string;
|
|
44
|
+
checkPackUpdates: (opts?: {
|
|
45
|
+
packId?: string;
|
|
46
|
+
apply?: boolean;
|
|
47
|
+
}) => Promise<string>;
|
|
48
|
+
runPackUpdatesOnBdsStart: () => Promise<void>;
|
|
49
|
+
bindingLabelForUuid: (uuid: string) => string;
|
|
50
|
+
createPackSourceProvider: typeof createPackSourceProvider;
|
|
51
|
+
providerShortLabel: typeof providerShortLabel;
|
|
52
|
+
resolveConfiguredPackProvider: typeof resolveConfiguredPackProvider;
|
|
53
|
+
};
|
|
54
|
+
export type PackUpdateApi = ReturnType<typeof createPackUpdateApi>;
|
|
55
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pack-update/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AACzF,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,6BAA6B,EAC9B,MAAM,sBAAsB,CAAC;AAG9B,YAAY,EAAE,cAAc,EAAE,CAAC;AAC/B,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,CAAC;AAEnD,YAAY,EACV,wBAAwB,EACxB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,OAAO,EACP,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EACL,kBAAkB,EAClB,6BAA6B,EAC7B,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,OAAO,EACP,UAAU,EACV,kBAAkB,EAClB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE9E,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3D,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAcvD;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createPackUpdateBindingsApi } from "./bindings.js";
|
|
2
|
+
import { createPackUpdateConfigApi } from "./config.js";
|
|
3
|
+
import { createTestPackUpdateDeps, identityPaint } from "./deps.js";
|
|
4
|
+
import {
|
|
5
|
+
createPackSourceProvider,
|
|
6
|
+
providerShortLabel,
|
|
7
|
+
resolveConfiguredPackProvider
|
|
8
|
+
} from "./providers/index.js";
|
|
9
|
+
import { createPackUpdateServiceApi } from "./service.js";
|
|
10
|
+
import { DEFAULT_PACK_UNINSTALL } from "./types.js";
|
|
11
|
+
import {
|
|
12
|
+
buildSearchQueries,
|
|
13
|
+
buildSearchQueriesFromSources,
|
|
14
|
+
bumpSemVer3,
|
|
15
|
+
collectQuerySeeds,
|
|
16
|
+
compareSemVer3,
|
|
17
|
+
decideVersionPolicy,
|
|
18
|
+
extractLatinPhrase,
|
|
19
|
+
insertCjkLatinBoundaries,
|
|
20
|
+
isNewer,
|
|
21
|
+
maxSemVer3,
|
|
22
|
+
nextEnabledVersion,
|
|
23
|
+
normalizePackSearchName,
|
|
24
|
+
packSourceScore,
|
|
25
|
+
toCfSlugCandidate
|
|
26
|
+
} from "./version-policy.js";
|
|
27
|
+
import {
|
|
28
|
+
createPackSourceProvider as createPackSourceProvider2,
|
|
29
|
+
CurseForgeBedrockProvider,
|
|
30
|
+
providerShortLabel as providerShortLabel2,
|
|
31
|
+
resolveConfiguredPackProvider as resolveConfiguredPackProvider2
|
|
32
|
+
} from "./providers/index.js";
|
|
33
|
+
function createPackUpdateApi(deps) {
|
|
34
|
+
const paint = deps.paint ?? identityPaint();
|
|
35
|
+
const resolved = { ...deps, paint };
|
|
36
|
+
const config = createPackUpdateConfigApi(resolved);
|
|
37
|
+
const bindings = createPackUpdateBindingsApi(resolved);
|
|
38
|
+
const service = createPackUpdateServiceApi(resolved, config, bindings);
|
|
39
|
+
return {
|
|
40
|
+
...config,
|
|
41
|
+
...bindings,
|
|
42
|
+
...service,
|
|
43
|
+
createPackSourceProvider,
|
|
44
|
+
providerShortLabel,
|
|
45
|
+
resolveConfiguredPackProvider
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
CurseForgeBedrockProvider,
|
|
50
|
+
DEFAULT_PACK_UNINSTALL,
|
|
51
|
+
buildSearchQueries,
|
|
52
|
+
buildSearchQueriesFromSources,
|
|
53
|
+
bumpSemVer3,
|
|
54
|
+
collectQuerySeeds,
|
|
55
|
+
compareSemVer3,
|
|
56
|
+
createPackSourceProvider2 as createPackSourceProvider,
|
|
57
|
+
createPackUpdateApi,
|
|
58
|
+
createTestPackUpdateDeps,
|
|
59
|
+
decideVersionPolicy,
|
|
60
|
+
extractLatinPhrase,
|
|
61
|
+
identityPaint,
|
|
62
|
+
insertCjkLatinBoundaries,
|
|
63
|
+
isNewer,
|
|
64
|
+
maxSemVer3,
|
|
65
|
+
nextEnabledVersion,
|
|
66
|
+
normalizePackSearchName,
|
|
67
|
+
packSourceScore,
|
|
68
|
+
providerShortLabel2 as providerShortLabel,
|
|
69
|
+
resolveConfiguredPackProvider2 as resolveConfiguredPackProvider,
|
|
70
|
+
toCfSlugCandidate
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/pack-update/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * pack-update \u516C\u5171\u5165\u53E3\uFF1A\u4F9D\u8D56\u6CE8\u5165\u5DE5\u5382 + \u7EAF\u51FD\u6570/\u7C7B\u578B\u518D\u5BFC\u51FA\n */\nimport { createPackUpdateBindingsApi } from \"./bindings.js\";\nimport { createPackUpdateConfigApi } from \"./config.js\";\nimport { createTestPackUpdateDeps, identityPaint, type PackUpdateDeps } from \"./deps.js\";\nimport {\n createPackSourceProvider,\n providerShortLabel,\n resolveConfiguredPackProvider,\n} from \"./providers/index.js\";\nimport { createPackUpdateServiceApi } from \"./service.js\";\n\nexport type { PackUpdateDeps };\nexport { createTestPackUpdateDeps, identityPaint };\n\nexport type {\n CurseForgeProviderConfig,\n PackProviderId,\n PackReleaseType,\n PackSourceBinding,\n PackSourceProvider,\n PackSourcesFile,\n PackUpdateConfig,\n PackUpdateMatchConfig,\n PackUninstallConfig,\n SemVer3,\n SourceFileRef,\n SourceSearchHit,\n VersionCompareResult,\n VersionPolicyConfig,\n} from \"./types.js\";\nexport { DEFAULT_PACK_UNINSTALL } from \"./types.js\";\n\nexport {\n buildSearchQueries,\n buildSearchQueriesFromSources,\n bumpSemVer3,\n collectQuerySeeds,\n compareSemVer3,\n decideVersionPolicy,\n extractLatinPhrase,\n insertCjkLatinBoundaries,\n isNewer,\n maxSemVer3,\n nextEnabledVersion,\n normalizePackSearchName,\n packSourceScore,\n toCfSlugCandidate,\n} from \"./version-policy.js\";\nexport type { SearchQueryPlan, SearchQuerySource } from \"./version-policy.js\";\n\nexport {\n createPackSourceProvider,\n CurseForgeBedrockProvider,\n providerShortLabel,\n resolveConfiguredPackProvider,\n} from \"./providers/index.js\";\n\nexport type { PackUpdateBindingsApi } from \"./bindings.js\";\nexport type { PackUpdateConfigApi } from \"./config.js\";\nexport type { PackUpdateServiceApi } from \"./service.js\";\n\nexport function createPackUpdateApi(deps: PackUpdateDeps) {\n const paint = deps.paint ?? identityPaint();\n const resolved: PackUpdateDeps = { ...deps, paint };\n const config = createPackUpdateConfigApi(resolved);\n const bindings = createPackUpdateBindingsApi(resolved);\n const service = createPackUpdateServiceApi(resolved, config, bindings);\n return {\n ...config,\n ...bindings,\n ...service,\n createPackSourceProvider,\n providerShortLabel,\n resolveConfiguredPackProvider,\n };\n}\n\nexport type PackUpdateApi = ReturnType<typeof createPackUpdateApi>;\n"],
|
|
5
|
+
"mappings": "AAGA,SAAS,mCAAmC;AAC5C,SAAS,iCAAiC;AAC1C,SAAS,0BAA0B,qBAA0C;AAC7E;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kCAAkC;AAqB3C,SAAS,8BAA8B;AAEvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP;AAAA,EACE,4BAAAA;AAAA,EACA;AAAA,EACA,sBAAAC;AAAA,EACA,iCAAAC;AAAA,OACK;AAMA,SAAS,oBAAoB,MAAsB;AACxD,QAAM,QAAQ,KAAK,SAAS,cAAc;AAC1C,QAAM,WAA2B,EAAE,GAAG,MAAM,MAAM;AAClD,QAAM,SAAS,0BAA0B,QAAQ;AACjD,QAAM,WAAW,4BAA4B,QAAQ;AACrD,QAAM,UAAU,2BAA2B,UAAU,QAAQ,QAAQ;AACrE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
|
|
6
|
+
"names": ["createPackSourceProvider", "providerShortLabel", "resolveConfiguredPackProvider"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { CurseForgeProviderConfig, PackSourceProvider, SourceFileRef, SourceSearchHit } from "../types.js";
|
|
2
|
+
export declare class CurseForgeBedrockProvider implements PackSourceProvider {
|
|
3
|
+
private readonly cfg;
|
|
4
|
+
readonly id: "curseforge";
|
|
5
|
+
private classIdCache;
|
|
6
|
+
constructor(cfg: CurseForgeProviderConfig);
|
|
7
|
+
isConfigured(): boolean;
|
|
8
|
+
private gameId;
|
|
9
|
+
private searchBase;
|
|
10
|
+
private officialBase;
|
|
11
|
+
private headers;
|
|
12
|
+
private looksLikeLegacyUploadToken;
|
|
13
|
+
private buildUrl;
|
|
14
|
+
private fetchJson;
|
|
15
|
+
/** 官方 Core API GET */
|
|
16
|
+
private apiGet;
|
|
17
|
+
resolveClassId(): Promise<number | null>;
|
|
18
|
+
search(query: string): Promise<SourceSearchHit[]>;
|
|
19
|
+
resolveProject(ref: string | number): Promise<SourceSearchHit | null>;
|
|
20
|
+
getLatestFile(projectId: number): Promise<SourceFileRef | null>;
|
|
21
|
+
download(file: SourceFileRef, destPath: string, onProgress?: (dl: number, total: number) => void): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=curseforge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"curseforge.d.ts","sourceRoot":"","sources":["../../../src/pack-update/providers/curseforge.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,wBAAwB,EAExB,kBAAkB,EAClB,aAAa,EACb,eAAe,EAChB,MAAM,aAAa,CAAC;AAyDrB,qBAAa,yBAA0B,YAAW,kBAAkB;IAItD,OAAO,CAAC,QAAQ,CAAC,GAAG;IAHhC,QAAQ,CAAC,EAAE,EAAG,YAAY,CAAU;IACpC,OAAO,CAAC,YAAY,CAAuB;IAE3C,YAA6B,GAAG,EAAE,wBAAwB,EAAI;IAE9D,YAAY,IAAI,OAAO,CAEtB;IAED,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,0BAA0B;IAIlC,OAAO,CAAC,QAAQ;YAaF,SAAS;IA4BvB,sBAAsB;IACtB,OAAO,CAAC,MAAM;IAUR,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiB7C;IAEK,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA0BtD;IAEK,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAa1E;IAEK,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA6DpE;IAEK,QAAQ,CACZ,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAC/C,OAAO,CAAC,IAAI,CAAC,CAiBf;CACF"}
|