fix: 保留 PaC YAML 标量空白

仅规范结构性 mapping 容器头,并以完整 YAML round-trip 校验失败闭合。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Codex
2026-07-11 08:09:33 +02:00
parent 2197de7336
commit 7adcb9f09c
2 changed files with 83 additions and 6 deletions
@@ -1032,12 +1032,33 @@ function parseYamlRecord(text: string, label: string): Record<string, unknown> {
}
export function pacSourceArtifactYaml(value: Record<string, unknown>): string {
const serialized = Bun.YAML.stringify(value, null, 2)
.split("\n")
.map((line) => line.replace(/[\t ]+$/u, ""))
.join("\n")
.trim();
return `${serialized}\n`;
const lines = Bun.YAML.stringify(value, null, 2).split("\n");
let blockScalarHeaderIndent: number | null = null;
const normalized = lines.map((line) => {
const content = line.trim();
const indent = line.length - line.trimStart().length;
if (blockScalarHeaderIndent !== null) {
if (content.length === 0 || indent > blockScalarHeaderIndent) return line;
blockScalarHeaderIndent = null;
}
const structuralLine = line.replace(/:[\t ]+$/u, ":");
if (/(?:^|:[\t ]+|-[\t ]+)[|>](?:[1-9][+-]?|[+-][1-9]?|[+-])?[\t ]*(?:#.*)?$/u.test(structuralLine)) {
blockScalarHeaderIndent = indent;
}
return structuralLine;
}).join("\n");
const withSingleEofNewline = `${normalized.replace(/\n+$/u, "")}\n`;
const roundTrip = parseYamlRecord(withSingleEofNewline, "serialized source artifact");
const roundTripDrift = firstCanonicalDrift(value, roundTrip, "$");
if (roundTripDrift !== null) {
throw new PacSourceArtifactError("source-artifact-yaml-round-trip-failed", {
driftPath: roundTripDrift.path,
expectedEvidence: roundTripDrift.expected,
actualEvidence: roundTripDrift.actual,
});
}
return withSingleEofNewline;
}
function requiredParam(binding: PacSourceArtifactBinding, key: string): string {