fix: 保留 PaC YAML 标量空白
仅规范结构性 mapping 容器头,并以完整 YAML round-trip 校验失败闭合。\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user