diff --git a/.changeset/pre.json b/.changeset/pre.json index 37272853..d1deaa4c 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -1,18 +1,4 @@ { "mode": "pre", - "tag": "rc", - "initialVersions": { - "@react-native-node-api/test-app": "0.2.3", - "@react-native-node-api/cli-utils": "0.1.5", - "cmake-file-api": "0.1.2", - "cmake-rn": "0.8.0", - "ferric-cli": "0.4.3", - "@react-native-node-api/ferric-example": "0.1.3", - "gyp-to-cmake": "0.6.0", - "react-native-node-api": "1.1.3", - "@react-native-node-api/node-addon-examples": "0.1.2", - "@react-native-node-api/node-tests": "0.1.1", - "weak-node-api": "0.1.1" - }, - "changesets": [] + "tag": "rc" } diff --git a/.changeset/drop-shadowing-napi-shims.md b/.changeset/pre/drop-shadowing-napi-shims.md similarity index 100% rename from .changeset/drop-shadowing-napi-shims.md rename to .changeset/pre/drop-shadowing-napi-shims.md diff --git a/.changeset/eighty-moons-shave.md b/.changeset/pre/eighty-moons-shave.md similarity index 100% rename from .changeset/eighty-moons-shave.md rename to .changeset/pre/eighty-moons-shave.md diff --git a/.changeset/hermes-loads-addons.md b/.changeset/pre/hermes-loads-addons.md similarity index 100% rename from .changeset/hermes-loads-addons.md rename to .changeset/pre/hermes-loads-addons.md diff --git a/.changeset/hermes-napi-host-integration.md b/.changeset/pre/hermes-napi-host-integration.md similarity index 100% rename from .changeset/hermes-napi-host-integration.md rename to .changeset/pre/hermes-napi-host-integration.md diff --git a/.changeset/prebuilt-hermes-archive.md b/.changeset/pre/prebuilt-hermes-archive.md similarity index 100% rename from .changeset/prebuilt-hermes-archive.md rename to .changeset/pre/prebuilt-hermes-archive.md diff --git a/.changeset/prebuilt-hermes-command.md b/.changeset/pre/prebuilt-hermes-command.md similarity index 100% rename from .changeset/prebuilt-hermes-command.md rename to .changeset/pre/prebuilt-hermes-command.md diff --git a/.changeset/prebuilt-hermes-host-compiler.md b/.changeset/pre/prebuilt-hermes-host-compiler.md similarity index 100% rename from .changeset/prebuilt-hermes-host-compiler.md rename to .changeset/pre/prebuilt-hermes-host-compiler.md diff --git a/.changeset/prebuilt-hermes-visionos-env.md b/.changeset/pre/prebuilt-hermes-visionos-env.md similarity index 100% rename from .changeset/prebuilt-hermes-visionos-env.md rename to .changeset/pre/prebuilt-hermes-visionos-env.md diff --git a/.changeset/route-fatal-exception-through-errorutils.md b/.changeset/pre/route-fatal-exception-through-errorutils.md similarity index 100% rename from .changeset/route-fatal-exception-through-errorutils.md rename to .changeset/pre/route-fatal-exception-through-errorutils.md diff --git a/packages/cmake-rn/CHANGELOG.md b/packages/cmake-rn/CHANGELOG.md index 0db08b6d..bd734184 100644 --- a/packages/cmake-rn/CHANGELOG.md +++ b/packages/cmake-rn/CHANGELOG.md @@ -1,5 +1,21 @@ # cmake-rn +## 0.8.1-rc.0 + +### Patch Changes + +- Updated dependencies [3a51f6f] +- Updated dependencies [22ce1cb] +- Updated dependencies [5e44159] +- Updated dependencies [14cd2d2] +- Updated dependencies [e213b99] +- Updated dependencies [774fc07] +- Updated dependencies [648cd63] +- Updated dependencies [695925b] +- Updated dependencies [2f51021] + - react-native-node-api@2.0.0-rc.0 + - weak-node-api@0.2.0-rc.0 + ## 0.8.0 ### Minor Changes diff --git a/packages/cmake-rn/package.json b/packages/cmake-rn/package.json index 5a8c1ea3..ad16cf08 100644 --- a/packages/cmake-rn/package.json +++ b/packages/cmake-rn/package.json @@ -1,6 +1,6 @@ { "name": "cmake-rn", - "version": "0.8.0", + "version": "0.8.1-rc.0", "description": "Build React Native Node API modules with CMake", "homepage": "https://github.com/callstackincubator/react-native-node-api", "repository": { diff --git a/packages/ferric/CHANGELOG.md b/packages/ferric/CHANGELOG.md index be7df824..9d5900b7 100644 --- a/packages/ferric/CHANGELOG.md +++ b/packages/ferric/CHANGELOG.md @@ -1,5 +1,21 @@ # ferric-cli +## 0.4.4-rc.0 + +### Patch Changes + +- Updated dependencies [3a51f6f] +- Updated dependencies [22ce1cb] +- Updated dependencies [5e44159] +- Updated dependencies [14cd2d2] +- Updated dependencies [e213b99] +- Updated dependencies [774fc07] +- Updated dependencies [648cd63] +- Updated dependencies [695925b] +- Updated dependencies [2f51021] + - react-native-node-api@2.0.0-rc.0 + - weak-node-api@0.2.0-rc.0 + ## 0.4.3 ### Patch Changes diff --git a/packages/ferric/package.json b/packages/ferric/package.json index 0102d4dd..dff39d60 100644 --- a/packages/ferric/package.json +++ b/packages/ferric/package.json @@ -1,6 +1,6 @@ { "name": "ferric-cli", - "version": "0.4.3", + "version": "0.4.4-rc.0", "description": "Rust Node-API Modules for React Native", "homepage": "https://github.com/callstackincubator/react-native-node-api", "repository": { diff --git a/packages/host/CHANGELOG.md b/packages/host/CHANGELOG.md index 909f1010..dcdc40b7 100644 --- a/packages/host/CHANGELOG.md +++ b/packages/host/CHANGELOG.md @@ -1,5 +1,116 @@ # react-native-node-api +## 2.0.0-rc.0 + +### Major Changes + +- 22ce1cb: Adopt Hermes' first-party Node-API (the `hermesNapi` target on the `static_h` + branch) instead of patching Hermes with our own implementation. Addons now run + against a real Node-API environment created with `hermes_napi_create_env()`, one + per addon as in Node, and Node-API is bumped from v8 to v10. + + This drops support for React Native 0.79–0.81: the vendored Hermes is built from + a pinned `static_h` commit and requires the Hermes build scripts shipped with + React Native 0.87 and later. Older React Native versions are still served by + previously published releases. + +### Minor Changes + +- 14cd2d2: Provide a `hermes_napi_host` implementation to the Hermes Node-API environments. This enables thread-safe functions (`napi_create_threadsafe_function` and friends) and moves `napi_async_work` execution onto a worker pool — previously the `execute` callback ran on the JavaScript thread, blocking it for the duration of the work. The host is also in place before an addon's module init runs, so async work and thread-safe functions can now be created during initialization. +- e213b99: Stop compiling Hermes as part of every iOS app build. The Cocoapods integration + now resolves the pinned commit with `prebuilt-hermes` and hands the archive's + path to React Native through `HERMES_ENGINE_TARBALL_PATH` — so + `hermes-engine.podspec` vendors the prebuilt frameworks instead of running its + "Build Hermesc" and "Build Hermes" script phases. + + Building Hermes from source remains available and is the faster loop while + iterating on Hermes itself, since Xcode then rebuilds it incrementally: set + `REACT_NATIVE_NODE_API_HERMES_FROM_SOURCE=1` before `pod install`. Setting + `REACT_NATIVE_OVERRIDE_HERMES_DIR` or `HERMES_ENGINE_TARBALL_PATH` yourself + still takes precedence, and Android is unchanged. + +- 774fc07: Add a `prebuilt-hermes` command, which resolves an archive of the pinned Hermes + commit prebuilt for Apple platforms and prints its path. The archive holds the + `destroot` layout React Native's `hermes-engine.podspec` expects from a tarball + pointed at by `HERMES_ENGINE_TARBALL_PATH`, so an app that sets that variable + vendors the prebuilt frameworks rather than compiling Hermes as part of its own + build. + + It is resolved from a local cache, then from a release asset published for the + pinned commit, and only built locally if neither has it. Its name covers + everything that changes its contents — the pinned commit, the React Native + version whose `ReactCommon/jsi` it is compiled against, the build type and the + platforms — so a stale archive can never be mistaken for a matching one. + + Nothing consumes this yet: `pod install` still builds Hermes from source. + +- 2f51021: Route `napi_fatal_exception` through React Native's `ErrorUtils.reportFatalError` instead of unconditionally logging and calling `abort()`. This is what node-addon-api calls whenever an exception escapes a thread-safe-function callback, so a single throwing tsfn callback no longer hard-kills the app: in dev the error and its stack now surface in LogBox, in release RN's default handler rethrows into the native crash path, and apps can observe or handle it via `ErrorUtils.setGlobalHandler` — the moral equivalent of Node's `'uncaughtException'`. The previous stringify-and-abort behavior remains as a fallback for when `ErrorUtils`/`reportFatalError` isn't available (non-RN embedders, very early startup) or the handler itself throws. + +### Patch Changes + +- 3a51f6f: Drop the host's shadowing implementations of Node-API functions that Hermes' + first-party Node-API already provides, so addons observe Hermes' behavior + instead of the host's older shims: + - `napi_get_node_version` now reports Hermes' own version (release name + `"hermes"`) instead of unconditionally failing with `napi_generic_failure`. + - `napi_is_buffer` now returns `true` only for `Uint8Array`, matching Node, + instead of any `ArrayBuffer`/`TypedArray`. + - `napi_get_buffer_info` now returns `napi_invalid_arg` for non-`Uint8Array` + values, matching Node, instead of `napi_ok` with zeroed output. + - `napi_create_buffer_copy` now writes a non-`NULL` `result_data` argument, as + documented, instead of silently ignoring it. + - `napi_create_buffer`, `napi_create_external_buffer` and `napi_get_version` + are unchanged in observable behavior, now served by Hermes directly. + + This also fixes a bug where calling `napi_get_buffer_info` on a non-`Uint8Array` + typed array (e.g. a `Float64Array`) left a process-global flag corrupted, so + that every subsequent `napi_create_buffer`/`napi_create_external_buffer` call + produced the wrong typed array view. + + `napi_fatal_error` keeps its host-side implementation, so fatal Node-API + errors keep reaching logcat on Android instead of only stderr. + +- 5e44159: Load addons through Hermes' `hermes_napi_load_module` instead of the host's own + `dlopen` + `dlsym` implementation: + - Addons that register themselves by calling the deprecated + `napi_module_register` are now supported. Previously only addons exporting a + `napi_register_module_v1` symbol could be loaded, and the rest resolved to + `undefined`. + - A failing `requireNodeAddon` now throws an error naming the addon, the path + that was tried and the underlying reason (e.g. the `dlopen` error), instead + of silently resolving to `undefined`. + - `node_api_get_module_file_name` now reports the path the addon was loaded + from, instead of an empty string. + + This also opens a Node-API handle scope around loading and initializing an + addon. Without one, the `exports` object handed to the addon's initialization + function was not reachable by the garbage collector, so a collection triggered + during initialization could free it while the addon was still populating it. + +- 648cd63: Fix `prebuilt-hermes` failing to configure the host Hermes compiler. It passed + `CMAKE_OSX_ARCHITECTURES=arm64;x86_64` to build a universal `hermesc`, but a + multi-arch host configure makes llvh's feature try-compiles fail — standard + headers report as missing and the configure dies with "Host compiler appears to + require libatomic, but cannot find it". The host compiler is now configured the + way Hermes and React Native configure it, for the host architecture only. + + `hermesc` is consequently native to the Mac that built the archive, so the + archive name now carries the host architecture. An Intel Mac finds no published + archive for its architecture and builds its own, rather than downloading one + whose `hermesc` it cannot execute. + +- 695925b: Fix `prebuilt-hermes` failing to configure the host Hermes compiler with "Host + compiler appears to require libatomic, but cannot find it". It exported all + three deployment targets Hermes' `build-apple-framework.sh` can ask for to every + command it ran, including the host compiler build. `XROS_DEPLOYMENT_TARGET` is + also a clang driver variable, so clang targeted visionOS against the macOS + sysroot, and every API marked unavailable there — `pthread_mutexattr_init`, the + `fd_set` helpers reached through `unistd.h` — failed to compile. Each platform + build now gets only the deployment target it needs, and the host compiler build + gets none. +- Updated dependencies [22ce1cb] + - weak-node-api@0.2.0-rc.0 + ## 1.1.3 ### Patch Changes diff --git a/packages/host/package.json b/packages/host/package.json index cb9244bd..5ad0bcfc 100644 --- a/packages/host/package.json +++ b/packages/host/package.json @@ -1,6 +1,6 @@ { "name": "react-native-node-api", - "version": "1.1.3", + "version": "2.0.0-rc.0", "description": "Node-API for React Native", "homepage": "https://github.com/callstackincubator/react-native-node-api", "repository": { diff --git a/packages/weak-node-api/CHANGELOG.md b/packages/weak-node-api/CHANGELOG.md index 90dec646..38ac4fa2 100644 --- a/packages/weak-node-api/CHANGELOG.md +++ b/packages/weak-node-api/CHANGELOG.md @@ -1,5 +1,19 @@ # weak-node-api +## 0.2.0-rc.0 + +### Minor Changes + +- 22ce1cb: Adopt Hermes' first-party Node-API (the `hermesNapi` target on the `static_h` + branch) instead of patching Hermes with our own implementation. Addons now run + against a real Node-API environment created with `hermes_napi_create_env()`, one + per addon as in Node, and Node-API is bumped from v8 to v10. + + This drops support for React Native 0.79–0.81: the vendored Hermes is built from + a pinned `static_h` commit and requires the Hermes build scripts shipped with + React Native 0.87 and later. Older React Native versions are still served by + previously published releases. + ## 0.1.1 ### Patch Changes diff --git a/packages/weak-node-api/package.json b/packages/weak-node-api/package.json index 163192a6..1f567159 100644 --- a/packages/weak-node-api/package.json +++ b/packages/weak-node-api/package.json @@ -1,6 +1,6 @@ { "name": "weak-node-api", - "version": "0.1.1", + "version": "0.2.0-rc.0", "description": "A linkable and runtime-injectable Node-API", "homepage": "https://github.com/callstackincubator/react-native-node-api", "repository": {