mirror of
https://github.com/morluto/rea
synced 2026-10-26 06:16:17 -04:00
00a3078148
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.
41 lines
1.1 KiB
JavaScript
41 lines
1.1 KiB
JavaScript
import { readFile, writeFile } from "node:fs/promises";
|
|
|
|
const isMissing = (cause) =>
|
|
typeof cause === "object" &&
|
|
cause !== null &&
|
|
"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,
|
|
source,
|
|
check,
|
|
generateCommand,
|
|
}) => {
|
|
let existing;
|
|
try {
|
|
existing = await readFile(path, "utf8");
|
|
} catch (cause) {
|
|
if (!isMissing(cause)) throw cause;
|
|
}
|
|
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, preserveLineEndings(source, existing), "utf8");
|
|
return { changed: true };
|
|
};
|