mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-16 20:22:21 +03:00
better-sqlite3 v13 ships Node-API prebuilds for every packaged platform (darwin/linux/linuxmusl/win32 x x64/arm64) inside the npm tarball, so the Electron-ABI node-gyp source rebuild in prepare-electron-standalone.mjs is obsolete. Replace it with a fail-fast prebuild verification that mirrors better-sqlite3 lib/binding.js selection, and strip build/deps/src so the packaged loader can only resolve the prebuild. Verified locally on darwin-arm64: the same darwin-arm64.node prebuild loads under both Node 24 (NODE_MODULE_VERSION 137) and Electron 43.3.0 under ELECTRON_RUN_AS_NODE (148); DB create/migrate/read/write/close/reopen pass in both runtimes and cross-runtime on each other's database files. Issue #10321 Stage 6.
87 lines
3.7 KiB
TypeScript
87 lines
3.7 KiB
TypeScript
import { test } from "node:test";
|
||
import assert from "node:assert/strict";
|
||
import fs from "node:fs";
|
||
import os from "node:os";
|
||
import path from "node:path";
|
||
import * as prebuildPlan from "../../scripts/build/electronRebuildPlan.mjs";
|
||
|
||
const {
|
||
SQLITE_PREBUILD_ARCHS,
|
||
SQLITE_PREBUILD_PLATFORMS,
|
||
isSqlitePrebuildSupported,
|
||
sqlitePrebuildFileName,
|
||
} = prebuildPlan;
|
||
|
||
// Since better-sqlite3 v13 (issue #10321 Stage 6) the Electron packaging no
|
||
// longer compiles the addon from source against the Electron headers: v13
|
||
// ships Node-API prebuilds for every packaged platform, and Node-API addons
|
||
// are ABI-independent (verified under electron 43 / NODE_MODULE_VERSION 148).
|
||
// These tests pin the prebuild selection logic that replaced the historical
|
||
// `npx node-gyp rebuild` spawn plan (whose win32 .cmd/shell quirk broke the
|
||
// v3.8.47 tag build — that entire code path is now gone).
|
||
|
||
test("prebuild file name mirrors better-sqlite3 lib/binding.js selection", () => {
|
||
assert.equal(sqlitePrebuildFileName("darwin", "arm64"), "darwin-arm64.node");
|
||
assert.equal(sqlitePrebuildFileName("darwin", "x64"), "darwin-x64.node");
|
||
assert.equal(sqlitePrebuildFileName("win32", "x64"), "win32-x64.node");
|
||
assert.equal(sqlitePrebuildFileName("win32", "arm64"), "win32-arm64.node");
|
||
});
|
||
|
||
test("linux resolves to the musl prebuild when glibcVersionRuntime is absent", () => {
|
||
// glibc build (GitHub ubuntu runner): header carries the runtime glibc version
|
||
assert.equal(
|
||
sqlitePrebuildFileName("linux", "x64", { glibcVersionRuntime: "2.39" }),
|
||
"linux-x64.node"
|
||
);
|
||
// musl build (Alpine): no glibcVersionRuntime -> linuxmusl prebuild
|
||
assert.equal(sqlitePrebuildFileName("linux", "x64", {}), "linuxmusl-x64.node");
|
||
assert.equal(sqlitePrebuildFileName("linux", "arm64", undefined), "linuxmusl-arm64.node");
|
||
});
|
||
|
||
test("prebuild support covers exactly the packaged platform/arch matrix", () => {
|
||
for (const platform of ["darwin", "linux", "win32"]) {
|
||
for (const arch of ["x64", "arm64"]) {
|
||
assert.equal(isSqlitePrebuildSupported(platform, arch), true);
|
||
}
|
||
}
|
||
assert.equal(isSqlitePrebuildSupported("freebsd", "x64"), false);
|
||
assert.equal(isSqlitePrebuildSupported("darwin", "ia32"), false);
|
||
});
|
||
|
||
test("packaged platform matrix matches the shipped prebuild inventory", () => {
|
||
// better-sqlite3 v13 prebuilds/: darwin/linux/linuxmusl/win32 × x64/arm64.
|
||
// The build fails fast when the prebuild for the CURRENT platform is missing,
|
||
// so this matrix must stay in sync with the npm tarball contents.
|
||
assert.deepEqual(SQLITE_PREBUILD_PLATFORMS, ["darwin", "linux", "linuxmusl", "win32"]);
|
||
assert.deepEqual(SQLITE_PREBUILD_ARCHS, ["x64", "arm64"]);
|
||
});
|
||
|
||
test("prebuild verification fails fast when the selected binary is missing", () => {
|
||
const assertSqlitePrebuildExists = (
|
||
prebuildPlan as typeof prebuildPlan & {
|
||
assertSqlitePrebuildExists?: (
|
||
moduleDir: string,
|
||
platform: string,
|
||
arch: string,
|
||
reportHeader?: { glibcVersionRuntime?: string | null }
|
||
) => string | null;
|
||
}
|
||
).assertSqlitePrebuildExists;
|
||
assert.equal(typeof assertSqlitePrebuildExists, "function");
|
||
|
||
const moduleDir = fs.mkdtempSync(path.join(os.tmpdir(), "sqlite-prebuild-"));
|
||
try {
|
||
assert.throws(
|
||
() => assertSqlitePrebuildExists?.(moduleDir, "darwin", "arm64"),
|
||
/better-sqlite3 prebuild missing for darwin-arm64/
|
||
);
|
||
|
||
const expected = path.join(moduleDir, "prebuilds", "darwin-arm64.node");
|
||
fs.mkdirSync(path.dirname(expected), { recursive: true });
|
||
fs.writeFileSync(expected, "napi");
|
||
assert.equal(assertSqlitePrebuildExists?.(moduleDir, "darwin", "arm64"), expected);
|
||
} finally {
|
||
fs.rmSync(moduleDir, { recursive: true, force: true });
|
||
}
|
||
});
|