3286f05b3b
The npm package ships with better-sqlite3 compiled for Linux x64. On Windows and macOS, the binary is incompatible and fails to load. Added postinstall script that: - Detects if the bundled native module is incompatible - Automatically runs 'npm rebuild better-sqlite3' to compile for the target platform - Provides manual fallback instructions if rebuild fails
58 lines
1.9 KiB
JavaScript
58 lines
1.9 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/**
|
|
* OmniRoute — Postinstall Native Module Rebuild
|
|
*
|
|
* The npm package ships with a Next.js standalone build that includes
|
|
* better-sqlite3 compiled for the build platform (Linux x64).
|
|
* This script detects platform mismatches and rebuilds the native
|
|
* module for the user's actual OS/architecture.
|
|
*
|
|
* Fixes: https://github.com/diegosouzapw/OmniRoute/issues/129
|
|
*/
|
|
|
|
import { execSync } from "node:child_process";
|
|
import { existsSync } from "node:fs";
|
|
import { join, dirname } from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = dirname(__filename);
|
|
const ROOT = join(__dirname, "..");
|
|
|
|
// The standalone build bundles better-sqlite3 inside app/node_modules
|
|
const appNodeModules = join(ROOT, "app", "node_modules", "better-sqlite3");
|
|
|
|
if (!existsSync(appNodeModules)) {
|
|
// No bundled better-sqlite3 — nothing to do (dev install, not npm global)
|
|
process.exit(0);
|
|
}
|
|
|
|
const buildInfoPath = join(appNodeModules, "build", "Release", "better_sqlite3.node");
|
|
|
|
// Quick check: try to load the native module
|
|
try {
|
|
// Use a dynamic import-like approach — try to dlopen the .node file
|
|
process.dlopen({ exports: {} }, buildInfoPath);
|
|
// If it loaded, the binary is compatible — nothing to do
|
|
process.exit(0);
|
|
} catch {
|
|
// Binary is incompatible — rebuild
|
|
}
|
|
|
|
console.log(`\n 🔧 Rebuilding better-sqlite3 for ${process.platform}-${process.arch}...`);
|
|
|
|
try {
|
|
execSync("npm rebuild better-sqlite3", {
|
|
cwd: join(ROOT, "app"),
|
|
stdio: "inherit",
|
|
timeout: 120_000,
|
|
});
|
|
console.log(" ✅ Native module rebuilt successfully!\n");
|
|
} catch (error) {
|
|
console.warn(" ⚠️ Failed to rebuild better-sqlite3 automatically.");
|
|
console.warn(" You can fix this manually by running:");
|
|
console.warn(` cd ${join(ROOT, "app")} && npm rebuild better-sqlite3\n`);
|
|
// Don't fail the install — the user can fix manually
|
|
}
|