Skip to content

Commit ad21f2f

Browse files
authored
Merge pull request #86 from DogeLakeDev/cursor/bc-d0d941f9-ddb0-4dbd-b660-faeef2871028-f87a
fix(bds-tools): scanDestOccupancy 合并冲突导致 changeset-release/--dts 失败
2 parents 4ad267d + 17b6d9d commit ad21f2f

3 files changed

Lines changed: 35 additions & 31 deletions

File tree

‎.changeset/build-deps-world-packs-solid.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
"@sfmc-bds/bds-tools": patch
44
---
55

6-
发版:build-publishable 拓扑 + listPublishableBuildDeps(npm-publish 应急补发不再硬编码只 build SDK);push 缺失态 DRY 对齐 listUnpushedExistingVersionTags。世界包:readPackDirOccupancy DRY,去掉死不变式,occupancy 保留真实 kind(LSP)。
6+
发版:build-publishable 拓扑 + listPublishableBuildDeps(npm-publish 应急补发不再硬编码只 build SDK);push 缺失态 DRY 对齐 listUnpushedExistingVersionTags。世界包:readPackDirOccupancy DRY,去掉死不变式,occupancy 保留真实 kind(LSP)。修 #80/#81 合并冲突:scanDestOccupancy 须赋值 facts=readPackDirOccupancy,禁止残留未声明 uuid/version/name 赋值(否则 --dts 挂掉且 catch 吞掉 ReferenceError 导致占用 uuid 恒空)。

‎bds-tools/src/world-packs.ts‎

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,8 @@ export type PackInstallPlan =
566566

567567
/**
568568
* 读单目录占用事实(info 优先,否则 header)。
569-
* 解析失败返回 null;BOM 已由 readJsonFile 剥离,不再抛 Utf8BomError。
569+
* info/header 解析失败返回 null;BOM 已由 readJsonFile 剥离。
570+
* 其它异常上抛,由 scanDestOccupancy 决定仍占文件夹名(uuid 置空)。
570571
*/
571572
export function readPackDirOccupancy(dir: string): {
572573
uuid: string;
@@ -594,7 +595,13 @@ export function readPackDirOccupancy(dir: string): {
594595
export function scanDestOccupancy(destParent: string): DestOccupancy[] {
595596
const out: DestOccupancy[] = [];
596597
for (const dir of listPackDirsIn(destParent)) {
597-
const facts = readPackDirOccupancy(dir);
598+
let facts: ReturnType<typeof readPackDirOccupancy> = null;
599+
try {
600+
// DRY:单目录占用只走 readPackDirOccupancy,禁止再内联一份 info/header 分支
601+
facts = readPackDirOccupancy(dir);
602+
} catch {
603+
/* manifest 不可读则占位 uuid 为空(#81 契约:扫描本身不因单目录失败而中断) */
604+
}
598605
out.push({
599606
folderName: path.basename(dir),
600607
dir,

‎bds-tools/world-packs.test.mjs‎

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -283,52 +283,49 @@ describe("world-packs primitives", () => {
283283
assert.deepEqual(version, [2, 0, 1]);
284284
});
285285

286-
it("scanDestOccupancy / readPackDirOccupancy:完整与残缺 manifest", async () => {
287-
const { scanDestOccupancy, readPackDirOccupancy, formatWorldPackFolderName } = await import(
288-
"./dist/world-packs.js"
289-
);
290-
const parent = path.join(tmp, "occupancy-scan");
291-
const fullName = formatWorldPackFolderName("Full", "resource");
292-
const brokenName = formatWorldPackFolderName("Broken", "behavior");
293-
const fullDir = path.join(parent, fullName);
294-
const brokenDir = path.join(parent, brokenName);
286+
it("scanDestOccupancy 走 readPackDirOccupancy(完整 + 残缺 header)", async () => {
287+
const { scanDestOccupancy, readPackDirOccupancy } = await import("./dist/world-packs.js");
288+
const dest = path.join(tmp, "occupancy-dry");
289+
const fullDir = path.join(dest, "[RP] Full");
295290
writeManifest(fullDir, {
296291
name: "Full Pack",
297-
uuid: "11111111-1111-1111-1111-111111111111",
298-
version: [2, 3, 4],
292+
uuid: "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
293+
version: [2, 1, 0],
299294
type: "resources",
300295
});
301-
fs.mkdirSync(brokenDir, { recursive: true });
296+
const partialDir = path.join(dest, "[RP] Partial");
297+
fs.mkdirSync(partialDir, { recursive: true });
302298
fs.writeFileSync(
303-
path.join(brokenDir, "manifest.json"),
299+
path.join(partialDir, "manifest.json"),
304300
JSON.stringify({
305301
format_version: 2,
306302
header: {
307-
name: "Broken Pack",
308-
uuid: "22222222-2222-2222-2222-222222222222",
309-
version: [9, 0, 1],
303+
name: "Partial",
304+
uuid: "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
305+
version: [3, 0, 0],
310306
},
311307
modules: [],
312308
})
313309
);
314310

315311
const fullFacts = readPackDirOccupancy(fullDir);
316-
assert.equal(fullFacts?.uuid, "11111111-1111-1111-1111-111111111111");
317-
assert.deepEqual(fullFacts?.version, [2, 3, 4]);
312+
assert.equal(fullFacts?.uuid, "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa");
313+
assert.deepEqual(fullFacts?.version, [2, 1, 0]);
314+
assert.equal(fullFacts?.name, "Full Pack");
318315
assert.equal(fullFacts?.kind, "resource");
319316

320-
const brokenFacts = readPackDirOccupancy(brokenDir);
321-
assert.equal(brokenFacts?.uuid, "22222222-2222-2222-2222-222222222222");
322-
assert.deepEqual(brokenFacts?.version, [9, 0, 1]);
323-
assert.equal(brokenFacts?.kind, undefined);
317+
const partialFacts = readPackDirOccupancy(partialDir);
318+
assert.equal(partialFacts?.uuid, "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb");
319+
assert.deepEqual(partialFacts?.version, [3, 0, 0]);
320+
assert.equal(partialFacts?.kind, undefined);
324321

325-
const occ = scanDestOccupancy(parent);
322+
const occ = scanDestOccupancy(dest);
326323
assert.equal(occ.length, 2);
327-
const byFolder = Object.fromEntries(occ.map((o) => [o.folderName, o]));
328-
assert.equal(byFolder[fullName]?.uuid, "11111111-1111-1111-1111-111111111111");
329-
assert.equal(byFolder[fullName]?.kind, "resource");
330-
assert.equal(byFolder[brokenName]?.uuid, "22222222-2222-2222-2222-222222222222");
331-
assert.equal(byFolder[brokenName]?.kind, undefined);
324+
const byUuid = new Map(occ.map((o) => [o.uuid, o]));
325+
assert.equal(byUuid.get("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa")?.name, "Full Pack");
326+
assert.equal(byUuid.get("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa")?.kind, "resource");
327+
assert.equal(byUuid.get("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb")?.version?.[0], 3);
328+
assert.equal(byUuid.get("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb")?.name, undefined);
332329
});
333330

334331
it("decidePackInstallPlan 表驱动", async () => {

0 commit comments

Comments
 (0)