Add the esbuild/swc pattern for distributing platform-specific native
binaries via npm optional dependencies. Each supported platform gets its
own @gsd/engine-{platform} package containing just the .node binary.
- 5 platform package stubs (darwin-arm64, darwin-x64, linux-x64-gnu,
linux-arm64-gnu, win32-x64-msvc) with os/cpu filters
- Rewritten native loader: tries npm package first, then local build
- Version sync script keeps platform packages in lock-step with root
- GitHub Actions workflow for cross-platform build + publish on tag push
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
65 lines
2 KiB
JavaScript
65 lines
2 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/**
|
|
* Synchronize platform package versions with the root package version.
|
|
*
|
|
* Reads version from root package.json, writes it to all platform
|
|
* package.json files and updates optionalDependencies in root package.json.
|
|
*/
|
|
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
|
|
const rootDir = path.resolve(__dirname, "..", "..");
|
|
const npmDir = path.resolve(__dirname, "..", "npm");
|
|
|
|
const rootPkgPath = path.join(rootDir, "package.json");
|
|
const rootPkg = JSON.parse(fs.readFileSync(rootPkgPath, "utf-8"));
|
|
const version = rootPkg.version;
|
|
|
|
console.log(`[sync-platform-versions] Syncing to version ${version}`);
|
|
|
|
const platformPackages = [
|
|
"darwin-arm64",
|
|
"darwin-x64",
|
|
"linux-x64-gnu",
|
|
"linux-arm64-gnu",
|
|
"win32-x64-msvc",
|
|
];
|
|
|
|
// Update each platform package.json
|
|
for (const platform of platformPackages) {
|
|
const pkgPath = path.join(npmDir, platform, "package.json");
|
|
if (!fs.existsSync(pkgPath)) {
|
|
console.warn(` Skipping ${platform}: ${pkgPath} not found`);
|
|
continue;
|
|
}
|
|
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
if (pkg.version !== version) {
|
|
console.log(` ${platform}: ${pkg.version} -> ${version}`);
|
|
pkg.version = version;
|
|
fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
|
|
} else {
|
|
console.log(` ${platform}: already ${version}`);
|
|
}
|
|
}
|
|
|
|
// Update optionalDependencies in root package.json
|
|
let rootChanged = false;
|
|
const optDeps = rootPkg.optionalDependencies || {};
|
|
for (const platform of platformPackages) {
|
|
const depName = `@gsd/engine-${platform}`;
|
|
if (optDeps[depName] && optDeps[depName] !== version) {
|
|
console.log(` root optionalDependencies ${depName}: ${optDeps[depName]} -> ${version}`);
|
|
optDeps[depName] = version;
|
|
rootChanged = true;
|
|
}
|
|
}
|
|
|
|
if (rootChanged) {
|
|
rootPkg.optionalDependencies = optDeps;
|
|
fs.writeFileSync(rootPkgPath, JSON.stringify(rootPkg, null, 2) + "\n");
|
|
console.log(" Updated root package.json optionalDependencies");
|
|
}
|
|
|
|
console.log("[sync-platform-versions] Done.");
|