Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions bindings/nodejs/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ index.d.ts
*.wasm
npm/
zen-engine.wasip1*
zen-engine.wasm32-wasip1.*
3 changes: 2 additions & 1 deletion bindings/nodejs/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ darwinArm:
cp zen-engine.darwin-arm64.node npm/darwin-arm64/

prepareLocalPublish:
yarn napi prepublish --skip-optional-publish
rm -f zen-engine.wasm32-wasip1.*.mjs zen-engine.wasm32-wasip1.*.mts
node prepublish.mjs --skip-optional-publish
yarn createNpmDirs

publish:
Expand Down
5 changes: 3 additions & 2 deletions bindings/nodejs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@
"fs": false,
"asyncInit": true
},
"asyncRuntime": true
"asyncRuntime": true,
"optionalDependency": true
}
},
"keywords": [
Expand Down Expand Up @@ -101,7 +102,7 @@
"test:wasm": "cross-env NAPI_RS_FORCE_WASI=error NAPI_RS_WASI_FLAVOR=wasm32-wasip1 __ZEN_MOCK_UTC_TIME=2025-08-19T16:55:02.078Z jest -c jest.wasm.config.js",
"artifacts": "napi artifacts -d ../../artifacts",
"createNpmDirs": "napi create-npm-dirs && node enrich-npm-dirs.mjs",
"prepublishOnly": "napi prepublish --no-gh-release",
"prepublishOnly": "node prepublish.mjs --no-gh-release",
"version": "napi version"
},
"resolutions": {
Expand Down
32 changes: 32 additions & 0 deletions bindings/nodejs/prepublish.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { spawnSync } from 'node:child_process';
import { readFileSync, rmSync, writeFileSync } from 'node:fs';
import { join } from 'node:path';

const packageJsonPath = join(import.meta.dirname, 'package.json');
const readPackageJson = () => JSON.parse(readFileSync(packageJsonPath, 'utf8'));

const before = readPackageJson();

const napi = spawnSync('napi', ['prepublish', ...process.argv.slice(2)], {
cwd: import.meta.dirname,
stdio: 'inherit',
shell: process.platform === 'win32',
});
if (napi.status !== 0) process.exit(napi.status ?? 1);

const after = readPackageJson();
const keptFiles = new Set(before.files ?? []);
const generatedFiles = (after.files ?? []).filter((file) => !keptFiles.has(file));

const restoreField = (target, source, key) => {
if (source && Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];
else if (target) delete target[key];
};

restoreField(after, before, 'files');
restoreField(after, before, 'exports');
if (after.publishConfig) restoreField(after.publishConfig, before.publishConfig, 'exports');

writeFileSync(packageJsonPath, `${JSON.stringify(after, null, 2)}\n`);

for (const file of generatedFiles) rmSync(join(import.meta.dirname, file), { force: true });
Loading