fix: make A2UI hash ordering deterministic

This commit is contained in:
Peter Steinberger
2026-04-12 11:41:15 -07:00
parent 903f771c93
commit 512bf8d365
2 changed files with 25 additions and 1 deletions

View File

@@ -67,6 +67,18 @@ export function getLocalRolldownCliCandidates(repoRoot = rootDir) {
];
}
export function compareNormalizedPaths(left, right) {
const normalizedLeft = normalizePath(left);
const normalizedRight = normalizePath(right);
if (normalizedLeft < normalizedRight) {
return -1;
}
if (normalizedLeft > normalizedRight) {
return 1;
}
return 0;
}
async function walkFiles(entryPath, files) {
if (!isBundleHashInputPath(entryPath)) {
return;
@@ -106,7 +118,7 @@ async function computeHash() {
await walkFiles(inputPath, files);
}
}
files.sort((left, right) => normalizePath(left).localeCompare(normalizePath(right)));
files.sort(compareNormalizedPaths);
const hash = createHash("sha256");
for (const filePath of files) {

View File

@@ -1,6 +1,7 @@
import path from "node:path";
import { describe, expect, it } from "vitest";
import {
compareNormalizedPaths,
getLocalRolldownCliCandidates,
isBundleHashInputPath,
} from "../../scripts/bundle-a2ui.mjs";
@@ -36,4 +37,15 @@ describe("scripts/bundle-a2ui.mjs", () => {
path.join(repoRoot, "node_modules", "rolldown", "bin", "cli.mjs"),
);
});
it("sorts hash inputs without locale-dependent collation", () => {
const paths = ["repo/Z.ts", "repo/a.ts", "repo/ä.ts", "repo/A.ts"];
expect([...paths].toSorted(compareNormalizedPaths)).toEqual([
"repo/A.ts",
"repo/Z.ts",
"repo/a.ts",
"repo/ä.ts",
]);
});
});