// 逐键比对:本次构建的 collection-all/project.json vs **已发布**的基线。 // 只报**具体哪个键**不同,而不是一串字符串差异。 import { readFileSync } from "node:fs"; // 基线只保留这一个文件:原来读的是 .scratch/dist-baseline/(96.9 MB 的整份旧 dist 拷贝,已按 .gitignore 的约定删除), // 而这里只用到 project.json。重构等价性验证结束后,那份拷贝已按 .gitignore 的约定删除。 const live = JSON.parse(readFileSync("tools/checks/published-project.json", "utf8")); const built = JSON.parse(readFileSync("dist/releases/collection-all/project.json", "utf8")); function diff(a: any, b: any, path = ""): string[] { const out: string[] = []; const keys = new Set([...Object.keys(a ?? {}), ...Object.keys(b ?? {})]); for (const key of keys) { const p = path ? `${path}.${key}` : key; const va = a?.[key]; const vb = b?.[key]; if (va === undefined) out.push(`+ ${p}(基线没有)`); else if (vb === undefined) out.push(`- ${p}(本次没有)`); else if (typeof va === "object" && va !== null && !Array.isArray(va)) out.push(...diff(va, vb, p)); else if (JSON.stringify(va) !== JSON.stringify(vb)) out.push(`≠ ${p}\n 基线: ${JSON.stringify(va)}\n 本次: ${JSON.stringify(vb)}`); } return out; } console.log("=== 顶层键序 ==="); console.log("基线:", Object.keys(live).join(" ")); console.log("本次:", Object.keys(built).join(" ")); console.log(""); const differences = diff(live, built); if (differences.length === 0) console.log("✓ 字段值完全一致"); else { console.log(`=== ${differences.length} 处差异 ===`); for (const d of differences) console.log(" " + d); }