mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-11 09:42:15 +03:00
fix(build): colocateLlmlinguaOptionals skip-check treated a Next-traced stub as fully copied
Debugging the omniroute-beta Docker rebuild: `npm run build` (and the
Dockerfile's own post-build verification) failed with
`Cannot find module '.../node_modules/@atjsh/llmlingua-2/dist/index.js'`.
Root cause, reproduced directly (both against a live Docker builder image
and in a unit test): Next.js's own standalone trace creates a stub
directory for `@atjsh/llmlingua-2` containing only `package.json` — it
references the package (a dynamically-imported optional dependency) but
can't fully bundle it. colocateLlmlinguaOptionals's skip checks (both the
closure-level early return and the per-package loop) only tested
`existsSync(dest)`, so that stub was indistinguishable from "already fully
co-located" — the function skipped copying the real `dist/` output
entirely, silently shipping a package with a manifest but no code.
Fix: check for the package's declared `main` entry file when it has one
(the real-world case for every actual SLM optional). Packages with no
`main` field fall back to comparing the destination's top-level entries
against the source's — correct both for genuinely multi-file packages and
for a metadata-only source (package.json is then its complete, faithfully-
copied contents), which the existing idempotency test exercises.
Covered by tests/unit/colocate-optionals.test.ts's new stub-reproduction
case (fails against the pre-fix code, passes after — confirmed directly)
plus the 6 pre-existing cases, all still green.
(cherry picked from commit 359aba59c7)
This commit is contained in:
committed by
diegosouzapw
parent
aae408f585
commit
4d816a4d8a
@@ -157,9 +157,7 @@ export function colocateLlmlinguaOptionals({
|
||||
if (!existsSync(targetNm)) {
|
||||
return {
|
||||
skipped: true,
|
||||
reason: targetNodeModulesDir
|
||||
? "no target node_modules"
|
||||
: "no standalone dist/node_modules",
|
||||
reason: targetNodeModulesDir ? "no target node_modules" : "no standalone dist/node_modules",
|
||||
};
|
||||
}
|
||||
|
||||
@@ -198,9 +196,7 @@ export function colocateLlmlinguaOptionals({
|
||||
});
|
||||
copied++;
|
||||
} catch (err) {
|
||||
log(
|
||||
` ⚠️ LLMLingua optional co-location failed for ${name}: ${err.message}`
|
||||
);
|
||||
log(` ⚠️ LLMLingua optional co-location failed for ${name}: ${err.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -196,6 +196,41 @@ test("colocateLlmlinguaOptionals skips when there is no standalone dist bundle",
|
||||
}
|
||||
});
|
||||
|
||||
test("colocateLlmlinguaOptionals fills a Next-traced stub (package.json only, no dist) instead of skipping it", () => {
|
||||
// Reproduces a real build failure: Next.js's own standalone trace can create
|
||||
// a stub directory for a dynamically-imported optional dependency it
|
||||
// references but can't fully bundle — just package.json, no actual code.
|
||||
// The old skip check (`existsSync(dest)`) treated that stub as "already
|
||||
// co-located" and never copied the real dist/ output, so
|
||||
// require.resolve('@atjsh/llmlingua-2') found a package.json with no
|
||||
// matching main file at runtime.
|
||||
const root = mkdtempSync(join(tmpdir(), "omniroute-colocate-stub-"));
|
||||
try {
|
||||
buildRoot(root);
|
||||
const distNm = join(root, "dist", "node_modules");
|
||||
mkPkg(distNm, "@huggingface/transformers", { version: "3.5.2" });
|
||||
|
||||
// Simulate the Next-traced stub: directory exists, package.json only.
|
||||
const stubDir = join(distNm, "@atjsh", "llmlingua-2");
|
||||
mkdirSync(stubDir, { recursive: true });
|
||||
writeFileSync(
|
||||
join(stubDir, "package.json"),
|
||||
readFileSync(join(root, "node_modules", "@atjsh", "llmlingua-2", "package.json"), "utf8")
|
||||
);
|
||||
assert.ok(!existsSync(join(stubDir, "dist", "index.js")), "stub must start without dist/");
|
||||
|
||||
const result = colocateLlmlinguaOptionals({ rootDir: root });
|
||||
assert.equal(result.skipped, false, "must not treat the stub as already co-located");
|
||||
|
||||
assert.ok(
|
||||
existsSync(join(stubDir, "dist", "index.js")),
|
||||
"the real dist/index.js must be filled in, not left missing behind the stub"
|
||||
);
|
||||
} finally {
|
||||
rmSync(root, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
|
||||
test("SEED_PACKAGES excludes transformers (it is a dist-pinned peer, not a seed)", () => {
|
||||
assert.ok(!SEED_PACKAGES.includes("@huggingface/transformers"));
|
||||
assert.deepEqual(SEED_PACKAGES, ["@atjsh/llmlingua-2", "@tensorflow/tfjs", "js-tiktoken"]);
|
||||
|
||||
Reference in New Issue
Block a user