From c53dd3716c6ea57d6c49cfb9841b0950423ec22d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Mon, 10 Aug 2026 22:27:41 +0200 Subject: [PATCH 1/4] Cut pre-releases from a "next" branch Enters changeset pre mode with the "rc" tag and lets the release workflow run on this branch, so 2.0.0-rc.N can be published under the "rc" dist tag while main keeps releasing stable versions. Pre mode is repo-wide state (.changeset/pre.json lists every package), which is why it lives here rather than on main. Exit pre mode before merging this branch back into main. Co-Authored-By: Claude Opus 5 (1M context) --- .changeset/pre.json | 18 ++++++++++++++++++ .github/workflows/release.yml | 1 + 2 files changed, 19 insertions(+) create mode 100644 .changeset/pre.json diff --git a/.changeset/pre.json b/.changeset/pre.json new file mode 100644 index 00000000..d58b8f48 --- /dev/null +++ b/.changeset/pre.json @@ -0,0 +1,18 @@ +{ + "mode": "pre", + "tag": "rc", + "initialVersions": { + "@react-native-node-api/test-app": "0.2.2", + "@react-native-node-api/cli-utils": "0.1.4", + "cmake-file-api": "0.1.2", + "cmake-rn": "0.6.3", + "ferric-cli": "0.3.11", + "@react-native-node-api/ferric-example": "0.1.2", + "gyp-to-cmake": "0.5.3", + "react-native-node-api": "1.0.1", + "@react-native-node-api/node-addon-examples": "0.1.1", + "@react-native-node-api/node-tests": "0.1.1", + "weak-node-api": "0.1.1" + }, + "changesets": [] +} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e4c89d77..8cf46c21 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,6 +14,7 @@ on: push: branches: - main + - next concurrency: ${{ github.workflow }}-${{ github.ref }} From d9f17284d9e2b9a9446927544211a53e94027bcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Mon, 10 Aug 2026 22:32:56 +0200 Subject: [PATCH 2/4] Run Check on the next branch too Now that next is the default branch, pushes to it should get the same coverage main gets, including the jobs gated on being on the trunk. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/check.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 533bdece..cb845c5c 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -18,6 +18,7 @@ on: push: branches: - main + - next pull_request: types: [opened, synchronize, reopened] @@ -107,7 +108,7 @@ jobs: - run: pnpm run bootstrap - run: pnpm test weak-node-api-tests: - if: github.ref == 'refs/heads/main' || contains(github.event.pull_request.labels.*.name, 'weak-node-api') + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/next' || contains(github.event.pull_request.labels.*.name, 'weak-node-api') strategy: fail-fast: false matrix: @@ -143,7 +144,7 @@ jobs: ctest --test-dir build --output-on-failure working-directory: packages/weak-node-api test-ios: - if: github.ref == 'refs/heads/main' || contains(github.event.pull_request.labels.*.name, 'Apple 🍎') + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/next' || contains(github.event.pull_request.labels.*.name, 'Apple 🍎') name: Test app (iOS) runs-on: macos-latest steps: @@ -325,7 +326,7 @@ jobs: name: emulator-logcat path: apps/test-app/emulator-logcat.txt test-ferric-apple-triplets: - if: github.ref == 'refs/heads/main' || contains(github.event.pull_request.labels.*.name, 'Ferric 🦀') + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/next' || contains(github.event.pull_request.labels.*.name, 'Ferric 🦀') name: Test ferric Apple triplets runs-on: macos-latest steps: From 58b213c662ddbad18960d9c83c487be216478b87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Tue, 11 Aug 2026 06:36:39 +0200 Subject: [PATCH 3/4] Adopt Hermes' first-party Node-API (static_h) (#372) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Phase 1: vendor static_h Hermes, bump to RN 0.87 nightly Begin migrating off the kraenhansen/hermes fork + JSI-patching path toward Hermes' first-party Node-API (the static_h branch). - vendor-hermes: shallow-fetch facebook/hermes at pinned static_h SHA 0ae42446d1ae669508368b0a18e60c789f76735d; drop the JSI-header copy step - patch-hermes.rb: rely on REACT_NATIVE_OVERRIDE_HERMES_DIR alone to trigger build-from-source; drop the no-op BUILD_FROM_SOURCE var and the obsolete RCT_USE_PREBUILT_RNCORE / JSI-patch guard - CxxNodeApiHostModule: stub env=nullptr (real env arrives in Phase 2 via hermes_napi_create_env) - bump react-native to 0.87.0-nightly-20260529-88857d22f (+ test-app deps, react-native-test-app 5.x); regenerate lockfile - RN 0.87 fallout: add @types/babel__core, fix test-app tsconfig extends for the tightened @react-native/typescript-config exports map, delete the podspec test asserting the removed guard Co-Authored-By: Claude Opus 4.8 (1M context) * Resolve Xcode app project resiliently in workspaces react-native-test-app 5.x generates the app's ReactTestApp.xcodeproj under the nearest node_modules, which in a workspace is the app-local node_modules (apps/test-app/node_modules/.generated), not the hoisted root. The workspace can also accumulate stale references to a project under a different node_modules. findXcodeProject took the first fileRef unconditionally, which could be the stale (non-existent) reference or the Pods project. Resolve every app project reference and pick the first whose project.pbxproj exists on disk, ignoring Pods.xcodeproj. Co-Authored-By: Claude Opus 4.8 (1M context) * Fix test-app tooling for RN 0.87 / Metro 0.84 - Bump @rnx-kit/metro-config to ^2.2.4: 2.1.1 called metro-config's exclusionList as a bare function, but Metro 0.84 changed that module to a { default } export, breaking `react-native start`. - Gradle wrapper bumped to 9.3.1 by react-native-test-app 5.x's configureGradleWrapper during pod install (RN 0.87 alignment). Co-Authored-By: Claude Opus 4.8 (1M context) * Phase 2: create a real Node-API env via hermes_napi_create_env Replace the `env = nullptr` stub in CxxNodeApiHostModule with a real Node-API environment: cast the JSI runtime to `IHermes`, read the underlying `vm::Runtime*` via `getVMRuntimeUnsafe()`, and create the env with `hermes_napi_create_env(vm, nullptr)`. The env is owned by the runtime and cached on the module (shared across all addons). This flips the Phase 1 baseline abort (`assert(status == napi_ok)` right after `napi_create_object(env=nullptr, …)`) green: with `MOCHA_REMOTE_CONTEXT=allTests` the iOS-sim suite now reports 14 passing (node-addon-examples getting-started incl. the Rust ferric addon, buffers, async, and a js-native-api node-test). Linking note: the RN `hermesvm` framework force-loads `hermesNapi`, and the public `hermes_napi_*` entry points are exported from it as long as Hermes is built from a checkout that includes facebook/hermes #2044 ("Export public hermes_napi entry points with NAPI macros") — which the pinned SHA (0ae42446) already contains. No pod-side linker surgery or source patching is required; just ensure the vendored checkout is actually at the pinned SHA (a stale pre-#2044 checkout is what stripped the symbol during bring-up). Co-Authored-By: Claude Opus 4.8 (1M context) * Phase 2: bump Node-API to v10, drop engine/runtime split All Node-API symbols are now sourced from Hermes' hermesNapi, so the old engine (js_native_api → libhermes.so) / runtime (node_api → libnode-api-host.so) distinction and the hand-maintained IMPLEMENTED_RUNTIME_FUNCTIONS allow-list are obsolete. - weak-node-api: getNodeApiFunctions defaults to v10 and no longer computes the dead `kind`/`libraryPath` fields; CMake compiles the generated weak_node_api.cpp at NAPI_VERSION=10 (145 → 155 symbols, adding the v9/v10 node_api_* surface). - generate-injector.mts: bind every symbol (no filter) and emit `#include ` first so the injector TU also compiles at v10. - Versions.hpp: guarded bump to NAPI_VERSION 10. Regenerated (gitignored) WeakNodeApiInjector.cpp + weak-node-api/generated now expose all 155 symbols incl. TSFN and napi_make_callback. Verified: build, prettier, lint, workspace unit tests, and the weak-node-api native build + ctest all pass. iOS e2e pending (rides the cold re-vendor). Co-Authored-By: Claude Opus 4.8 (1M context) * vendor-hermes: export public hermes_napi_* entry points The clean Hermes build at the pinned SHA does NOT export hermes_napi_create_env (and the other hermes_napi_* entry points). They are declared in API/napi/hermes_napi.h with NAPI_EXTERN (visibility "default") but — unlike the sibling js_native_api.h / node_api.h headers — without any extern "C" wrapping, so they get C++ linkage. The mangled C++ symbols stay out of the framework's dynamic export table under Hermes' global -fvisibility=hidden, and a from-scratch build fails at the app link with "Undefined symbol: hermes_napi_create_env". vendor-hermes now wraps the hermes_napi.h declarations in EXTERN_C_START / EXTERN_C_END (both available via the node_api.h include), giving the entry points C linkage so they export under their unmangled C names. This mirrors the upstream fix in facebook/hermes#2106. The patch is idempotent (guarded on EXTERN_C_START) and asserts its anchors exist so a future Hermes bump fails loudly rather than silently no-op'ing. Also ignore **/build-tests/** in ESLint (CMake writes compiler_depend.ts dependency files there that aren't real TypeScript). Co-Authored-By: Claude Opus 4.8 (1M context) * vendor-hermes: apply prettier formatting Collapse the single-argument `.replace()` call in patchHermesNapiVisibility onto one line to satisfy prettier:check (fixup for the hermes_napi patch). Co-Authored-By: Claude Opus 4.8 (1M context) * Regenerate pnpm-lock.yaml for RN 0.87 dependency bumps Rebased onto main after the npm->pnpm migration (#381). The original PR's two package-lock.json maintenance commits (restore public registry URLs, restore pruned optional platform binaries) are dropped: both addressed npm-specific lockfile problems that no longer exist under pnpm. Regenerate pnpm-lock.yaml against the RN 0.87 nightly / react-native-test-app 5.x / @rnx-kit/metro-config bumps so the lockfile matches the workspace manifests. Verified with pnpm install --frozen-lockfile. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01TVfanKvtyfSsoMgZv3DJtY * vendor-hermes: advance pin to include upstream napi C-linkage fix Move the pinned Hermes commit forward from 0ae42446 to efcf68e2 on the static_h branch (a descendant, 18 commits ahead). The only relevant change in that range is facebook/hermes#2106 "give hermes_napi.h public API C linkage", which wraps the public hermes_napi_* entry points in extern "C". That is exactly the fix we were applying locally after cloning: without C linkage the mangled hermes_napi_create_env symbol stayed out of the framework export table under Hermes' global -fvisibility=hidden. Now that the fix is upstream at the pinned commit, drop patchHermesNapiVisibility and its header-anchor constants entirely — the vendored checkout exports the entry points as-is. No commit in the bumped range touches getVMRuntimeUnsafe or the IHermes JSI interface we depend on, so the unstable-accessor rationale for pinning still holds. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01TVfanKvtyfSsoMgZv3DJtY * host: match hermes_napi_create_env C linkage after upstream #2106 The pinned Hermes commit now includes facebook/hermes#2106, which wraps the public hermes_napi_* entry points in extern "C". Hermes therefore exports the unmangled C symbol for hermes_napi_create_env. CxxNodeApiHostModule forward-declares that entry point (to avoid including Hermes' node_api.h) but did so with C++ linkage, so it referenced the mangled name. After the pin bump the two no longer matched and the iOS app failed to link with "Undefined symbol: hermes_napi_create_env". Wrap the forward declaration in extern "C" so the reference resolves to the exported unmangled symbol. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01TVfanKvtyfSsoMgZv3DJtY * android: inject ExecOperations for Gradle 9 compatibility (#386) RN 0.87 bumps the Gradle wrapper to 9.x, which removed Project.exec(). The linkNodeApiModules task used the bare `exec {}` closure in its doLast action, failing every Android build (and gradle.test.ts on all platforms) with "Could not find method exec()". Inject the ExecOperations service via an @Inject-annotated interface and call injectedExecOps.execOps.exec {} instead. Greens the ubuntu and macOS unit-test lanes. Windows surfaces a separate, pre-existing RN 0.87 / Gradle 9 issue (missing react-native/tmp projectDir) tracked separately. * android: patch RN settings.gradle.kts /tmp projectDir for Windows (#387) * android: patch RN settings.gradle.kts /tmp projectDir for Windows The Windows unit-test lane failed configuring the React Native build-from- source composite build: Configuring project ':packages:react-native' without an existing directory is not allowed. The configured projectDirectory '...\react-native\tmp' does not exist React Native's own settings.gradle.kts declares the intermediate container projects :packages and :packages:react-native with projectDir = file("/tmp"), purely to satisfy Gradle 9's rule that every project in a path have an existing folder. "/tmp" exists on the posix CI hosts but on Windows it is not an absolute path, so Gradle resolves it to a non-existent \tmp and the build fails before any task runs. This is why only windows-latest was red while ubuntu and macOS passed. Add a pnpm patch replacing file("/tmp") with file(System.getProperty("java.io.tmpdir", "/tmp")): the JVM temp dir is "/tmp" on posix and %TEMP% on Windows, both of which always exist. Remove the patch once React Native stops hardcoding "/tmp" upstream. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01TVfanKvtyfSsoMgZv3DJtY * android: point RN /tmp patch at the merged upstream fix The upstream fix landed on react-native main as 908872a6 (2026-07-28, facebook/react-native#57706), after the 0.87 branch cut — so 0.87-stable does not carry it. Record that in the patch comment so the removal gate is a concrete react-native version rather than "once upstream fixes it". Co-Authored-By: Claude Opus 5 (1M context) --------- Co-authored-by: Claude * host: apply the Kotlin plugin only when built-in Kotlin is unavailable AGP 9 ships built-in Kotlin support and enables it by default, which registers the `kotlin` extension itself. Applying `kotlin-android` on top of that fails the consumer's build with "Cannot add extension with name 'kotlin'", so any consumer who has migrated off the `builtInKotlin=false` opt-out currently cannot build against this package. Gate the plugin on the AGP major version and the consumer's opt-out, so the library works both for consumers still on AGP 8 (or opted out while they migrate) and for those already on built-in Kotlin. React Native's own ReactAndroid no longer applies the Kotlin plugin either, as of 0.87. Reuses the `com.android.Version` idiom already used by supportsNamespace(). Co-Authored-By: Claude Opus 5 (1M context) * deps: bump react-native to 0.87.0-rc.4 Moves off the 0.87.0-nightly-20260529 pin onto the 0.87 release candidate. The motivating change is AGP: the nightly still resolved AGP 8.12, while AGP 9.2.1 landed on the 0.87 line in mid-June. AGP 9 is what react-native-test-app assumes for React Native >= 0.87 (it forces Gradle 9.4.1 and then uses the built-in Kotlin `kotlin {}` extension), so the test app could not configure against the old pin. The Windows `/tmp` projectDir patch is unchanged — settings.gradle.kts is byte-identical between the two versions (same blob 2036e0f), so only the file name and the patchedDependencies key move. The fix for it is still main-only, so the patch stays until we are on 0.88+. Also switches the two React Native facing tsconfigs to nodenext module resolution. 0.87.0-rc.4 drops react-native's top-level `types` field and flips the default `types` export condition to the generated strict API, neither of which the node10 resolution inherited from @tsconfig/react-native can see — the package stopped resolving entirely (TS2688). @tsconfig/react-native is stale at every published version through 3.0.9, so there is nothing to bump there. Emit is unaffected: both projects still produce CommonJS. The strict API exports TurboModule and TurboModuleRegistry, and still references react-native's globals, so console/require stay typed. Co-Authored-By: Claude Opus 5 (1M context) * test-app: adopt built-in Kotlin on Android, opt out of the AGP 9 DSL With React Native 0.87 the test app builds against AGP 9.2.1, where built-in Kotlin is enabled by default. Nothing in the build needs the Kotlin plugin any more: ReactAndroid dropped it upstream, react-native-test-app's modules are gated on it, and react-native-node-api now only applies it when built-in Kotlin is unavailable. So unlike the React Native app template, we do not set `android.builtInKotlin=false`. The new DSL is a different matter and stays opted out: both of react-native-test-app's Gradle modules still use the old one, and that is third-party code. AGP 10 removes this opt out, so it is tracked in #389 along with the upstream code that has to migrate first. Also pins the Gradle wrapper at 9.4.1, which react-native-test-app rewrites it to at run time for React Native >= 0.87 — pinning it ourselves keeps CI from building with a dirty working tree. Co-Authored-By: Claude Opus 5 (1M context) * deps: bump react-native to a 0.88 nightly and drop the Windows patch React Native 57706 ("Fix build-from-source on Windows: use JVM temp dir instead of hardcoded /tmp", 908872a6, 2026-07-28) landed on main after the 0.87 branch cut, so it ships on the 0.88 line and not in 0.87.0-rc.4. Verified in the published artifact, not just the tree: the tarball for 0.88.0-nightly-20260809-db662caea carries the fix in settings.gradle.kts, the exact file (and path) we were patching. Our patch is now redundant. Dropping it is what makes Android build. Patching a dependency makes pnpm encode the patch hash into the virtual store directory as `..._patch_hash=`, and prefab — which the Android Gradle plugin runs over react-native's package directory — parses a positional path containing `=` as an option name and dies with "Error: no such option". That is https://github.com/google/prefab/issues/187, open since March and hitting every pnpm user with a patched dependency. With no patched dependencies there is no `=` in the store, so the bug goes untriggered. Requires react-native-test-app >= 5.4.8, which widened its peer range to `0.76 - 0.87 || >=0.88.0-0 <0.88.0` — a prerelease window covering exactly these nightlies. 5.4.5 did not accept 0.88 at all, so the floor moves up. Everything the AGP 9 work depends on is unchanged on this line: AGP 9.2.1, Kotlin 2.2.0, and react-native-test-app still resolves Gradle 9.4.1 for 0.88, matching the pinned wrapper. Co-Authored-By: Claude Opus 5 (1M context) * host: link the renamed hermesvm prefab module on Android React Native renamed the prefab module published by `hermes-engine` from `libhermes` to `hermesvm` between 0.81 and 0.83 — the Android counterpart of the `hermesvm` framework this branch already links against on Apple platforms. This CMakeLists has been on `libhermes` since #308, which was correct while the repo targeted 0.81, and stayed behind when this branch jumped to 0.87/0.88. Without it CMake fails to configure: Target "node-api-host" links to target "hermes-engine::libhermes" but the target was not found. Co-Authored-By: Claude Opus 5 (1M context) * test-app: opt out of built-in Kotlin after all fa4424b deliberately left `android.builtInKotlin` unset, on the reasoning that nothing in the build still needs the Kotlin plugin. That reasoning was wrong, and only a real Android build showed it: ComponentActivity.kt:33:9 Unresolved reference 'ComponentActivityDelegate' react-native-test-app's app module pulls in version-specific sources with `main.java.srcDirs += [...]` — src/reactactivitydelegate-0.75/java, src/reactapplication-0.76/java, src/camera/java and others. The Kotlin plugin compiles the Kotlin in those directories; AGP's built-in Kotlin only picks up the standard source directories, so every symbol defined in an added one goes unresolved (`testApp`, `reactHost`, `canUseCamera`, `ComponentBottomSheetDialogFragment`, …). Their `useBuiltInKotlin` gate avoids the plugin-conflict failure but does not make the module itself built-in-Kotlin ready, which is why their template ships this opt out. react-native-node-api itself stays built-in-Kotlin ready via the conditional in ee41927 — with this flag set it applies the Kotlin plugin, and for a consumer on built-in Kotlin it steps aside. This is only about the test harness. Co-Authored-By: Claude Opus 5 (1M context) * test-app: fail the Android run as soon as the app crashes `mocha-remote` waits indefinitely for a client to connect and has no notion of the app dying. When the test app crashed on startup, nothing ever connected: the run sat idle until the 75 minute step timeout, with the actual cause — a `FATAL EXCEPTION` one second after `am start` — only visible by downloading the logcat artifact afterwards. Add a watchdog that follows `adb logcat -b crash` alongside the app and exits non-zero when the crash buffer names the test app, printing the stack trace inline. `concurrently --kill-others-on-fail` then tears down Metro and the app run, and `mocha-remote` inherits the failing exit code, so a startup crash fails the job in seconds rather than in an hour. It deliberately only reacts to crashes — an app that hangs or never launches still falls back to the job timeout. Co-Authored-By: Claude Opus 5 (1M context) * test-app: don't let the crash watchdog hold the step's stderr open The watchdog correctly failed the run on the first crash it saw, but the job kept hanging afterwards: `@actions/exec` — how the emulator-runner action runs each line of the step's script — resolves a command only once the stdio streams it handed out are closed, and the `adb logcat` child inherited our stderr. Exiting orphaned it, so that pipe stayed open and the step waited on a dangling file descriptor long after everything else had been torn down. Give the child no stderr of its own and kill it on the way out. Verified by spawning the watchdog the way `@actions/exec` does: before, the process exited after 1.6s but its stdio never closed; now both happen together. Co-Authored-By: Claude Opus 5 (1M context) * vendor-hermes: advance the pin past Hermes' JSI_UNSTABLE default flip The Android test app crashed on startup, in `NodeApiHostPackage.`: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZTIN8facebook3jsi10SerializedE" referenced by ".../libhermesvm.so" com.facebook.soloader.SoLoaderDSONotFoundError: couldn't find DSO to load: libhermesvm.so That symbol is `typeinfo for facebook::jsi::Serialized`. JSI's `Serialized` / `ISerialization` APIs sit behind `#ifdef JSI_UNSTABLE`, and React Native never defines it when building the `libjsi.so` it ships in the ReactAndroid AAR. Our pinned Hermes still defaulted `JSI_UNSTABLE` to ON, so `hermesvm` compiled those APIs in and referenced symbols that nothing in the APK defines. Apple builds are unaffected because JSI is compiled into the `hermesvm` framework itself; on Android the two are separate shared libraries, and RN's hermes-engine build imports `libjsi.so` rather than packaging the copy Hermes builds for itself. facebook/hermes 5a795c9f8 ("Fix: JSI_UNSTABLE CMake flag should be OFF by default") is the immediate child of the previous pin, so this picks up the one-line fix and nothing else. Verified by rebuilding the release APK for x86_64: `libhermesvm.so` no longer references `jsi::Serialized`, and every undefined JSI symbol it does have is defined by a library shipped in the APK. Co-Authored-By: Claude Opus 5 (1M context) * host: create one Node-API env per addon Node creates a fresh napi_env for every addon it loads (see the "Create a new napi_env for this specific module" branch of napi_module_register_by_symbol in src/node_api.cc), because the env holds addon-scoped state: instance data, last error info and the addon's Node-API version. Sharing one env across all addons breaks that isolation most visibly for instance data, where the single slot on napi_env__ means two addons built on Napi::Addon clobber each other — the second registration finalizes the first addon's object, and Addon::Unwrap then casts the wrong type. Move the env onto the addon record and create it during initialization. hermes_napi_create_env() allocates a fresh env per call and registers its teardown with the vm::Runtime, so ownership is unchanged: each env is torn down with the runtime. The call invoker registry is already keyed by env, so it needs no change beyond dropping entries when an env goes away — with an env per addon those would otherwise accumulate across reloads. Co-Authored-By: Claude Opus 5 (1M context) * Add changeset for the static_h Node-API adoption Co-Authored-By: Claude Opus 5 (1M context) * docs: describe the vendored Hermes instead of a patched one Node-API is implemented in Hermes itself now, so nothing is patched or forked: we build from a pinned commit on the static_h branch. Also corrects HOW-IT-WORKS, which described the removed jsi::Runtime::createNodeApiEnv. Co-Authored-By: Claude Opus 5 (1M context) * docs: describe the Node-API host struct in HOW-IT-WORKS Hermes implements both js_native_api.h and node_api.h; what it can't supply without libuv are the scheduling primitives, which the host passes in as a hermes_napi_host struct. Co-Authored-By: Claude Opus 5 (1M context) --------- Co-authored-by: Claude Opus 4.8 (1M context) --- .changeset/eighty-moons-shave.md | 14 + AGENTS.md | 2 +- README.md | 12 +- apps/test-app/android/gradle.properties | 20 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- apps/test-app/package.json | 17 +- .../scripts/android-crash-watchdog.mts | 101 ++ apps/test-app/tsconfig.json | 2 +- apps/test-app/tsconfig.node-scripts.json | 2 +- docs/ANDROID.md | 6 +- docs/HOW-IT-WORKS.md | 16 +- eslint.config.js | 1 + package.json | 2 +- packages/host/android/CMakeLists.txt | 2 +- packages/host/android/build.gradle | 30 +- packages/host/cpp/CxxNodeApiHostModule.cpp | 38 +- packages/host/cpp/CxxNodeApiHostModule.hpp | 8 + packages/host/cpp/RuntimeNodeApiAsync.cpp | 11 + packages/host/cpp/Versions.hpp | 6 +- packages/host/package.json | 2 +- packages/host/scripts/generate-injector.mts | 29 +- packages/host/scripts/patch-hermes.rb | 33 +- packages/host/scripts/patch-xcode-project.rb | 6 +- packages/host/src/node/cli/hermes.ts | 124 +- packages/host/src/node/cli/xcode-helpers.ts | 37 +- packages/host/src/node/podspec.test.ts | 24 - packages/host/tsconfig.react-native.json | 2 + .../node-addon-examples/tsconfig.tests.json | 3 +- packages/weak-node-api/CMakeLists.txt | 2 +- .../weak-node-api/src/node-api-functions.ts | 18 +- pnpm-lock.yaml | 1198 +++++------------ 31 files changed, 702 insertions(+), 1068 deletions(-) create mode 100644 .changeset/eighty-moons-shave.md create mode 100644 apps/test-app/scripts/android-crash-watchdog.mts delete mode 100644 packages/host/src/node/podspec.test.ts diff --git a/.changeset/eighty-moons-shave.md b/.changeset/eighty-moons-shave.md new file mode 100644 index 00000000..0d68f8c8 --- /dev/null +++ b/.changeset/eighty-moons-shave.md @@ -0,0 +1,14 @@ +--- +"react-native-node-api": major +"weak-node-api": minor +--- + +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. diff --git a/AGENTS.md b/AGENTS.md index 5cb3f1c4..ca13226d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -60,7 +60,7 @@ patch or workaround: ## Critical Build Dependencies -- **Custom Hermes**: Currently depends on a patched Hermes with Node-API support (see [facebook/hermes#1377](https://github.com/facebook/hermes/pull/1377)) +- **Vendored Hermes**: Builds Hermes from a pinned commit on the `static_h` branch, which carries Hermes' first-party Node-API implementation (`API/napi`, target `hermesNapi`). The pin lives in `packages/host/src/node/cli/hermes.ts` and is fetched by the `vendor-hermes` command. - **Prebuilt Binary Spec**: All tools must output to the exact naming scheme: - Android: `*.android.node/` with jniLibs structure + `react-native-node-api-module` marker file - iOS: `*.apple.node` (XCFramework renamed) + marker file diff --git a/README.md b/README.md index a88f3fef..308d5407 100644 --- a/README.md +++ b/README.md @@ -19,8 +19,9 @@ ## How does this work? > [!IMPORTANT] -> This library is currently dependent on a custom version of Hermes and therefore has a very limited range of supported React Native versions. -> Once the [PR adding Node-API support to Hermes](https://github.com/facebook/hermes/pull/1377) merges, we expect this restriction to be lifted. +> This library builds Hermes from a pinned commit on its `static_h` branch, which carries [Hermes' first-party Node-API implementation](https://github.com/facebook/hermes/tree/static_h/API/napi). +> React Native has not shipped that Hermes yet, so the range of supported React Native versions is very limited — see the `react-native` peer dependency of the [host package](packages/host/package.json) for the version we currently build against. +> We expect this restriction to be lifted once React Native ships a Hermes with Node-API included. > [!NOTE] > This library only works for iOS and Android and we want to eventually support React Native for Windows, macOS, visionOS and other out-of-tree platforms too. @@ -35,10 +36,9 @@ This mono-repository hosts the development of a few packages: Responsible for adding Node-API support to your React Native application: -- Declares a Podspec which downloads a special version of Hermes, with Node-API support, - - instructing React Native's Hermes Podspecs to compile from this custom source-code. - - patching React Native's JSI copy, with the updates introduced by our special version of Hermes. - - we expect this to eventually be removed, as Node-API support gets merged into Hermes upstream. +- Declares a Podspec which vendors Hermes from a pinned commit on its `static_h` branch, where Node-API is implemented, + - instructing React Native's Hermes Podspecs to compile from this checkout. + - we expect this to eventually be removed, as React Native starts shipping a Hermes with Node-API included. - Automatically discovers and adds Node-API binaries, matching the [the prebuilt binary specification](./docs/PREBUILDS.md) - This is driven by the platform specific build tools (through the Podspec on iOS and eventually Gradle on Android) - Implements a TurboModule with a `requireNodeAddon` function responsible for diff --git a/apps/test-app/android/gradle.properties b/apps/test-app/android/gradle.properties index 08ca7f53..df4582c0 100644 --- a/apps/test-app/android/gradle.properties +++ b/apps/test-app/android/gradle.properties @@ -50,4 +50,22 @@ react.buildFromSource=true #ANDROID_NDK_VERSION=26.1.10909125 # Version of Kotlin to build against. -#KOTLIN_VERSION=1.8.22 \ No newline at end of file +#KOTLIN_VERSION=1.8.22 + +# Opt out of built-in Kotlin and the new DSL, both of which ship enabled in +# AGP 9. AGP 10 removes both opt outs, so they are on borrowed time — tracked in +# https://github.com/callstackincubator/react-native-node-api/issues/389, which +# links the upstream code that has to migrate first. +# +# Both are blocked on react-native-test-app, not on us. Its Gradle modules still +# use the old DSL (`compileSdkVersion`, `lintOptions`), and its app module adds +# version-specific Kotlin sources through `main.java.srcDirs +=`. The Kotlin +# plugin compiles those; AGP's built-in Kotlin only picks up the standard source +# directories, so building without this leaves every symbol defined in an added +# directory (`testApp`, `ComponentActivityDelegate`, …) unresolved. +# +# Note that react-native-node-api itself is built-in-Kotlin ready — it applies +# the Kotlin plugin only when built-in Kotlin is unavailable — so this is purely +# about the test harness. +android.builtInKotlin=false +android.newDsl=false diff --git a/apps/test-app/android/gradle/wrapper/gradle-wrapper.properties b/apps/test-app/android/gradle/wrapper/gradle-wrapper.properties index d4081da4..c61a118f 100644 --- a/apps/test-app/android/gradle/wrapper/gradle-wrapper.properties +++ b/apps/test-app/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/apps/test-app/package.json b/apps/test-app/package.json index b4dea4aa..1383025e 100644 --- a/apps/test-app/package.json +++ b/apps/test-app/package.json @@ -6,10 +6,11 @@ "scripts": { "metro": "react-native start --no-interactive", "android": "react-native run-android --no-packager --active-arch-only", + "android:crash-watchdog": "node scripts/android-crash-watchdog.mts", "ios": "react-native run-ios --no-packager", "pod-install": "cd ios && pod install", "mocha-and-metro": "mocha-remote --watch -- react-native start", - "test:android": "mocha-remote --exit-on-error -- concurrently --kill-others-on-fail --passthrough-arguments npm:metro 'npm:android -- {@}' --", + "test:android": "mocha-remote --exit-on-error -- concurrently --kill-others-on-fail --passthrough-arguments npm:metro 'npm:android -- {@}' npm:android:crash-watchdog --", "test:android:allTests": "MOCHA_REMOTE_CONTEXT=allTests node --run test:android -- ", "test:android:nodeAddonExamples": "MOCHA_REMOTE_CONTEXT=nodeAddonExamples node --run test:android -- ", "test:android:nodeTests": "MOCHA_REMOTE_CONTEXT=nodeTests node --run test:android -- ", @@ -30,20 +31,20 @@ "@react-native-node-api/ferric-example": "workspace:*", "@react-native-node-api/node-addon-examples": "workspace:*", "@react-native-node-api/node-tests": "workspace:*", - "@react-native/babel-preset": "0.81.4", - "@react-native/metro-config": "0.81.4", - "@react-native/typescript-config": "0.81.4", - "@rnx-kit/metro-config": "^2.1.1", + "@react-native/babel-preset": "0.88.0-nightly-20260809-db662caea", + "@react-native/metro-config": "0.88.0-nightly-20260809-db662caea", + "@react-native/typescript-config": "0.88.0-nightly-20260809-db662caea", + "@rnx-kit/metro-config": "^2.2.4", "@types/mocha": "^10.0.10", "@types/react": "^19.1.0", "concurrently": "^9.1.2", "mocha": "^11.6.0", "mocha-remote-cli": "^1.13.2", "mocha-remote-react-native": "^1.13.2", - "react": "19.1.0", - "react-native": "0.81.4", + "react": "19.2.3", + "react-native": "0.88.0-nightly-20260809-db662caea", "react-native-node-api": "workspace:*", - "react-native-test-app": "^4.4.7", + "react-native-test-app": "^5.4.8", "weak-node-api": "workspace:*" } } diff --git a/apps/test-app/scripts/android-crash-watchdog.mts b/apps/test-app/scripts/android-crash-watchdog.mts new file mode 100644 index 00000000..40f2423a --- /dev/null +++ b/apps/test-app/scripts/android-crash-watchdog.mts @@ -0,0 +1,101 @@ +/** + * Fails the Android test run as soon as the app crashes. + * + * `mocha-remote` waits indefinitely for a client to connect and has no notion + * of the app dying: when the app crashes on startup, nothing ever connects and + * the run hangs until the CI job hits its timeout — 68 minutes of an emulator + * idling for a crash that happened one second after `am start`. + * + * Run alongside the app (through `concurrently --kill-others-on-fail`), this + * turns such a crash into an immediate failure with the stack trace inlined in + * the log, instead of a timeout with the cause buried in a logcat artifact. + * + * It only reacts to crashes: a hung or never-launched app still relies on the + * job timeout. + */ +import cp from "node:child_process"; +import readline from "node:readline"; + +// The application id used by react-native-test-app, which the CI workflow also +// hardcodes when uninstalling any leftover copy of the app. +const APP_ID = "com.microsoft.reacttestapp"; + +// How long to keep reading after the first line mentioning the app, to capture +// the rest of the stack trace before exiting. +const TRACE_GRACE_MS = 1000; + +/** + * Runs adb, resolving false if it couldn't run at all (not installed, no + * device, etc). The watchdog stays out of the way in that case: the build or + * the run itself will fail with a better message than anything we could add. + */ +function adb(...args: string[]): Promise { + return new Promise((resolve) => { + const child = cp.spawn("adb", args, { stdio: "ignore" }); + child.on("error", () => resolve(false)); + child.on("close", (code) => resolve(code === 0)); + }); +} + +function skip(reason: string): never { + console.warn(`[crash-watchdog] Not watching for crashes: ${reason}`); + process.exit(0); +} + +async function main() { + if (!(await adb("wait-for-device"))) { + skip("failed to wait for an adb device"); + } + + // Drop any crash from an earlier run, so we only react to this one. The app + // hasn't been installed yet at this point, so this can't discard a crash we + // care about. + await adb("logcat", "-b", "crash", "-c"); + + // Never let this child inherit our stderr: GitHub's `@actions/exec` resolves + // a step only once the stdio streams it handed out are closed, so an adb + // orphaned by our exit would hold the step open long after we failed it. + const logcat = cp.spawn("adb", ["logcat", "-b", "crash"], { + stdio: ["ignore", "pipe", "ignore"], + }); + + // ... and don't leave it running at all: killing it on the way out covers + // both failing on a crash and getting terminated once the tests pass. + process.on("exit", () => logcat.kill("SIGKILL")); + for (const signal of ["SIGINT", "SIGTERM"] as const) { + process.on(signal, () => process.exit(0)); + } + + // The line naming the app is preceded by the header of the crash it belongs + // to ("FATAL EXCEPTION: main"), so keep a few lines of lead-in around. + const LEAD_IN_LINES = 5; + const trace: string[] = []; + let crashed = false; + + logcat.on("error", () => skip("failed to spawn adb logcat")); + logcat.on("close", () => { + // Getting killed once the tests pass is the expected way for this to end. + if (!crashed) { + skip("adb logcat exited"); + } + }); + + for await (const line of readline.createInterface({ input: logcat.stdout })) { + trace.push(line); + if (crashed) { + continue; + } else if (line.includes(APP_ID)) { + crashed = true; + // Give the rest of the stack trace a moment to arrive before printing it. + setTimeout(() => { + console.error(`\n[crash-watchdog] ${APP_ID} crashed:\n`); + console.error(trace.join("\n")); + process.exit(1); + }, TRACE_GRACE_MS); + } else if (trace.length > LEAD_IN_LINES) { + trace.shift(); + } + } +} + +await main(); diff --git a/apps/test-app/tsconfig.json b/apps/test-app/tsconfig.json index 42a8c0b4..712ac620 100644 --- a/apps/test-app/tsconfig.json +++ b/apps/test-app/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@react-native/typescript-config/tsconfig.json", + "extends": "@react-native/typescript-config", "compilerOptions": { "types": ["react-native", "mocha"] }, diff --git a/apps/test-app/tsconfig.node-scripts.json b/apps/test-app/tsconfig.node-scripts.json index 66e44e08..9ce8f1da 100644 --- a/apps/test-app/tsconfig.node-scripts.json +++ b/apps/test-app/tsconfig.node-scripts.json @@ -7,5 +7,5 @@ "rootDir": "scripts", "types": ["node"] }, - "include": ["scripts/**/*.ts"] + "include": ["scripts"] } diff --git a/docs/ANDROID.md b/docs/ANDROID.md index 31b5479b..4b285812 100644 --- a/docs/ANDROID.md +++ b/docs/ANDROID.md @@ -2,7 +2,7 @@ ## Building Hermes from source -Because we're using a version of Hermes patched with Node-API support, we need to build React Native from source. +Because we build Hermes from source (a pinned commit carrying its Node-API implementation), we need to build React Native from source too. Follow [the React Native documentation on how to build from source](https://reactnative.dev/contributing/how-to-build-from-source#update-your-project-to-build-from-source). @@ -23,7 +23,7 @@ In particular, you will have to edit the `android/settings.gradle` file as follo > + } > ``` -To download our custom version of Hermes, you need to run from your app package: +To fetch the pinned Hermes, you need to run from your app package: ``` npx react-native-node-api vendor-hermes @@ -39,7 +39,7 @@ export REACT_NATIVE_OVERRIDE_HERMES_DIR=$(npx react-native-node-api vendor-herme ## Cleaning your React Native build folders -If you've accidentally built your app without Hermes patched, you can clean things up by deleting the `ReactAndroid` build folder. +If you've accidentally built your app without the vendored Hermes, you can clean things up by deleting the `ReactAndroid` build folder. ``` rm -rf node_modules/react-native/ReactAndroid/build diff --git a/docs/HOW-IT-WORKS.md b/docs/HOW-IT-WORKS.md index cd4ae854..b78f4686 100644 --- a/docs/HOW-IT-WORKS.md +++ b/docs/HOW-IT-WORKS.md @@ -39,16 +39,22 @@ The native implementation of `requireNodeAddon` is responsible for loading the d In any case the native code stores the initialization function in a data-structure. -## `react-native-node-api` creates a `node_env` and initialize the Node-API module +## `react-native-node-api` creates a `napi_env` and initialize the Node-API module -The initialization function of a Node-API module expects a `node_env`, which we create by calling `createNodeApiEnv` on the `jsi::Runtime`. +The initialization function of a Node-API module expects a `napi_env`, which we create by calling `hermes_napi_create_env` with the low-level Hermes VM runtime behind the `jsi::Runtime`. As in Node.js, each addon gets its own environment. ## The library's C++ code initialize the `exports` object -An `exports` object is created for the Node-API module and both the `napi_env` and `exports` object is passed to the Node-API module's initialization function and the third party code is able to call the Node-API free functions: +An `exports` object is created for the Node-API module and both the `napi_env` and `exports` object is passed to the Node-API module's initialization function and the third party code is able to call the Node-API free functions. -- The engine-specific functions (see [js_native_api.h](https://github.com/nodejs/node/blob/main/src/js_native_api.h)) are implemented by the `jsi::Runtime` (currently only Hermes supports this). -- The runtime-specific functions (see [node_api.h](https://github.com/nodejs/node/blob/main/src/node_api.h)) are implemented by `react-native-node-api`. +Hermes implements both halves of Node-API: the engine-specific functions (see [js_native_api.h](https://github.com/nodejs/node/blob/main/src/js_native_api.h)) and the runtime-specific ones (see [node_api.h](https://github.com/nodejs/node/blob/main/src/node_api.h)). Node.js implements the latter on top of libuv, which React Native doesn't have — so Hermes leaves the host to supply the primitives they need, as a `hermes_napi_host` struct passed when the environment is created: + +- `post_work` / `cancel_work` — run a unit of work on a worker thread and report back on the JavaScript thread. This is what backs `napi_create_async_work` and friends. +- `post_task` — schedule a callback on the JavaScript thread, used by thread-safe functions to dispatch queued calls. +- `ref_loop` / `unref_loop` — keep the event loop alive while a thread-safe function is referenced, modelling libuv's "ref" semantics. +- `fatal_exception` and, for embedders that have one, a libuv loop pointer for `napi_get_uv_event_loop`. + +`react-native-node-api` provides that struct, backed by React Native's `CallInvoker` for anything that has to land on the JavaScript thread and a worker pool for the rest. ## `my-app` regain control and call `add` diff --git a/eslint.config.js b/eslint.config.js index df9e3915..bbe15a20 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -10,6 +10,7 @@ export default tseslint.config( globalIgnores([ "**/dist/**", "**/build/**", + "**/build-tests/**", "apps/test-app/ios/**", "apps/macos-test-app/**", "packages/host/hermes/**", diff --git a/package.json b/package.json index 9a4f3db3..777b02a7 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "globals": "^16.0.0", "prettier": "3.6.2", "publint": "^0.3.15", - "react-native": "0.81.4", + "react-native": "0.88.0-nightly-20260809-db662caea", "read-pkg": "^9.0.1", "tsx": "^4.20.6", "typescript": "^5.8.0", diff --git a/packages/host/android/CMakeLists.txt b/packages/host/android/CMakeLists.txt index e4c183f7..19ba1d03 100644 --- a/packages/host/android/CMakeLists.txt +++ b/packages/host/android/CMakeLists.txt @@ -28,7 +28,7 @@ target_link_libraries(node-api-host log ReactAndroid::reactnative ReactAndroid::jsi - hermes-engine::libhermes + hermes-engine::hermesvm weak-node-api # react_codegen_NodeApiHostSpec ) diff --git a/packages/host/android/build.gradle b/packages/host/android/build.gradle index 39204133..60947ffa 100644 --- a/packages/host/android/build.gradle +++ b/packages/host/android/build.gradle @@ -1,6 +1,8 @@ import java.nio.file.Paths import groovy.json.JsonSlurper +import javax.inject.Inject import org.gradle.internal.os.OperatingSystem +import org.gradle.process.ExecOperations if (!System.getenv("REACT_NATIVE_OVERRIDE_HERMES_DIR")) { throw new GradleException([ @@ -48,7 +50,21 @@ def reactNativeArchitectures() { } apply plugin: "com.android.library" -apply plugin: "kotlin-android" + +// AGP 9 ships built-in Kotlin support and enables it by default, which +// registers the `kotlin` extension itself. Applying the Kotlin plugin on top of +// that fails the consumer's build with "Cannot add extension with name +// 'kotlin'", so only apply it when built-in Kotlin isn't doing the job — either +// because the consumer is on AGP 8, or because they opted out of it while they +// migrate. See https://developer.android.com/build/migrate-to-built-in-kotlin +def useBuiltInKotlin() { + def major = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')[0].toInteger() + return major >= 9 && project.findProperty("android.builtInKotlin") != "false" +} + +if (!useBuiltInKotlin()) { + apply plugin: "kotlin-android" +} apply plugin: "com.facebook.react" @@ -161,17 +177,25 @@ dependencies { def commandLinePrefix = OperatingSystem.current().isWindows() ? ["cmd", "/c", "node"] : [] def cliPath = file("../bin/react-native-node-api.mjs") +// Gradle 9 removed Project.exec(), so the ExecOperations service has to be +// injected and used explicitly instead of the bare `exec {}` closure. +interface InjectedExecOps { + @Inject + ExecOperations getExecOps() +} +def injectedExecOps = project.objects.newInstance(InjectedExecOps) + // Custom task to fetch jniLibs paths via CLI task linkNodeApiModules { doLast { - exec { + injectedExecOps.execOps.exec { commandLine commandLinePrefix + [cliPath, 'link', '--android', rootProject.rootDir.absolutePath] standardOutput = System.out errorOutput = System.err // Enable color output environment "FORCE_COLOR", "1" } - + android.sourceSets.main.jniLibs.srcDirs += file("../auto-linked/android").listFiles() } } diff --git a/packages/host/cpp/CxxNodeApiHostModule.cpp b/packages/host/cpp/CxxNodeApiHostModule.cpp index 0b1961ec..05745892 100644 --- a/packages/host/cpp/CxxNodeApiHostModule.cpp +++ b/packages/host/cpp/CxxNodeApiHostModule.cpp @@ -2,8 +2,26 @@ #include "Logger.hpp" #include "RuntimeNodeApiAsync.hpp" +#include + using namespace facebook; +// Declared by the vendored Hermes in API/napi/hermes_napi.h. We forward declare +// it here (rather than including that header) to avoid pulling in Hermes' own +// node_api.h alongside the weak-node-api copy already included transitively. +// +// The declaration must be `extern "C"`: since facebook/hermes#2106 (included in +// the pinned Hermes commit) the public hermes_napi.h wraps these entry points +// in `extern "C"`, so Hermes exports the unmangled C symbol. Without matching C +// linkage here the reference would be to the C++-mangled name and the app fails +// to link ("Undefined symbol: hermes_napi_create_env"). Passing host as nullptr +// is enough — async work / thread-safe functions will return failure until a +// host integration is wired up (Phase 3). +extern "C" { +struct hermes_napi_host; +napi_env hermes_napi_create_env(void *hermes_runtime, hermes_napi_host *host); +} + namespace callstack::react_native_node_api { CxxNodeApiHostModule::CxxNodeApiHostModule( @@ -108,7 +126,25 @@ bool CxxNodeApiHostModule::initializeNodeModule(jsi::Runtime &rt, // TODO: Read the version from the addon // @see // https://github.com/callstackincubator/react-native-node-api/issues/4 - napi_env env = reinterpret_cast(rt.createNodeApiEnv(8)); + + // Create this addon's Node-API environment. Hermes binds an env to its + // low-level VM runtime, which we reach through the (unstable) IHermes JSI + // interface, and takes ownership: the env is torn down with the runtime, so + // there is nothing to free here. Each addon gets its own env, as in Node. + if (addon.env == nullptr) { + // Fully qualified: `using namespace facebook` makes a bare `hermes` + // ambiguous with the top-level `::hermes` (VM) namespace pulled in via + // . + auto *hermes = facebook::jsi::castInterface(&rt); + if (hermes == nullptr) { + log_debug("NapiHost: JSI runtime is not castable to IHermes; cannot " + "create a Node-API environment"); + abort(); + } + addon.env = hermes_napi_create_env(hermes->getVMRuntimeUnsafe(), nullptr); + assert(addon.env != nullptr); + } + napi_env env = addon.env; // Create the "exports" object napi_value exports; diff --git a/packages/host/cpp/CxxNodeApiHostModule.hpp b/packages/host/cpp/CxxNodeApiHostModule.hpp index 4c753cfe..7be3e598 100644 --- a/packages/host/cpp/CxxNodeApiHostModule.hpp +++ b/packages/host/cpp/CxxNodeApiHostModule.hpp @@ -26,6 +26,14 @@ class JSI_EXPORT CxxNodeApiHostModule : public facebook::react::TurboModule { void *moduleHandle; napi_addon_register_func init; std::string generatedName; + + // The Node-API environment for this addon, created when the addon is + // initialized. Node creates one env per addon (see + // napi_module_register_by_symbol in Node's src/node_api.cc) and the env + // carries addon-scoped state — instance data, last error info, the addon's + // Node-API version — so addons must not share one. Owned by the Hermes + // runtime, which tears it down when the runtime is destroyed. + napi_env env = nullptr; }; std::unordered_map nodeAddons_; std::shared_ptr callInvoker_; diff --git a/packages/host/cpp/RuntimeNodeApiAsync.cpp b/packages/host/cpp/RuntimeNodeApiAsync.cpp index bee380a7..647aa71b 100644 --- a/packages/host/cpp/RuntimeNodeApiAsync.cpp +++ b/packages/host/cpp/RuntimeNodeApiAsync.cpp @@ -85,10 +85,21 @@ static AsyncWorkRegistry asyncWorkRegistry; namespace callstack::react_native_node_api { +// Drop an env's entry when the env is torn down with its runtime (on a reload, +// for example). There is one env per addon, so without this the map keeps a +// stale entry per addon per runtime for the lifetime of the process. +static void NAPI_CDECL removeCallInvoker(void *env) { + callInvokers.erase(static_cast(env)); +} + void setCallInvoker( napi_env env, const std::shared_ptr &invoker) { + const bool isFirstForEnv = !callInvokers.contains(env); callInvokers[env] = invoker; + if (isFirstForEnv) { + ::napi_add_env_cleanup_hook(env, removeCallInvoker, env); + } } std::weak_ptr getCallInvoker(napi_env env) { diff --git a/packages/host/cpp/Versions.hpp b/packages/host/cpp/Versions.hpp index 2cc106ef..84a91dfe 100644 --- a/packages/host/cpp/Versions.hpp +++ b/packages/host/cpp/Versions.hpp @@ -1,3 +1,7 @@ #pragma once -#define NAPI_VERSION 8 +// Must be defined before any include so the header exposes the +// full v10 surface (js_native_api.h otherwise defaults this to 8). +#ifndef NAPI_VERSION +#define NAPI_VERSION 10 +#endif diff --git a/packages/host/package.json b/packages/host/package.json index 9ac3ae12..6633b534 100644 --- a/packages/host/package.json +++ b/packages/host/package.json @@ -85,7 +85,7 @@ }, "peerDependencies": { "@babel/core": "^7.26.10", - "react-native": "0.79.1 || 0.79.2 || 0.79.3 || 0.79.4 || 0.79.5 || 0.79.6 || 0.79.7 || 0.80.0 || 0.80.1 || 0.80.2 || 0.81.0 || 0.81.1 || 0.81.2 || 0.81.3 || 0.81.4 || 0.81.5", + "react-native": "0.88.0-nightly-20260809-db662caea", "weak-node-api": "workspace:*" } } diff --git a/packages/host/scripts/generate-injector.mts b/packages/host/scripts/generate-injector.mts index bfd6a150..d5c6cfd3 100644 --- a/packages/host/scripts/generate-injector.mts +++ b/packages/host/scripts/generate-injector.mts @@ -6,35 +6,22 @@ import { type FunctionDecl, getNodeApiFunctions } from "weak-node-api"; export const CPP_SOURCE_PATH = path.join(import.meta.dirname, "../cpp"); -// TODO: Remove when all runtime Node API functions are implemented -const IMPLEMENTED_RUNTIME_FUNCTIONS = [ - "napi_create_buffer", - "napi_create_buffer_copy", - "napi_is_buffer", - "napi_get_buffer_info", - "napi_create_external_buffer", - "napi_create_async_work", - "napi_queue_async_work", - "napi_delete_async_work", - "napi_cancel_async_work", - "napi_fatal_error", - "napi_get_node_version", - "napi_get_version", -]; - /** * Generates source code which injects the Node API functions from the host. */ export function generateSource(functions: FunctionDecl[]) { return ` // This file is generated by react-native-node-api + // Versions.hpp must come first so exposes the full v10 surface. + #include + #include #include #include #include #include - + #if defined(__APPLE__) #define WEAK_NODE_API_LIBRARY_NAME "@rpath/weak-node-api.framework/weak-node-api" #elif defined(__ANDROID__) @@ -61,13 +48,7 @@ export function generateSource(functions: FunctionDecl[]) { log_debug("Injecting NodeApiHost"); inject_weak_node_api_host(NodeApiHost { - ${functions - .filter( - ({ kind, name }) => - kind === "engine" || IMPLEMENTED_RUNTIME_FUNCTIONS.includes(name), - ) - .flatMap(({ name }) => `.${name} = ${name},`) - .join("\n")} + ${functions.flatMap(({ name }) => `.${name} = ${name},`).join("\n")} }); } } // namespace callstack::react_native_node_api diff --git a/packages/host/scripts/patch-hermes.rb b/packages/host/scripts/patch-hermes.rb index 76252154..986f5d8f 100644 --- a/packages/host/scripts/patch-hermes.rb +++ b/packages/host/scripts/patch-hermes.rb @@ -1,33 +1,24 @@ -Pod::UI.warn "!!! PATCHING HERMES WITH NODE-API SUPPORT !!!" +Pod::UI.warn "!!! CONFIGURING HERMES WITH NODE-API SUPPORT !!!" -if ENV['RCT_USE_PREBUILT_RNCORE'] == '1' - raise "React Native Node-API cannot reliably patch JSI when React Native Core is prebuilt." -end - -def get_react_native_package - if caller.any? { |frame| frame.include?("node_modules/react-native-macos/") } - return "react-native-macos" - elsif caller.any? { |frame| frame.include?("node_modules/react-native/") } - return "react-native" - else - raise "Unable to determine React Native package from call stack." +if ENV['REACT_NATIVE_OVERRIDE_HERMES_DIR'].nil? + def get_react_native_package + if caller.any? { |frame| frame.include?("node_modules/react-native-macos/") } + return "react-native-macos" + elsif caller.any? { |frame| frame.include?("node_modules/react-native/") } + return "react-native" + else + raise "Unable to determine React Native package from call stack." + end end -end -if ENV['REACT_NATIVE_OVERRIDE_HERMES_DIR'].nil? VENDORED_HERMES_DIR ||= `npx react-native-node-api vendor-hermes --react-native-package '#{get_react_native_package()}' --silent '#{Pod::Config.instance.installation_root}'`.strip - # Signal the patched Hermes to React Native - ENV['BUILD_FROM_SOURCE'] = 'true' ENV['REACT_NATIVE_OVERRIDE_HERMES_DIR'] = VENDORED_HERMES_DIR -elsif Dir.exist?(ENV['REACT_NATIVE_OVERRIDE_HERMES_DIR']) - # Setting an override path implies building from source - ENV['BUILD_FROM_SOURCE'] = 'true' end -if !ENV['REACT_NATIVE_OVERRIDE_HERMES_DIR'].empty? +if ENV['REACT_NATIVE_OVERRIDE_HERMES_DIR'] && !ENV['REACT_NATIVE_OVERRIDE_HERMES_DIR'].empty? if Dir.exist?(ENV['REACT_NATIVE_OVERRIDE_HERMES_DIR']) Pod::UI.info "[Node-API] Using overridden Hermes in #{ENV['REACT_NATIVE_OVERRIDE_HERMES_DIR'].inspect}" else - raise "Hermes patching failed: Expected override to exist in #{ENV['REACT_NATIVE_OVERRIDE_HERMES_DIR'].inspect}" + raise "Hermes setup failed: Expected override to exist in #{ENV['REACT_NATIVE_OVERRIDE_HERMES_DIR'].inspect}" end end diff --git a/packages/host/scripts/patch-xcode-project.rb b/packages/host/scripts/patch-xcode-project.rb index 02eb5a67..ac46ad5f 100644 --- a/packages/host/scripts/patch-xcode-project.rb +++ b/packages/host/scripts/patch-xcode-project.rb @@ -5,9 +5,11 @@ NODE_BINARY = ENV["NODE_BINARY"] || `command -v node`.strip CLI_COMMAND = "'#{NODE_BINARY}' '#{File.join(__dir__, "../dist/node/cli/run.js")}'" PATCH_XCODE_PROJECT_COMMAND = "#{CLI_COMMAND} patch-xcode-project '#{Pod::Config.instance.installation_root}'" - + # Using an at_exit hook to ensure the command is executed after the pod install is complete at_exit do - system(PATCH_XCODE_PROJECT_COMMAND) or raise "Failed to patch the Xcode project" + unless system(PATCH_XCODE_PROJECT_COMMAND) + Pod::UI.warn "[Node-API] Failed to patch the Xcode project (non-fatal)" + end end end diff --git a/packages/host/src/node/cli/hermes.ts b/packages/host/src/node/cli/hermes.ts index 4b41692c..e9893d5c 100644 --- a/packages/host/src/node/cli/hermes.ts +++ b/packages/host/src/node/cli/hermes.ts @@ -15,40 +15,37 @@ import { import { packageDirectory } from "pkg-dir"; import { readPackage } from "read-pkg"; -// FIXME: make this configurable with reasonable fallback before public release -const HERMES_GIT_URL = "https://github.com/kraenhansen/hermes.git"; +const HERMES_GIT_URL = "https://github.com/facebook/hermes.git"; + +// Pinned commit on the `static_h` branch, which carries the first-party +// Node-API implementation under `API/napi`. Bump deliberately: the JSI +// accessor we rely on (`getVMRuntimeUnsafe`) is documented as unstable, so we +// vendor a known-good commit rather than tracking a moving branch. +// +// This commit includes facebook/hermes#2106 ("give hermes_napi.h public API C +// linkage"), which wraps the public `hermes_napi_*` entry points (e.g. +// `hermes_napi_create_env`) in `extern "C"`. Without it those declarations got +// C++ linkage: the mangled symbols stayed out of the framework's export table +// under Hermes' global `-fvisibility=hidden`, and consumers linking the +// framework hit "Undefined symbol: hermes_napi_create_env". We used to patch +// the header ourselves after cloning; now that the fix is upstream at this pin, +// no header patching is required. +// +// It also includes the immediately following commit, which flips Hermes' +// `JSI_UNSTABLE` CMake flag back to OFF by default. With it ON, Hermes compiles +// JSI's unstable `Serialized` / `ISerialization` APIs into `hermesvm`, but +// React Native never defines `JSI_UNSTABLE` when building the `libjsi.so` it +// ships in the ReactAndroid AAR. On Android the two are separate shared +// libraries, so `libhermesvm.so` ended up with undefined references to +// `facebook::jsi::Serialized` that nothing in the APK defined, and the app died +// on startup with "cannot locate symbol _ZTIN8facebook3jsi10SerializedE". +const HERMES_GIT_SHA = "5a795c9f880002c862c9254a26b57199819c97f7"; const platformOption = new Option( "--react-native-package ", "The React Native package to vendor Hermes into", ).default("react-native"); -type PatchJSIHeadersOptions = { - reactNativePath: string; - hermesJsiPath: string; - silent: boolean; -}; - -async function patchJsiHeaders({ - reactNativePath, - hermesJsiPath, - silent, -}: PatchJSIHeadersOptions) { - const reactNativeJsiPath = path.join(reactNativePath, "ReactCommon/jsi/jsi/"); - await oraPromise( - fs.promises.cp(hermesJsiPath, reactNativeJsiPath, { - recursive: true, - }), - { - text: `Copying JSI from patched Hermes to React Native`, - successText: "Copied JSI from patched Hermes to React Native", - failText: (err) => - `Failed to copy JSI from Hermes to React Native: ${err.message}`, - isEnabled: !silent, - }, - ); -} - export const command = new Command("vendor-hermes") .argument("[from]", "Path to a file inside the app package", process.cwd()) .option("--silent", "Don't print anything except the final path", false) @@ -75,19 +72,8 @@ export const command = new Command("vendor-hermes") paths: [appPackageRoot], }), ); - const hermesVersionPath = path.join( - reactNativePath, - "sdks", - ".hermesversion", - ); - assert( - fs.existsSync(hermesVersionPath), - `Expected a file with a Hermes version at ${prettyPath(hermesVersionPath)}`, - ); - - const hermesVersion = fs.readFileSync(hermesVersionPath, "utf8").trim(); if (!silent) { - console.log(`Using Hermes version: ${hermesVersion}`); + console.log(`Vendoring Hermes at ${HERMES_GIT_SHA}`); } const hermesPath = path.join(reactNativePath, "sdks", "node-api-hermes"); @@ -104,53 +90,49 @@ export const command = new Command("vendor-hermes") ); } if (!fs.existsSync(hermesPath)) { - const patchedTag = `node-api-${hermesVersion}`; try { + // GitHub allows fetching a reachable commit by SHA, so we can clone + // the pinned commit shallowly without downloading the whole history. await oraPromise( - spawn( - "git", - [ - "clone", + (async () => { + await fs.promises.mkdir(hermesPath, { recursive: true }); + const git = (args: string[]) => + spawn("git", args, { + cwd: hermesPath, + outputMode: "buffered", + }); + await git(["init", "--quiet"]); + await git(["remote", "add", "origin", HERMES_GIT_URL]); + await git(["fetch", "--depth", "1", "origin", HERMES_GIT_SHA]); + await git(["checkout", "--quiet", "FETCH_HEAD"]); + await git([ + "submodule", + "update", + "--init", "--recursive", "--depth", "1", - "--branch", - patchedTag, - HERMES_GIT_URL, - hermesPath, - ], - { - outputMode: "buffered", - }, - ), + ]); + })(), { - text: `Cloning custom Hermes into ${prettyPath(hermesPath)}`, - successText: "Cloned custom Hermes", - failText: (err) => - `Failed to clone custom Hermes: ${err.message}`, + text: `Cloning Hermes into ${prettyPath(hermesPath)}`, + successText: "Cloned Hermes", + failText: (err) => `Failed to clone Hermes: ${err.message}`, isEnabled: !silent, }, ); } catch (error) { - throw new UsageError("Failed to clone custom Hermes", { + // A failed clone can leave a partial checkout behind, which would + // make the existence check above skip re-cloning on the next run. + await fs.promises.rm(hermesPath, { recursive: true, force: true }); + throw new UsageError("Failed to clone Hermes", { cause: error, fix: { - instructions: `Check the network connection and ensure this ${chalk.bold("react-native")} version is supported by ${chalk.bold("react-native-node-api")}.`, + instructions: `Check the network connection and that the pinned Hermes commit ${chalk.bold(HERMES_GIT_SHA)} is still reachable on ${chalk.bold(HERMES_GIT_URL)}.`, }, }); } } - const hermesJsiPath = path.join(hermesPath, "API/jsi/jsi"); - - assert( - fs.existsSync(hermesJsiPath), - `Hermes JSI path does not exist: ${hermesJsiPath}`, - ); - await patchJsiHeaders({ - reactNativePath, - hermesJsiPath, - silent, - }); console.log(hermesPath); }), ); diff --git a/packages/host/src/node/cli/xcode-helpers.ts b/packages/host/src/node/cli/xcode-helpers.ts index 0f17afaa..b9368358 100644 --- a/packages/host/src/node/cli/xcode-helpers.ts +++ b/packages/host/src/node/cli/xcode-helpers.ts @@ -68,18 +68,9 @@ export async function findXcodeWorkspace(fromPath: string) { throw new Error(`No Xcode workspace found in '${fromPath}'`); } -export async function findXcodeProject(fromPath: string) { - // Read the workspace contents to find the first project - const workspacePath = await findXcodeWorkspace(fromPath); - const workspace = await readXcodeWorkspace(workspacePath); - // Resolve the first project location to an absolute path - assert( - workspace.fileRefs.length > 0, - "Expected at least one project in the workspace", - ); - const [firstProject] = workspace.fileRefs; +function resolveWorkspaceFileRef(location: string, workspacePath: string) { // Extract the path from the scheme (using a regex) - const match = firstProject.location.match(/^([^:]*):(.*)$/); + const match = location.match(/^([^:]*):(.*)$/); assert(match, "Expected a project path in the workspace"); const [, scheme, projectPath] = match; assert(scheme, "Expected a scheme in the fileRef location"); @@ -93,6 +84,30 @@ export async function findXcodeProject(fromPath: string) { } } +export async function findXcodeProject(fromPath: string) { + const workspacePath = await findXcodeWorkspace(fromPath); + const workspace = await readXcodeWorkspace(workspacePath); + assert( + workspace.fileRefs.length > 0, + "Expected at least one project in the workspace", + ); + // The workspace references the Pods project alongside the app project, and in + // a monorepo it can accumulate stale references to app projects generated + // under a different node_modules. Pick the first referenced app project that + // actually exists on disk (ignoring the Pods project). + const appProjectPaths = workspace.fileRefs + .map(({ location }) => resolveWorkspaceFileRef(location, workspacePath)) + .filter((projectPath) => path.basename(projectPath) !== "Pods.xcodeproj"); + const existingProjectPath = appProjectPaths.find((projectPath) => + fs.existsSync(path.join(projectPath, "project.pbxproj")), + ); + assert( + existingProjectPath, + `Expected one of the workspace's projects to exist: ${appProjectPaths.join(", ")}`, + ); + return existingProjectPath; +} + export type ExpectedFrameworkSlice = { platform: string; platformVariant?: string; diff --git a/packages/host/src/node/podspec.test.ts b/packages/host/src/node/podspec.test.ts deleted file mode 100644 index 4da4d640..00000000 --- a/packages/host/src/node/podspec.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import assert from "node:assert/strict"; -import { describe, it } from "node:test"; -import cp from "node:child_process"; - -describe("Podspec", () => { - // We cannot support prebuilds of React Native Core since we're patching JSI - it( - "should error when RCT_USE_PREBUILT_RNCORE is set", - // We cannot call `pod` on non-macOS systems - { skip: process.platform !== "darwin" }, - () => { - const { status, stdout } = cp.spawnSync("pod", ["spec", "lint"], { - env: { ...process.env, RCT_USE_PREBUILT_RNCORE: "1" }, - encoding: "utf-8", - }); - - assert.notEqual(status, 0); - assert.match( - stdout, - /React Native Node-API cannot reliably patch JSI when React Native Core is prebuilt/, - ); - }, - ); -}); diff --git a/packages/host/tsconfig.react-native.json b/packages/host/tsconfig.react-native.json index c84162e8..0c0afe93 100644 --- a/packages/host/tsconfig.react-native.json +++ b/packages/host/tsconfig.react-native.json @@ -6,6 +6,8 @@ "noEmit": false, "outDir": "dist", "rootDir": "src", + "module": "nodenext", + "moduleResolution": "nodenext", "types": ["react-native"] }, "include": ["src/react-native"] diff --git a/packages/node-addon-examples/tsconfig.tests.json b/packages/node-addon-examples/tsconfig.tests.json index 629f51e3..dff90191 100644 --- a/packages/node-addon-examples/tsconfig.tests.json +++ b/packages/node-addon-examples/tsconfig.tests.json @@ -3,9 +3,10 @@ "compilerOptions": { "composite": true, "noEmit": false, - "module": "commonjs", "outDir": "dist", "rootDir": "src", + "module": "nodenext", + "moduleResolution": "nodenext", "types": ["react-native"] }, "include": ["src/*.ts"] diff --git a/packages/weak-node-api/CMakeLists.txt b/packages/weak-node-api/CMakeLists.txt index 29080360..d23d1551 100644 --- a/packages/weak-node-api/CMakeLists.txt +++ b/packages/weak-node-api/CMakeLists.txt @@ -56,7 +56,7 @@ endif() # C++20 is needed to use designated initializers target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_20) -target_compile_definitions(${PROJECT_NAME} PRIVATE NAPI_VERSION=8) +target_compile_definitions(${PROJECT_NAME} PRIVATE NAPI_VERSION=10) target_compile_options(${PROJECT_NAME} PRIVATE $<$:/W4 /WX> diff --git a/packages/weak-node-api/src/node-api-functions.ts b/packages/weak-node-api/src/node-api-functions.ts index f92bd956..0cf73fa5 100644 --- a/packages/weak-node-api/src/node-api-functions.ts +++ b/packages/weak-node-api/src/node-api-functions.ts @@ -78,24 +78,25 @@ export function getNodeApiHeaderAST(version: NodeApiVersion) { export type FunctionDecl = { name: string; - kind: "engine" | "runtime"; returnType: string; noReturn: boolean; argumentTypes: string[]; - libraryPath: string; fallbackReturnStatement: string; }; -export function getNodeApiFunctions(version: NodeApiVersion = "v8") { +export function getNodeApiFunctions(version: NodeApiVersion = "v10") { const root = getNodeApiHeaderAST(version); assert.equal(root.kind, "TranslationUnitDecl"); assert(Array.isArray(root.inner)); const foundSymbols = new Set(); + // Both interfaces are now sourced from the same host (hermesNapi provides + // every symbol), so there is no engine/runtime distinction to preserve. const symbolsPerInterface = nodeApiHeaders.symbols[version]; - const engineSymbols = new Set(symbolsPerInterface.js_native_api_symbols); - const runtimeSymbols = new Set(symbolsPerInterface.node_api_symbols); - const allSymbols = new Set([...engineSymbols, ...runtimeSymbols]); + const allSymbols = new Set([ + ...symbolsPerInterface.js_native_api_symbols, + ...symbolsPerInterface.node_api_symbols, + ]); const nodeApiFunctions: FunctionDecl[] = []; @@ -131,14 +132,9 @@ export function getNodeApiFunctions(version: NodeApiVersion = "v8") { name, returnType, noReturn: node.type.qualType.includes("__attribute__((noreturn))"), - kind: engineSymbols.has(name) ? "engine" : "runtime", argumentTypes: argumentTypes .split(",") .map((arg) => arg.trim().replace("_Bool", "bool")), - // Defer to the right library - libraryPath: engineSymbols.has(name) - ? "libhermes.so" - : "libnode-api-host.so", fallbackReturnStatement: returnType === "void" ? "abort();" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2be265d9..ba0121ea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,8 +48,8 @@ importers: specifier: ^0.3.15 version: 0.3.21 react-native: - specifier: 0.81.4 - version: 0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0) + specifier: 0.88.0-nightly-20260809-db662caea + version: 0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) read-pkg: specifier: ^9.0.1 version: 9.0.1 @@ -93,17 +93,17 @@ importers: specifier: workspace:* version: link:../../packages/node-tests '@react-native/babel-preset': - specifier: 0.81.4 - version: 0.81.4(@babel/core@7.29.7) + specifier: 0.88.0-nightly-20260809-db662caea + version: 0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7) '@react-native/metro-config': - specifier: 0.81.4 - version: 0.81.4(@babel/core@7.29.7) + specifier: 0.88.0-nightly-20260809-db662caea + version: 0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7) '@react-native/typescript-config': - specifier: 0.81.4 - version: 0.81.4 + specifier: 0.88.0-nightly-20260809-db662caea + version: 0.88.0-nightly-20260809-db662caea '@rnx-kit/metro-config': - specifier: ^2.1.1 - version: 2.2.4(@react-native-community/cli-types@20.2.0)(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(metro@0.83.7)(react-native@0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0))(react@19.1.0) + specifier: ^2.2.4 + version: 2.2.4(@react-native-community/cli-types@20.2.0)(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(metro@0.87.0)(react-native@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) '@types/mocha': specifier: ^10.0.10 version: 10.0.10 @@ -121,19 +121,19 @@ importers: version: 1.13.2 mocha-remote-react-native: specifier: ^1.13.2 - version: 1.13.2(react-native@0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0))(react@19.1.0) + version: 1.13.2(react-native@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) react: - specifier: 19.1.0 - version: 19.1.0 + specifier: 19.2.3 + version: 19.2.3 react-native: - specifier: 0.81.4 - version: 0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0) + specifier: 0.88.0-nightly-20260809-db662caea + version: 0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) react-native-node-api: specifier: workspace:* version: link:../../packages/host react-native-test-app: - specifier: ^4.4.7 - version: 4.4.12(@react-native-community/cli-types@20.2.0)(metro@0.83.7)(react-native@0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0))(react@19.1.0) + specifier: ^5.4.8 + version: 5.4.8(@react-native-community/cli-types@20.2.0)(metro@0.87.0)(react-native@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) weak-node-api: specifier: workspace:* version: link:../../packages/weak-node-api @@ -247,8 +247,8 @@ importers: specifier: ^8.0.0 version: 8.0.0 react-native: - specifier: 0.79.1 || 0.79.2 || 0.79.3 || 0.79.4 || 0.79.5 || 0.79.6 || 0.79.7 || 0.80.0 || 0.80.1 || 0.80.2 || 0.81.0 || 0.81.1 || 0.81.2 || 0.81.3 || 0.81.4 || 0.81.5 - version: 0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0) + specifier: 0.88.0-nightly-20260809-db662caea + version: 0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) read-pkg: specifier: ^9.0.1 version: 9.0.1 @@ -504,27 +504,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-async-generators@7.8.4': - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-bigint@7.8.3': - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-properties@7.12.13': - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-dynamic-import@7.8.3': resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: @@ -554,64 +533,22 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-json-strings@7.8.3': - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.29.7': resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-optional-chaining@7.8.3': resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.29.7': resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} engines: {node: '>=6.9.0'} @@ -1435,38 +1372,18 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + '@isaacs/ttlcache@1.4.1': resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} engines: {node: '>=12'} - '@istanbuljs/load-nyc-config@1.1.0': - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - - '@istanbuljs/schema@0.1.6': - resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} - engines: {node: '>=8'} - - '@jest/create-cache-key-function@29.7.0': - resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/environment@29.7.0': - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/fake-timers@29.7.0': - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/transform@29.7.0': - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/types@29.6.3': resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2077,77 +1994,81 @@ packages: engines: {node: '>=20.19.4'} hasBin: true - '@react-native/assets-registry@0.81.4': - resolution: {integrity: sha512-AMcDadefBIjD10BRqkWw+W/VdvXEomR6aEZ0fhQRAv7igrBzb4PTn4vHKYg+sUK0e3wa74kcMy2DLc/HtnGcMA==} - engines: {node: '>= 20.19.4'} + '@react-native/asset-utils@0.88.0-nightly-20260809-db662caea': + resolution: {integrity: sha512-oN9CBHkciHKhI699hA+A4zkfTV+iJJ0Cb4pmGbqUTBN2E3mExCGT2+/GHT7rzcVUAqWix5vpsASfFi5o6SP2Nw==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - '@react-native/babel-plugin-codegen@0.81.4': - resolution: {integrity: sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==} - engines: {node: '>= 20.19.4'} + '@react-native/babel-plugin-codegen@0.88.0-nightly-20260809-db662caea': + resolution: {integrity: sha512-vXAc0lQdkNqY2FBF4H35lKq3e2y2KfNPX4WD3IACWc0ZnRujzEUMYQ0EXHLQVm+DyEzvWHmrYfreiZMeL1CKng==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - '@react-native/babel-preset@0.81.4': - resolution: {integrity: sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==} - engines: {node: '>= 20.19.4'} + '@react-native/babel-preset@0.88.0-nightly-20260809-db662caea': + resolution: {integrity: sha512-FdDxdpeQtxDB8OL2b8DAJVQln0QAxmtkHN13En6s6VzBVYuUaxQ/kd9ZUzVR+HRVII7BMfcgzE6tWl6Oph+oZg==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} peerDependencies: '@babel/core': '*' - '@react-native/codegen@0.81.4': - resolution: {integrity: sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==} - engines: {node: '>= 20.19.4'} + '@react-native/codegen@0.88.0-nightly-20260809-db662caea': + resolution: {integrity: sha512-pBJM4v0Lg3gQfuFnJYeyGX3lrbq+fsIAo44ZuaOBMPNwkelZZVWy5/koPgFNHOycGKZSmvfhJ0NbFTISg9tCrA==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} peerDependencies: '@babel/core': '*' - '@react-native/community-cli-plugin@0.81.4': - resolution: {integrity: sha512-8mpnvfcLcnVh+t1ok6V9eozWo8Ut+TZhz8ylJ6gF9d6q9EGDQX6s8jenan5Yv/pzN4vQEKI4ib2pTf/FELw+SA==} - engines: {node: '>= 20.19.4'} + '@react-native/community-cli-plugin@0.88.0-nightly-20260809-db662caea': + resolution: {integrity: sha512-GbcAYQatq/dRScOnj85aoUGtD3+iuuSrAmaAXwhQ4d29qAPy5kFRusSkRrTskrbuBGTqUEt8daT6Mq6ZzOsjHw==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} peerDependencies: '@react-native-community/cli': '*' - '@react-native/metro-config': '*' + '@react-native/metro-config': 0.88.0-nightly-20260809-db662caea peerDependenciesMeta: '@react-native-community/cli': optional: true '@react-native/metro-config': optional: true - '@react-native/debugger-frontend@0.81.4': - resolution: {integrity: sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==} - engines: {node: '>= 20.19.4'} + '@react-native/debugger-frontend@0.88.0-nightly-20260809-db662caea': + resolution: {integrity: sha512-uh092SG1u6rT5hGZeUa315SZR/1pwSYit14FAn4vRqHMjbRPFpJoZboBvp2k6zfib3glqJGmeQtS769WvgZWFw==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} + + '@react-native/debugger-shell@0.88.0-nightly-20260809-db662caea': + resolution: {integrity: sha512-g7Gw7bfvUMW4BUhFb8tmTGBf3414EdlC4sAbzOcUOE5SIyqQCmU0iLcAWSSKIuP9NjFWLKKVDP9DLuTGTpBl7Q==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - '@react-native/dev-middleware@0.81.4': - resolution: {integrity: sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==} - engines: {node: '>= 20.19.4'} + '@react-native/dev-middleware@0.88.0-nightly-20260809-db662caea': + resolution: {integrity: sha512-i+srhjb4whNoMGRXemmo73+KeBpPJVVGGor+93s89OdjCqGW3ApVQpj2TOerULOtOdFDUV4CcmFnr0Yaj7Q/vQ==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - '@react-native/gradle-plugin@0.81.4': - resolution: {integrity: sha512-T7fPcQvDDCSusZFVSg6H1oVDKb/NnVYLnsqkcHsAF2C2KGXyo3J7slH/tJAwNfj/7EOA2OgcWxfC1frgn9TQvw==} - engines: {node: '>= 20.19.4'} + '@react-native/gradle-plugin@0.88.0-nightly-20260809-db662caea': + resolution: {integrity: sha512-+cHvVKWNVydVjwWxS1jff5YBSbIyziusABbq1E6OOdJ04JPQPto2ubQG8CI9AlW6S2hiS8iAD/qYv6KY1+2TOA==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - '@react-native/js-polyfills@0.81.4': - resolution: {integrity: sha512-sr42FaypKXJHMVHhgSbu2f/ZJfrLzgaoQ+HdpRvKEiEh2mhFf6XzZwecyLBvWqf2pMPZa+CpPfNPiejXjKEy8w==} - engines: {node: '>= 20.19.4'} + '@react-native/js-polyfills@0.88.0-nightly-20260809-db662caea': + resolution: {integrity: sha512-0rZKQhKppL5khczDF4oXE8HGOXmzOkvAWl+EkjtPf9Qy4Gb/XJx3a5yrbNYREBpjYAxjQrylrnU9Pb9ioIBEJg==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - '@react-native/metro-babel-transformer@0.81.4': - resolution: {integrity: sha512-AahgamQ9kZV4B1x8I/LpTZBgbT+j9i1pQoM3KDkECPIOF1JUwNFUukEjpkq4kRSdzudLocnfASFg+eWzIgPcCA==} - engines: {node: '>= 20.19.4'} + '@react-native/metro-babel-transformer@0.88.0-nightly-20260809-db662caea': + resolution: {integrity: sha512-TJkVCb8+ZEOJiipGQTjTI2tEnDCYxCvStH7Pd45xenlxzN2M89zZH4VRUQXtQUXN+5xJEvqzHJhIR5IECuwSXA==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} peerDependencies: '@babel/core': '*' - '@react-native/metro-config@0.81.4': - resolution: {integrity: sha512-aEXhRMsz6yN5X63Zk+cdKByQ0j3dsKv+ETRP9lLARdZ82fBOCMuK6IfmZMwK3A/3bI7gSvt2MFPn3QHy3WnByw==} - engines: {node: '>= 20.19.4'} + '@react-native/metro-config@0.88.0-nightly-20260809-db662caea': + resolution: {integrity: sha512-n4U+3az3nYMUASoSU5CV4F5zQt+eiHQZiR6v5qbD5qsVlMrcGzHZo7/NkVUsozwQbWYXneYeoA+60mSuPwclpw==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - '@react-native/normalize-colors@0.81.4': - resolution: {integrity: sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==} + '@react-native/normalize-colors@0.88.0-nightly-20260809-db662caea': + resolution: {integrity: sha512-oe3/cG9LKEIEogEw/i7d+hD9/ZVWUo4wCrCOCsIxL3ibTqNJiUdZqEmE+xbY9azmzBPurjbq/2rtQfHl4lp8Mw==} - '@react-native/typescript-config@0.81.4': - resolution: {integrity: sha512-1HSrwtfAmtbKHNK2HAMCL5ArbGhxxJjOmTViDQ4nEhLJCAllZjQJyR/Hs1GmwHJokLmgXCcg3VH/13spwQBdxw==} + '@react-native/typescript-config@0.88.0-nightly-20260809-db662caea': + resolution: {integrity: sha512-fEWkmJR2vzZRt6X4+Z1qGm4mXQ90RYBBe/KOSRoMfbYIZPmeL/vhnmuA6jQB/9dpXzA8oJyIE4xLs73I/spJIw==} - '@react-native/virtualized-lists@0.81.4': - resolution: {integrity: sha512-hBM+rMyL6Wm1Q4f/WpqGsaCojKSNUBqAXLABNGoWm1vabZ7cSnARMxBvA/2vo3hLcoR4v7zDK8tkKm9+O0LjVA==} - engines: {node: '>= 20.19.4'} + '@react-native/virtualized-lists@0.88.0-nightly-20260809-db662caea': + resolution: {integrity: sha512-aVkgJUe00hgSAVqXTCZ8KlobzCdqnzxDx3yXrsdxuclB8P1FJcRRkpqOBhnUfqRYQwuXJtamvJijBilSvZ5LYA==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} peerDependencies: - '@types/react': ^19.1.0 + '@types/react': ^19.2.0 react: '*' - react-native: '*' + react-native: 0.88.0-nightly-20260809-db662caea peerDependenciesMeta: '@types/react': optional: true @@ -2320,12 +2241,6 @@ packages: '@sinclair/typebox@0.27.12': resolution: {integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==} - '@sinonjs/commons@3.0.1': - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - - '@sinonjs/fake-timers@10.3.0': - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@tsconfig/node22@22.0.5': resolution: {integrity: sha512-hLf2ld+sYN/BtOJjHUWOk568dvjFQkHnLNa6zce25GIH+vxKfvTgm3qpaH6ToF5tu/NN0IH66s+Bb5wElHrLcw==} @@ -2350,9 +2265,6 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/graceful-fs@4.1.9': - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -2386,9 +2298,6 @@ packages: '@types/react@19.2.17': resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} - '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -2481,10 +2390,6 @@ packages: resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==} engines: {node: '>=10.0.0'} - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -2559,10 +2464,6 @@ packages: resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} engines: {node: '>=14'} - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - anynum@1.0.1: resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==} @@ -2618,20 +2519,6 @@ packages: axios@1.18.1: resolution: {integrity: sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==} - babel-jest@29.7.0: - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - - babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - - babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - babel-plugin-polyfill-corejs2@0.4.17: resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} peerDependencies: @@ -2652,23 +2539,12 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-syntax-hermes-parser@0.29.1: - resolution: {integrity: sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==} + babel-plugin-syntax-hermes-parser@0.37.0: + resolution: {integrity: sha512-7I9T16lJTjHG6JhHOmM/iqO/UGGQwAcAAD4/tsk+GSjPf9bbusBsPlz1scyGehImMfH1Yopbj0aQYxhTAHdcdg==} babel-plugin-transform-flow-enums@0.0.2: resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} - babel-preset-current-node-syntax@1.2.0: - resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} - peerDependencies: - '@babel/core': ^7.0.0 || ^8.0.0-0 - - babel-preset-jest@29.6.3: - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -2785,14 +2661,6 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - chrome-launcher@0.15.2: - resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} - engines: {node: '>=12.13.0'} - hasBin: true - - chromium-edge-launcher@0.2.0: - resolution: {integrity: sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==} - ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} @@ -2984,6 +2852,10 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -3184,10 +3056,6 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -3225,10 +3093,6 @@ packages: fast-xml-builder@1.3.0: resolution: {integrity: sha512-F74cZEdCvuw9P41GAC3rod4X04jjWGM1JPEv/GWSqFTWLsdyMSBMBMlm9Hk3GLBgLBbdBNY8yee0pQh2RBVESQ==} - fast-xml-parser@4.5.7: - resolution: {integrity: sha512-a6Qh1RMCNbSrU1+sAyAAZH3rTe+OaWJbNZIq0S+ifZciUUOQtlVxBJwoTUE2bYhysmG/RYyI5WJFIKdBahJdrQ==} - hasBin: true - fast-xml-parser@5.10.1: resolution: {integrity: sha512-IEMIf7298kXuZSRFoGfMYrl7is8LpavODgbNz1cwIudv7KwVFnuU+UsMporfq6PD6aXSlawZlARiA3UywCTfMw==} hasBin: true @@ -3236,6 +3100,11 @@ packages: fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fb-dotslash@0.5.8: + resolution: {integrity: sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==} + engines: {node: '>=20'} + hasBin: true + fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} @@ -3294,6 +3163,14 @@ packages: flow-enums-runtime@0.0.6: resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} + flow-estree@0.325.0: + resolution: {integrity: sha512-HnYTpF6Al3YZpiPwket4x33V7iXSUgyqmtOz9FvgGBRKfBzZre/A3sRpXN1Jsq1VeRson1ToHJn+EosHemaPpQ==} + engines: {node: '>=18'} + + flow-parser@0.325.0: + resolution: {integrity: sha512-3uJxDHNXuiNM5twT+tk0iIn8zdSkF67cmE/6SoWFbmxcX7BnI82qYeJSEhrfNnDx7TwhAVPnLqV7MCt+biVwZw==} + engines: {node: '>=0.4.0'} + follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} @@ -3335,9 +3212,6 @@ packages: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3375,10 +3249,6 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} - get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -3400,10 +3270,6 @@ packages: deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - global-modules@1.0.0: resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} engines: {node: '>=0.10.0'} @@ -3460,17 +3326,20 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - hermes-estree@0.29.1: - resolution: {integrity: sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==} + hermes-compiler@260318099.0.1: + resolution: {integrity: sha512-jDXx48/z7ULUr2+sf+A3+3RQRiwcvH4Y+mhlxMdUhNQGOsnQY8eeDgy+8yhKrDHbLvRfW2JwEnDFfmyf96F5SQ==} + + hermes-estree@0.36.1: + resolution: {integrity: sha512-guv1nQ6IJ7S83NRFPWc3SA7IBZrdNC9kapwOq6uXvF4wP+sDCgjzQbKPCoyYmoyZRzztF/n/c36l/rccCZSiCw==} - hermes-estree@0.35.0: - resolution: {integrity: sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==} + hermes-estree@0.37.0: + resolution: {integrity: sha512-Frp4+A518C4zZgB2+Qo1srlM3y6nbrFbNNzBF3g7tEuQXHXTb2h39V25JQLNHotxclkD+AZTN/JCCpiTFlhIGg==} - hermes-parser@0.29.1: - resolution: {integrity: sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==} + hermes-parser@0.36.1: + resolution: {integrity: sha512-GApNk4zLHi2UWoWZZkx7LNCOSzLSc5lB55pZ/PhK7ycFeg7u5LcF88p/WbpIi1XUDtE0MpHE3uRR3u3KB7TjSQ==} - hermes-parser@0.35.0: - resolution: {integrity: sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==} + hermes-parser@0.37.0: + resolution: {integrity: sha512-8PuWcyaF6VHQHL2dbU+QEIkbtHYQrTX/6+ep4VcBLJ3f/ehevowr5Zj8LQfYXQQGFG2O+df7hIMtt4PkkhfK3Q==} homedir-polyfill@1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} @@ -3532,10 +3401,6 @@ packages: resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} engines: {node: '>=18'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -3655,41 +3520,13 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-util@29.7.0: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3771,9 +3608,6 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lighthouse-logger@1.4.2: - resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} - lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -3835,9 +3669,6 @@ packages: makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - marky@1.3.0: - resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} - math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -3859,62 +3690,62 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - metro-babel-transformer@0.83.7: - resolution: {integrity: sha512-sBqBkt6kNut/88bv+Ucvm4yqdPetbvAEsHzi3MAgJEifOSYYzX5Z5Kgw3TFOrwf/mHJTOBG2ONlaMHoyfP15TA==} - engines: {node: '>=20.19.4'} + metro-babel-transformer@0.87.0: + resolution: {integrity: sha512-IEn1K1FyY4J1sA5y6zqDjf2OkfmpTEqhZOeP6MJX8HepSW0cuHGw1m8bYOdv2adkG3XUE9dtM0csUs0gP/Xa5w==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - metro-cache-key@0.83.7: - resolution: {integrity: sha512-W1c2Nmx8MiJTJt+eWhMO08z9VKi3kZOaz99IYGdqeqDgY9j+yZjXl62rUav4Di0heZfh4/n2s722PqRL1OODeg==} - engines: {node: '>=20.19.4'} + metro-cache-key@0.87.0: + resolution: {integrity: sha512-Q+MPt6jl0zQogr4Q02WaJK6HY+GtE5A0nzj8kIV1Owgrx6OMNvm6scPTr1SM/R4LpCE8EH/Y5qfbXQ84GHTr0Q==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - metro-cache@0.83.7: - resolution: {integrity: sha512-E9SRePXQ1Zvlj79VcOk57q7VC7rMHMFQ+jhmPHBiq+dJ0bJB5BL87lWZF6oh5X76Cci5tpDuQNaDwwuSCToEeg==} - engines: {node: '>=20.19.4'} + metro-cache@0.87.0: + resolution: {integrity: sha512-146vS1BMSKcp99jddOhFBfHwzUEWN35NrsnSJDF2sQQ0ZT5OsBcOjd574PM233TWEZISRJ5DOK+vokD+1ubx+w==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - metro-config@0.83.7: - resolution: {integrity: sha512-83mjWFbFOt2GeJ6pFIum5mSnc1uTsZJAtD8o4ej0s4NVsYsA7fB+pHvTfHhFrpeMONaobu2riKavkPei05Er/Q==} - engines: {node: '>=20.19.4'} + metro-config@0.87.0: + resolution: {integrity: sha512-yZ9QAIzWH9MxwrzwRlX/CBGRWOT14l7klSDYg8hdtSdnoUs5A7MQRdHE2KB9iHVzGQW5wgWM5aXJswNeWbSQPA==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - metro-core@0.83.7: - resolution: {integrity: sha512-6yn3w1wnltT6RQl7p7YES2l95ArC+mWrOssEiH8p5/DDrJS65/szf9LsC9JrBv8c5DdvSY3V3f0GRYg0Ox7hCg==} - engines: {node: '>=20.19.4'} + metro-core@0.87.0: + resolution: {integrity: sha512-yW57+pCOHRC/CJZ99GA2PTd+30dORwDAjUPRCokj91IWW5In9Jwtt2FB5wACrGO8P0GHTyVHdTwDNyZsNndUbA==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - metro-file-map@0.83.7: - resolution: {integrity: sha512-+j0F1m+FQYVAQ6syf+mwhIPV5GoFQrkInX8bppuc50IzNsZbMrp8R5H/Sx/K2daQ3YEa9F/XwkeZT8gzJfgeCw==} - engines: {node: '>=20.19.4'} + metro-file-map@0.87.0: + resolution: {integrity: sha512-Dc57t8jsINwA90bbVlqaeDlxf1rVGgj5SmOEnOMbaHNUM/HCYYTJxPV8SRdOBwh7qTz/biO9vaQvBTjRBgbbsg==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - metro-minify-terser@0.83.7: - resolution: {integrity: sha512-MfJar2IS4tBRuLb9svwb0Gu5l9BsH+pcRm8eGcEi/wy8MzZinfinh5dFLt2nWkocnulIgtGB5NkFDdbXqMXKhQ==} - engines: {node: '>=20.19.4'} + metro-minify-terser@0.87.0: + resolution: {integrity: sha512-tPa0O983PDutFu3LXbArRH5NduogcKrvW6fs9VHhksTKUA1iqDyoD1ZSj/Me52xJ6T9/9pOwIVyj9ulKc/zMkg==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - metro-resolver@0.83.7: - resolution: {integrity: sha512-WSJIENlMcoSsuz66IfBHOkgfp3KJt2UW2TnEHPf1b8pIG2eEXNOVmo2+03A0H17WY2XGXWgxL0CG7FAopqgB1A==} - engines: {node: '>=20.19.4'} + metro-resolver@0.87.0: + resolution: {integrity: sha512-Xl3M9R3KToaHJvXlI2lSOxtYHitzxite+195DSi00HL9PcS7Xik5+3xlRjfkKb3FA86SZxYPj+WJwlcfgaZoxg==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - metro-runtime@0.83.7: - resolution: {integrity: sha512-9GKkJURaB2iyYoEExKnedzAHzxmKtSi+k0tsZUvMoU27tBZJElchYt7JH/Ai/XzYAI9lCAaV7u5HZSI8J5Z+wQ==} - engines: {node: '>=20.19.4'} + metro-runtime@0.87.0: + resolution: {integrity: sha512-XsXZkgEwI0ZMYSBfvOMAbenzwa60XlObXJ27g6/Khgrz9ESbiBbAsd7hR62G2jRBYOhGAzG61Gk22dpRJj/mdw==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - metro-source-map@0.83.7: - resolution: {integrity: sha512-JgA1h7oc1a1jydBe1GhVFsUoMYo3wLPk7oRA32rjlDsq+sP2JLt9x2p2lWbNSxTm/u8NV4VRid3hvEJgcX8tKw==} - engines: {node: '>=20.19.4'} + metro-source-map@0.87.0: + resolution: {integrity: sha512-31BrYqu1c2co93rF1LN9Pw+7g+BrfDyxJkNQWrYm+pfA/+eVYVumF7tFMHbXLePLmHfhvSgVvbK6su1Oyiw1ng==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - metro-symbolicate@0.83.7: - resolution: {integrity: sha512-g4suyxw20WOHWI680c+Kq4wC/NF+Hx5pRH9afrMp+sMTxqLeKcPR1Xf4wMhsjlbvx7LbIREdke6q928jEjvJWw==} - engines: {node: '>=20.19.4'} + metro-symbolicate@0.87.0: + resolution: {integrity: sha512-uOpTxAXu74N+RSujUZ78L6gjI6bDdnz6XuW+AIUNuubZDEQPIpaX0StzIb0GMeQWP6zfHOHwFrWPP5Iquu1GXw==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} hasBin: true - metro-transform-plugins@0.83.7: - resolution: {integrity: sha512-Ss0FpBiZDjX2kwhukMDl5sNdYK8T/06IPqxNE4H6PTlRlfs9q11cef13c/xESY/Pm4VCkp1yJUZO3kXzvMxQFA==} - engines: {node: '>=20.19.4'} + metro-transform-plugins@0.87.0: + resolution: {integrity: sha512-i8keUe9+BaSwMuQM26DGheElCpTtflAKIrSwJAm8ZsgDb50RAUQus+e6zt2suaJXJ1OxZa7vqgtqoZxdniM6Fw==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - metro-transform-worker@0.83.7: - resolution: {integrity: sha512-UegCo7ygB2fT64mRK2nbAjQVJ1zSwIIHy8d96jJv2nKZFDaViYBiughEdu5HM/Ceq0WN3LZrZk3zhl9aoiLYFw==} - engines: {node: '>=20.19.4'} + metro-transform-worker@0.87.0: + resolution: {integrity: sha512-YftLzNJxCTYxEN5k4AzR8KYwiENTEuz30L+4QeoMrtDd+U8mDThZg/ArR3JVRd8LaikwPOjVAS5SP3xPJN0AaA==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - metro@0.83.7: - resolution: {integrity: sha512-SPaPEyvTsTmd0LpT7RaZciQyDw2i/JB7+iY9L5VfBo72+psescFxBqpI1TL9dnL+pmnfkU+l/J1mEEGLeF65EQ==} - engines: {node: '>=20.19.4'} + metro@0.87.0: + resolution: {integrity: sha512-fRqFhSzQhLNQSCvJFeuRzBRXAOOKXf1O8d2cvmMtG6yFR0jCllQ7vBsXoLP18yuqtf+N1XwWXTPF11eWy9q6dQ==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} hasBin: true micromatch@4.0.8: @@ -4087,10 +3918,6 @@ packages: resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -4103,9 +3930,9 @@ packages: nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - ob1@0.83.7: - resolution: {integrity: sha512-9M5kpuOLyTPogMtZiQUIxdAZxl7Dxs6tVBbJErSumsqGMuhVSoUbkfeZ3XNPpLpwBBtqY5QDUzGwggLHX3slQg==} - engines: {node: '>=20.19.4'} + ob1@0.87.0: + resolution: {integrity: sha512-8Q8sKCiUwsxgSmjDtVWyRgmxsgeJXXam3oQH6Id8ADfNaJMV6GZKyeAl8+pGVVdgwAZabfk5+aExle7AP/nZiA==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} @@ -4135,9 +3962,6 @@ packages: resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} engines: {node: '>= 0.8'} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} @@ -4150,9 +3974,9 @@ packages: resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} engines: {node: '>=8'} - open@7.4.2: - resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} - engines: {node: '>=8'} + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} @@ -4254,10 +4078,6 @@ packages: resolution: {integrity: sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==} engines: {node: '>=14.0.0'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -4288,10 +4108,6 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} - pkg-dir@8.0.0: resolution: {integrity: sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==} engines: {node: '>=18'} @@ -4379,17 +4195,17 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-native-test-app@4.4.12: - resolution: {integrity: sha512-bCUpjF5A5NaCO0d7eYuqS4enRs+T5ZxOTkA80JfxNODSNynNPGXK85JAtfrNpPoAT79tai0oczFx5yrBOqePmw==} - engines: {node: '>=16.17'} + react-native-test-app@5.4.8: + resolution: {integrity: sha512-J8gdIUmHDZX5k2Cnx8odARmZrvGCgnOY2kpKtlWJfmSnWyJN4nAqCe2/PUk/7NAlrlkvSWGI4x+03k3cx2mxww==} + engines: {node: '>=20.19.4'} hasBin: true peerDependencies: - '@callstack/react-native-visionos': 0.73 - 0.79 + '@callstack/react-native-visionos': 0.76 - 0.79 '@expo/config-plugins': '>=5.0' - react: 18.1 - 19.1 - react-native: 0.70 - 0.82 || >=0.83.0-0 <0.83.0 - react-native-macos: ^0.0.0-0 || 0.71 - 0.79 - react-native-windows: ^0.0.0-0 || 0.70 - 0.79 + react: 18.2 - 19.2 + react-native: 0.76 - 0.87 || >=0.88.0-0 <0.88.0 + react-native-macos: ^0.0.0-0 || 0.76 - 0.81 + react-native-windows: ^0.0.0-0 || 0.76 - 0.83 peerDependenciesMeta: '@callstack/react-native-visionos': optional: true @@ -4400,13 +4216,13 @@ packages: react-native-windows: optional: true - react-native@0.81.4: - resolution: {integrity: sha512-bt5bz3A/+Cv46KcjV0VQa+fo7MKxs17RCcpzjftINlen4ZDUl0I6Ut+brQ2FToa5oD0IB0xvQHfmsg2EDqsZdQ==} - engines: {node: '>= 20.19.4'} + react-native@0.88.0-nightly-20260809-db662caea: + resolution: {integrity: sha512-3norxpYjYN9UeUI9ajhW880BejAKIasC7d01RkxFCWRrOnIVJeeSFKekwy81EJFTkM8FUCmJud5ys5hviXM/ZQ==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} hasBin: true peerDependencies: - '@types/react': ^19.1.0 - react: ^19.1.0 + '@types/react': ^19.1.1 + react: ^19.2.3 peerDependenciesMeta: '@types/react': optional: true @@ -4415,8 +4231,8 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} - react@19.1.0: - resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + react@19.2.3: + resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} engines: {node: '>=0.10.0'} read-pkg@9.0.1: @@ -4507,11 +4323,6 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rolldown@1.0.0-beta.29: resolution: {integrity: sha512-EsoOi8moHN6CAYyTZipxDDVTJn0j2nBCWor4wRU45RQ8ER2qREDykXLr3Ulz6hBh6oBKCFTQIjo21i0FXNo/IA==} hasBin: true @@ -4536,8 +4347,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - scheduler@0.26.0: - resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} @@ -4729,9 +4540,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strnum@1.1.2: - resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} - strnum@2.4.1: resolution: {integrity: sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==} @@ -4761,10 +4569,6 @@ packages: engines: {node: '>=10'} hasBin: true - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} @@ -4816,10 +4620,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - type-fest@0.7.1: resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} engines: {node: '>=8'} @@ -4908,10 +4708,6 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@11.1.1: - resolution: {integrity: sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==} - hasBin: true - uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). @@ -4974,13 +4770,6 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - ws@6.2.6: resolution: {integrity: sha512-XTrf1gv7kXoVf1hbC3PAyAiPgR8Wz1blcrYIjEsUmr08BLksT41R8KbjmS9408C2ERx7v1JDLD/BkpLEttjfKA==} peerDependencies: @@ -5325,26 +5114,6 @@ snapshots: dependencies: '@babel/core': 7.29.7 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 @@ -5370,61 +5139,21 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 @@ -6396,62 +6125,14 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@isaacs/ttlcache@1.4.1': {} - - '@istanbuljs/load-nyc-config@1.1.0': - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.15.0 - resolve-from: 5.0.0 - - '@istanbuljs/schema@0.1.6': {} - - '@jest/create-cache-key-function@29.7.0': - dependencies: - '@jest/types': 29.6.3 - - '@jest/environment@29.7.0': - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.20.1 - jest-mock: 29.7.0 + '@isaacs/cliui@9.0.0': {} - '@jest/fake-timers@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.20.1 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 + '@isaacs/ttlcache@1.4.1': {} '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.12 - '@jest/transform@29.7.0': - dependencies: - '@babel/core': 7.29.7 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.31 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.8 - pirates: 4.0.7 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - '@jest/types@29.6.3': dependencies: '@jest/schemas': 29.6.3 @@ -7033,17 +6714,17 @@ snapshots: - typescript - utf-8-validate - '@react-native/assets-registry@0.81.4': {} + '@react-native/asset-utils@0.88.0-nightly-20260809-db662caea': {} - '@react-native/babel-plugin-codegen@0.81.4(@babel/core@7.29.7)': + '@react-native/babel-plugin-codegen@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)': dependencies: '@babel/traverse': 7.29.7 - '@react-native/codegen': 0.81.4(@babel/core@7.29.7) + '@react-native/codegen': 0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7) transitivePeerDependencies: - '@babel/core' - supports-color - '@react-native/babel-preset@0.81.4(@babel/core@7.29.7)': + '@react-native/babel-preset@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.29.7) @@ -7051,27 +6732,19 @@ snapshots: '@babel/plugin-syntax-export-default-from': 7.29.7(@babel/core@7.29.7) '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7) '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-computed-properties': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-flow-strip-types': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-function-name': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-literals': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-numeric-separator': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7) @@ -7080,101 +6753,105 @@ snapshots: '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-sticky-regex': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) - '@babel/template': 7.29.7 - '@react-native/babel-plugin-codegen': 0.81.4(@babel/core@7.29.7) - babel-plugin-syntax-hermes-parser: 0.29.1 + '@react-native/babel-plugin-codegen': 0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7) + babel-plugin-syntax-hermes-parser: 0.37.0 babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7) + flow-parser: 0.325.0 react-refresh: 0.14.2 transitivePeerDependencies: - supports-color - '@react-native/codegen@0.81.4(@babel/core@7.29.7)': + '@react-native/codegen@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/parser': 7.29.7 - glob: 7.2.3 - hermes-parser: 0.29.1 + flow-parser: 0.325.0 + hermes-parser: 0.37.0 invariant: 2.2.4 nullthrows: 1.1.1 + tinyglobby: 0.2.17 yargs: 17.7.3 - '@react-native/community-cli-plugin@0.81.4(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))': + '@react-native/community-cli-plugin@0.88.0-nightly-20260809-db662caea(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))': dependencies: - '@react-native/dev-middleware': 0.81.4 + '@react-native/asset-utils': 0.88.0-nightly-20260809-db662caea + '@react-native/dev-middleware': 0.88.0-nightly-20260809-db662caea + commander: 12.1.0 debug: 4.4.3(supports-color@8.1.1) invariant: 2.2.4 - metro: 0.83.7 - metro-config: 0.83.7 - metro-core: 0.83.7 + metro: 0.87.0 semver: 7.8.5 optionalDependencies: '@react-native-community/cli': 20.2.0(typescript@5.9.3) - '@react-native/metro-config': 0.81.4(@babel/core@7.29.7) + '@react-native/metro-config': 0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@react-native/debugger-frontend@0.81.4': {} + '@react-native/debugger-frontend@0.88.0-nightly-20260809-db662caea': {} - '@react-native/dev-middleware@0.81.4': + '@react-native/debugger-shell@0.88.0-nightly-20260809-db662caea': + dependencies: + cross-spawn: 7.0.6 + debug: 4.4.3(supports-color@8.1.1) + fb-dotslash: 0.5.8 + transitivePeerDependencies: + - supports-color + + '@react-native/dev-middleware@0.88.0-nightly-20260809-db662caea': dependencies: '@isaacs/ttlcache': 1.4.1 - '@react-native/debugger-frontend': 0.81.4 - chrome-launcher: 0.15.2 - chromium-edge-launcher: 0.2.0 + '@react-native/debugger-frontend': 0.88.0-nightly-20260809-db662caea + '@react-native/debugger-shell': 0.88.0-nightly-20260809-db662caea connect: 3.7.0 debug: 4.4.3(supports-color@8.1.1) invariant: 2.2.4 nullthrows: 1.1.1 - open: 7.4.2 + open: 8.4.2 serve-static: 1.16.3 - ws: 6.2.6 + ws: 7.5.13 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@react-native/gradle-plugin@0.81.4': {} + '@react-native/gradle-plugin@0.88.0-nightly-20260809-db662caea': {} - '@react-native/js-polyfills@0.81.4': {} + '@react-native/js-polyfills@0.88.0-nightly-20260809-db662caea': {} - '@react-native/metro-babel-transformer@0.81.4(@babel/core@7.29.7)': + '@react-native/metro-babel-transformer@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@react-native/babel-preset': 0.81.4(@babel/core@7.29.7) - hermes-parser: 0.29.1 + '@react-native/babel-preset': 0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7) + flow-parser: 0.325.0 + hermes-parser: 0.37.0 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - '@react-native/metro-config@0.81.4(@babel/core@7.29.7)': + '@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)': dependencies: - '@react-native/js-polyfills': 0.81.4 - '@react-native/metro-babel-transformer': 0.81.4(@babel/core@7.29.7) - metro-config: 0.83.7 - metro-runtime: 0.83.7 + '@react-native/js-polyfills': 0.88.0-nightly-20260809-db662caea + '@react-native/metro-babel-transformer': 0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7) + metro-config: 0.87.0 + metro-runtime: 0.87.0 transitivePeerDependencies: - '@babel/core' - - bufferutil - supports-color - - utf-8-validate - '@react-native/normalize-colors@0.81.4': {} + '@react-native/normalize-colors@0.88.0-nightly-20260809-db662caea': {} - '@react-native/typescript-config@0.81.4': {} + '@react-native/typescript-config@0.88.0-nightly-20260809-db662caea': {} - '@react-native/virtualized-lists@0.81.4(@types/react@19.2.17)(react-native@0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0))(react@19.1.0)': + '@react-native/virtualized-lists@0.88.0-nightly-20260809-db662caea(@types/react@19.2.17)(react-native@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 - react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0) + react: 19.2.3 + react-native: 0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) optionalDependencies: '@types/react': 19.2.17 @@ -7183,37 +6860,37 @@ snapshots: '@actions/core': 2.0.3 stack-utils: 2.0.6 - '@rnx-kit/metro-config@2.2.4(@react-native-community/cli-types@20.2.0)(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(metro@0.83.7)(react-native@0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0))(react@19.1.0)': + '@rnx-kit/metro-config@2.2.4(@react-native-community/cli-types@20.2.0)(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(metro@0.87.0)(react-native@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)': dependencies: - '@rnx-kit/tools-node': 3.0.5(metro@0.83.7) - '@rnx-kit/tools-react-native': 2.3.8(@react-native-community/cli-types@20.2.0)(metro@0.83.7) + '@rnx-kit/tools-node': 3.0.5(metro@0.87.0) + '@rnx-kit/tools-react-native': 2.3.8(@react-native-community/cli-types@20.2.0)(metro@0.87.0) '@rnx-kit/tools-workspaces': 0.2.3 - react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0) + react: 19.2.3 + react-native: 0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) optionalDependencies: - '@react-native/metro-config': 0.81.4(@babel/core@7.29.7) + '@react-native/metro-config': 0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7) transitivePeerDependencies: - '@react-native-community/cli-types' - memfs - metro - '@rnx-kit/react-native-host@0.5.21(react-native@0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0))': + '@rnx-kit/react-native-host@0.5.21(react-native@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))': dependencies: - react-native: 0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0) + react-native: 0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) '@rnx-kit/tools-filesystem@0.2.0': {} - '@rnx-kit/tools-node@3.0.5(metro@0.83.7)': + '@rnx-kit/tools-node@3.0.5(metro@0.87.0)': dependencies: - '@rnx-kit/types-node': 1.0.0(metro@0.83.7) + '@rnx-kit/types-node': 1.0.0(metro@0.87.0) transitivePeerDependencies: - metro - '@rnx-kit/tools-react-native@2.3.8(@react-native-community/cli-types@20.2.0)(metro@0.83.7)': + '@rnx-kit/tools-react-native@2.3.8(@react-native-community/cli-types@20.2.0)(metro@0.87.0)': dependencies: '@rnx-kit/tools-filesystem': 0.2.0 - '@rnx-kit/tools-node': 3.0.5(metro@0.83.7) - '@rnx-kit/types-bundle-config': 1.0.0(metro@0.83.7) + '@rnx-kit/tools-node': 3.0.5(metro@0.87.0) + '@rnx-kit/types-bundle-config': 1.0.0(metro@0.87.0) optionalDependencies: '@react-native-community/cli-types': 20.2.0 transitivePeerDependencies: @@ -7228,26 +6905,26 @@ snapshots: read-yaml-file: 2.1.0 strip-json-comments: 3.1.1 - '@rnx-kit/types-bundle-config@1.0.0(metro@0.83.7)': + '@rnx-kit/types-bundle-config@1.0.0(metro@0.87.0)': dependencies: '@rnx-kit/types-metro-serializer-esbuild': 1.0.2 '@rnx-kit/types-plugin-cyclic-dependencies': 1.0.0 '@rnx-kit/types-plugin-duplicates-checker': 1.0.0 '@rnx-kit/types-plugin-typescript': 1.0.0 optionalDependencies: - metro: 0.83.7 + metro: 0.87.0 - '@rnx-kit/types-kit-config@1.0.0(metro@0.83.7)': + '@rnx-kit/types-kit-config@1.0.0(metro@0.87.0)': dependencies: - '@rnx-kit/types-bundle-config': 1.0.0(metro@0.83.7) + '@rnx-kit/types-bundle-config': 1.0.0(metro@0.87.0) transitivePeerDependencies: - metro '@rnx-kit/types-metro-serializer-esbuild@1.0.2': {} - '@rnx-kit/types-node@1.0.0(metro@0.83.7)': + '@rnx-kit/types-node@1.0.0(metro@0.87.0)': dependencies: - '@rnx-kit/types-kit-config': 1.0.0(metro@0.83.7) + '@rnx-kit/types-kit-config': 1.0.0(metro@0.87.0) transitivePeerDependencies: - metro @@ -7316,14 +6993,6 @@ snapshots: '@sinclair/typebox@0.27.12': {} - '@sinonjs/commons@3.0.1': - dependencies: - type-detect: 4.0.8 - - '@sinonjs/fake-timers@10.3.0': - dependencies: - '@sinonjs/commons': 3.0.1 - '@tsconfig/node22@22.0.5': {} '@tsconfig/react-native@3.0.6': {} @@ -7356,10 +7025,6 @@ snapshots: '@types/estree@1.0.9': {} - '@types/graceful-fs@4.1.9': - dependencies: - '@types/node': 22.20.1 - '@types/istanbul-lib-coverage@2.0.6': {} '@types/istanbul-lib-report@3.0.3': @@ -7390,8 +7055,6 @@ snapshots: dependencies: csstype: 3.2.3 - '@types/stack-utils@2.0.3': {} - '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.35': @@ -7527,10 +7190,6 @@ snapshots: '@xmldom/xmldom@0.8.13': {} - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -7599,11 +7258,6 @@ snapshots: ansis@4.3.1: {} - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.2 - anynum@1.0.1: {} appdirsjs@1.2.7: {} @@ -7657,36 +7311,6 @@ snapshots: - debug - supports-color - babel-jest@29.7.0(@babel/core@7.29.7): - dependencies: - '@babel/core': 7.29.7 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.29.7) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-istanbul@6.1.1: - dependencies: - '@babel/helper-plugin-utils': 7.29.7 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.6 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-jest-hoist@29.6.3: - dependencies: - '@babel/template': 7.29.7 - '@babel/types': 7.29.7 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.28.0 - babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7): dependencies: '@babel/compat-data': 7.29.7 @@ -7719,9 +7343,9 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-syntax-hermes-parser@0.29.1: + babel-plugin-syntax-hermes-parser@0.37.0: dependencies: - hermes-parser: 0.29.1 + hermes-parser: 0.37.0 babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.29.7): dependencies: @@ -7729,31 +7353,6 @@ snapshots: transitivePeerDependencies: - '@babel/core' - babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.7): - dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.7) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.7) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.7) - '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.7) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.7) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.7) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.7) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.7) - - babel-preset-jest@29.6.3(@babel/core@7.29.7): - dependencies: - '@babel/core': 7.29.7 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) - balanced-match@1.0.2: {} balanced-match@4.0.4: {} @@ -7872,26 +7471,6 @@ snapshots: chownr@2.0.0: {} - chrome-launcher@0.15.2: - dependencies: - '@types/node': 22.20.1 - escape-string-regexp: 4.0.0 - is-wsl: 2.2.0 - lighthouse-logger: 1.4.2 - transitivePeerDependencies: - - supports-color - - chromium-edge-launcher@0.2.0: - dependencies: - '@types/node': 22.20.1 - escape-string-regexp: 4.0.0 - is-wsl: 2.2.0 - lighthouse-logger: 1.4.2 - mkdirp: 1.0.4 - rimraf: 3.0.2 - transitivePeerDependencies: - - supports-color - ci-info@2.0.0: {} ci-info@3.9.0: {} @@ -8084,6 +7663,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + define-lazy-prop@2.0.0: {} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -8314,8 +7895,6 @@ snapshots: etag@1.8.1: {} - event-target-shim@5.0.1: {} - execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -8359,10 +7938,6 @@ snapshots: path-expression-matcher: 1.6.2 xml-naming: 0.3.0 - fast-xml-parser@4.5.7: - dependencies: - strnum: 1.1.2 - fast-xml-parser@5.10.1: dependencies: '@nodable/entities': 3.0.0 @@ -8376,6 +7951,8 @@ snapshots: dependencies: reusify: 1.1.0 + fb-dotslash@0.5.8: {} + fb-watchman@2.0.2: dependencies: bser: 2.1.1 @@ -8440,6 +8017,12 @@ snapshots: flow-enums-runtime@0.0.6: {} + flow-estree@0.325.0: {} + + flow-parser@0.325.0: + dependencies: + flow-estree: 0.325.0 + follow-redirects@1.16.0(debug@4.4.3): optionalDependencies: debug: 4.4.3(supports-color@8.1.1) @@ -8485,8 +8068,6 @@ snapshots: dependencies: minipass: 3.3.6 - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true @@ -8526,8 +8107,6 @@ snapshots: hasown: 2.0.4 math-intrinsics: 1.1.0 - get-package-type@0.1.0: {} - get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -8552,15 +8131,6 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.5 - once: 1.4.0 - path-is-absolute: 1.0.1 - global-modules@1.0.0: dependencies: global-prefix: 1.0.2 @@ -8614,17 +8184,19 @@ snapshots: he@1.2.0: {} - hermes-estree@0.29.1: {} + hermes-compiler@260318099.0.1: {} + + hermes-estree@0.36.1: {} - hermes-estree@0.35.0: {} + hermes-estree@0.37.0: {} - hermes-parser@0.29.1: + hermes-parser@0.36.1: dependencies: - hermes-estree: 0.29.1 + hermes-estree: 0.36.1 - hermes-parser@0.35.0: + hermes-parser@0.37.0: dependencies: - hermes-estree: 0.35.0 + hermes-estree: 0.37.0 homedir-polyfill@1.0.3: dependencies: @@ -8683,11 +8255,6 @@ snapshots: index-to-position@1.2.0: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - inherits@2.0.4: {} ini@1.3.8: {} @@ -8779,71 +8346,14 @@ snapshots: isexe@2.0.0: {} - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-instrument@5.2.1: - dependencies: - '@babel/core': 7.29.7 - '@babel/parser': 7.29.7 - '@istanbuljs/schema': 0.1.6 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jest-environment-node@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.20.1 - jest-mock: 29.7.0 - jest-util: 29.7.0 - jest-get-type@29.6.3: {} - jest-haste-map@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.9 - '@types/node': 22.20.1 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 - micromatch: 4.0.8 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - - jest-message-util@29.7.0: - dependencies: - '@babel/code-frame': 7.29.7 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 - - jest-mock@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.20.1 - jest-util: 29.7.0 - - jest-regex-util@29.6.3: {} - jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 @@ -8934,13 +8444,6 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lighthouse-logger@1.4.2: - dependencies: - debug: 2.6.9 - marky: 1.3.0 - transitivePeerDependencies: - - supports-color - lines-and-columns@1.2.4: {} locate-path@5.0.0: @@ -9001,8 +8504,6 @@ snapshots: dependencies: tmpl: 1.0.5 - marky@1.3.0: {} - math-intrinsics@1.1.0: {} media-typer@1.1.0: {} @@ -9017,51 +8518,50 @@ snapshots: merge2@1.4.1: {} - metro-babel-transformer@0.83.7: + metro-babel-transformer@0.87.0: dependencies: '@babel/core': 7.29.7 flow-enums-runtime: 0.0.6 - hermes-parser: 0.35.0 - metro-cache-key: 0.83.7 + hermes-parser: 0.36.1 + metro-cache-key: 0.87.0 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-cache-key@0.83.7: + metro-cache-key@0.87.0: dependencies: flow-enums-runtime: 0.0.6 - metro-cache@0.83.7: + metro-cache@0.87.0: dependencies: exponential-backoff: 3.1.3 flow-enums-runtime: 0.0.6 https-proxy-agent: 7.0.6 - metro-core: 0.83.7 + metro-core: 0.87.0 transitivePeerDependencies: - supports-color - metro-config@0.83.7: + metro-config@0.87.0: dependencies: connect: 3.7.0 flow-enums-runtime: 0.0.6 jest-validate: 29.7.0 - metro: 0.83.7 - metro-cache: 0.83.7 - metro-core: 0.83.7 - metro-runtime: 0.83.7 - yaml: 2.9.0 + metro: 0.87.0 + metro-cache: 0.87.0 + metro-core: 0.87.0 + metro-runtime: 0.87.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro-core@0.83.7: + metro-core@0.87.0: dependencies: flow-enums-runtime: 0.0.6 lodash.throttle: 4.1.1 - metro-resolver: 0.83.7 + metro-resolver: 0.87.0 - metro-file-map@0.83.7: + metro-file-map@0.87.0: dependencies: debug: 4.4.3(supports-color@8.1.1) fb-watchman: 2.0.2 @@ -9075,46 +8575,46 @@ snapshots: transitivePeerDependencies: - supports-color - metro-minify-terser@0.83.7: + metro-minify-terser@0.87.0: dependencies: flow-enums-runtime: 0.0.6 terser: 5.49.0 - metro-resolver@0.83.7: + metro-resolver@0.87.0: dependencies: flow-enums-runtime: 0.0.6 - metro-runtime@0.83.7: + metro-runtime@0.87.0: dependencies: '@babel/runtime': 7.29.7 flow-enums-runtime: 0.0.6 - metro-source-map@0.83.7: + metro-source-map@0.87.0: dependencies: '@babel/traverse': 7.29.7 '@babel/types': 7.29.7 flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-symbolicate: 0.83.7 + metro-symbolicate: 0.87.0 nullthrows: 1.1.1 - ob1: 0.83.7 + ob1: 0.87.0 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-symbolicate@0.83.7: + metro-symbolicate@0.87.0: dependencies: flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-source-map: 0.83.7 + metro-source-map: 0.87.0 nullthrows: 1.1.1 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-transform-plugins@0.83.7: + metro-transform-plugins@0.87.0: dependencies: '@babel/core': 7.29.7 '@babel/generator': 7.29.7 @@ -9125,27 +8625,27 @@ snapshots: transitivePeerDependencies: - supports-color - metro-transform-worker@0.83.7: + metro-transform-worker@0.87.0: dependencies: '@babel/core': 7.29.7 '@babel/generator': 7.29.7 '@babel/parser': 7.29.7 '@babel/types': 7.29.7 flow-enums-runtime: 0.0.6 - metro: 0.83.7 - metro-babel-transformer: 0.83.7 - metro-cache: 0.83.7 - metro-cache-key: 0.83.7 - metro-minify-terser: 0.83.7 - metro-source-map: 0.83.7 - metro-transform-plugins: 0.83.7 + metro: 0.87.0 + metro-babel-transformer: 0.87.0 + metro-cache: 0.87.0 + metro-cache-key: 0.87.0 + metro-minify-terser: 0.87.0 + metro-source-map: 0.87.0 + metro-transform-plugins: 0.87.0 nullthrows: 1.1.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro@0.83.7: + metro@0.87.0: dependencies: '@babel/code-frame': 7.29.7 '@babel/core': 7.29.7 @@ -9161,24 +8661,24 @@ snapshots: error-stack-parser: 2.1.4 flow-enums-runtime: 0.0.6 graceful-fs: 4.2.11 - hermes-parser: 0.35.0 + hermes-parser: 0.36.1 image-size: 1.2.1 invariant: 2.2.4 jest-worker: 29.7.0 jsc-safe-url: 0.2.4 lodash.throttle: 4.1.1 - metro-babel-transformer: 0.83.7 - metro-cache: 0.83.7 - metro-cache-key: 0.83.7 - metro-config: 0.83.7 - metro-core: 0.83.7 - metro-file-map: 0.83.7 - metro-resolver: 0.83.7 - metro-runtime: 0.83.7 - metro-source-map: 0.83.7 - metro-symbolicate: 0.83.7 - metro-transform-plugins: 0.83.7 - metro-transform-worker: 0.83.7 + metro-babel-transformer: 0.87.0 + metro-cache: 0.87.0 + metro-cache-key: 0.87.0 + metro-config: 0.87.0 + metro-core: 0.87.0 + metro-file-map: 0.87.0 + metro-resolver: 0.87.0 + metro-runtime: 0.87.0 + metro-source-map: 0.87.0 + metro-symbolicate: 0.87.0 + metro-transform-plugins: 0.87.0 + metro-transform-worker: 0.87.0 mime-types: 3.0.2 nullthrows: 1.1.1 serialize-error: 2.1.0 @@ -9277,11 +8777,11 @@ snapshots: transitivePeerDependencies: - supports-color - mocha-remote-react-native@1.13.2(react-native@0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0))(react@19.1.0): + mocha-remote-react-native@1.13.2(react-native@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3): dependencies: mocha-remote-client: 1.13.2 - react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0) + react: 19.2.3 + react-native: 0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) transitivePeerDependencies: - bufferutil - supports-color @@ -9374,8 +8874,6 @@ snapshots: semver: 7.8.5 validate-npm-package-license: 3.0.4 - normalize-path@3.0.0: {} - npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -9389,7 +8887,7 @@ snapshots: nullthrows@1.1.1: {} - ob1@0.83.7: + ob1@0.87.0: dependencies: flow-enums-runtime: 0.0.6 @@ -9421,10 +8919,6 @@ snapshots: on-headers@1.1.0: {} - once@1.4.0: - dependencies: - wrappy: 1.0.2 - onetime@5.1.2: dependencies: mimic-fn: 2.1.0 @@ -9437,8 +8931,9 @@ snapshots: dependencies: is-wsl: 1.1.0 - open@7.4.2: + open@8.4.2: dependencies: + define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 @@ -9568,8 +9063,6 @@ snapshots: path-expression-matcher@1.6.2: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} path-parse@1.0.7: {} @@ -9589,8 +9082,6 @@ snapshots: pify@4.0.1: {} - pirates@4.0.7: {} - pkg-dir@8.0.0: dependencies: find-up-simple: 1.0.1 @@ -9682,59 +9173,55 @@ snapshots: react-is@18.3.1: {} - react-native-test-app@4.4.12(@react-native-community/cli-types@20.2.0)(metro@0.83.7)(react-native@0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0))(react@19.1.0): + react-native-test-app@5.4.8(@react-native-community/cli-types@20.2.0)(metro@0.87.0)(react-native@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3): dependencies: - '@rnx-kit/react-native-host': 0.5.21(react-native@0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0)) - '@rnx-kit/tools-react-native': 2.3.8(@react-native-community/cli-types@20.2.0)(metro@0.83.7) + '@isaacs/cliui': 9.0.0 + '@rnx-kit/react-native-host': 0.5.21(react-native@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3)) + '@rnx-kit/tools-react-native': 2.3.8(@react-native-community/cli-types@20.2.0)(metro@0.87.0) ajv: 8.20.0 - cliui: 8.0.1 - fast-xml-parser: 4.5.7 + fast-xml-builder: 1.3.0 + fast-xml-parser: 5.10.1 prompts: 2.4.2 - react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0) + react: 19.2.3 + react-native: 0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) semver: 7.8.5 - uuid: 11.1.1 transitivePeerDependencies: - '@react-native-community/cli-types' - memfs - metro - react-native@0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0): - dependencies: - '@jest/create-cache-key-function': 29.7.0 - '@react-native/assets-registry': 0.81.4 - '@react-native/codegen': 0.81.4(@babel/core@7.29.7) - '@react-native/community-cli-plugin': 0.81.4(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7)) - '@react-native/gradle-plugin': 0.81.4 - '@react-native/js-polyfills': 0.81.4 - '@react-native/normalize-colors': 0.81.4 - '@react-native/virtualized-lists': 0.81.4(@types/react@19.2.17)(react-native@0.81.4(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.81.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.1.0))(react@19.1.0) - abort-controller: 3.0.0 + react-native@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3): + dependencies: + '@react-native/asset-utils': 0.88.0-nightly-20260809-db662caea + '@react-native/codegen': 0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7) + '@react-native/community-cli-plugin': 0.88.0-nightly-20260809-db662caea(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)) + '@react-native/gradle-plugin': 0.88.0-nightly-20260809-db662caea + '@react-native/normalize-colors': 0.88.0-nightly-20260809-db662caea + '@react-native/virtualized-lists': 0.88.0-nightly-20260809-db662caea(@types/react@19.2.17)(react-native@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.88.0-nightly-20260809-db662caea(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) anser: 1.4.10 ansi-regex: 5.0.1 - babel-jest: 29.7.0(@babel/core@7.29.7) - babel-plugin-syntax-hermes-parser: 0.29.1 + babel-plugin-syntax-hermes-parser: 0.37.0 base64-js: 1.5.1 - commander: 12.1.0 flow-enums-runtime: 0.0.6 - glob: 7.2.3 + flow-parser: 0.325.0 + hermes-compiler: 260318099.0.1 invariant: 2.2.4 - jest-environment-node: 29.7.0 memoize-one: 5.2.1 - metro-runtime: 0.83.7 - metro-source-map: 0.83.7 + metro-runtime: 0.87.0 + metro-source-map: 0.87.0 nullthrows: 1.1.1 pretty-format: 29.7.0 promise: 8.3.0 - react: 19.1.0 + react: 19.2.3 react-devtools-core: 6.1.5 react-refresh: 0.14.2 regenerator-runtime: 0.13.11 - scheduler: 0.26.0 + scheduler: 0.27.0 semver: 7.8.5 stacktrace-parser: 0.1.11 + tinyglobby: 0.2.17 whatwg-fetch: 3.6.20 - ws: 6.2.6 + ws: 7.5.13 yargs: 17.7.3 optionalDependencies: '@types/react': 19.2.17 @@ -9748,7 +9235,7 @@ snapshots: react-refresh@0.14.2: {} - react@19.1.0: {} + react@19.2.3: {} read-pkg@9.0.1: dependencies: @@ -9841,10 +9328,6 @@ snapshots: reusify@1.1.0: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - rolldown@1.0.0-beta.29(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2): dependencies: '@oxc-project/runtime': 0.77.3 @@ -9892,7 +9375,7 @@ snapshots: safer-buffer@2.1.2: {} - scheduler@0.26.0: {} + scheduler@0.27.0: {} semver-compare@1.0.0: {} @@ -10090,8 +9573,6 @@ snapshots: strip-json-comments@3.1.1: {} - strnum@1.1.2: {} - strnum@2.4.1: dependencies: anynum: 1.0.1 @@ -10124,12 +9605,6 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - test-exclude@6.0.0: - dependencies: - '@istanbuljs/schema': 0.1.6 - glob: 7.2.3 - minimatch: 3.1.5 - throat@5.0.0: {} tinyexec@1.2.4: {} @@ -10169,8 +9644,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} - type-fest@0.7.1: {} type-fest@4.41.0: {} @@ -10243,8 +9716,6 @@ snapshots: utils-merge@1.0.1: {} - uuid@11.1.1: {} - uuid@8.3.2: {} validate-npm-package-license@3.0.4: @@ -10312,13 +9783,6 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.2.0 - wrappy@1.0.2: {} - - write-file-atomic@4.0.2: - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - ws@6.2.6: dependencies: async-limiter: 1.0.1 From 5f3c0613e2e38dd9cf74458b0e561d6912209ccc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 11 Aug 2026 07:16:35 +0000 Subject: [PATCH 4/4] Version Packages (rc) --- .changeset/pre.json | 4 +++- apps/test-app/CHANGELOG.md | 11 +++++++++++ apps/test-app/package.json | 2 +- packages/cmake-rn/CHANGELOG.md | 8 ++++++++ packages/cmake-rn/package.json | 2 +- packages/ferric-example/CHANGELOG.md | 7 +++++++ packages/ferric-example/package.json | 2 +- packages/ferric/CHANGELOG.md | 8 ++++++++ packages/ferric/package.json | 2 +- packages/host/CHANGELOG.md | 19 +++++++++++++++++++ packages/host/package.json | 2 +- packages/node-addon-examples/CHANGELOG.md | 7 +++++++ packages/node-addon-examples/package.json | 2 +- packages/weak-node-api/CHANGELOG.md | 14 ++++++++++++++ packages/weak-node-api/package.json | 2 +- 15 files changed, 84 insertions(+), 8 deletions(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index d58b8f48..22ed034f 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -14,5 +14,7 @@ "@react-native-node-api/node-tests": "0.1.1", "weak-node-api": "0.1.1" }, - "changesets": [] + "changesets": [ + "eighty-moons-shave" + ] } diff --git a/apps/test-app/CHANGELOG.md b/apps/test-app/CHANGELOG.md index d94f31c6..4f28679f 100644 --- a/apps/test-app/CHANGELOG.md +++ b/apps/test-app/CHANGELOG.md @@ -1,5 +1,16 @@ # react-native-node-api-test-app +## 0.2.4-rc.0 + +### Patch Changes + +- Updated dependencies [58b213c] + - react-native-node-api@2.0.0-rc.0 + - weak-node-api@0.2.0-rc.0 + - @react-native-node-api/ferric-example@0.1.4-rc.0 + - @react-native-node-api/node-addon-examples@0.1.3-rc.0 + - @react-native-node-api/node-tests@0.1.1 + ## 0.2.3 ### Patch Changes diff --git a/apps/test-app/package.json b/apps/test-app/package.json index 1383025e..00b6cfa7 100644 --- a/apps/test-app/package.json +++ b/apps/test-app/package.json @@ -2,7 +2,7 @@ "name": "@react-native-node-api/test-app", "private": true, "type": "commonjs", - "version": "0.2.3", + "version": "0.2.4-rc.0", "scripts": { "metro": "react-native start --no-interactive", "android": "react-native run-android --no-packager --active-arch-only", diff --git a/packages/cmake-rn/CHANGELOG.md b/packages/cmake-rn/CHANGELOG.md index 624d619c..6fd71879 100644 --- a/packages/cmake-rn/CHANGELOG.md +++ b/packages/cmake-rn/CHANGELOG.md @@ -1,5 +1,13 @@ # cmake-rn +## 0.7.1-rc.0 + +### Patch Changes + +- Updated dependencies [58b213c] + - react-native-node-api@2.0.0-rc.0 + - weak-node-api@0.2.0-rc.0 + ## 0.7.0 ### Minor Changes diff --git a/packages/cmake-rn/package.json b/packages/cmake-rn/package.json index 70bc085d..441ec557 100644 --- a/packages/cmake-rn/package.json +++ b/packages/cmake-rn/package.json @@ -1,6 +1,6 @@ { "name": "cmake-rn", - "version": "0.7.0", + "version": "0.7.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-example/CHANGELOG.md b/packages/ferric-example/CHANGELOG.md index f1f1b809..3f0be426 100644 --- a/packages/ferric-example/CHANGELOG.md +++ b/packages/ferric-example/CHANGELOG.md @@ -1,5 +1,12 @@ # @react-native-node-api/ferric-example +## 0.1.4-rc.0 + +### Patch Changes + +- Updated dependencies [58b213c] + - react-native-node-api@2.0.0-rc.0 + ## 0.1.3 ### Patch Changes diff --git a/packages/ferric-example/package.json b/packages/ferric-example/package.json index 28735907..7c0a9d2c 100644 --- a/packages/ferric-example/package.json +++ b/packages/ferric-example/package.json @@ -1,6 +1,6 @@ { "name": "@react-native-node-api/ferric-example", - "version": "0.1.3", + "version": "0.1.4-rc.0", "private": true, "type": "commonjs", "homepage": "https://github.com/callstackincubator/react-native-node-api", diff --git a/packages/ferric/CHANGELOG.md b/packages/ferric/CHANGELOG.md index a2d18a73..45c6b8b5 100644 --- a/packages/ferric/CHANGELOG.md +++ b/packages/ferric/CHANGELOG.md @@ -1,5 +1,13 @@ # ferric-cli +## 0.4.1-rc.0 + +### Patch Changes + +- Updated dependencies [58b213c] + - react-native-node-api@2.0.0-rc.0 + - weak-node-api@0.2.0-rc.0 + ## 0.4.0 ### Minor Changes diff --git a/packages/ferric/package.json b/packages/ferric/package.json index 5096ac83..75859747 100644 --- a/packages/ferric/package.json +++ b/packages/ferric/package.json @@ -1,6 +1,6 @@ { "name": "ferric-cli", - "version": "0.4.0", + "version": "0.4.1-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 bd0e6532..d2a5bf2c 100644 --- a/packages/host/CHANGELOG.md +++ b/packages/host/CHANGELOG.md @@ -1,5 +1,24 @@ # react-native-node-api +## 2.0.0-rc.0 + +### Major Changes + +- 58b213c: 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. + +### Patch Changes + +- Updated dependencies [58b213c] + - weak-node-api@0.2.0-rc.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/host/package.json b/packages/host/package.json index 6633b534..ddd4c16f 100644 --- a/packages/host/package.json +++ b/packages/host/package.json @@ -1,6 +1,6 @@ { "name": "react-native-node-api", - "version": "1.1.0", + "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/node-addon-examples/CHANGELOG.md b/packages/node-addon-examples/CHANGELOG.md index f1db8d8f..64cdd2c3 100644 --- a/packages/node-addon-examples/CHANGELOG.md +++ b/packages/node-addon-examples/CHANGELOG.md @@ -1,5 +1,12 @@ # @react-native-node-api/node-addon-examples +## 0.1.3-rc.0 + +### Patch Changes + +- Updated dependencies [58b213c] + - react-native-node-api@2.0.0-rc.0 + ## 0.1.2 ### Patch Changes diff --git a/packages/node-addon-examples/package.json b/packages/node-addon-examples/package.json index 0d2d129b..2adeaa98 100644 --- a/packages/node-addon-examples/package.json +++ b/packages/node-addon-examples/package.json @@ -1,6 +1,6 @@ { "name": "@react-native-node-api/node-addon-examples", - "version": "0.1.2", + "version": "0.1.3-rc.0", "type": "commonjs", "main": "dist/index.js", "files": [ diff --git a/packages/weak-node-api/CHANGELOG.md b/packages/weak-node-api/CHANGELOG.md index 90dec646..869dd9bb 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 + +- 58b213c: 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": {