fix(build): preserve native generated-file line endings

Treat CRLF and LF as equivalent when checking committed text artifacts so Windows package lifecycles do not report false drift.

When real generated content changes, retain the existing artifact's line-ending convention and cover both check and update behavior with a focused regression test.
This commit is contained in:
N0zoM1z0 2026-07-17 02:00:39 +08:00 committed by N0zoM1z0
parent 5970a71824
commit 00a3078148
2 changed files with 38 additions and 2 deletions

View File

@ -6,6 +6,13 @@ const isMissing = (cause) =>
"code" in cause &&
cause.code === "ENOENT";
const normalizeLineEndings = (value) => value.replaceAll("\r\n", "\n");
const preserveLineEndings = (source, existing) =>
existing?.includes("\r\n") === true
? normalizeLineEndings(source).replaceAll("\n", "\r\n")
: source;
/** Compare or update one generated text artifact with actionable diagnostics. */
export const ensureGeneratedFile = async ({
path,
@ -19,11 +26,15 @@ export const ensureGeneratedFile = async ({
} catch (cause) {
if (!isMissing(cause)) throw cause;
}
if (existing === source) return { changed: false };
if (
existing !== undefined &&
normalizeLineEndings(existing) === normalizeLineEndings(source)
)
return { changed: false };
if (check)
throw new Error(
`${path} is missing or stale. Run \`${generateCommand}\` and commit the result.`,
);
await writeFile(path, source, "utf8");
await writeFile(path, preserveLineEndings(source, existing), "utf8");
return { changed: true };
};

View File

@ -234,4 +234,29 @@ describe("canonical product catalog", () => {
).resolves.toEqual({ changed: true });
expect(await readFile(path, "utf8")).toBe("current\n");
});
it("accepts and preserves native generated-file line endings", async () => {
const directory = await mkdtemp(join(tmpdir(), "rea-generated-eol-"));
temporaryRoots.push(directory);
const path = join(directory, "catalog.json");
await writeFile(path, "current\r\n", "utf8");
await expect(
ensureGeneratedFile({
path,
source: "current\n",
check: true,
generateCommand: "npm run docs:generate",
}),
).resolves.toEqual({ changed: false });
expect(await readFile(path, "utf8")).toBe("current\r\n");
await expect(
ensureGeneratedFile({
path,
source: "updated\n",
check: false,
generateCommand: "npm run docs:generate",
}),
).resolves.toEqual({ changed: true });
expect(await readFile(path, "utf8")).toBe("updated\r\n");
});
});