From ce990542b9639ca95b688c45d28d525c3a2d3c99 Mon Sep 17 00:00:00 2001 From: LongYinan Date: Tue, 13 May 2025 19:54:25 +0800 Subject: [PATCH] fix(napi): module_exports binding (#2632) --- cli/src/api/build.ts | 14 ++++++---- .../src/bindgen_runtime/js_values/symbol.rs | 4 +-- .../src/bindgen_runtime/module_register.rs | 26 ++++++++---------- .../__tests__/__snapshots__/values.spec.ts.md | 2 ++ .../__snapshots__/values.spec.ts.snap | Bin 6495 -> 6511 bytes examples/napi/__tests__/values.spec.ts | 6 ++++ examples/napi/dts-header.d.ts | 2 ++ examples/napi/example.wasi-browser.js | 1 + examples/napi/example.wasi.cjs | 1 + examples/napi/index.d.cts | 2 ++ examples/napi/package.json | 4 +-- examples/napi/src/lib.rs | 6 ++-- 12 files changed, 42 insertions(+), 26 deletions(-) diff --git a/cli/src/api/build.ts b/cli/src/api/build.ts index 2ee803cd..83307b22 100644 --- a/cli/src/api/build.ts +++ b/cli/src/api/build.ts @@ -940,11 +940,14 @@ class Builder { const workerPath = join(dir, 'wasi-worker.mjs') const browserWorkerPath = join(dir, 'wasi-worker-browser.mjs') const browserEntryPath = join(dir, 'browser.js') - const exportsCode = idents - .map( - (ident) => `module.exports.${ident} = __napiModule.exports.${ident}`, - ) - .join('\n') + const exportsCode = + `module.exports = __napiModule.exports\n` + + idents + .map( + (ident) => + `module.exports.${ident} = __napiModule.exports.${ident}`, + ) + .join('\n') await writeFileAsync( bindingPath, createWasiBinding( @@ -966,6 +969,7 @@ class Builder { this.config.wasm?.browser?.fs, this.config.wasm?.browser?.asyncInit, ) + + `export default __napiModule.exports\n` + idents .map( (ident) => diff --git a/crates/napi/src/bindgen_runtime/js_values/symbol.rs b/crates/napi/src/bindgen_runtime/js_values/symbol.rs index be308cba..b6789398 100644 --- a/crates/napi/src/bindgen_runtime/js_values/symbol.rs +++ b/crates/napi/src/bindgen_runtime/js_values/symbol.rs @@ -40,10 +40,10 @@ impl Symbol { } #[cfg(feature = "napi9")] - pub fn for_desc(desc: String) -> Self { + pub fn for_desc>(desc: S) -> Self { Self { desc: None, - for_desc: Some(desc.to_owned()), + for_desc: Some(desc.as_ref().to_owned()), } } } diff --git a/crates/napi/src/bindgen_runtime/module_register.rs b/crates/napi/src/bindgen_runtime/module_register.rs index 12b5436c..d1266b54 100644 --- a/crates/napi/src/bindgen_runtime/module_register.rs +++ b/crates/napi/src/bindgen_runtime/module_register.rs @@ -60,9 +60,6 @@ impl Default for PersistedPerInstanceHashMap { type ModuleRegisterCallback = RwLock, (&'static str, ExportRegisterCallback))>>; -#[cfg(not(feature = "noop"))] -type ModuleRegisterHookCallback = PersistedPerInstanceHashMap; - #[cfg(not(feature = "noop"))] type ModuleClassProperty = PersistedPerInstanceHashMap, (&'static str, Vec)>>; @@ -77,7 +74,7 @@ type RegisteredClassesMap = PersistedPerInstanceHashMap = LazyLock::new(Default::default); #[cfg(not(feature = "noop"))] -static MODULE_REGISTER_HOOK_CALLBACK: LazyLock = +static MODULE_REGISTER_HOOK_CALLBACK: LazyLock>> = LazyLock::new(Default::default); #[cfg(not(feature = "noop"))] static MODULE_CLASS_PROPERTIES: LazyLock = LazyLock::new(Default::default); @@ -152,10 +149,10 @@ pub fn register_module_export( #[cfg(not(feature = "noop"))] #[doc(hidden)] pub fn register_module_export_hook(cb: ExportRegisterHookCallback) { - let current_id = std::thread::current().id(); - MODULE_REGISTER_HOOK_CALLBACK.borrow_mut(|inner| { - inner.insert(current_id, cb); - }); + let mut inner = MODULE_REGISTER_HOOK_CALLBACK + .write() + .expect("Write MODULE_REGISTER_HOOK_CALLBACK failed"); + *inner = Some(cb); } #[cfg(feature = "noop")] @@ -465,13 +462,14 @@ pub unsafe extern "C" fn napi_register_module_v1( ) }); - MODULE_REGISTER_HOOK_CALLBACK.borrow_mut(|inner| { - if let Some(cb) = inner.get(¤t_thread_id) { - if let Err(e) = cb(env, exports) { - JsError::from(e).throw_into(env); - } + let module_register_hook_callback = MODULE_REGISTER_HOOK_CALLBACK + .read() + .expect("Read MODULE_REGISTER_HOOK_CALLBACK failed"); + if let Some(cb) = module_register_hook_callback.as_ref() { + if let Err(e) = cb(env, exports) { + JsError::from(e).throw_into(env); } - }); + } #[cfg(feature = "compat-mode")] { diff --git a/examples/napi/__tests__/__snapshots__/values.spec.ts.md b/examples/napi/__tests__/__snapshots__/values.spec.ts.md index f88164f3..a03296e4 100644 --- a/examples/napi/__tests__/__snapshots__/values.spec.ts.md +++ b/examples/napi/__tests__/__snapshots__/values.spec.ts.md @@ -41,6 +41,8 @@ Generated by [AVA](https://avajs.dev). ␊ type MaybePromise = T | Promise␊ ␊ + export declare const NAPI_RS_SYMBOL: symbol␊ + ␊ export declare class ExternalObject {␊ readonly '': {␊ readonly '': unique symbol␊ diff --git a/examples/napi/__tests__/__snapshots__/values.spec.ts.snap b/examples/napi/__tests__/__snapshots__/values.spec.ts.snap index 260f373534e1b2a0c8ff124a5fe96bcdd9b734af..cfd2ad4463e85830ecf2d1ba392cffbd994afc32 100644 GIT binary patch delta 6483 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 delta 6467 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 diff --git a/examples/napi/__tests__/values.spec.ts b/examples/napi/__tests__/values.spec.ts index 925b63b5..a9d6f47d 100644 --- a/examples/napi/__tests__/values.spec.ts +++ b/examples/napi/__tests__/values.spec.ts @@ -233,6 +233,8 @@ import { shutdownRuntime, callAsyncWithUnknownReturnValue, } from '../index.cjs' +// import other stuff in `#[napi(module_exports)]` +import nativeAddon from '../index.cjs' import { test } from './test.framework.js' @@ -1634,3 +1636,7 @@ test('extends javascript error', (t) => { t.true(typeof e.nativeStackTrace === 'string') } }) + +test('module exports', (t) => { + t.is(nativeAddon.NAPI_RS_SYMBOL, Symbol.for('NAPI_RS_SYMBOL')) +}) diff --git a/examples/napi/dts-header.d.ts b/examples/napi/dts-header.d.ts index 3986614f..f1295bd8 100644 --- a/examples/napi/dts-header.d.ts +++ b/examples/napi/dts-header.d.ts @@ -2,3 +2,5 @@ /* eslint-disable */ type MaybePromise = T | Promise + +export declare const NAPI_RS_SYMBOL: symbol diff --git a/examples/napi/example.wasi-browser.js b/examples/napi/example.wasi-browser.js index d8a35933..e7f885c6 100644 --- a/examples/napi/example.wasi-browser.js +++ b/examples/napi/example.wasi-browser.js @@ -60,6 +60,7 @@ const { } }, }) +export default __napiModule.exports export const Animal = __napiModule.exports.Animal export const AnimalWithDefaultConstructor = __napiModule.exports.AnimalWithDefaultConstructor export const AnotherClassForEither = __napiModule.exports.AnotherClassForEither diff --git a/examples/napi/example.wasi.cjs b/examples/napi/example.wasi.cjs index ac48974e..e94d7b69 100644 --- a/examples/napi/example.wasi.cjs +++ b/examples/napi/example.wasi.cjs @@ -84,6 +84,7 @@ const { instance: __napiInstance, module: __wasiModule, napiModule: __napiModule } }, }) +module.exports = __napiModule.exports module.exports.Animal = __napiModule.exports.Animal module.exports.AnimalWithDefaultConstructor = __napiModule.exports.AnimalWithDefaultConstructor module.exports.AnotherClassForEither = __napiModule.exports.AnotherClassForEither diff --git a/examples/napi/index.d.cts b/examples/napi/index.d.cts index 07a767fe..027c4529 100644 --- a/examples/napi/index.d.cts +++ b/examples/napi/index.d.cts @@ -3,6 +3,8 @@ type MaybePromise = T | Promise +export declare const NAPI_RS_SYMBOL: symbol + export declare class ExternalObject { readonly '': { readonly '': unique symbol diff --git a/examples/napi/package.json b/examples/napi/package.json index 2bd0996e..805dd855 100644 --- a/examples/napi/package.json +++ b/examples/napi/package.json @@ -8,8 +8,8 @@ "scripts": { "browser": "vite", "build": "napi-raw build --platform --js index.cjs --dts index.d.cts", - "test": "cross-env TS_NODE_PROJECT=./tsconfig.json node --import @oxc-node/core/register ../../node_modules/ava/entrypoints/cli.mjs", - "test-js": "ava" + "test": "ava reset-cache && cross-env TS_NODE_PROJECT=./tsconfig.json node --import @oxc-node/core/register ../../node_modules/ava/entrypoints/cli.mjs", + "test-js": "ava reset-cache && ava" }, "napi": { "binaryName": "example", diff --git a/examples/napi/src/lib.rs b/examples/napi/src/lib.rs index 39f19de4..516b47fb 100644 --- a/examples/napi/src/lib.rs +++ b/examples/napi/src/lib.rs @@ -8,7 +8,7 @@ #[cfg(not(target_family = "wasm"))] use napi::bindgen_prelude::create_custom_tokio_runtime; use napi::{ - bindgen_prelude::{Env, Object, Result}, + bindgen_prelude::{Object, Result, Symbol}, JsObjectValue, }; @@ -53,8 +53,8 @@ pub fn shutdown_runtime() { } #[napi(module_exports)] -pub fn exports(env: Env, mut export: Object) -> Result<()> { - let symbol = env.create_symbol(Some("NAPI_RS_SYMBOL"))?; +pub fn exports(mut export: Object) -> Result<()> { + let symbol = Symbol::for_desc("NAPI_RS_SYMBOL"); export.set_named_property("NAPI_RS_SYMBOL", symbol)?; Ok(()) }