@sfmc-bds/bds-tools 0.2.0-beta.17 → 0.2.0-beta.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/bds-manager.d.ts.map +1 -1
  2. package/dist/bds-manager.js +8 -1
  3. package/dist/bds-manager.js.map +2 -2
  4. package/dist/changelog.d.ts +11 -7
  5. package/dist/changelog.d.ts.map +1 -1
  6. package/dist/changelog.js +60 -34
  7. package/dist/changelog.js.map +2 -2
  8. package/dist/check-update.d.ts.map +1 -1
  9. package/dist/check-update.js +50 -13
  10. package/dist/check-update.js.map +2 -2
  11. package/dist/qq-events-notify.d.ts +1 -1
  12. package/dist/qq-events-notify.d.ts.map +1 -1
  13. package/dist/qq-events-notify.js.map +1 -1
  14. package/dist/qqutil.d.ts.map +1 -1
  15. package/dist/qqutil.js +14 -12
  16. package/dist/qqutil.js.map +2 -2
  17. package/dist/server-properties-i18n.d.ts.map +1 -1
  18. package/dist/server-properties-i18n.js +4 -0
  19. package/dist/server-properties-i18n.js.map +2 -2
  20. package/dist/server-properties.d.ts +3 -0
  21. package/dist/server-properties.d.ts.map +1 -1
  22. package/dist/server-properties.js +15 -0
  23. package/dist/server-properties.js.map +2 -2
  24. package/dist/types.d.ts +1 -0
  25. package/dist/types.d.ts.map +1 -1
  26. package/package.json +4 -4
  27. package/dist/dependency-negotiator.test.js +0 -120
  28. package/dist/dependency-negotiator.test.js.map +0 -7
  29. package/dist/fsx.test.js +0 -60
  30. package/dist/fsx.test.js.map +0 -7
  31. package/dist/level-dat.test.js +0 -172
  32. package/dist/level-dat.test.js.map +0 -7
  33. package/dist/pack-manager-lifecycle.test.js +0 -252
  34. package/dist/pack-manager-lifecycle.test.js.map +0 -7
  35. package/dist/pack-update/config.test.js +0 -75
  36. package/dist/pack-update/config.test.js.map +0 -7
  37. package/dist/pack-update/version-policy.test.js +0 -137
  38. package/dist/pack-update/version-policy.test.js.map +0 -7
  39. package/dist/process-probe.test.js +0 -76
  40. package/dist/process-probe.test.js.map +0 -7
  41. package/dist/server-properties.test.js +0 -127
  42. package/dist/server-properties.test.js.map +0 -7
  43. package/dist/world-packs.test.js +0 -698
  44. package/dist/world-packs.test.js.map +0 -7
  45. package/dist/zipx.test.js +0 -36
  46. package/dist/zipx.test.js.map +0 -7
@@ -1,252 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import fs from "node:fs";
3
- import os from "node:os";
4
- import path from "node:path";
5
- import { describe, it, before, after } from "node:test";
6
- import { fileURLToPath } from "node:url";
7
- import { spawnSync } from "node:child_process";
8
- const CLI = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "dist", "cli-pack-manager.js");
9
- function run(args) {
10
- const r = spawnSync(process.execPath, [CLI, ...args], { encoding: "utf8" });
11
- return { status: r.status, out: r.stdout ?? "", err: r.stderr ?? "" };
12
- }
13
- describe("pack-manager CLI extensions", () => {
14
- let tmp;
15
- before(() => {
16
- tmp = fs.mkdtempSync(path.join(os.tmpdir(), "sfmc-pm-"));
17
- });
18
- after(() => {
19
- fs.rmSync(tmp, { recursive: true, force: true });
20
- });
21
- it("assemble-rp --modules-json \u53EA\u7528\u663E\u5F0F map(\u4E0D\u626B\u6574\u6811)", async () => {
22
- const { loadModuleResourcePackMap, assembleResourcePack } = await import("./pack-manager.js");
23
- const modA = path.join(tmp, "mod-a", "resource_pack");
24
- const modB = path.join(tmp, "mod-b", "resource_pack");
25
- fs.mkdirSync(modA, { recursive: true });
26
- fs.mkdirSync(modB, { recursive: true });
27
- fs.writeFileSync(path.join(modA, "a.txt"), "a");
28
- fs.writeFileSync(path.join(modB, "b.txt"), "b");
29
- const mapFile = path.join(tmp, "map.json");
30
- fs.writeFileSync(mapFile, JSON.stringify({ "mod-a": modA }));
31
- const map = loadModuleResourcePackMap(mapFile);
32
- assert.deepEqual(Object.keys(map), ["mod-a"]);
33
- const out = path.join(tmp, "rp-out");
34
- await assembleResourcePack({
35
- moduleResourceDirs: map,
36
- outDir: out,
37
- projectName: "test-rp",
38
- uuid: "11111111-1111-1111-1111-111111111111",
39
- version: [1, 0, 0]
40
- });
41
- assert.ok(fs.existsSync(path.join(out, "mod-a", "a.txt")));
42
- assert.ok(!fs.existsSync(path.join(out, "mod-b")));
43
- const cli = run([
44
- "assemble-rp",
45
- "--modules-json",
46
- mapFile,
47
- "--out",
48
- path.join(tmp, "rp-cli"),
49
- "--name",
50
- "test-rp-cli",
51
- "--uuid",
52
- "22222222-2222-2222-2222-222222222222"
53
- ]);
54
- assert.equal(cli.status, 0, cli.err || cli.out);
55
- });
56
- it("deploy --clear-rp \u5220\u9664\u4E16\u754C\u5185\u6B8B\u7559 RP \u76EE\u5F55", async () => {
57
- const { deployToBDS } = await import("./pack-manager.js");
58
- const bds = path.join(tmp, "bds");
59
- const level = "Bedrock level";
60
- const worlds = path.join(bds, "worlds", level);
61
- const bpSrc = path.join(tmp, "bp-src");
62
- const rpDst = path.join(worlds, "resource_packs", "sfmc-modules-rp");
63
- fs.mkdirSync(bpSrc, { recursive: true });
64
- fs.writeFileSync(path.join(bpSrc, "dummy.txt"), "bp");
65
- fs.mkdirSync(rpDst, { recursive: true });
66
- fs.writeFileSync(path.join(rpDst, "stale.txt"), "old");
67
- await deployToBDS({
68
- bdsRoot: bds,
69
- levelName: level,
70
- behaviorPackSrc: bpSrc,
71
- bpName: "sfmc-modules",
72
- rpName: "sfmc-modules-rp",
73
- clearResourcePack: true
74
- });
75
- assert.ok(!fs.existsSync(rpDst));
76
- assert.ok(fs.existsSync(path.join(worlds, "behavior_packs", "sfmc-modules", "dummy.txt")));
77
- });
78
- it("read-manifest / has-pack / list-packs CLI \u5951\u7EA6", async () => {
79
- const { assembleBehaviorPack, enablePackInWorld, worldPackListHas, readWorldPackList } = await import("./pack-manager.js");
80
- const bpOut = path.join(tmp, "bp-assembled");
81
- const src = path.join(tmp, "bp-empty-src");
82
- fs.mkdirSync(path.join(src, "scripts"), { recursive: true });
83
- fs.writeFileSync(path.join(src, "scripts", "main.js"), "//\n");
84
- const uuid = "33333333-3333-3333-3333-333333333333";
85
- await assembleBehaviorPack({
86
- srcDir: src,
87
- outDir: bpOut,
88
- projectName: "sfmc-modules",
89
- uuid,
90
- version: [1, 2, 3]
91
- });
92
- const rm = run(["read-manifest", "--pack-dir", bpOut]);
93
- assert.equal(rm.status, 0, rm.err);
94
- const header = JSON.parse(rm.out.trim());
95
- assert.equal(header.uuid, uuid);
96
- assert.deepEqual(header.version, [1, 2, 3]);
97
- const worldsDir = path.join(tmp, "worlds-root");
98
- await enablePackInWorld({
99
- worldsDir,
100
- levelName: "L1",
101
- kind: "behavior",
102
- packUuid: uuid,
103
- version: [1, 2, 3]
104
- });
105
- assert.equal(worldPackListHas(worldsDir, "L1", "behavior", uuid), true);
106
- assert.equal(worldPackListHas(worldsDir, "L1", "behavior", "00000000-0000-0000-0000-000000000000"), false);
107
- const hp = run([
108
- "has-pack",
109
- "--worlds-dir",
110
- worldsDir,
111
- "--level",
112
- "L1",
113
- "--kind",
114
- "behavior",
115
- "--pack-id",
116
- uuid
117
- ]);
118
- assert.equal(hp.status, 0);
119
- assert.equal(hp.out.trim(), "1");
120
- const lp = run(["list-packs", "--worlds-dir", worldsDir, "--level", "L1", "--kind", "behavior"]);
121
- assert.equal(lp.status, 0, lp.err);
122
- const listed = JSON.parse(lp.out.trim());
123
- assert.equal(listed.length, 1);
124
- assert.equal(listed[0].pack_id, uuid);
125
- assert.deepEqual(readWorldPackList(worldsDir, "L1", "behavior"), listed);
126
- });
127
- it("readLevelNameSync \u4E0E async \u540C\u5951\u7EA6\uFF08\u4F9B sfmc resolveBdsContext\uFF09", async () => {
128
- const { readLevelName, readLevelNameSync } = await import("./pack-manager.js");
129
- const bds = path.join(tmp, "bds-level");
130
- fs.mkdirSync(bds, { recursive: true });
131
- assert.equal(readLevelNameSync(bds), "Bedrock level");
132
- assert.equal(await readLevelName(bds), "Bedrock level");
133
- fs.writeFileSync(path.join(bds, "server.properties"), "level-name=My World\n", "utf8");
134
- assert.equal(readLevelNameSync(bds), "My World");
135
- assert.equal(await readLevelName(bds), "My World");
136
- });
137
- it("BDS \u8DEF\u5F84 helpers \u5355\u4E00\u6743\u5A01\uFF08Demeter/DRY\uFF09", async () => {
138
- const {
139
- bdsWorldsDir,
140
- bdsWorldLevelDir,
141
- worldPackListFile,
142
- configPermissionPath,
143
- hasConfigPermission,
144
- serverPropertiesPath,
145
- ensureConfigPermission
146
- } = await import("./pack-manager.js");
147
- const bds = path.join(tmp, "bds-paths");
148
- fs.mkdirSync(bds, { recursive: true });
149
- assert.equal(bdsWorldsDir(bds), path.join(bds, "worlds"));
150
- assert.equal(bdsWorldLevelDir(bds, "L1"), path.join(bds, "worlds", "L1"));
151
- assert.equal(
152
- worldPackListFile(bdsWorldsDir(bds), "L1", "behavior"),
153
- path.join(bds, "worlds", "L1", "world_behavior_packs.json")
154
- );
155
- assert.equal(
156
- worldPackListFile(bdsWorldsDir(bds), "L1", "resource"),
157
- path.join(bds, "worlds", "L1", "world_resource_packs.json")
158
- );
159
- assert.equal(serverPropertiesPath(bds), path.join(bds, "server.properties"));
160
- const uuid = "00000000-0000-4000-8000-000000000099";
161
- assert.equal(configPermissionPath(bds, uuid), path.join(bds, "config", uuid, "permission.json"));
162
- assert.equal(hasConfigPermission(bds, uuid), false);
163
- assert.equal(await ensureConfigPermission(bds, uuid), true);
164
- assert.equal(hasConfigPermission(bds, uuid), true);
165
- assert.equal(await ensureConfigPermission(bds, uuid), false);
166
- });
167
- it("readWorldPackListResult \u533A\u5206\u7F3A\u5931\u4E0E JSON \u635F\u574F\uFF08doctor parseFail\uFF09", async () => {
168
- const { readWorldPackListResult } = await import("./pack-manager.js");
169
- const worldsDir = path.join(tmp, "worlds-parse");
170
- const levelDir = path.join(worldsDir, "Lbad");
171
- fs.mkdirSync(levelDir, { recursive: true });
172
- const missing = readWorldPackListResult(worldsDir, "Lbad", "behavior");
173
- assert.deepEqual(missing.entries, []);
174
- assert.equal(missing.parseFailedFile, void 0);
175
- const badFile = path.join(levelDir, "world_behavior_packs.json");
176
- fs.writeFileSync(badFile, "{not-json", "utf8");
177
- const bad = readWorldPackListResult(worldsDir, "Lbad", "behavior");
178
- assert.deepEqual(bad.entries, []);
179
- assert.equal(bad.parseFailedFile, badFile);
180
- fs.writeFileSync(badFile, '{"not":"array"}', "utf8");
181
- const notArr = readWorldPackListResult(worldsDir, "Lbad", "behavior");
182
- assert.deepEqual(notArr.entries, []);
183
- assert.equal(notArr.parseFailedFile, badFile);
184
- });
185
- it("\u65E0 deploy-catalog \u65F6\u4ECD\u53EF\u51ED\u78C1\u76D8 RP manifest \u5378\u4E16\u754C\u6E05\u5355(BLOCKER \u56DE\u5F52)", async () => {
186
- const {
187
- assembleResourcePack,
188
- deployToBDS,
189
- enablePackInWorld,
190
- disablePackInWorld,
191
- readPackManifestHeader,
192
- worldPackListHas
193
- } = await import("./pack-manager.js");
194
- const bds = path.join(tmp, "bds-stale");
195
- const level = "Bedrock level";
196
- const worlds = path.join(bds, "worlds", level);
197
- const worldsDir = path.join(bds, "worlds");
198
- const bpSrc = path.join(tmp, "bp-stale-src");
199
- const rpMod = path.join(tmp, "mod-stale", "resource_pack");
200
- fs.mkdirSync(path.join(bpSrc, "scripts"), { recursive: true });
201
- fs.writeFileSync(path.join(bpSrc, "scripts", "main.js"), "//\n");
202
- fs.mkdirSync(rpMod, { recursive: true });
203
- fs.writeFileSync(path.join(rpMod, "x.txt"), "x");
204
- const staleUuid = "44444444-4444-4444-4444-444444444444";
205
- const rpAssembled = path.join(tmp, "rp-stale-assembled");
206
- await assembleResourcePack({
207
- moduleResourceDirs: { stale: rpMod },
208
- outDir: rpAssembled,
209
- projectName: "sfmc-modules-rp",
210
- uuid: staleUuid,
211
- version: [1, 0, 0]
212
- });
213
- await deployToBDS({
214
- bdsRoot: bds,
215
- levelName: level,
216
- behaviorPackSrc: bpSrc,
217
- resourcePackSrc: rpAssembled,
218
- bpName: "sfmc-modules",
219
- rpName: "sfmc-modules-rp"
220
- });
221
- await enablePackInWorld({
222
- worldsDir,
223
- levelName: level,
224
- kind: "resource",
225
- packUuid: staleUuid,
226
- version: [1, 0, 0]
227
- });
228
- assert.equal(worldPackListHas(worldsDir, level, "resource", staleUuid), true);
229
- const rpDst = path.join(worlds, "resource_packs", "sfmc-modules-rp");
230
- const header = readPackManifestHeader(rpDst);
231
- assert.equal(header?.uuid, staleUuid);
232
- assert.ok(header);
233
- await deployToBDS({
234
- bdsRoot: bds,
235
- levelName: level,
236
- behaviorPackSrc: bpSrc,
237
- bpName: "sfmc-modules",
238
- rpName: "sfmc-modules-rp",
239
- clearResourcePack: true
240
- });
241
- assert.ok(!fs.existsSync(rpDst));
242
- await disablePackInWorld({
243
- worldsDir,
244
- levelName: level,
245
- kind: "resource",
246
- packUuid: header.uuid,
247
- version: [1, 0, 0]
248
- });
249
- assert.equal(worldPackListHas(worldsDir, level, "resource", staleUuid), false);
250
- });
251
- });
252
- //# sourceMappingURL=pack-manager-lifecycle.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/pack-manager-lifecycle.test.ts"],
4
- "sourcesContent": ["/**\n * pack-manager SOLID \u56DE\u5F52:modules-json / clear-rp / has-pack / read-manifest\n */\nimport assert from \"node:assert/strict\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { describe, it, before, after } from \"node:test\";\nimport { fileURLToPath } from \"node:url\";\nimport { spawnSync } from \"node:child_process\";\n\nconst CLI = path.join(path.dirname(fileURLToPath(import.meta.url)), \"..\", \"dist\", \"cli-pack-manager.js\");\n\nfunction run(args) {\n const r = spawnSync(process.execPath, [CLI, ...args], { encoding: \"utf8\" });\n return { status: r.status, out: r.stdout ?? \"\", err: r.stderr ?? \"\" };\n}\n\ndescribe(\"pack-manager CLI extensions\", () => {\n /** @type {string} */\n let tmp;\n before(() => {\n tmp = fs.mkdtempSync(path.join(os.tmpdir(), \"sfmc-pm-\"));\n });\n after(() => {\n fs.rmSync(tmp, { recursive: true, force: true });\n });\n\n it(\"assemble-rp --modules-json \u53EA\u7528\u663E\u5F0F map(\u4E0D\u626B\u6574\u6811)\", async () => {\n const { loadModuleResourcePackMap, assembleResourcePack } = await import(\"./pack-manager.js\");\n const modA = path.join(tmp, \"mod-a\", \"resource_pack\");\n const modB = path.join(tmp, \"mod-b\", \"resource_pack\");\n fs.mkdirSync(modA, { recursive: true });\n fs.mkdirSync(modB, { recursive: true });\n fs.writeFileSync(path.join(modA, \"a.txt\"), \"a\");\n fs.writeFileSync(path.join(modB, \"b.txt\"), \"b\");\n const mapFile = path.join(tmp, \"map.json\");\n /* \u4EC5\u542F\u7528 mod-a */\n fs.writeFileSync(mapFile, JSON.stringify({ \"mod-a\": modA }));\n const map = loadModuleResourcePackMap(mapFile);\n assert.deepEqual(Object.keys(map), [\"mod-a\"]);\n\n const out = path.join(tmp, \"rp-out\");\n await assembleResourcePack({\n moduleResourceDirs: map,\n outDir: out,\n projectName: \"test-rp\",\n uuid: \"11111111-1111-1111-1111-111111111111\",\n version: [1, 0, 0],\n });\n assert.ok(fs.existsSync(path.join(out, \"mod-a\", \"a.txt\")));\n assert.ok(!fs.existsSync(path.join(out, \"mod-b\")));\n\n const cli = run([\n \"assemble-rp\",\n \"--modules-json\",\n mapFile,\n \"--out\",\n path.join(tmp, \"rp-cli\"),\n \"--name\",\n \"test-rp-cli\",\n \"--uuid\",\n \"22222222-2222-2222-2222-222222222222\",\n ]);\n assert.equal(cli.status, 0, cli.err || cli.out);\n });\n\n it(\"deploy --clear-rp \u5220\u9664\u4E16\u754C\u5185\u6B8B\u7559 RP \u76EE\u5F55\", async () => {\n const { deployToBDS } = await import(\"./pack-manager.js\");\n const bds = path.join(tmp, \"bds\");\n const level = \"Bedrock level\";\n const worlds = path.join(bds, \"worlds\", level);\n const bpSrc = path.join(tmp, \"bp-src\");\n const rpDst = path.join(worlds, \"resource_packs\", \"sfmc-modules-rp\");\n fs.mkdirSync(bpSrc, { recursive: true });\n fs.writeFileSync(path.join(bpSrc, \"dummy.txt\"), \"bp\");\n fs.mkdirSync(rpDst, { recursive: true });\n fs.writeFileSync(path.join(rpDst, \"stale.txt\"), \"old\");\n\n await deployToBDS({\n bdsRoot: bds,\n levelName: level,\n behaviorPackSrc: bpSrc,\n bpName: \"sfmc-modules\",\n rpName: \"sfmc-modules-rp\",\n clearResourcePack: true,\n });\n assert.ok(!fs.existsSync(rpDst));\n assert.ok(fs.existsSync(path.join(worlds, \"behavior_packs\", \"sfmc-modules\", \"dummy.txt\")));\n });\n\n it(\"read-manifest / has-pack / list-packs CLI \u5951\u7EA6\", async () => {\n const { assembleBehaviorPack, enablePackInWorld, worldPackListHas, readWorldPackList } =\n await import(\"./pack-manager.js\");\n const bpOut = path.join(tmp, \"bp-assembled\");\n const src = path.join(tmp, \"bp-empty-src\");\n fs.mkdirSync(path.join(src, \"scripts\"), { recursive: true });\n fs.writeFileSync(path.join(src, \"scripts\", \"main.js\"), \"//\\n\");\n const uuid = \"33333333-3333-3333-3333-333333333333\";\n await assembleBehaviorPack({\n srcDir: src,\n outDir: bpOut,\n projectName: \"sfmc-modules\",\n uuid,\n version: [1, 2, 3],\n });\n\n const rm = run([\"read-manifest\", \"--pack-dir\", bpOut]);\n assert.equal(rm.status, 0, rm.err);\n const header = JSON.parse(rm.out.trim());\n assert.equal(header.uuid, uuid);\n assert.deepEqual(header.version, [1, 2, 3]);\n\n const worldsDir = path.join(tmp, \"worlds-root\");\n await enablePackInWorld({\n worldsDir,\n levelName: \"L1\",\n kind: \"behavior\",\n packUuid: uuid,\n version: [1, 2, 3],\n });\n assert.equal(worldPackListHas(worldsDir, \"L1\", \"behavior\", uuid), true);\n assert.equal(worldPackListHas(worldsDir, \"L1\", \"behavior\", \"00000000-0000-0000-0000-000000000000\"), false);\n\n const hp = run([\n \"has-pack\",\n \"--worlds-dir\",\n worldsDir,\n \"--level\",\n \"L1\",\n \"--kind\",\n \"behavior\",\n \"--pack-id\",\n uuid,\n ]);\n assert.equal(hp.status, 0);\n assert.equal(hp.out.trim(), \"1\");\n\n const lp = run([\"list-packs\", \"--worlds-dir\", worldsDir, \"--level\", \"L1\", \"--kind\", \"behavior\"]);\n assert.equal(lp.status, 0, lp.err);\n const listed = JSON.parse(lp.out.trim());\n assert.equal(listed.length, 1);\n assert.equal(listed[0].pack_id, uuid);\n assert.deepEqual(readWorldPackList(worldsDir, \"L1\", \"behavior\"), listed);\n });\n\n it(\"readLevelNameSync \u4E0E async \u540C\u5951\u7EA6\uFF08\u4F9B sfmc resolveBdsContext\uFF09\", async () => {\n const { readLevelName, readLevelNameSync } = await import(\"./pack-manager.js\");\n const bds = path.join(tmp, \"bds-level\");\n fs.mkdirSync(bds, { recursive: true });\n assert.equal(readLevelNameSync(bds), \"Bedrock level\");\n assert.equal(await readLevelName(bds), \"Bedrock level\");\n fs.writeFileSync(path.join(bds, \"server.properties\"), \"level-name=My World\\n\", \"utf8\");\n assert.equal(readLevelNameSync(bds), \"My World\");\n assert.equal(await readLevelName(bds), \"My World\");\n });\n\n it(\"BDS \u8DEF\u5F84 helpers \u5355\u4E00\u6743\u5A01\uFF08Demeter/DRY\uFF09\", async () => {\n const {\n bdsWorldsDir,\n bdsWorldLevelDir,\n worldPackListFile,\n configPermissionPath,\n hasConfigPermission,\n serverPropertiesPath,\n ensureConfigPermission,\n } = await import(\"./pack-manager.js\");\n const bds = path.join(tmp, \"bds-paths\");\n fs.mkdirSync(bds, { recursive: true });\n assert.equal(bdsWorldsDir(bds), path.join(bds, \"worlds\"));\n assert.equal(bdsWorldLevelDir(bds, \"L1\"), path.join(bds, \"worlds\", \"L1\"));\n assert.equal(\n worldPackListFile(bdsWorldsDir(bds), \"L1\", \"behavior\"),\n path.join(bds, \"worlds\", \"L1\", \"world_behavior_packs.json\")\n );\n assert.equal(\n worldPackListFile(bdsWorldsDir(bds), \"L1\", \"resource\"),\n path.join(bds, \"worlds\", \"L1\", \"world_resource_packs.json\")\n );\n assert.equal(serverPropertiesPath(bds), path.join(bds, \"server.properties\"));\n const uuid = \"00000000-0000-4000-8000-000000000099\";\n assert.equal(configPermissionPath(bds, uuid), path.join(bds, \"config\", uuid, \"permission.json\"));\n assert.equal(hasConfigPermission(bds, uuid), false);\n assert.equal(await ensureConfigPermission(bds, uuid), true);\n assert.equal(hasConfigPermission(bds, uuid), true);\n assert.equal(await ensureConfigPermission(bds, uuid), false);\n });\n\n it(\"readWorldPackListResult \u533A\u5206\u7F3A\u5931\u4E0E JSON \u635F\u574F\uFF08doctor parseFail\uFF09\", async () => {\n const { readWorldPackListResult } = await import(\"./pack-manager.js\");\n const worldsDir = path.join(tmp, \"worlds-parse\");\n const levelDir = path.join(worldsDir, \"Lbad\");\n fs.mkdirSync(levelDir, { recursive: true });\n\n const missing = readWorldPackListResult(worldsDir, \"Lbad\", \"behavior\");\n assert.deepEqual(missing.entries, []);\n assert.equal(missing.parseFailedFile, undefined);\n\n const badFile = path.join(levelDir, \"world_behavior_packs.json\");\n fs.writeFileSync(badFile, \"{not-json\", \"utf8\");\n const bad = readWorldPackListResult(worldsDir, \"Lbad\", \"behavior\");\n assert.deepEqual(bad.entries, []);\n assert.equal(bad.parseFailedFile, badFile);\n\n fs.writeFileSync(badFile, '{\"not\":\"array\"}', \"utf8\");\n const notArr = readWorldPackListResult(worldsDir, \"Lbad\", \"behavior\");\n assert.deepEqual(notArr.entries, []);\n assert.equal(notArr.parseFailedFile, badFile);\n });\n\n it(\"\u65E0 deploy-catalog \u65F6\u4ECD\u53EF\u51ED\u78C1\u76D8 RP manifest \u5378\u4E16\u754C\u6E05\u5355(BLOCKER \u56DE\u5F52)\", async () => {\n const {\n assembleResourcePack,\n deployToBDS,\n enablePackInWorld,\n disablePackInWorld,\n readPackManifestHeader,\n worldPackListHas,\n } = await import(\"./pack-manager.js\");\n\n const bds = path.join(tmp, \"bds-stale\");\n const level = \"Bedrock level\";\n const worlds = path.join(bds, \"worlds\", level);\n const worldsDir = path.join(bds, \"worlds\");\n const bpSrc = path.join(tmp, \"bp-stale-src\");\n const rpMod = path.join(tmp, \"mod-stale\", \"resource_pack\");\n fs.mkdirSync(path.join(bpSrc, \"scripts\"), { recursive: true });\n fs.writeFileSync(path.join(bpSrc, \"scripts\", \"main.js\"), \"//\\n\");\n fs.mkdirSync(rpMod, { recursive: true });\n fs.writeFileSync(path.join(rpMod, \"x.txt\"), \"x\");\n\n const staleUuid = \"44444444-4444-4444-4444-444444444444\";\n const rpAssembled = path.join(tmp, \"rp-stale-assembled\");\n await assembleResourcePack({\n moduleResourceDirs: { stale: rpMod },\n outDir: rpAssembled,\n projectName: \"sfmc-modules-rp\",\n uuid: staleUuid,\n version: [1, 0, 0],\n });\n\n await deployToBDS({\n bdsRoot: bds,\n levelName: level,\n behaviorPackSrc: bpSrc,\n resourcePackSrc: rpAssembled,\n bpName: \"sfmc-modules\",\n rpName: \"sfmc-modules-rp\",\n });\n await enablePackInWorld({\n worldsDir,\n levelName: level,\n kind: \"resource\",\n packUuid: staleUuid,\n version: [1, 0, 0],\n });\n assert.equal(worldPackListHas(worldsDir, level, \"resource\", staleUuid), true);\n\n /* \u6A21\u62DF catalog \u7F3A\u5931:\u53EA\u7559\u78C1\u76D8 RP,lifecycle \u5E94\u5728 clear \u524D\u8BFB manifest */\n const rpDst = path.join(worlds, \"resource_packs\", \"sfmc-modules-rp\");\n const header = readPackManifestHeader(rpDst);\n assert.equal(header?.uuid, staleUuid);\n assert.ok(header);\n\n await deployToBDS({\n bdsRoot: bds,\n levelName: level,\n behaviorPackSrc: bpSrc,\n bpName: \"sfmc-modules\",\n rpName: \"sfmc-modules-rp\",\n clearResourcePack: true,\n });\n assert.ok(!fs.existsSync(rpDst));\n\n await disablePackInWorld({\n worldsDir,\n levelName: level,\n kind: \"resource\",\n packUuid: header.uuid,\n version: [1, 0, 0],\n });\n assert.equal(worldPackListHas(worldsDir, level, \"resource\", staleUuid), false);\n });\n});\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,75 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import fs from "node:fs";
3
- import os from "node:os";
4
- import path from "node:path";
5
- import { 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
@@ -1,7 +0,0 @@
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
- }
@@ -1,137 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import { describe, it } from "node:test";
3
- import {
4
- buildSearchQueries,
5
- buildSearchQueriesFromSources,
6
- collectQuerySeeds,
7
- decideVersionPolicy,
8
- extractLatinPhrase,
9
- insertCjkLatinBoundaries,
10
- nextEnabledVersion,
11
- normalizePackSearchName,
12
- packSourceScore,
13
- toCfSlugCandidate
14
- } from "./index.js";
15
- describe("version-policy", () => {
16
- it("\u540C major \u66F4\u65B0\u5E94 bump RP", () => {
17
- const d = decideVersionPolicy([1, 21, 100], [1, 21, 110], {
18
- authority: "behavior_pack",
19
- onUpdateOverwriteBoth: true,
20
- rpBumpWhenSameMajor: true,
21
- rpBumpComponent: "patch",
22
- majorHigherSkipRpBump: true
23
- });
24
- assert.equal(d.remoteNewer, true);
25
- assert.equal(d.shouldBumpRp, true);
26
- });
27
- it("major \u66F4\u9AD8\u5219\u4E0D\u989D\u5916 bump RP", () => {
28
- const d = decideVersionPolicy([1, 21, 100], [2, 0, 0], {
29
- authority: "behavior_pack",
30
- onUpdateOverwriteBoth: true,
31
- rpBumpWhenSameMajor: true,
32
- rpBumpComponent: "patch",
33
- majorHigherSkipRpBump: true
34
- });
35
- assert.equal(d.majorHigher, true);
36
- assert.equal(d.shouldBumpRp, false);
37
- });
38
- it("\u540C\u7248\u672C\u672A\u66F4\u9AD8\u65F6\u9ED8\u8BA4\u4E0D bump\uFF1BtreatAsUpdate \u5F3A\u5236\u540C\u6B65\u4ECD\u53EF bump RP", () => {
39
- const policy = {
40
- authority: "behavior_pack",
41
- onUpdateOverwriteBoth: true,
42
- rpBumpWhenSameMajor: true,
43
- rpBumpComponent: "patch",
44
- majorHigherSkipRpBump: true
45
- };
46
- const plain = decideVersionPolicy([1, 0, 0], [1, 0, 0], policy);
47
- assert.equal(plain.remoteNewer, false);
48
- assert.equal(plain.shouldBumpRp, false);
49
- const forced = decideVersionPolicy([1, 0, 0], [1, 0, 0], policy, { treatAsUpdate: true });
50
- assert.equal(forced.remoteNewer, false);
51
- assert.equal(forced.shouldBumpRp, true);
52
- });
53
- it("\u8FDC\u7A0B\u66F4\u65E7\u4F46 treatAsUpdate \u65F6\u4ECD\u6309\u540C major \u89C4\u5219 bump RP", () => {
54
- const d = decideVersionPolicy(
55
- [1, 2, 0],
56
- [1, 1, 0],
57
- {
58
- authority: "behavior_pack",
59
- onUpdateOverwriteBoth: true,
60
- rpBumpWhenSameMajor: true,
61
- rpBumpComponent: "patch",
62
- majorHigherSkipRpBump: true
63
- },
64
- { treatAsUpdate: true }
65
- );
66
- assert.equal(d.remoteNewer, false);
67
- assert.equal(d.majorHigher, false);
68
- assert.equal(d.shouldBumpRp, true);
69
- });
70
- it("nextEnabledVersion = bump(max(remote, previous))", () => {
71
- assert.deepEqual(nextEnabledVersion([1, 0, 5], [1, 0, 8], "patch"), [1, 0, 9]);
72
- assert.deepEqual(nextEnabledVersion([1, 0, 0], [1, 21, 100], "patch"), [1, 21, 101]);
73
- assert.deepEqual(nextEnabledVersion([2, 0, 0], [1, 99, 99], "patch"), [2, 0, 1]);
74
- assert.deepEqual(nextEnabledVersion([1, 2, 0], [1, 1, 9], "minor"), [1, 3, 0]);
75
- });
76
- it("normalize \u53BB\u6389\u65B9\u62EC\u53F7\u3001\u7248\u672C\u4E0E BP", () => {
77
- const n = normalizePackSearchName("[BA] [\u73A9\u6CD5] Slash Blade v4 BP");
78
- assert.equal(n, "Slash Blade");
79
- });
80
- it("CJK \u7C98\u8FDE\u5206\u754C\u5E76\u63D0\u53D6\u62C9\u4E01\u6838\u5FC3", () => {
81
- const folder = "[BP] [BA] [\u73A9\u6CD5] \u62D4\u5200\u5251Slash Blade v4 BP";
82
- assert.equal(normalizePackSearchName(folder), "\u62D4\u5200\u5251 Slash Blade");
83
- assert.equal(
84
- extractLatinPhrase(insertCjkLatinBoundaries(folder.replace(/\[[^\]]*\]/g, " "))),
85
- "Slash Blade v4 BP"
86
- );
87
- const seeds = collectQuerySeeds(folder);
88
- assert.ok(seeds.includes("Slash Blade v4 BP"));
89
- assert.ok(seeds.includes("Slash Blade v4"));
90
- assert.ok(seeds.includes("Slash Blade"));
91
- assert.ok(seeds.some((s) => s.includes("\u62D4\u5200\u5251")));
92
- });
93
- it("\u810F\u6587\u4EF6\u5939\u540D\u6D3E\u751F\u542B slug / Title-Slug / addon", () => {
94
- const qs = buildSearchQueries("[BP] [BA] [\u73A9\u6CD5] \u62D4\u5200\u5251Slash Blade v4 BP");
95
- assert.ok(qs.includes("slash-blade"), `queries=${JSON.stringify(qs)}`);
96
- assert.ok(qs.includes("slash-blade-addon"), `queries=${JSON.stringify(qs)}`);
97
- assert.ok(qs.includes("Slash Blade"), `queries=${JSON.stringify(qs)}`);
98
- assert.ok(
99
- qs.some((q) => q.toLowerCase() === "slash-blade"),
100
- `queries=${JSON.stringify(qs)}`
101
- );
102
- const iSlug = qs.findIndex((q) => q === "slash-blade-addon");
103
- const iCjk = qs.findIndex((q) => q.includes("\u62D4\u5200\u5251"));
104
- assert.ok(iSlug >= 0 && (iCjk < 0 || iSlug < iCjk));
105
- });
106
- it("header+\u6587\u4EF6\u5939\u53CC\u6E90\uFF1A\u6709\u62C9\u4E01\u65F6\u4E0D\u641C\u7EAF\u4E2D\u6587\uFF0C\u4E14\u6587\u4EF6\u5939\u8D21\u732E slug", () => {
107
- const qs = buildSearchQueries(["\u62D4\u5200\u5251", "[BP] [BA] [\u73A9\u6CD5] \u62D4\u5200\u5251Slash Blade v4 BP"]);
108
- assert.ok(qs.includes("slash-blade-addon"));
109
- assert.ok(qs.includes("Slash Blade"));
110
- assert.ok(qs.every((q) => /[A-Za-z]/.test(q)), `\u4E0D\u5E94\u518D\u641C\u7EAF\u4E2D\u6587: ${JSON.stringify(qs)}`);
111
- });
112
- it("\u53CC\u6E90\u8F6E\u8BE2\uFF1Aheader \u4E0E folder \u90FD\u4F1A\u8D21\u732E", () => {
113
- const plan = buildSearchQueriesFromSources([
114
- { id: "header", raw: "Cool Swords Pack" },
115
- { id: "folder", raw: "[BP] [BA] [\u73A9\u6CD5] \u62D4\u5200\u5251Slash Blade v4 BP" }
116
- ]);
117
- assert.ok(plan.perSource.header?.some((q) => /cool|swords/i.test(q)));
118
- assert.ok(plan.perSource.folder?.some((q) => /slash-blade/i.test(q)));
119
- assert.ok(plan.queries.some((q) => /slash-blade/i.test(q)));
120
- assert.ok(plan.queries.some((q) => /cool|swords/i.test(q)));
121
- });
122
- it("slug \u5019\u9009\u65E0\u7A7A\u683C", () => {
123
- assert.equal(toCfSlugCandidate("Slash Blade v4"), "slash-blade");
124
- const qs = buildSearchQueries("Slash Blade v4");
125
- assert.ok(qs.includes("Slash Blade"));
126
- assert.ok(qs.includes("slash-blade"));
127
- assert.ok(qs.includes("slash-blade-addon"));
128
- });
129
- it("slug \u547D\u4E2D slash-blade-addon \u9AD8\u5206", () => {
130
- const score = packSourceScore("Slash Blade v4", {
131
- name: "Slash Blade Addon",
132
- slug: "slash-blade-addon"
133
- });
134
- assert.ok(score >= 0.95, `score=${score}`);
135
- });
136
- });
137
- //# sourceMappingURL=version-policy.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/pack-update/version-policy.test.ts"],
4
- "sourcesContent": ["/**\n * version-policy / slug \u5339\u914D\u6D4B\u8BD5\uFF08\u6D4B\u751F\u4EA7\u5951\u7EA6\uFF0C\u7981\u6B62\u5185\u8054\u590D\u5236\uFF09\n */\nimport assert from \"node:assert/strict\";\nimport { describe, it } from \"node:test\";\nimport {\n buildSearchQueries,\n buildSearchQueriesFromSources,\n collectQuerySeeds,\n decideVersionPolicy,\n extractLatinPhrase,\n insertCjkLatinBoundaries,\n nextEnabledVersion,\n normalizePackSearchName,\n packSourceScore,\n toCfSlugCandidate,\n} from \"./index.js\";\n\ndescribe(\"version-policy\", () => {\n it(\"\u540C major \u66F4\u65B0\u5E94 bump RP\", () => {\n const d = decideVersionPolicy([1, 21, 100], [1, 21, 110], {\n authority: \"behavior_pack\",\n onUpdateOverwriteBoth: true,\n rpBumpWhenSameMajor: true,\n rpBumpComponent: \"patch\",\n majorHigherSkipRpBump: true,\n });\n assert.equal(d.remoteNewer, true);\n assert.equal(d.shouldBumpRp, true);\n });\n\n it(\"major \u66F4\u9AD8\u5219\u4E0D\u989D\u5916 bump RP\", () => {\n const d = decideVersionPolicy([1, 21, 100], [2, 0, 0], {\n authority: \"behavior_pack\",\n onUpdateOverwriteBoth: true,\n rpBumpWhenSameMajor: true,\n rpBumpComponent: \"patch\",\n majorHigherSkipRpBump: true,\n });\n assert.equal(d.majorHigher, true);\n assert.equal(d.shouldBumpRp, false);\n });\n\n it(\"\u540C\u7248\u672C\u672A\u66F4\u9AD8\u65F6\u9ED8\u8BA4\u4E0D bump\uFF1BtreatAsUpdate \u5F3A\u5236\u540C\u6B65\u4ECD\u53EF bump RP\", () => {\n const policy = {\n authority: \"behavior_pack\" as const,\n onUpdateOverwriteBoth: true,\n rpBumpWhenSameMajor: true,\n rpBumpComponent: \"patch\" as const,\n majorHigherSkipRpBump: true,\n };\n const plain = decideVersionPolicy([1, 0, 0], [1, 0, 0], policy);\n assert.equal(plain.remoteNewer, false);\n assert.equal(plain.shouldBumpRp, false);\n\n const forced = decideVersionPolicy([1, 0, 0], [1, 0, 0], policy, { treatAsUpdate: true });\n assert.equal(forced.remoteNewer, false);\n assert.equal(forced.shouldBumpRp, true);\n });\n\n it(\"\u8FDC\u7A0B\u66F4\u65E7\u4F46 treatAsUpdate \u65F6\u4ECD\u6309\u540C major \u89C4\u5219 bump RP\", () => {\n const d = decideVersionPolicy(\n [1, 2, 0],\n [1, 1, 0],\n {\n authority: \"behavior_pack\",\n onUpdateOverwriteBoth: true,\n rpBumpWhenSameMajor: true,\n rpBumpComponent: \"patch\",\n majorHigherSkipRpBump: true,\n },\n { treatAsUpdate: true }\n );\n assert.equal(d.remoteNewer, false);\n assert.equal(d.majorHigher, false);\n assert.equal(d.shouldBumpRp, true);\n });\n\n it(\"nextEnabledVersion = bump(max(remote, previous))\", () => {\n assert.deepEqual(nextEnabledVersion([1, 0, 5], [1, 0, 8], \"patch\"), [1, 0, 9]);\n assert.deepEqual(nextEnabledVersion([1, 0, 0], [1, 21, 100], \"patch\"), [1, 21, 101]);\n assert.deepEqual(nextEnabledVersion([2, 0, 0], [1, 99, 99], \"patch\"), [2, 0, 1]);\n assert.deepEqual(nextEnabledVersion([1, 2, 0], [1, 1, 9], \"minor\"), [1, 3, 0]);\n });\n\n it(\"normalize \u53BB\u6389\u65B9\u62EC\u53F7\u3001\u7248\u672C\u4E0E BP\", () => {\n const n = normalizePackSearchName(\"[BA] [\u73A9\u6CD5] Slash Blade v4 BP\");\n assert.equal(n, \"Slash Blade\");\n });\n\n it(\"CJK \u7C98\u8FDE\u5206\u754C\u5E76\u63D0\u53D6\u62C9\u4E01\u6838\u5FC3\", () => {\n const folder = \"[BP] [BA] [\u73A9\u6CD5] \u62D4\u5200\u5251Slash Blade v4 BP\";\n assert.equal(normalizePackSearchName(folder), \"\u62D4\u5200\u5251 Slash Blade\");\n assert.equal(\n extractLatinPhrase(insertCjkLatinBoundaries(folder.replace(/\\[[^\\]]*\\]/g, \" \"))),\n \"Slash Blade v4 BP\"\n );\n const seeds = collectQuerySeeds(folder);\n assert.ok(seeds.includes(\"Slash Blade v4 BP\"));\n assert.ok(seeds.includes(\"Slash Blade v4\"));\n assert.ok(seeds.includes(\"Slash Blade\"));\n assert.ok(seeds.some((s) => s.includes(\"\u62D4\u5200\u5251\")));\n });\n\n it(\"\u810F\u6587\u4EF6\u5939\u540D\u6D3E\u751F\u542B slug / Title-Slug / addon\", () => {\n const qs = buildSearchQueries(\"[BP] [BA] [\u73A9\u6CD5] \u62D4\u5200\u5251Slash Blade v4 BP\");\n assert.ok(qs.includes(\"slash-blade\"), `queries=${JSON.stringify(qs)}`);\n assert.ok(qs.includes(\"slash-blade-addon\"), `queries=${JSON.stringify(qs)}`);\n assert.ok(qs.includes(\"Slash Blade\"), `queries=${JSON.stringify(qs)}`);\n assert.ok(\n qs.some((q) => q.toLowerCase() === \"slash-blade\"),\n `queries=${JSON.stringify(qs)}`\n );\n const iSlug = qs.findIndex((q) => q === \"slash-blade-addon\");\n const iCjk = qs.findIndex((q) => q.includes(\"\u62D4\u5200\u5251\"));\n assert.ok(iSlug >= 0 && (iCjk < 0 || iSlug < iCjk));\n });\n\n it(\"header+\u6587\u4EF6\u5939\u53CC\u6E90\uFF1A\u6709\u62C9\u4E01\u65F6\u4E0D\u641C\u7EAF\u4E2D\u6587\uFF0C\u4E14\u6587\u4EF6\u5939\u8D21\u732E slug\", () => {\n const qs = buildSearchQueries([\"\u62D4\u5200\u5251\", \"[BP] [BA] [\u73A9\u6CD5] \u62D4\u5200\u5251Slash Blade v4 BP\"]);\n assert.ok(qs.includes(\"slash-blade-addon\"));\n assert.ok(qs.includes(\"Slash Blade\"));\n assert.ok(qs.every((q) => /[A-Za-z]/.test(q)), `\u4E0D\u5E94\u518D\u641C\u7EAF\u4E2D\u6587: ${JSON.stringify(qs)}`);\n });\n\n it(\"\u53CC\u6E90\u8F6E\u8BE2\uFF1Aheader \u4E0E folder \u90FD\u4F1A\u8D21\u732E\", () => {\n const plan = buildSearchQueriesFromSources([\n { id: \"header\", raw: \"Cool Swords Pack\" },\n { id: \"folder\", raw: \"[BP] [BA] [\u73A9\u6CD5] \u62D4\u5200\u5251Slash Blade v4 BP\" },\n ]);\n assert.ok(plan.perSource.header?.some((q) => /cool|swords/i.test(q)));\n assert.ok(plan.perSource.folder?.some((q) => /slash-blade/i.test(q)));\n assert.ok(plan.queries.some((q) => /slash-blade/i.test(q)));\n assert.ok(plan.queries.some((q) => /cool|swords/i.test(q)));\n });\n\n it(\"slug \u5019\u9009\u65E0\u7A7A\u683C\", () => {\n assert.equal(toCfSlugCandidate(\"Slash Blade v4\"), \"slash-blade\");\n const qs = buildSearchQueries(\"Slash Blade v4\");\n assert.ok(qs.includes(\"Slash Blade\"));\n assert.ok(qs.includes(\"slash-blade\"));\n assert.ok(qs.includes(\"slash-blade-addon\"));\n });\n\n it(\"slug \u547D\u4E2D slash-blade-addon \u9AD8\u5206\", () => {\n const score = packSourceScore(\"Slash Blade v4\", {\n name: \"Slash Blade Addon\",\n slug: \"slash-blade-addon\",\n });\n assert.ok(score >= 0.95, `score=${score}`);\n });\n});\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,76 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import fs from "node:fs";
3
- import os from "node:os";
4
- import path from "node:path";
5
- import { after, describe, it } from "node:test";
6
- import * as probe from "./process-probe.js";
7
- describe("process-probe pid file", () => {
8
- let tempRoot = "";
9
- after(() => {
10
- if (tempRoot) {
11
- fs.rmSync(tempRoot, { recursive: true, force: true });
12
- }
13
- });
14
- it("read/write/clear bds.pid \u5728\u72EC\u7ACB temp \u6839\u76EE\u5F55", () => {
15
- tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), "sfmc-probe-"));
16
- assert.equal(probe.readBdsPidFile(tempRoot), 0);
17
- probe.writeBdsPidFile(4242, tempRoot);
18
- assert.equal(probe.readBdsPidFile(tempRoot), 4242);
19
- probe.clearBdsPidFile(tempRoot);
20
- assert.equal(probe.readBdsPidFile(tempRoot), 0);
21
- });
22
- });
23
- describe("process-probe probeBdsStatus", () => {
24
- let tempRoot = "";
25
- const calls = [];
26
- after(() => {
27
- probe.setExecForTesting(null);
28
- probe.setIsAliveForTesting(null);
29
- if (tempRoot) {
30
- fs.rmSync(tempRoot, { recursive: true, force: true });
31
- }
32
- });
33
- it("managedPid + hasStdin \u4E14\u8FDB\u7A0B\u5B58\u6D3B \u2192 managed", async () => {
34
- tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), "sfmc-probe-"));
35
- calls.length = 0;
36
- probe.setIsAliveForTesting((pid) => pid === 100);
37
- probe.setExecForTesting(async (cmd) => {
38
- calls.push(cmd);
39
- if (cmd.includes("PID eq 100")) {
40
- return { stdout: "bedrock_server.exe 100 Console", stderr: "" };
41
- }
42
- return { stdout: "", stderr: "" };
43
- });
44
- const result = await probe.probeBdsStatus({ managedPid: 100, hasStdin: true, rootDir: tempRoot });
45
- assert.deepEqual(result, { state: "managed", pid: 100 });
46
- });
47
- it("PID \u6587\u4EF6\u5B58\u6D3B\u4F46\u65E0 stdin \u2192 external", async () => {
48
- probe.writeBdsPidFile(200, tempRoot);
49
- probe.setIsAliveForTesting((pid) => pid === 200);
50
- probe.setExecForTesting(async (cmd) => {
51
- if (cmd.includes("PID eq 200")) {
52
- return { stdout: "bedrock_server.exe 200 Console", stderr: "" };
53
- }
54
- return { stdout: "", stderr: "" };
55
- });
56
- const result = await probe.probeBdsStatus({ managedPid: 200, hasStdin: false, rootDir: tempRoot });
57
- assert.equal(result.state, "external");
58
- assert.equal(result.pid, 200);
59
- });
60
- it("\u65E0 PID \u6587\u4EF6\u4F46\u6709 bedrock_server \u955C\u50CF \u2192 external", async () => {
61
- probe.clearBdsPidFile(tempRoot);
62
- probe.setIsAliveForTesting(() => false);
63
- probe.setExecForTesting(async (cmd) => {
64
- if (cmd.includes("IMAGENAME eq bedrock_server.exe")) {
65
- return { stdout: '"bedrock_server.exe","555","Console","1","999 K"\n', stderr: "" };
66
- }
67
- if (cmd.includes("pgrep")) {
68
- return { stdout: "555\n", stderr: "" };
69
- }
70
- return { stdout: "", stderr: "" };
71
- });
72
- const result = await probe.probeBdsStatus({ rootDir: tempRoot });
73
- assert.deepEqual(result, { state: "external", pid: 555 });
74
- });
75
- });
76
- //# sourceMappingURL=process-probe.test.js.map