71 lines
3.3 KiB
TypeScript
71 lines
3.3 KiB
TypeScript
import { describe, expect, test } from "bun:test";
|
|
import { existsSync, readFileSync } from "node:fs";
|
|
import { join } from "node:path";
|
|
|
|
/**
|
|
* Tripwires for the patched, pinned Transformers.js runtime (D-040).
|
|
* `@huggingface/transformers` carries a `bun patch` (D-027/D-028) keyed by
|
|
* its exact version; a bump that forgets to regenerate the patch would leave
|
|
* the app working but silently bring back the mobile OOM. These checks fail
|
|
* the fast suite instead.
|
|
*/
|
|
|
|
const ROOT = join(import.meta.dir, "..");
|
|
const PKG_DIR = join(ROOT, "node_modules/@huggingface/transformers");
|
|
const PINNED_VERSION = "4.3.2";
|
|
|
|
function read(path: string): string {
|
|
return readFileSync(path, "utf8");
|
|
}
|
|
|
|
/** Source text of `async function <name>(…) { … }` in a bundled file. */
|
|
function functionSource(source: string, name: string): string {
|
|
const start = source.indexOf(`async function ${name}(`);
|
|
if (start < 0) throw new Error(`${name} not found`);
|
|
const end = source.indexOf("\nfunction ", start + 1);
|
|
const endAsync = source.indexOf("\nasync function ", start + 1);
|
|
const stops = [end, endAsync].filter((i) => i > 0);
|
|
return source.slice(start, stops.length ? Math.min(...stops) : undefined);
|
|
}
|
|
|
|
describe("@huggingface/transformers runtime", () => {
|
|
test("installed version is the pinned 4.3.2", () => {
|
|
const installed = JSON.parse(read(join(PKG_DIR, "package.json"))).version;
|
|
expect(installed).toBe(PINNED_VERSION);
|
|
});
|
|
|
|
test("patchedDependencies points at an existing patch for the installed version", () => {
|
|
const rootPkg = JSON.parse(read(join(ROOT, "package.json")));
|
|
const patchPath = rootPkg.patchedDependencies?.[`@huggingface/transformers@${PINNED_VERSION}`];
|
|
expect(typeof patchPath).toBe("string");
|
|
expect(existsSync(join(ROOT, patchPath))).toBe(true);
|
|
});
|
|
|
|
test("web bundle's constructSessions carries the sequential-load patch (D-027/D-028)", () => {
|
|
const body = functionSource(read(join(PKG_DIR, "dist/transformers.web.js")), "constructSessions");
|
|
expect(body).toContain("options?.sequentialSessionLoad");
|
|
expect(body).toContain("Promise.all(");
|
|
expect(body).toContain("for (const name of Object.keys(names))");
|
|
});
|
|
|
|
test("Whisper generate still takes the seek loop when max_new_tokens is unset (D-021, D-042)", () => {
|
|
// The worker's `max_new_tokens: 440` exists only to dodge this branch.
|
|
// If upstream changes the condition, re-measure D-021 before touching it.
|
|
const source = read(join(PKG_DIR, "src/models/whisper/modeling_whisper.js"));
|
|
expect(source).toContain("if (generation_config.return_timestamps && !kwargs.max_new_tokens)");
|
|
});
|
|
|
|
test("onnxruntime-web is the build D-043 re-tested 8-bit decoders on at the default optimization level", () => {
|
|
// D-014's "basic" cap was dropped because this build loads the q8 merged
|
|
// decoders at every graphOptimizationLevel. A different build needs the
|
|
// D-043 session-creation check re-run before it ships.
|
|
const ortWeb = JSON.parse(read(join(ROOT, "node_modules/onnxruntime-web/package.json"))).version;
|
|
expect(ortWeb).toBe("1.31.0-dev.20260914-8d85527a0");
|
|
});
|
|
|
|
test("worker leaves WASM sessions at the default graph optimization level (D-043)", () => {
|
|
const worker = read(join(ROOT, "src/worker/inference.worker.ts"));
|
|
expect(worker).not.toContain("graphOptimizationLevel");
|
|
});
|
|
});
|