From a2d43af49dd5dad8e6582939caa5f11e8f2e03ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Mon, 13 Jul 2026 20:53:06 +0200 Subject: [PATCH 01/25] 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) --- apps/test-app/package.json | 12 +-- apps/test-app/tsconfig.json | 2 +- package.json | 2 +- packages/host/cpp/CxxNodeApiHostModule.cpp | 3 +- packages/host/package.json | 2 +- packages/host/scripts/patch-hermes.rb | 33 +++--- packages/host/scripts/patch-xcode-project.rb | 6 +- packages/host/src/node/cli/hermes.ts | 106 ++++++------------- packages/host/src/node/podspec.test.ts | 24 ----- 9 files changed, 62 insertions(+), 128 deletions(-) delete mode 100644 packages/host/src/node/podspec.test.ts diff --git a/apps/test-app/package.json b/apps/test-app/package.json index 80d34691..54d9190d 100644 --- a/apps/test-app/package.json +++ b/apps/test-app/package.json @@ -30,9 +30,9 @@ "@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", + "@react-native/babel-preset": "0.87.0-nightly-20260529-88857d22f", + "@react-native/metro-config": "0.87.0-nightly-20260529-88857d22f", + "@react-native/typescript-config": "0.87.0-nightly-20260529-88857d22f", "@rnx-kit/metro-config": "^2.1.1", "@types/mocha": "^10.0.10", "@types/react": "^19.1.0", @@ -40,10 +40,10 @@ "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.87.0-nightly-20260529-88857d22f", "react-native-node-api": "workspace:*", - "react-native-test-app": "^4.4.7", + "react-native-test-app": "^5.1.9", "weak-node-api": "workspace:*" } } 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/package.json b/package.json index 9a4f3db3..e0947829 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.87.0-nightly-20260529-88857d22f", "read-pkg": "^9.0.1", "tsx": "^4.20.6", "typescript": "^5.8.0", diff --git a/packages/host/cpp/CxxNodeApiHostModule.cpp b/packages/host/cpp/CxxNodeApiHostModule.cpp index 0b1961ec..554fb242 100644 --- a/packages/host/cpp/CxxNodeApiHostModule.cpp +++ b/packages/host/cpp/CxxNodeApiHostModule.cpp @@ -108,7 +108,8 @@ 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)); + // TODO: Phase 2-3 will replace this with hermes_napi_create_env + napi_env env = nullptr; // Create the "exports" object napi_value exports; diff --git a/packages/host/package.json b/packages/host/package.json index 970dafbf..b9a45ad5 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.87.0-nightly-20260529-88857d22f", "weak-node-api": "workspace:*" } } 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..61076224 100644 --- a/packages/host/src/node/cli/hermes.ts +++ b/packages/host/src/node/cli/hermes.ts @@ -15,40 +15,19 @@ 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. +const HERMES_GIT_SHA = "0ae42446d1ae669508368b0a18e60c789f76735d"; 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 +54,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 +72,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/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/, - ); - }, - ); -}); From 42d7e5aed36d752de10bb51fce33aa2f521c6c86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Mon, 13 Jul 2026 21:02:57 +0200 Subject: [PATCH 02/25] 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) --- packages/host/src/node/cli/xcode-helpers.ts | 37 +++++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) 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; From 31cb1a492d94954d82a348dd2e2f2b8deecd00bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Mon, 13 Jul 2026 21:11:45 +0200 Subject: [PATCH 03/25] 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) --- apps/test-app/android/gradle/wrapper/gradle-wrapper.properties | 2 +- apps/test-app/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/test-app/android/gradle/wrapper/gradle-wrapper.properties b/apps/test-app/android/gradle/wrapper/gradle-wrapper.properties index d4081da4..37f78a6a 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.3.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 54d9190d..dc2e63cc 100644 --- a/apps/test-app/package.json +++ b/apps/test-app/package.json @@ -33,7 +33,7 @@ "@react-native/babel-preset": "0.87.0-nightly-20260529-88857d22f", "@react-native/metro-config": "0.87.0-nightly-20260529-88857d22f", "@react-native/typescript-config": "0.87.0-nightly-20260529-88857d22f", - "@rnx-kit/metro-config": "^2.1.1", + "@rnx-kit/metro-config": "^2.2.4", "@types/mocha": "^10.0.10", "@types/react": "^19.1.0", "concurrently": "^9.1.2", From 2b53fe7650af96cfa6eee6995bae2f9efd36999b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Mon, 13 Jul 2026 22:16:33 +0200 Subject: [PATCH 04/25] Phase 2: create a real Node-API env via hermes_napi_create_env MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- packages/host/cpp/CxxNodeApiHostModule.cpp | 32 ++++++++++++++++++++-- packages/host/cpp/CxxNodeApiHostModule.hpp | 5 ++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/packages/host/cpp/CxxNodeApiHostModule.cpp b/packages/host/cpp/CxxNodeApiHostModule.cpp index 554fb242..cbc763ae 100644 --- a/packages/host/cpp/CxxNodeApiHostModule.cpp +++ b/packages/host/cpp/CxxNodeApiHostModule.cpp @@ -2,8 +2,19 @@ #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. +// Only the mangled name matters for linking, so passing host as nullptr is +// enough — async work / thread-safe functions will return failure until a +// host integration is wired up (Phase 3). +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,8 +119,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 - // TODO: Phase 2-3 will replace this with hermes_napi_create_env - napi_env env = nullptr; + + // Lazily create the Node-API environment backing this runtime. Hermes binds + // an env to its low-level VM runtime, which we reach through the (unstable) + // IHermes JSI interface. The env is owned by the runtime and shared across + // all addons, so we create it once and cache it. + if (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(); + } + env_ = hermes_napi_create_env(hermes->getVMRuntimeUnsafe(), nullptr); + assert(env_ != nullptr); + } + napi_env env = env_; // Create the "exports" object napi_value exports; diff --git a/packages/host/cpp/CxxNodeApiHostModule.hpp b/packages/host/cpp/CxxNodeApiHostModule.hpp index 4c753cfe..2b2c97bc 100644 --- a/packages/host/cpp/CxxNodeApiHostModule.hpp +++ b/packages/host/cpp/CxxNodeApiHostModule.hpp @@ -30,6 +30,11 @@ class JSI_EXPORT CxxNodeApiHostModule : public facebook::react::TurboModule { std::unordered_map nodeAddons_; std::shared_ptr callInvoker_; + // The Node-API environment backing every addon loaded into this runtime. + // Created lazily on first use from the underlying Hermes VM runtime and + // shared across all addons (Node-API expects a single env per realm). + napi_env env_ = nullptr; + using LoaderPolicy = PosixLoader; // FIXME: HACK: This is temporary workaround // for my lazyness (work on iOS and Android) From 31051983d1aa25f8421aaebe52c8e98cf5acb7da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Tue, 14 Jul 2026 21:27:11 +0200 Subject: [PATCH 05/25] Phase 2: bump Node-API to v10, drop engine/runtime split MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- packages/host/cpp/Versions.hpp | 6 +++- packages/host/scripts/generate-injector.mts | 29 ++++--------------- packages/weak-node-api/CMakeLists.txt | 2 +- .../weak-node-api/src/node-api-functions.ts | 18 +++++------- 4 files changed, 18 insertions(+), 37 deletions(-) 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/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/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();" From 1ba19012cd630a887035dad38c7c285967c41f64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Wed, 15 Jul 2026 07:32:20 +0200 Subject: [PATCH 06/25] vendor-hermes: export public hermes_napi_* entry points MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- eslint.config.js | 1 + packages/host/src/node/cli/hermes.ts | 38 ++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) 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/packages/host/src/node/cli/hermes.ts b/packages/host/src/node/cli/hermes.ts index 61076224..a0a4fb76 100644 --- a/packages/host/src/node/cli/hermes.ts +++ b/packages/host/src/node/cli/hermes.ts @@ -28,6 +28,41 @@ const platformOption = new Option( "The React Native package to vendor Hermes into", ).default("react-native"); +// The public `hermes_napi_*` entry points (e.g. `hermes_napi_create_env`) are +// declared in `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 symbols are name-mangled +// and, because Hermes builds with a global `-fvisibility=hidden`, stay out of +// the shared framework's export table. We reach `hermes_napi_create_env` from +// the host module, so consumers linking the framework hit "Undefined symbol". +// +// Wrapping the declarations in `EXTERN_C_START` / `EXTERN_C_END` (both already +// available via the `node_api.h` include) gives them C linkage, so they export +// under their unmangled C names. This mirrors facebook/hermes#2106. +const HERMES_NAPI_HEADER = "API/napi/hermes_napi.h"; +const HERMES_NAPI_INCLUDE = '#include "hermes/napi/node_api.h"'; +const HERMES_NAPI_ENDIF = "#endif // HERMES_NAPI_HERMES_NAPI_H"; + +async function patchHermesNapiVisibility(hermesPath: string) { + const headerPath = path.join(hermesPath, HERMES_NAPI_HEADER); + const contents = await fs.promises.readFile(headerPath, "utf8"); + if (contents.includes("EXTERN_C_START")) { + return; + } + assert( + contents.includes(HERMES_NAPI_INCLUDE) && + contents.includes(HERMES_NAPI_ENDIF), + `Cannot patch ${HERMES_NAPI_HEADER}: expected anchors not found (did the pinned Hermes commit change?)`, + ); + const patched = contents + .replace( + HERMES_NAPI_INCLUDE, + `${HERMES_NAPI_INCLUDE}\n\nEXTERN_C_START`, + ) + .replace(HERMES_NAPI_ENDIF, `EXTERN_C_END\n\n${HERMES_NAPI_ENDIF}`); + await fs.promises.writeFile(headerPath, patched); +} + 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) @@ -115,6 +150,9 @@ export const command = new Command("vendor-hermes") }); } } + // Applied unconditionally (idempotent) so an existing checkout from + // before this patch also gets fixed. + await patchHermesNapiVisibility(hermesPath); console.log(hermesPath); }), ); From 9fa7c3e4843ce24e30c898017bccff1e1dba7b16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Thu, 16 Jul 2026 21:00:14 +0200 Subject: [PATCH 07/25] 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) --- packages/host/src/node/cli/hermes.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/host/src/node/cli/hermes.ts b/packages/host/src/node/cli/hermes.ts index a0a4fb76..6441e597 100644 --- a/packages/host/src/node/cli/hermes.ts +++ b/packages/host/src/node/cli/hermes.ts @@ -55,10 +55,7 @@ async function patchHermesNapiVisibility(hermesPath: string) { `Cannot patch ${HERMES_NAPI_HEADER}: expected anchors not found (did the pinned Hermes commit change?)`, ); const patched = contents - .replace( - HERMES_NAPI_INCLUDE, - `${HERMES_NAPI_INCLUDE}\n\nEXTERN_C_START`, - ) + .replace(HERMES_NAPI_INCLUDE, `${HERMES_NAPI_INCLUDE}\n\nEXTERN_C_START`) .replace(HERMES_NAPI_ENDIF, `EXTERN_C_END\n\n${HERMES_NAPI_ENDIF}`); await fs.promises.writeFile(headerPath, patched); } From 7755667da145adb507365db298294bd32f538561 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 23 Jul 2026 20:25:29 +0000 Subject: [PATCH 08/25] 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 --- pnpm-lock.yaml | 1094 +++++++++++++----------------------------------- 1 file changed, 300 insertions(+), 794 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2be265d9..3327fdaa 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.87.0-nightly-20260529-88857d22f + version: 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.87.0-nightly-20260529-88857d22f + version: 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7) '@react-native/metro-config': - specifier: 0.81.4 - version: 0.81.4(@babel/core@7.29.7) + specifier: 0.87.0-nightly-20260529-88857d22f + version: 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7) '@react-native/typescript-config': - specifier: 0.81.4 - version: 0.81.4 + specifier: 0.87.0-nightly-20260529-88857d22f + version: 0.87.0-nightly-20260529-88857d22f '@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.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(metro@0.84.4)(react-native@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.87.0-nightly-20260529-88857d22f + version: 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.1.9 + version: 5.4.5(@react-native-community/cli-types@20.2.0)(metro@0.84.4)(react-native@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.87.0-nightly-20260529-88857d22f + version: 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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/assets-registry@0.87.0-nightly-20260529-88857d22f': + resolution: {integrity: sha512-j8zIei+HBgoZzong8KWc94Q5tzZqXkNGaf8nUGZwox8d99jFimIPB1OwjZUgtNqP+pdAahB3nIVK1c3nYyf5Hw==} + 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.87.0-nightly-20260529-88857d22f': + resolution: {integrity: sha512-KO/inLlEtopwOEXnMfRES56tiRHhUhXtQ5l57kVqExRW7eay/H45HfWbRGuZwk0ZX68CoDJdToCSiEZqNijdzQ==} + 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.87.0-nightly-20260529-88857d22f': + resolution: {integrity: sha512-JkeAigYc4v/zOILjdK4EhOc4NioWXCRculwZ6gDYS0MwcQnRVhFZ8uZ7cLCsmJdmVusfEOLvsWZP0wlnFSlqFA==} + 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.87.0-nightly-20260529-88857d22f': + resolution: {integrity: sha512-y24JDXa7Bf9WKX7iAb0Lterf6WKXim4GHf/YE6gbCeq1ViTHDA4mMM9YpfDXps5ep1s0HpAawyWNmytH0+sexQ==} + 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.87.0-nightly-20260529-88857d22f': + resolution: {integrity: sha512-GLwUc2KE/cSaOJMbKhOEUD6wF1297Vsq7J2p1jjI8XKDrRD2k/0bbpb6DO0arBBxIazzMzbuWWysOugNBYXRPA==} + 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.87.0-nightly-20260529-88857d22f 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.87.0-nightly-20260529-88857d22f': + resolution: {integrity: sha512-e3m3+A7SP2VjAq2YUK9G3OyVy9zqFbND9aFS2t69JO8D+XLac95sZdXcI+AarclMnM4vHY59IRCXv5LoIaYyHA==} + 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/debugger-shell@0.87.0-nightly-20260529-88857d22f': + resolution: {integrity: sha512-9c+F/ZZRQf5K1/WNV/pVMTh8AhMvmIHg6gukKIfJ/4Ayf67qIJsU5OFGWjAYwPccY9eYkZlhH+KE9ryvmvr9Cw==} + 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/dev-middleware@0.87.0-nightly-20260529-88857d22f': + resolution: {integrity: sha512-A8nc5Y3T6ckQKR4hgUvR8MWscR1rmfxAldj1bN/N7/nw5HI/t+H0Gvbh8mDEgTuZCs5SsAtEtiHlOQ+MM7dvWA==} + 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/gradle-plugin@0.87.0-nightly-20260529-88857d22f': + resolution: {integrity: sha512-51W23Y022JXhwC+zgGM3SD22jmTFky+QLQgnm4uzt6UPTE11cNkCq6WKBErrP41pZhHH1dhO9gyngn46Ku/VWw==} + 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/js-polyfills@0.87.0-nightly-20260529-88857d22f': + resolution: {integrity: sha512-659Z+ssrFyciyoQ1Ty9Nfy7RlK50buh3w28rdH7Y70fEsR5UxAjZJ2TQGG4+DB+FVYPHcvUFCQdgRZ6U/QsYDw==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} + + '@react-native/metro-babel-transformer@0.87.0-nightly-20260529-88857d22f': + resolution: {integrity: sha512-ktNbGf0MOi1XpIvQ25QWYCOgWth22UlP7cBx4q3rtbtQoGiUJQTUlnZFNkJwlNDHMsVfjCDpKs7bVmGsxuL6GA==} + 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.87.0-nightly-20260529-88857d22f': + resolution: {integrity: sha512-Q3Y+cysds2KpFZhRETvPPcnZu5yy0t1HnEKROZhqJwBKqRqJw3HEnQJk7CjetO4akluUOoottpIMoeIQR0VSTw==} + 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.87.0-nightly-20260529-88857d22f': + resolution: {integrity: sha512-ii3Uc1Y+nds7/K4JXmnF4qSRDYvhaaHf9HB1X+EBpoUXWl+LCvtGSfLPpf7doQzRBEolRsICvD84UCSvD88jzw==} - '@react-native/typescript-config@0.81.4': - resolution: {integrity: sha512-1HSrwtfAmtbKHNK2HAMCL5ArbGhxxJjOmTViDQ4nEhLJCAllZjQJyR/Hs1GmwHJokLmgXCcg3VH/13spwQBdxw==} + '@react-native/typescript-config@0.87.0-nightly-20260529-88857d22f': + resolution: {integrity: sha512-8kf2oriCR1YZoFGe8W/A6GOh1DqoxsbnMiGQs4wudroeaNKS31JtK/S87AAxdUeeiTtMaoSdR1RG5Gs5Xo7XOA==} - '@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.87.0-nightly-20260529-88857d22f': + resolution: {integrity: sha512-Ik1DHacZt8jN9Pze1s4aRxKd4XNIJAxwjI91MQWl57pygbu7oSWBe9xOdNuP9uphnf5cO3dfQDqFtMQ98muZrw==} + 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.87.0-nightly-20260529-88857d22f 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==} @@ -2559,10 +2468,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 +2523,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 +2543,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.36.1: + resolution: {integrity: sha512-ycduwJbvdvIMmVvlAZqGggS+pm5Eu4Bk9pcV9Sm2Z4PJNRVsKkv0g7vHj+LeuC1gHTeF67sJXFOq61IlqCa2hA==} 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==} @@ -2790,8 +2670,8 @@ packages: engines: {node: '>=12.13.0'} hasBin: true - chromium-edge-launcher@0.2.0: - resolution: {integrity: sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==} + chromium-edge-launcher@0.3.0: + resolution: {integrity: sha512-p03azHlGjtyRvFEee3cyvtsRYdniSkwjkzmM/KmVnqT5d7QkkwpJBhis/zCLMYdQMVJ5tt140TBNqqrZPaWeFA==} ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} @@ -3225,10 +3105,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 +3112,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==} @@ -3335,9 +3216,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 +3253,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 +3274,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,18 +3330,21 @@ 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@250829098.0.13: + resolution: {integrity: sha512-6Ivl/892zuiORZdKmBsTlCyCIaCC3+QK/8a9E4nCSIn5kPvOZMUk5lQ1vgyuMBSBD+bnu59RePORn1siZv6zgA==} hermes-estree@0.35.0: resolution: {integrity: sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==} - hermes-parser@0.29.1: - resolution: {integrity: sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==} + hermes-estree@0.36.1: + resolution: {integrity: sha512-guv1nQ6IJ7S83NRFPWc3SA7IBZrdNC9kapwOq6uXvF4wP+sDCgjzQbKPCoyYmoyZRzztF/n/c36l/rccCZSiCw==} hermes-parser@0.35.0: resolution: {integrity: sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==} + hermes-parser@0.36.1: + resolution: {integrity: sha512-GApNk4zLHi2UWoWZZkx7LNCOSzLSc5lB55pZ/PhK7ycFeg7u5LcF88p/WbpIi1XUDtE0MpHE3uRR3u3KB7TjSQ==} + homedir-polyfill@1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} @@ -3532,10 +3405,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 +3524,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} @@ -3859,62 +3700,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.84.4: + resolution: {integrity: sha512-rvCfz8snl9h20VcvpOHxZuHP1SlAkv4HXbzw7nyyVwu6Eqo5PRerbakQ9XmUCOsRy70spJ37O+G1TK8oMzo48g==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-cache-key@0.83.7: - resolution: {integrity: sha512-W1c2Nmx8MiJTJt+eWhMO08z9VKi3kZOaz99IYGdqeqDgY9j+yZjXl62rUav4Di0heZfh4/n2s722PqRL1OODeg==} - engines: {node: '>=20.19.4'} + metro-cache-key@0.84.4: + resolution: {integrity: sha512-wVO79aGrkYImpnaVS4+d5RrRBRPX31QtvKB3wKGBuiNSznduZTQHzsrJZRroFJSwnygrzdsGUtDQPuqqFjFdvw==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-cache@0.83.7: - resolution: {integrity: sha512-E9SRePXQ1Zvlj79VcOk57q7VC7rMHMFQ+jhmPHBiq+dJ0bJB5BL87lWZF6oh5X76Cci5tpDuQNaDwwuSCToEeg==} - engines: {node: '>=20.19.4'} + metro-cache@0.84.4: + resolution: {integrity: sha512-gpcFQdSLUwUCk71saKoE64jLFbx2nwTfVCcPSULMNT8QYq0p1eZZE29Jvd0HtT/UlhC3ZOutLxJME5xqD2JUZg==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-config@0.83.7: - resolution: {integrity: sha512-83mjWFbFOt2GeJ6pFIum5mSnc1uTsZJAtD8o4ej0s4NVsYsA7fB+pHvTfHhFrpeMONaobu2riKavkPei05Er/Q==} - engines: {node: '>=20.19.4'} + metro-config@0.84.4: + resolution: {integrity: sha512-PMotGDjXcXLWo2TMRH+VR99phFNgYTwqh4OoieIKK3yTJa1Jmkl+fZJxDO0jfBvNF+WESHciHvpNuBtXaF3B0Q==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-core@0.83.7: - resolution: {integrity: sha512-6yn3w1wnltT6RQl7p7YES2l95ArC+mWrOssEiH8p5/DDrJS65/szf9LsC9JrBv8c5DdvSY3V3f0GRYg0Ox7hCg==} - engines: {node: '>=20.19.4'} + metro-core@0.84.4: + resolution: {integrity: sha512-HONpWC5LGXZn3ffkd4Hu6AIrfE7j4Z0g0wMo/goV24WOB3lhuFZ40KgvaDiSw8iyQHloMYay5N/wPX+z8oN/PQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.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.84.4: + resolution: {integrity: sha512-KSVDi/u60hKPx++NLu3MTIvyjzNoJnFAF8PQFxaj1jiSka/wjw+Ua6sNuJ0TDHQv+7AAoFQxeMgaRAe8Yic5wQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-minify-terser@0.83.7: - resolution: {integrity: sha512-MfJar2IS4tBRuLb9svwb0Gu5l9BsH+pcRm8eGcEi/wy8MzZinfinh5dFLt2nWkocnulIgtGB5NkFDdbXqMXKhQ==} - engines: {node: '>=20.19.4'} + metro-minify-terser@0.84.4: + resolution: {integrity: sha512-5qpbaVOMC7CPitIpuewzVeGw7E+C3ykbv2mqTjQLl85Z3annSVGlSCTcsZjqXZzjupfK4Ztj3dDc4kc44NZwtQ==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-resolver@0.83.7: - resolution: {integrity: sha512-WSJIENlMcoSsuz66IfBHOkgfp3KJt2UW2TnEHPf1b8pIG2eEXNOVmo2+03A0H17WY2XGXWgxL0CG7FAopqgB1A==} - engines: {node: '>=20.19.4'} + metro-resolver@0.84.4: + resolution: {integrity: sha512-1qLgbxQ5ZGhhutuPot1Yp348ofDsATL2WkrHF65TobqTT9K3P9qJXw38bomk7ncp5B7OYMfWwtyBZo1lCV792A==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-runtime@0.83.7: - resolution: {integrity: sha512-9GKkJURaB2iyYoEExKnedzAHzxmKtSi+k0tsZUvMoU27tBZJElchYt7JH/Ai/XzYAI9lCAaV7u5HZSI8J5Z+wQ==} - engines: {node: '>=20.19.4'} + metro-runtime@0.84.4: + resolution: {integrity: sha512-Jibypds4g7AhzdRKY+kDoj51s5EXMwgyp5ddtlreDAsWefMdOx+agWqgm0H2XSZ/ueanHHVM89fnf5OJnlxa8Q==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-source-map@0.83.7: - resolution: {integrity: sha512-JgA1h7oc1a1jydBe1GhVFsUoMYo3wLPk7oRA32rjlDsq+sP2JLt9x2p2lWbNSxTm/u8NV4VRid3hvEJgcX8tKw==} - engines: {node: '>=20.19.4'} + metro-source-map@0.84.4: + resolution: {integrity: sha512-jbWkPxIesVuo1IWkvezmMJld6iu8nD62GsrZiV6jP37AOdbo4OBq1FJ+qkOg8sV05wAHB//jAbziuW0SlJfW4g==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-symbolicate@0.83.7: - resolution: {integrity: sha512-g4suyxw20WOHWI680c+Kq4wC/NF+Hx5pRH9afrMp+sMTxqLeKcPR1Xf4wMhsjlbvx7LbIREdke6q928jEjvJWw==} - engines: {node: '>=20.19.4'} + metro-symbolicate@0.84.4: + resolution: {integrity: sha512-OnfpacxUqGPZQ27t8qK9mFa7uqHIlVWeqRqkCbvMvreEBiamEeOn8krKtcwgP5M4cYDPwuSmCTopHMVthqG4zA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.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.84.4: + resolution: {integrity: sha512-kehr6HbAecqD0/a3xLXobELdPaAmRAl8bel0qagPF4vhZtux93nS8S4eq2kgKt6J2GnQpVjSoW1PXdst04mwow==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-transform-worker@0.83.7: - resolution: {integrity: sha512-UegCo7ygB2fT64mRK2nbAjQVJ1zSwIIHy8d96jJv2nKZFDaViYBiughEdu5HM/Ceq0WN3LZrZk3zhl9aoiLYFw==} - engines: {node: '>=20.19.4'} + metro-transform-worker@0.84.4: + resolution: {integrity: sha512-W1IYMvvXTu4MxYr7d9h7CeG2vpIr3bmLLIavkPY4O1ilzDrvS8z/NEe6y+pC44Ff7raMXQgYSfdqDUwN/i39gg==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro@0.83.7: - resolution: {integrity: sha512-SPaPEyvTsTmd0LpT7RaZciQyDw2i/JB7+iY9L5VfBo72+psescFxBqpI1TL9dnL+pmnfkU+l/J1mEEGLeF65EQ==} - engines: {node: '>=20.19.4'} + metro@0.84.4: + resolution: {integrity: sha512-8ETTubqfD6ornDy2zYDvRcKnVDOXdFJsjetYDBsY4oAsb6NJkiwFR+FaMESyGppFmQUyBQA4H4sFGxzcQSGtFA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} hasBin: true micromatch@4.0.8: @@ -4087,10 +3928,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 +3940,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.84.4: + resolution: {integrity: sha512-eJXMpz4aQHXF/YBB9ddqZDIS+ooO91hObo9FoW/xBkr54/zCwYYCDqT/O54vNo8kOkWs5Ou/y28NgdrV0edQNA==} + engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} @@ -4135,9 +3972,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'} @@ -4254,10 +4088,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 +4118,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 +4205,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.5: + resolution: {integrity: sha512-Vbv8hlj6/PZ/ZiVXoxtsbbe3nCsFLEDlcUl2DkeQ8Ryqo0ZMrx9ijD8ToRJgKnlb8NvVguZ6qFBH6RkG2N5cmQ==} + 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.86 || >=0.86.0-0 <0.87.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,14 +4226,17 @@ 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.87.0-nightly-20260529-88857d22f: + resolution: {integrity: sha512-qV7jWIdQfun0qv6lt9ByemzgsOII6mmiJCGYLgBF5wEFoKKYSXS71oDBdah7qv5bZWHohcz/31g6mZCwvsx1AA==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} hasBin: true peerDependencies: - '@types/react': ^19.1.0 - react: ^19.1.0 + '@react-native/jest-preset': 0.87.0-nightly-20260529-88857d22f + '@types/react': ^19.1.1 + react: ^19.2.3 peerDependenciesMeta: + '@react-native/jest-preset': + optional: true '@types/react': optional: true @@ -4415,8 +4244,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 +4336,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 +4360,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 +4553,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 +4582,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 +4633,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 +4721,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 +4783,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 +5127,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 +5152,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 +6138,14 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@isaacs/ttlcache@1.4.1': {} + '@isaacs/cliui@9.0.0': {} - '@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 - - '@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 +6727,17 @@ snapshots: - typescript - utf-8-validate - '@react-native/assets-registry@0.81.4': {} + '@react-native/assets-registry@0.87.0-nightly-20260529-88857d22f': {} - '@react-native/babel-plugin-codegen@0.81.4(@babel/core@7.29.7)': + '@react-native/babel-plugin-codegen@0.87.0-nightly-20260529-88857d22f(@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.87.0-nightly-20260529-88857d22f(@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.87.0-nightly-20260529-88857d22f(@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 +6745,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 +6766,106 @@ 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.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7) + babel-plugin-syntax-hermes-parser: 0.36.1 babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7) react-refresh: 0.14.2 transitivePeerDependencies: - supports-color - '@react-native/codegen@0.81.4(@babel/core@7.29.7)': + '@react-native/codegen@0.87.0-nightly-20260529-88857d22f(@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 + hermes-parser: 0.36.1 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.87.0-nightly-20260529-88857d22f(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))': dependencies: - '@react-native/dev-middleware': 0.81.4 + '@react-native/dev-middleware': 0.87.0-nightly-20260529-88857d22f 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.84.4 + metro-config: 0.84.4 + metro-core: 0.84.4 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.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@react-native/debugger-frontend@0.81.4': {} + '@react-native/debugger-frontend@0.87.0-nightly-20260529-88857d22f': {} + + '@react-native/debugger-shell@0.87.0-nightly-20260529-88857d22f': + 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.81.4': + '@react-native/dev-middleware@0.87.0-nightly-20260529-88857d22f': dependencies: '@isaacs/ttlcache': 1.4.1 - '@react-native/debugger-frontend': 0.81.4 + '@react-native/debugger-frontend': 0.87.0-nightly-20260529-88857d22f + '@react-native/debugger-shell': 0.87.0-nightly-20260529-88857d22f chrome-launcher: 0.15.2 - chromium-edge-launcher: 0.2.0 + chromium-edge-launcher: 0.3.0 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 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.87.0-nightly-20260529-88857d22f': {} - '@react-native/js-polyfills@0.81.4': {} + '@react-native/js-polyfills@0.87.0-nightly-20260529-88857d22f': {} - '@react-native/metro-babel-transformer@0.81.4(@babel/core@7.29.7)': + '@react-native/metro-babel-transformer@0.87.0-nightly-20260529-88857d22f(@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.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7) + hermes-parser: 0.36.1 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - '@react-native/metro-config@0.81.4(@babel/core@7.29.7)': + '@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.87.0-nightly-20260529-88857d22f + '@react-native/metro-babel-transformer': 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7) + metro-config: 0.84.4 + metro-runtime: 0.84.4 transitivePeerDependencies: - '@babel/core' - bufferutil - supports-color - utf-8-validate - '@react-native/normalize-colors@0.81.4': {} + '@react-native/normalize-colors@0.87.0-nightly-20260529-88857d22f': {} - '@react-native/typescript-config@0.81.4': {} + '@react-native/typescript-config@0.87.0-nightly-20260529-88857d22f': {} - '@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.87.0-nightly-20260529-88857d22f(@types/react@19.2.17)(react-native@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) optionalDependencies: '@types/react': 19.2.17 @@ -7183,37 +6874,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.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(metro@0.84.4)(react-native@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.84.4) + '@rnx-kit/tools-react-native': 2.3.8(@react-native-community/cli-types@20.2.0)(metro@0.84.4) '@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.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.87.0-nightly-20260529-88857d22f(@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.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.84.4)': dependencies: - '@rnx-kit/types-node': 1.0.0(metro@0.83.7) + '@rnx-kit/types-node': 1.0.0(metro@0.84.4) 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.84.4)': 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.84.4) + '@rnx-kit/types-bundle-config': 1.0.0(metro@0.84.4) optionalDependencies: '@react-native-community/cli-types': 20.2.0 transitivePeerDependencies: @@ -7228,26 +6919,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.84.4)': 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.84.4 - '@rnx-kit/types-kit-config@1.0.0(metro@0.83.7)': + '@rnx-kit/types-kit-config@1.0.0(metro@0.84.4)': dependencies: - '@rnx-kit/types-bundle-config': 1.0.0(metro@0.83.7) + '@rnx-kit/types-bundle-config': 1.0.0(metro@0.84.4) 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.84.4)': dependencies: - '@rnx-kit/types-kit-config': 1.0.0(metro@0.83.7) + '@rnx-kit/types-kit-config': 1.0.0(metro@0.84.4) transitivePeerDependencies: - metro @@ -7316,14 +7007,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 +7039,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 +7069,6 @@ snapshots: dependencies: csstype: 3.2.3 - '@types/stack-utils@2.0.3': {} - '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.35': @@ -7599,11 +7276,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 +7329,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 +7361,9 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-syntax-hermes-parser@0.29.1: + babel-plugin-syntax-hermes-parser@0.36.1: dependencies: - hermes-parser: 0.29.1 + hermes-parser: 0.36.1 babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.29.7): dependencies: @@ -7729,31 +7371,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: {} @@ -7881,14 +7498,13 @@ snapshots: transitivePeerDependencies: - supports-color - chromium-edge-launcher@0.2.0: + chromium-edge-launcher@0.3.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 @@ -8359,10 +7975,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 +7988,8 @@ snapshots: dependencies: reusify: 1.1.0 + fb-dotslash@0.5.8: {} + fb-watchman@2.0.2: dependencies: bser: 2.1.1 @@ -8485,8 +8099,6 @@ snapshots: dependencies: minipass: 3.3.6 - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true @@ -8526,8 +8138,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 +8162,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,18 +8215,20 @@ snapshots: he@1.2.0: {} - hermes-estree@0.29.1: {} + hermes-compiler@250829098.0.13: {} hermes-estree@0.35.0: {} - hermes-parser@0.29.1: - dependencies: - hermes-estree: 0.29.1 + hermes-estree@0.36.1: {} hermes-parser@0.35.0: dependencies: hermes-estree: 0.35.0 + hermes-parser@0.36.1: + dependencies: + hermes-estree: 0.36.1 + homedir-polyfill@1.0.3: dependencies: parse-passwd: 1.0.0 @@ -8683,11 +8286,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 +8377,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 @@ -9017,51 +8558,51 @@ snapshots: merge2@1.4.1: {} - metro-babel-transformer@0.83.7: + metro-babel-transformer@0.84.4: dependencies: '@babel/core': 7.29.7 flow-enums-runtime: 0.0.6 hermes-parser: 0.35.0 - metro-cache-key: 0.83.7 + metro-cache-key: 0.84.4 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-cache-key@0.83.7: + metro-cache-key@0.84.4: dependencies: flow-enums-runtime: 0.0.6 - metro-cache@0.83.7: + metro-cache@0.84.4: 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.84.4 transitivePeerDependencies: - supports-color - metro-config@0.83.7: + metro-config@0.84.4: 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 + metro: 0.84.4 + metro-cache: 0.84.4 + metro-core: 0.84.4 + metro-runtime: 0.84.4 yaml: 2.9.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro-core@0.83.7: + metro-core@0.84.4: dependencies: flow-enums-runtime: 0.0.6 lodash.throttle: 4.1.1 - metro-resolver: 0.83.7 + metro-resolver: 0.84.4 - metro-file-map@0.83.7: + metro-file-map@0.84.4: dependencies: debug: 4.4.3(supports-color@8.1.1) fb-watchman: 2.0.2 @@ -9075,46 +8616,46 @@ snapshots: transitivePeerDependencies: - supports-color - metro-minify-terser@0.83.7: + metro-minify-terser@0.84.4: dependencies: flow-enums-runtime: 0.0.6 terser: 5.49.0 - metro-resolver@0.83.7: + metro-resolver@0.84.4: dependencies: flow-enums-runtime: 0.0.6 - metro-runtime@0.83.7: + metro-runtime@0.84.4: dependencies: '@babel/runtime': 7.29.7 flow-enums-runtime: 0.0.6 - metro-source-map@0.83.7: + metro-source-map@0.84.4: 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.84.4 nullthrows: 1.1.1 - ob1: 0.83.7 + ob1: 0.84.4 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-symbolicate@0.83.7: + metro-symbolicate@0.84.4: dependencies: flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-source-map: 0.83.7 + metro-source-map: 0.84.4 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.84.4: dependencies: '@babel/core': 7.29.7 '@babel/generator': 7.29.7 @@ -9125,27 +8666,27 @@ snapshots: transitivePeerDependencies: - supports-color - metro-transform-worker@0.83.7: + metro-transform-worker@0.84.4: 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.84.4 + metro-babel-transformer: 0.84.4 + metro-cache: 0.84.4 + metro-cache-key: 0.84.4 + metro-minify-terser: 0.84.4 + metro-source-map: 0.84.4 + metro-transform-plugins: 0.84.4 nullthrows: 1.1.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro@0.83.7: + metro@0.84.4: dependencies: '@babel/code-frame': 7.29.7 '@babel/core': 7.29.7 @@ -9167,18 +8708,18 @@ snapshots: 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.84.4 + metro-cache: 0.84.4 + metro-cache-key: 0.84.4 + metro-config: 0.84.4 + metro-core: 0.84.4 + metro-file-map: 0.84.4 + metro-resolver: 0.84.4 + metro-runtime: 0.84.4 + metro-source-map: 0.84.4 + metro-symbolicate: 0.84.4 + metro-transform-plugins: 0.84.4 + metro-transform-worker: 0.84.4 mime-types: 3.0.2 nullthrows: 1.1.1 serialize-error: 2.1.0 @@ -9277,11 +8818,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.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) transitivePeerDependencies: - bufferutil - supports-color @@ -9374,8 +8915,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 +8928,7 @@ snapshots: nullthrows@1.1.1: {} - ob1@0.83.7: + ob1@0.84.4: dependencies: flow-enums-runtime: 0.0.6 @@ -9421,10 +8960,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 @@ -9568,8 +9103,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 +9122,6 @@ snapshots: pify@4.0.1: {} - pirates@4.0.7: {} - pkg-dir@8.0.0: dependencies: find-up-simple: 1.0.1 @@ -9682,59 +9213,57 @@ 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.5(@react-native-community/cli-types@20.2.0)(metro@0.84.4)(react-native@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.84.4) 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.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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): + react-native@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3): 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) + '@react-native/assets-registry': 0.87.0-nightly-20260529-88857d22f + '@react-native/codegen': 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7) + '@react-native/community-cli-plugin': 0.87.0-nightly-20260529-88857d22f(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)) + '@react-native/gradle-plugin': 0.87.0-nightly-20260529-88857d22f + '@react-native/js-polyfills': 0.87.0-nightly-20260529-88857d22f + '@react-native/normalize-colors': 0.87.0-nightly-20260529-88857d22f + '@react-native/virtualized-lists': 0.87.0-nightly-20260529-88857d22f(@types/react@19.2.17)(react-native@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) abort-controller: 3.0.0 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.36.1 base64-js: 1.5.1 commander: 12.1.0 flow-enums-runtime: 0.0.6 - glob: 7.2.3 + hermes-compiler: 250829098.0.13 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.84.4 + metro-source-map: 0.84.4 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 +9277,7 @@ snapshots: react-refresh@0.14.2: {} - react@19.1.0: {} + react@19.2.3: {} read-pkg@9.0.1: dependencies: @@ -9841,10 +9370,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 +9417,7 @@ snapshots: safer-buffer@2.1.2: {} - scheduler@0.26.0: {} + scheduler@0.27.0: {} semver-compare@1.0.0: {} @@ -10090,8 +9615,6 @@ snapshots: strip-json-comments@3.1.1: {} - strnum@1.1.2: {} - strnum@2.4.1: dependencies: anynum: 1.0.1 @@ -10124,12 +9647,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 +9686,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 +9758,6 @@ snapshots: utils-merge@1.0.1: {} - uuid@11.1.1: {} - uuid@8.3.2: {} validate-npm-package-license@3.0.4: @@ -10312,13 +9825,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 ae54eacabcb737732ee98f486ba1c71102add37c Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 24 Jul 2026 12:05:56 +0000 Subject: [PATCH 09/25] vendor-hermes: advance pin to include upstream napi C-linkage fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- packages/host/src/node/cli/hermes.ts | 46 ++++++---------------------- 1 file changed, 10 insertions(+), 36 deletions(-) diff --git a/packages/host/src/node/cli/hermes.ts b/packages/host/src/node/cli/hermes.ts index 6441e597..2f600533 100644 --- a/packages/host/src/node/cli/hermes.ts +++ b/packages/host/src/node/cli/hermes.ts @@ -21,45 +21,22 @@ const HERMES_GIT_URL = "https://github.com/facebook/hermes.git"; // 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. -const HERMES_GIT_SHA = "0ae42446d1ae669508368b0a18e60c789f76735d"; +// +// 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. +const HERMES_GIT_SHA = "efcf68e285865fd9d952070b08e751bcad63f25e"; const platformOption = new Option( "--react-native-package ", "The React Native package to vendor Hermes into", ).default("react-native"); -// The public `hermes_napi_*` entry points (e.g. `hermes_napi_create_env`) are -// declared in `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 symbols are name-mangled -// and, because Hermes builds with a global `-fvisibility=hidden`, stay out of -// the shared framework's export table. We reach `hermes_napi_create_env` from -// the host module, so consumers linking the framework hit "Undefined symbol". -// -// Wrapping the declarations in `EXTERN_C_START` / `EXTERN_C_END` (both already -// available via the `node_api.h` include) gives them C linkage, so they export -// under their unmangled C names. This mirrors facebook/hermes#2106. -const HERMES_NAPI_HEADER = "API/napi/hermes_napi.h"; -const HERMES_NAPI_INCLUDE = '#include "hermes/napi/node_api.h"'; -const HERMES_NAPI_ENDIF = "#endif // HERMES_NAPI_HERMES_NAPI_H"; - -async function patchHermesNapiVisibility(hermesPath: string) { - const headerPath = path.join(hermesPath, HERMES_NAPI_HEADER); - const contents = await fs.promises.readFile(headerPath, "utf8"); - if (contents.includes("EXTERN_C_START")) { - return; - } - assert( - contents.includes(HERMES_NAPI_INCLUDE) && - contents.includes(HERMES_NAPI_ENDIF), - `Cannot patch ${HERMES_NAPI_HEADER}: expected anchors not found (did the pinned Hermes commit change?)`, - ); - const patched = contents - .replace(HERMES_NAPI_INCLUDE, `${HERMES_NAPI_INCLUDE}\n\nEXTERN_C_START`) - .replace(HERMES_NAPI_ENDIF, `EXTERN_C_END\n\n${HERMES_NAPI_ENDIF}`); - await fs.promises.writeFile(headerPath, patched); -} - 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) @@ -147,9 +124,6 @@ export const command = new Command("vendor-hermes") }); } } - // Applied unconditionally (idempotent) so an existing checkout from - // before this patch also gets fixed. - await patchHermesNapiVisibility(hermesPath); console.log(hermesPath); }), ); From 9147dd275723e5463fb2e74513aa640113bb54de Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 24 Jul 2026 12:51:32 +0000 Subject: [PATCH 10/25] 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 --- packages/host/cpp/CxxNodeApiHostModule.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/host/cpp/CxxNodeApiHostModule.cpp b/packages/host/cpp/CxxNodeApiHostModule.cpp index cbc763ae..113bd24d 100644 --- a/packages/host/cpp/CxxNodeApiHostModule.cpp +++ b/packages/host/cpp/CxxNodeApiHostModule.cpp @@ -9,11 +9,18 @@ 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. -// Only the mangled name matters for linking, so passing host as nullptr is -// enough — async work / thread-safe functions will return failure until a +// +// 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 { From 973e12b2d6acb8c681723096a75571338ce286d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Fri, 24 Jul 2026 20:31:11 +0200 Subject: [PATCH 11/25] 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. --- packages/host/android/build.gradle | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/host/android/build.gradle b/packages/host/android/build.gradle index 39204133..396fd8f2 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([ @@ -161,17 +163,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() } } From da1b88a48965786bc9ff1563acafd95d38381fa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Sun, 9 Aug 2026 20:57:17 +0200 Subject: [PATCH 12/25] android: patch RN settings.gradle.kts /tmp projectDir for Windows (#387) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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 --- ...ve@0.87.0-nightly-20260529-88857d22f.patch | 24 +++++++++++ pnpm-lock.yaml | 43 +++++++++++-------- pnpm-workspace.yaml | 2 + 3 files changed, 50 insertions(+), 19 deletions(-) create mode 100644 patches/react-native@0.87.0-nightly-20260529-88857d22f.patch diff --git a/patches/react-native@0.87.0-nightly-20260529-88857d22f.patch b/patches/react-native@0.87.0-nightly-20260529-88857d22f.patch new file mode 100644 index 00000000..f21ac35e --- /dev/null +++ b/patches/react-native@0.87.0-nightly-20260529-88857d22f.patch @@ -0,0 +1,24 @@ +diff --git a/settings.gradle.kts b/settings.gradle.kts +index 2036e0f16450b837223aad4b73cd1d556089d16d..a769520babe1423bb08399e5a932db50de7bad51 100644 +--- a/settings.gradle.kts ++++ b/settings.gradle.kts +@@ -35,6 +35,16 @@ project(":packages:react-native:ReactAndroid:hermes-engine").projectDir = + // for :packages and :packages:react-native as well as otherwise the build from + // source will fail with a missing folder exception. + +-project(":packages").projectDir = file("/tmp") +- +-project(":packages:react-native").projectDir = file("/tmp") ++// Patched by react-native-node-api: upstream hardcodes file("/tmp"), which does ++// not exist on Windows (there `/tmp` resolves to a non-existent /tmp), ++// so the build-from-source settings fail to configure. Use the JVM temp dir, ++// which exists on every platform (`/tmp` on posix, %TEMP% on Windows). ++// ++// Fixed upstream in facebook/react-native#57706, landed on main as 908872a6 ++// (2026-07-28) — after the 0.87 branch cut, so 0.87-stable does NOT carry it. ++// Remove this patch once we pin a react-native that contains that commit: a ++// nightly built from main on/after 2026-07-29, or the first stable line ++// branched after it (0.88+), or a 0.87.x that cherry-picks it. ++project(":packages").projectDir = file(System.getProperty("java.io.tmpdir", "/tmp")) ++ ++project(":packages:react-native").projectDir = file(System.getProperty("java.io.tmpdir", "/tmp")) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3327fdaa..48caa968 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,11 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +patchedDependencies: + react-native@0.87.0-nightly-20260529-88857d22f: + hash: 34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08 + path: patches/react-native@0.87.0-nightly-20260529-88857d22f.patch + importers: .: @@ -49,7 +54,7 @@ importers: version: 0.3.21 react-native: specifier: 0.87.0-nightly-20260529-88857d22f - version: 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + version: 0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) read-pkg: specifier: ^9.0.1 version: 9.0.1 @@ -103,7 +108,7 @@ importers: version: 0.87.0-nightly-20260529-88857d22f '@rnx-kit/metro-config': specifier: ^2.2.4 - version: 2.2.4(@react-native-community/cli-types@20.2.0)(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(metro@0.84.4)(react-native@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + version: 2.2.4(@react-native-community/cli-types@20.2.0)(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(metro@0.84.4)(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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 +126,19 @@ importers: version: 1.13.2 mocha-remote-react-native: specifier: ^1.13.2 - version: 1.13.2(react-native@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + version: 1.13.2(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) react: specifier: 19.2.3 version: 19.2.3 react-native: specifier: 0.87.0-nightly-20260529-88857d22f - version: 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + version: 0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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: ^5.1.9 - version: 5.4.5(@react-native-community/cli-types@20.2.0)(metro@0.84.4)(react-native@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + version: 5.4.5(@react-native-community/cli-types@20.2.0)(metro@0.84.4)(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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 @@ -248,7 +253,7 @@ importers: version: 8.0.0 react-native: specifier: 0.87.0-nightly-20260529-88857d22f - version: 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + version: 0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) read-pkg: specifier: ^9.0.1 version: 9.0.1 @@ -6860,12 +6865,12 @@ snapshots: '@react-native/typescript-config@0.87.0-nightly-20260529-88857d22f': {} - '@react-native/virtualized-lists@0.87.0-nightly-20260529-88857d22f(@types/react@19.2.17)(react-native@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)': + '@react-native/virtualized-lists@0.87.0-nightly-20260529-88857d22f(@types/react@19.2.17)(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.2.3 - react-native: 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + react-native: 0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) optionalDependencies: '@types/react': 19.2.17 @@ -6874,13 +6879,13 @@ 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.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(metro@0.84.4)(react-native@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)': + '@rnx-kit/metro-config@2.2.4(@react-native-community/cli-types@20.2.0)(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(metro@0.84.4)(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.84.4) '@rnx-kit/tools-react-native': 2.3.8(@react-native-community/cli-types@20.2.0)(metro@0.84.4) '@rnx-kit/tools-workspaces': 0.2.3 react: 19.2.3 - react-native: 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + react-native: 0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) optionalDependencies: '@react-native/metro-config': 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7) transitivePeerDependencies: @@ -6888,9 +6893,9 @@ snapshots: - memfs - metro - '@rnx-kit/react-native-host@0.5.21(react-native@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))': + '@rnx-kit/react-native-host@0.5.21(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))': dependencies: - react-native: 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + react-native: 0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) '@rnx-kit/tools-filesystem@0.2.0': {} @@ -8818,11 +8823,11 @@ snapshots: transitivePeerDependencies: - supports-color - mocha-remote-react-native@1.13.2(react-native@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3): + mocha-remote-react-native@1.13.2(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.2.3 - react-native: 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + react-native: 0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) transitivePeerDependencies: - bufferutil - supports-color @@ -9213,24 +9218,24 @@ snapshots: react-is@18.3.1: {} - react-native-test-app@5.4.5(@react-native-community/cli-types@20.2.0)(metro@0.84.4)(react-native@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3): + react-native-test-app@5.4.5(@react-native-community/cli-types@20.2.0)(metro@0.84.4)(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3): dependencies: '@isaacs/cliui': 9.0.0 - '@rnx-kit/react-native-host': 0.5.21(react-native@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3)) + '@rnx-kit/react-native-host': 0.5.21(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.84.4) ajv: 8.20.0 fast-xml-builder: 1.3.0 fast-xml-parser: 5.10.1 prompts: 2.4.2 react: 19.2.3 - react-native: 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + react-native: 0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) semver: 7.8.5 transitivePeerDependencies: - '@react-native-community/cli-types' - memfs - metro - react-native@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3): + react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3): dependencies: '@react-native/assets-registry': 0.87.0-nightly-20260529-88857d22f '@react-native/codegen': 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7) @@ -9238,7 +9243,7 @@ snapshots: '@react-native/gradle-plugin': 0.87.0-nightly-20260529-88857d22f '@react-native/js-polyfills': 0.87.0-nightly-20260529-88857d22f '@react-native/normalize-colors': 0.87.0-nightly-20260529-88857d22f - '@react-native/virtualized-lists': 0.87.0-nightly-20260529-88857d22f(@types/react@19.2.17)(react-native@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + '@react-native/virtualized-lists': 0.87.0-nightly-20260529-88857d22f(@types/react@19.2.17)(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c3bd5498..f6fcfe88 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -7,3 +7,5 @@ packages: # platform binary; allow just that one rather than disabling the safety globally. onlyBuiltDependencies: - esbuild +patchedDependencies: + react-native@0.87.0-nightly-20260529-88857d22f: patches/react-native@0.87.0-nightly-20260529-88857d22f.patch From 772e59bb92ca1600bec55e04e0c8750458c11098 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Sun, 9 Aug 2026 22:47:14 +0200 Subject: [PATCH 13/25] 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) --- packages/host/android/build.gradle | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/host/android/build.gradle b/packages/host/android/build.gradle index 396fd8f2..60947ffa 100644 --- a/packages/host/android/build.gradle +++ b/packages/host/android/build.gradle @@ -50,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" From 9d990a51dd26c253f522382a40bab8b01d0692ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Sun, 9 Aug 2026 22:47:40 +0200 Subject: [PATCH 14/25] deps: bump react-native to 0.87.0-rc.4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- apps/test-app/package.json | 8 +- package.json | 2 +- packages/host/package.json | 2 +- packages/host/tsconfig.react-native.json | 2 + .../node-addon-examples/tsconfig.tests.json | 3 +- ...f.patch => react-native@0.87.0-rc.4.patch} | 0 pnpm-lock.yaml | 451 ++++++++---------- pnpm-workspace.yaml | 2 +- 8 files changed, 219 insertions(+), 251 deletions(-) rename patches/{react-native@0.87.0-nightly-20260529-88857d22f.patch => react-native@0.87.0-rc.4.patch} (100%) diff --git a/apps/test-app/package.json b/apps/test-app/package.json index dc2e63cc..ccf09c1c 100644 --- a/apps/test-app/package.json +++ b/apps/test-app/package.json @@ -30,9 +30,9 @@ "@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.87.0-nightly-20260529-88857d22f", - "@react-native/metro-config": "0.87.0-nightly-20260529-88857d22f", - "@react-native/typescript-config": "0.87.0-nightly-20260529-88857d22f", + "@react-native/babel-preset": "0.87.0-rc.4", + "@react-native/metro-config": "0.87.0-rc.4", + "@react-native/typescript-config": "0.87.0-rc.4", "@rnx-kit/metro-config": "^2.2.4", "@types/mocha": "^10.0.10", "@types/react": "^19.1.0", @@ -41,7 +41,7 @@ "mocha-remote-cli": "^1.13.2", "mocha-remote-react-native": "^1.13.2", "react": "19.2.3", - "react-native": "0.87.0-nightly-20260529-88857d22f", + "react-native": "0.87.0-rc.4", "react-native-node-api": "workspace:*", "react-native-test-app": "^5.1.9", "weak-node-api": "workspace:*" diff --git a/package.json b/package.json index e0947829..24d66780 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.87.0-nightly-20260529-88857d22f", + "react-native": "0.87.0-rc.4", "read-pkg": "^9.0.1", "tsx": "^4.20.6", "typescript": "^5.8.0", diff --git a/packages/host/package.json b/packages/host/package.json index b9a45ad5..554915c6 100644 --- a/packages/host/package.json +++ b/packages/host/package.json @@ -85,7 +85,7 @@ }, "peerDependencies": { "@babel/core": "^7.26.10", - "react-native": "0.87.0-nightly-20260529-88857d22f", + "react-native": "0.87.0-rc.4", "weak-node-api": "workspace:*" } } 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/patches/react-native@0.87.0-nightly-20260529-88857d22f.patch b/patches/react-native@0.87.0-rc.4.patch similarity index 100% rename from patches/react-native@0.87.0-nightly-20260529-88857d22f.patch rename to patches/react-native@0.87.0-rc.4.patch diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 48caa968..fd974fe4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,9 +5,9 @@ settings: excludeLinksFromLockfile: false patchedDependencies: - react-native@0.87.0-nightly-20260529-88857d22f: + react-native@0.87.0-rc.4: hash: 34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08 - path: patches/react-native@0.87.0-nightly-20260529-88857d22f.patch + path: patches/react-native@0.87.0-rc.4.patch importers: @@ -53,8 +53,8 @@ importers: specifier: ^0.3.15 version: 0.3.21 react-native: - specifier: 0.87.0-nightly-20260529-88857d22f - version: 0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + specifier: 0.87.0-rc.4 + version: 0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) read-pkg: specifier: ^9.0.1 version: 9.0.1 @@ -98,17 +98,17 @@ importers: specifier: workspace:* version: link:../../packages/node-tests '@react-native/babel-preset': - specifier: 0.87.0-nightly-20260529-88857d22f - version: 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7) + specifier: 0.87.0-rc.4 + version: 0.87.0-rc.4(@babel/core@7.29.7) '@react-native/metro-config': - specifier: 0.87.0-nightly-20260529-88857d22f - version: 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7) + specifier: 0.87.0-rc.4 + version: 0.87.0-rc.4(@babel/core@7.29.7) '@react-native/typescript-config': - specifier: 0.87.0-nightly-20260529-88857d22f - version: 0.87.0-nightly-20260529-88857d22f + specifier: 0.87.0-rc.4 + version: 0.87.0-rc.4 '@rnx-kit/metro-config': specifier: ^2.2.4 - version: 2.2.4(@react-native-community/cli-types@20.2.0)(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(metro@0.84.4)(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + version: 2.2.4(@react-native-community/cli-types@20.2.0)(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(metro@0.87.0)(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@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 @@ -126,19 +126,19 @@ importers: version: 1.13.2 mocha-remote-react-native: specifier: ^1.13.2 - version: 1.13.2(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + version: 1.13.2(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) react: specifier: 19.2.3 version: 19.2.3 react-native: - specifier: 0.87.0-nightly-20260529-88857d22f - version: 0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + specifier: 0.87.0-rc.4 + version: 0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@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: ^5.1.9 - version: 5.4.5(@react-native-community/cli-types@20.2.0)(metro@0.84.4)(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + version: 5.4.5(@react-native-community/cli-types@20.2.0)(metro@0.87.0)(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@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 @@ -252,8 +252,8 @@ importers: specifier: ^8.0.0 version: 8.0.0 react-native: - specifier: 0.87.0-nightly-20260529-88857d22f - version: 0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + specifier: 0.87.0-rc.4 + version: 0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) read-pkg: specifier: ^9.0.1 version: 9.0.1 @@ -1999,81 +1999,81 @@ packages: engines: {node: '>=20.19.4'} hasBin: true - '@react-native/assets-registry@0.87.0-nightly-20260529-88857d22f': - resolution: {integrity: sha512-j8zIei+HBgoZzong8KWc94Q5tzZqXkNGaf8nUGZwox8d99jFimIPB1OwjZUgtNqP+pdAahB3nIVK1c3nYyf5Hw==} + '@react-native/asset-utils@0.87.0-rc.4': + resolution: {integrity: sha512-EfiQ0ZvDxRUXvApzA4wsJy+e6NHw4LIkcFk2SZcmSxKni+DJF5hDxgfpJeVgh2TzQHzmaXRINUOINnKgro+zEA==} engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - '@react-native/babel-plugin-codegen@0.87.0-nightly-20260529-88857d22f': - resolution: {integrity: sha512-KO/inLlEtopwOEXnMfRES56tiRHhUhXtQ5l57kVqExRW7eay/H45HfWbRGuZwk0ZX68CoDJdToCSiEZqNijdzQ==} + '@react-native/babel-plugin-codegen@0.87.0-rc.4': + resolution: {integrity: sha512-Jm8Jij3d9obVLIF4bQFi2LEaPG5njwz2EeR4WHe7sdO2f0tK4z6FMNDPw62TPm9koSPChEfXU0xk16wNBV2UMQ==} engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - '@react-native/babel-preset@0.87.0-nightly-20260529-88857d22f': - resolution: {integrity: sha512-JkeAigYc4v/zOILjdK4EhOc4NioWXCRculwZ6gDYS0MwcQnRVhFZ8uZ7cLCsmJdmVusfEOLvsWZP0wlnFSlqFA==} + '@react-native/babel-preset@0.87.0-rc.4': + resolution: {integrity: sha512-j2FM0CymBpcMtF4XCKisYFJvlJvVXb7dzeGX8PGpofxpK906O/hP5MkQeYO7JTIMs6WY/+Gmfy0ckGp0OuJh1A==} engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} peerDependencies: '@babel/core': '*' - '@react-native/codegen@0.87.0-nightly-20260529-88857d22f': - resolution: {integrity: sha512-y24JDXa7Bf9WKX7iAb0Lterf6WKXim4GHf/YE6gbCeq1ViTHDA4mMM9YpfDXps5ep1s0HpAawyWNmytH0+sexQ==} + '@react-native/codegen@0.87.0-rc.4': + resolution: {integrity: sha512-Cy70AK1rCe+S8ux2R9XhSe8MzzI7Jv7emTmJlx9wGaMbhuWeHg0TEAawJnJ2nj7kLiKvxI95A4Yvq8PM+GEjuQ==} engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} peerDependencies: '@babel/core': '*' - '@react-native/community-cli-plugin@0.87.0-nightly-20260529-88857d22f': - resolution: {integrity: sha512-GLwUc2KE/cSaOJMbKhOEUD6wF1297Vsq7J2p1jjI8XKDrRD2k/0bbpb6DO0arBBxIazzMzbuWWysOugNBYXRPA==} + '@react-native/community-cli-plugin@0.87.0-rc.4': + resolution: {integrity: sha512-O+F+oERD43GYDcywTUwF25VeL2uegq93uCC7QUwxsZn7ADR5Sxd3yOrO9VDeW+s2HTgBBbYvXljq6KML430VQQ==} engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} peerDependencies: '@react-native-community/cli': '*' - '@react-native/metro-config': 0.87.0-nightly-20260529-88857d22f + '@react-native/metro-config': 0.87.0-rc.4 peerDependenciesMeta: '@react-native-community/cli': optional: true '@react-native/metro-config': optional: true - '@react-native/debugger-frontend@0.87.0-nightly-20260529-88857d22f': - resolution: {integrity: sha512-e3m3+A7SP2VjAq2YUK9G3OyVy9zqFbND9aFS2t69JO8D+XLac95sZdXcI+AarclMnM4vHY59IRCXv5LoIaYyHA==} + '@react-native/debugger-frontend@0.87.0-rc.4': + resolution: {integrity: sha512-Mw2dICfMltllCd6CRN5YczLYzS2FOhPavW6p4j6UMojGsiRzAy8YOT7dLi5plv7u3qwggU/PUkg4kjQcJckfBg==} engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - '@react-native/debugger-shell@0.87.0-nightly-20260529-88857d22f': - resolution: {integrity: sha512-9c+F/ZZRQf5K1/WNV/pVMTh8AhMvmIHg6gukKIfJ/4Ayf67qIJsU5OFGWjAYwPccY9eYkZlhH+KE9ryvmvr9Cw==} + '@react-native/debugger-shell@0.87.0-rc.4': + resolution: {integrity: sha512-lb4NSh+q1bmoA2xmcu5DJcT0kfbCgriMf8i4rm1Y+IvTdjPgl7bMMu4C8vwTANSkZtx53AgyfBBATBg+q0e+QQ==} engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - '@react-native/dev-middleware@0.87.0-nightly-20260529-88857d22f': - resolution: {integrity: sha512-A8nc5Y3T6ckQKR4hgUvR8MWscR1rmfxAldj1bN/N7/nw5HI/t+H0Gvbh8mDEgTuZCs5SsAtEtiHlOQ+MM7dvWA==} + '@react-native/dev-middleware@0.87.0-rc.4': + resolution: {integrity: sha512-gtu7i16+R4V+eM5S54bCw+pWnpswwMxrDZYYQlZXOqeV7d5E/cDHhbzcsNBrMKgtp5+EsANnM9rkdQu6IKC6YQ==} engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - '@react-native/gradle-plugin@0.87.0-nightly-20260529-88857d22f': - resolution: {integrity: sha512-51W23Y022JXhwC+zgGM3SD22jmTFky+QLQgnm4uzt6UPTE11cNkCq6WKBErrP41pZhHH1dhO9gyngn46Ku/VWw==} + '@react-native/gradle-plugin@0.87.0-rc.4': + resolution: {integrity: sha512-cx+K21v+nnwbVJWEMjobJ724SyxEw5Xyz6iLg9HAz0e5epXdDMnbqiyImXCEbUvCLk4kq6YKQT6fz74WdxKwBA==} engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - '@react-native/js-polyfills@0.87.0-nightly-20260529-88857d22f': - resolution: {integrity: sha512-659Z+ssrFyciyoQ1Ty9Nfy7RlK50buh3w28rdH7Y70fEsR5UxAjZJ2TQGG4+DB+FVYPHcvUFCQdgRZ6U/QsYDw==} + '@react-native/js-polyfills@0.87.0-rc.4': + resolution: {integrity: sha512-FFdmwLz4QCY5h4LNwIf+QUNkupmdF5cKVTr9uN4lWk1MOTYdFVfEd3Uy5a9IDL5syJ2dxZNMdv3yceZ3C2uZAg==} engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - '@react-native/metro-babel-transformer@0.87.0-nightly-20260529-88857d22f': - resolution: {integrity: sha512-ktNbGf0MOi1XpIvQ25QWYCOgWth22UlP7cBx4q3rtbtQoGiUJQTUlnZFNkJwlNDHMsVfjCDpKs7bVmGsxuL6GA==} + '@react-native/metro-babel-transformer@0.87.0-rc.4': + resolution: {integrity: sha512-TfI3DgkI1nMduyIjaG5UZ4+tauI5D4M5FaLUeWqMtkTW9ba6WjcqYpk3xm6lLMT37JeKZVZsRk9pUD2/E1tWig==} engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} peerDependencies: '@babel/core': '*' - '@react-native/metro-config@0.87.0-nightly-20260529-88857d22f': - resolution: {integrity: sha512-Q3Y+cysds2KpFZhRETvPPcnZu5yy0t1HnEKROZhqJwBKqRqJw3HEnQJk7CjetO4akluUOoottpIMoeIQR0VSTw==} + '@react-native/metro-config@0.87.0-rc.4': + resolution: {integrity: sha512-r9sA/jZSYEiJCgI7pJN8tRGMqE7h4FGT8IVt9DTnWTof8wVox22fjGB6atPiRSADMOayfqg0e0XCA309jq2LyA==} engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - '@react-native/normalize-colors@0.87.0-nightly-20260529-88857d22f': - resolution: {integrity: sha512-ii3Uc1Y+nds7/K4JXmnF4qSRDYvhaaHf9HB1X+EBpoUXWl+LCvtGSfLPpf7doQzRBEolRsICvD84UCSvD88jzw==} + '@react-native/normalize-colors@0.87.0-rc.4': + resolution: {integrity: sha512-3Jn9RESQpJhFg3BBfpiT1B5WK0YJAanO/OnbHu1vNNImly01Ui8payVddpsaUsnAkUmktacB07hpWTBHZ2vF2w==} - '@react-native/typescript-config@0.87.0-nightly-20260529-88857d22f': - resolution: {integrity: sha512-8kf2oriCR1YZoFGe8W/A6GOh1DqoxsbnMiGQs4wudroeaNKS31JtK/S87AAxdUeeiTtMaoSdR1RG5Gs5Xo7XOA==} + '@react-native/typescript-config@0.87.0-rc.4': + resolution: {integrity: sha512-QfYwGYXm59n/sbq6kPAew6ZL2uZ/Wnf/SoRHYirqjVWHP1f2UOhL/n92g+L3KTNM0pz1HRjl5kFRlGLfcDNyZg==} - '@react-native/virtualized-lists@0.87.0-nightly-20260529-88857d22f': - resolution: {integrity: sha512-Ik1DHacZt8jN9Pze1s4aRxKd4XNIJAxwjI91MQWl57pygbu7oSWBe9xOdNuP9uphnf5cO3dfQDqFtMQ98muZrw==} + '@react-native/virtualized-lists@0.87.0-rc.4': + resolution: {integrity: sha512-MgAV4eG49CmLiz761Fjh9idVQQtjGlK7gkXroIa86m54QmrNFzZnf0WPtIZQQwrDSonTeHD1MZcSl4aN6oRgug==} engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} peerDependencies: '@types/react': ^19.2.0 react: '*' - react-native: 0.87.0-nightly-20260529-88857d22f + react-native: 0.87.0-rc.4 peerDependenciesMeta: '@types/react': optional: true @@ -2395,10 +2395,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'} @@ -3069,10 +3065,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'} @@ -3335,18 +3327,12 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - hermes-compiler@250829098.0.13: - resolution: {integrity: sha512-6Ivl/892zuiORZdKmBsTlCyCIaCC3+QK/8a9E4nCSIn5kPvOZMUk5lQ1vgyuMBSBD+bnu59RePORn1siZv6zgA==} - - hermes-estree@0.35.0: - resolution: {integrity: sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==} + hermes-compiler@250829098.0.16: + resolution: {integrity: sha512-xsgzk+mUyvt9t1nUbF8USBlYxajTUtPJhVZ86q85s/SEoMKCF+52YZcudb0ENSnV3T3lV9mgB3s6R7+pH90zgw==} hermes-estree@0.36.1: resolution: {integrity: sha512-guv1nQ6IJ7S83NRFPWc3SA7IBZrdNC9kapwOq6uXvF4wP+sDCgjzQbKPCoyYmoyZRzztF/n/c36l/rccCZSiCw==} - hermes-parser@0.35.0: - resolution: {integrity: sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==} - hermes-parser@0.36.1: resolution: {integrity: sha512-GApNk4zLHi2UWoWZZkx7LNCOSzLSc5lB55pZ/PhK7ycFeg7u5LcF88p/WbpIi1XUDtE0MpHE3uRR3u3KB7TjSQ==} @@ -3705,62 +3691,62 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - metro-babel-transformer@0.84.4: - resolution: {integrity: sha512-rvCfz8snl9h20VcvpOHxZuHP1SlAkv4HXbzw7nyyVwu6Eqo5PRerbakQ9XmUCOsRy70spJ37O+G1TK8oMzo48g==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + 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.84.4: - resolution: {integrity: sha512-wVO79aGrkYImpnaVS4+d5RrRBRPX31QtvKB3wKGBuiNSznduZTQHzsrJZRroFJSwnygrzdsGUtDQPuqqFjFdvw==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + 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.84.4: - resolution: {integrity: sha512-gpcFQdSLUwUCk71saKoE64jLFbx2nwTfVCcPSULMNT8QYq0p1eZZE29Jvd0HtT/UlhC3ZOutLxJME5xqD2JUZg==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + 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.84.4: - resolution: {integrity: sha512-PMotGDjXcXLWo2TMRH+VR99phFNgYTwqh4OoieIKK3yTJa1Jmkl+fZJxDO0jfBvNF+WESHciHvpNuBtXaF3B0Q==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + metro-config@0.87.0: + resolution: {integrity: sha512-yZ9QAIzWH9MxwrzwRlX/CBGRWOT14l7klSDYg8hdtSdnoUs5A7MQRdHE2KB9iHVzGQW5wgWM5aXJswNeWbSQPA==} + engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} - metro-core@0.84.4: - resolution: {integrity: sha512-HONpWC5LGXZn3ffkd4Hu6AIrfE7j4Z0g0wMo/goV24WOB3lhuFZ40KgvaDiSw8iyQHloMYay5N/wPX+z8oN/PQ==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + 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.84.4: - resolution: {integrity: sha512-KSVDi/u60hKPx++NLu3MTIvyjzNoJnFAF8PQFxaj1jiSka/wjw+Ua6sNuJ0TDHQv+7AAoFQxeMgaRAe8Yic5wQ==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + 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.84.4: - resolution: {integrity: sha512-5qpbaVOMC7CPitIpuewzVeGw7E+C3ykbv2mqTjQLl85Z3annSVGlSCTcsZjqXZzjupfK4Ztj3dDc4kc44NZwtQ==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + 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.84.4: - resolution: {integrity: sha512-1qLgbxQ5ZGhhutuPot1Yp348ofDsATL2WkrHF65TobqTT9K3P9qJXw38bomk7ncp5B7OYMfWwtyBZo1lCV792A==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + 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.84.4: - resolution: {integrity: sha512-Jibypds4g7AhzdRKY+kDoj51s5EXMwgyp5ddtlreDAsWefMdOx+agWqgm0H2XSZ/ueanHHVM89fnf5OJnlxa8Q==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + 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.84.4: - resolution: {integrity: sha512-jbWkPxIesVuo1IWkvezmMJld6iu8nD62GsrZiV6jP37AOdbo4OBq1FJ+qkOg8sV05wAHB//jAbziuW0SlJfW4g==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + 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.84.4: - resolution: {integrity: sha512-OnfpacxUqGPZQ27t8qK9mFa7uqHIlVWeqRqkCbvMvreEBiamEeOn8krKtcwgP5M4cYDPwuSmCTopHMVthqG4zA==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + 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.84.4: - resolution: {integrity: sha512-kehr6HbAecqD0/a3xLXobELdPaAmRAl8bel0qagPF4vhZtux93nS8S4eq2kgKt6J2GnQpVjSoW1PXdst04mwow==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + 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.84.4: - resolution: {integrity: sha512-W1IYMvvXTu4MxYr7d9h7CeG2vpIr3bmLLIavkPY4O1ilzDrvS8z/NEe6y+pC44Ff7raMXQgYSfdqDUwN/i39gg==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + 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.84.4: - resolution: {integrity: sha512-8ETTubqfD6ornDy2zYDvRcKnVDOXdFJsjetYDBsY4oAsb6NJkiwFR+FaMESyGppFmQUyBQA4H4sFGxzcQSGtFA==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + 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: @@ -3945,9 +3931,9 @@ packages: nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - ob1@0.84.4: - resolution: {integrity: sha512-eJXMpz4aQHXF/YBB9ddqZDIS+ooO91hObo9FoW/xBkr54/zCwYYCDqT/O54vNo8kOkWs5Ou/y28NgdrV0edQNA==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} + 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==} @@ -4231,17 +4217,14 @@ packages: react-native-windows: optional: true - react-native@0.87.0-nightly-20260529-88857d22f: - resolution: {integrity: sha512-qV7jWIdQfun0qv6lt9ByemzgsOII6mmiJCGYLgBF5wEFoKKYSXS71oDBdah7qv5bZWHohcz/31g6mZCwvsx1AA==} + react-native@0.87.0-rc.4: + resolution: {integrity: sha512-cmgycLQVEiaece2H8nqFvaRjX41PJuGHgtW6MmL2xuVjJGswqB22BJoUWXR6hKInCwmvM5H89VJtpCDbRKmRWQ==} engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} hasBin: true peerDependencies: - '@react-native/jest-preset': 0.87.0-nightly-20260529-88857d22f '@types/react': ^19.1.1 react: ^19.2.3 peerDependenciesMeta: - '@react-native/jest-preset': - optional: true '@types/react': optional: true @@ -6732,17 +6715,17 @@ snapshots: - typescript - utf-8-validate - '@react-native/assets-registry@0.87.0-nightly-20260529-88857d22f': {} + '@react-native/asset-utils@0.87.0-rc.4': {} - '@react-native/babel-plugin-codegen@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)': + '@react-native/babel-plugin-codegen@0.87.0-rc.4(@babel/core@7.29.7)': dependencies: '@babel/traverse': 7.29.7 - '@react-native/codegen': 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7) + '@react-native/codegen': 0.87.0-rc.4(@babel/core@7.29.7) transitivePeerDependencies: - '@babel/core' - supports-color - '@react-native/babel-preset@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)': + '@react-native/babel-preset@0.87.0-rc.4(@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) @@ -6773,14 +6756,14 @@ snapshots: '@babel/plugin-transform-runtime': 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) - '@react-native/babel-plugin-codegen': 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7) + '@react-native/babel-plugin-codegen': 0.87.0-rc.4(@babel/core@7.29.7) babel-plugin-syntax-hermes-parser: 0.36.1 babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7) react-refresh: 0.14.2 transitivePeerDependencies: - supports-color - '@react-native/codegen@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)': + '@react-native/codegen@0.87.0-rc.4(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/parser': 7.29.7 @@ -6790,26 +6773,25 @@ snapshots: tinyglobby: 0.2.17 yargs: 17.7.3 - '@react-native/community-cli-plugin@0.87.0-nightly-20260529-88857d22f(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))': + '@react-native/community-cli-plugin@0.87.0-rc.4(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))': dependencies: - '@react-native/dev-middleware': 0.87.0-nightly-20260529-88857d22f + '@react-native/asset-utils': 0.87.0-rc.4 + '@react-native/dev-middleware': 0.87.0-rc.4 debug: 4.4.3(supports-color@8.1.1) invariant: 2.2.4 - metro: 0.84.4 - metro-config: 0.84.4 - metro-core: 0.84.4 + 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.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7) + '@react-native/metro-config': 0.87.0-rc.4(@babel/core@7.29.7) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@react-native/debugger-frontend@0.87.0-nightly-20260529-88857d22f': {} + '@react-native/debugger-frontend@0.87.0-rc.4': {} - '@react-native/debugger-shell@0.87.0-nightly-20260529-88857d22f': + '@react-native/debugger-shell@0.87.0-rc.4': dependencies: cross-spawn: 7.0.6 debug: 4.4.3(supports-color@8.1.1) @@ -6817,11 +6799,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@react-native/dev-middleware@0.87.0-nightly-20260529-88857d22f': + '@react-native/dev-middleware@0.87.0-rc.4': dependencies: '@isaacs/ttlcache': 1.4.1 - '@react-native/debugger-frontend': 0.87.0-nightly-20260529-88857d22f - '@react-native/debugger-shell': 0.87.0-nightly-20260529-88857d22f + '@react-native/debugger-frontend': 0.87.0-rc.4 + '@react-native/debugger-shell': 0.87.0-rc.4 chrome-launcher: 0.15.2 chromium-edge-launcher: 0.3.0 connect: 3.7.0 @@ -6836,41 +6818,39 @@ snapshots: - supports-color - utf-8-validate - '@react-native/gradle-plugin@0.87.0-nightly-20260529-88857d22f': {} + '@react-native/gradle-plugin@0.87.0-rc.4': {} - '@react-native/js-polyfills@0.87.0-nightly-20260529-88857d22f': {} + '@react-native/js-polyfills@0.87.0-rc.4': {} - '@react-native/metro-babel-transformer@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)': + '@react-native/metro-babel-transformer@0.87.0-rc.4(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@react-native/babel-preset': 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7) + '@react-native/babel-preset': 0.87.0-rc.4(@babel/core@7.29.7) hermes-parser: 0.36.1 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - '@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)': + '@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7)': dependencies: - '@react-native/js-polyfills': 0.87.0-nightly-20260529-88857d22f - '@react-native/metro-babel-transformer': 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7) - metro-config: 0.84.4 - metro-runtime: 0.84.4 + '@react-native/js-polyfills': 0.87.0-rc.4 + '@react-native/metro-babel-transformer': 0.87.0-rc.4(@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.87.0-nightly-20260529-88857d22f': {} + '@react-native/normalize-colors@0.87.0-rc.4': {} - '@react-native/typescript-config@0.87.0-nightly-20260529-88857d22f': {} + '@react-native/typescript-config@0.87.0-rc.4': {} - '@react-native/virtualized-lists@0.87.0-nightly-20260529-88857d22f(@types/react@19.2.17)(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)': + '@react-native/virtualized-lists@0.87.0-rc.4(@types/react@19.2.17)(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@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.2.3 - react-native: 0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + react-native: 0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) optionalDependencies: '@types/react': 19.2.17 @@ -6879,37 +6859,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.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(metro@0.84.4)(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)': + '@rnx-kit/metro-config@2.2.4(@react-native-community/cli-types@20.2.0)(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(metro@0.87.0)(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@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.84.4) - '@rnx-kit/tools-react-native': 2.3.8(@react-native-community/cli-types@20.2.0)(metro@0.84.4) + '@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.2.3 - react-native: 0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + react-native: 0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) optionalDependencies: - '@react-native/metro-config': 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7) + '@react-native/metro-config': 0.87.0-rc.4(@babel/core@7.29.7) transitivePeerDependencies: - '@react-native-community/cli-types' - memfs - metro - '@rnx-kit/react-native-host@0.5.21(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))': + '@rnx-kit/react-native-host@0.5.21(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))': dependencies: - react-native: 0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + react-native: 0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@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.84.4)': + '@rnx-kit/tools-node@3.0.5(metro@0.87.0)': dependencies: - '@rnx-kit/types-node': 1.0.0(metro@0.84.4) + '@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.84.4)': + '@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.84.4) - '@rnx-kit/types-bundle-config': 1.0.0(metro@0.84.4) + '@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: @@ -6924,26 +6904,26 @@ snapshots: read-yaml-file: 2.1.0 strip-json-comments: 3.1.1 - '@rnx-kit/types-bundle-config@1.0.0(metro@0.84.4)': + '@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.84.4 + metro: 0.87.0 - '@rnx-kit/types-kit-config@1.0.0(metro@0.84.4)': + '@rnx-kit/types-kit-config@1.0.0(metro@0.87.0)': dependencies: - '@rnx-kit/types-bundle-config': 1.0.0(metro@0.84.4) + '@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.84.4)': + '@rnx-kit/types-node@1.0.0(metro@0.87.0)': dependencies: - '@rnx-kit/types-kit-config': 1.0.0(metro@0.84.4) + '@rnx-kit/types-kit-config': 1.0.0(metro@0.87.0) transitivePeerDependencies: - metro @@ -7209,10 +7189,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 @@ -7935,8 +7911,6 @@ snapshots: etag@1.8.1: {} - event-target-shim@5.0.1: {} - execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -8220,16 +8194,10 @@ snapshots: he@1.2.0: {} - hermes-compiler@250829098.0.13: {} - - hermes-estree@0.35.0: {} + hermes-compiler@250829098.0.16: {} hermes-estree@0.36.1: {} - hermes-parser@0.35.0: - dependencies: - hermes-estree: 0.35.0 - hermes-parser@0.36.1: dependencies: hermes-estree: 0.36.1 @@ -8563,51 +8531,50 @@ snapshots: merge2@1.4.1: {} - metro-babel-transformer@0.84.4: + 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.84.4 + hermes-parser: 0.36.1 + metro-cache-key: 0.87.0 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-cache-key@0.84.4: + metro-cache-key@0.87.0: dependencies: flow-enums-runtime: 0.0.6 - metro-cache@0.84.4: + 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.84.4 + metro-core: 0.87.0 transitivePeerDependencies: - supports-color - metro-config@0.84.4: + metro-config@0.87.0: dependencies: connect: 3.7.0 flow-enums-runtime: 0.0.6 jest-validate: 29.7.0 - metro: 0.84.4 - metro-cache: 0.84.4 - metro-core: 0.84.4 - metro-runtime: 0.84.4 - 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.84.4: + metro-core@0.87.0: dependencies: flow-enums-runtime: 0.0.6 lodash.throttle: 4.1.1 - metro-resolver: 0.84.4 + metro-resolver: 0.87.0 - metro-file-map@0.84.4: + metro-file-map@0.87.0: dependencies: debug: 4.4.3(supports-color@8.1.1) fb-watchman: 2.0.2 @@ -8621,46 +8588,46 @@ snapshots: transitivePeerDependencies: - supports-color - metro-minify-terser@0.84.4: + metro-minify-terser@0.87.0: dependencies: flow-enums-runtime: 0.0.6 terser: 5.49.0 - metro-resolver@0.84.4: + metro-resolver@0.87.0: dependencies: flow-enums-runtime: 0.0.6 - metro-runtime@0.84.4: + metro-runtime@0.87.0: dependencies: '@babel/runtime': 7.29.7 flow-enums-runtime: 0.0.6 - metro-source-map@0.84.4: + 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.84.4 + metro-symbolicate: 0.87.0 nullthrows: 1.1.1 - ob1: 0.84.4 + ob1: 0.87.0 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-symbolicate@0.84.4: + metro-symbolicate@0.87.0: dependencies: flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-source-map: 0.84.4 + 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.84.4: + metro-transform-plugins@0.87.0: dependencies: '@babel/core': 7.29.7 '@babel/generator': 7.29.7 @@ -8671,27 +8638,27 @@ snapshots: transitivePeerDependencies: - supports-color - metro-transform-worker@0.84.4: + 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.84.4 - metro-babel-transformer: 0.84.4 - metro-cache: 0.84.4 - metro-cache-key: 0.84.4 - metro-minify-terser: 0.84.4 - metro-source-map: 0.84.4 - metro-transform-plugins: 0.84.4 + 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.84.4: + metro@0.87.0: dependencies: '@babel/code-frame': 7.29.7 '@babel/core': 7.29.7 @@ -8707,24 +8674,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.84.4 - metro-cache: 0.84.4 - metro-cache-key: 0.84.4 - metro-config: 0.84.4 - metro-core: 0.84.4 - metro-file-map: 0.84.4 - metro-resolver: 0.84.4 - metro-runtime: 0.84.4 - metro-source-map: 0.84.4 - metro-symbolicate: 0.84.4 - metro-transform-plugins: 0.84.4 - metro-transform-worker: 0.84.4 + 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 @@ -8823,11 +8790,11 @@ snapshots: transitivePeerDependencies: - supports-color - mocha-remote-react-native@1.13.2(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3): + mocha-remote-react-native@1.13.2(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@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.2.3 - react-native: 0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + react-native: 0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) transitivePeerDependencies: - bufferutil - supports-color @@ -8933,7 +8900,7 @@ snapshots: nullthrows@1.1.1: {} - ob1@0.84.4: + ob1@0.87.0: dependencies: flow-enums-runtime: 0.0.6 @@ -9218,44 +9185,42 @@ snapshots: react-is@18.3.1: {} - react-native-test-app@5.4.5(@react-native-community/cli-types@20.2.0)(metro@0.84.4)(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3): + react-native-test-app@5.4.5(@react-native-community/cli-types@20.2.0)(metro@0.87.0)(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3): dependencies: '@isaacs/cliui': 9.0.0 - '@rnx-kit/react-native-host': 0.5.21(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@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.84.4) + '@rnx-kit/react-native-host': 0.5.21(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@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 fast-xml-builder: 1.3.0 fast-xml-parser: 5.10.1 prompts: 2.4.2 react: 19.2.3 - react-native: 0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + react-native: 0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) semver: 7.8.5 transitivePeerDependencies: - '@react-native-community/cli-types' - memfs - metro - react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3): + react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3): dependencies: - '@react-native/assets-registry': 0.87.0-nightly-20260529-88857d22f - '@react-native/codegen': 0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7) - '@react-native/community-cli-plugin': 0.87.0-nightly-20260529-88857d22f(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7)) - '@react-native/gradle-plugin': 0.87.0-nightly-20260529-88857d22f - '@react-native/js-polyfills': 0.87.0-nightly-20260529-88857d22f - '@react-native/normalize-colors': 0.87.0-nightly-20260529-88857d22f - '@react-native/virtualized-lists': 0.87.0-nightly-20260529-88857d22f(@types/react@19.2.17)(react-native@0.87.0-nightly-20260529-88857d22f(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-nightly-20260529-88857d22f(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) - abort-controller: 3.0.0 + '@react-native/asset-utils': 0.87.0-rc.4 + '@react-native/codegen': 0.87.0-rc.4(@babel/core@7.29.7) + '@react-native/community-cli-plugin': 0.87.0-rc.4(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7)) + '@react-native/gradle-plugin': 0.87.0-rc.4 + '@react-native/normalize-colors': 0.87.0-rc.4 + '@react-native/virtualized-lists': 0.87.0-rc.4(@types/react@19.2.17)(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@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-plugin-syntax-hermes-parser: 0.36.1 base64-js: 1.5.1 commander: 12.1.0 flow-enums-runtime: 0.0.6 - hermes-compiler: 250829098.0.13 + hermes-compiler: 250829098.0.16 invariant: 2.2.4 memoize-one: 5.2.1 - metro-runtime: 0.84.4 - metro-source-map: 0.84.4 + metro-runtime: 0.87.0 + metro-source-map: 0.87.0 nullthrows: 1.1.1 pretty-format: 29.7.0 promise: 8.3.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f6fcfe88..632cdabc 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -8,4 +8,4 @@ packages: onlyBuiltDependencies: - esbuild patchedDependencies: - react-native@0.87.0-nightly-20260529-88857d22f: patches/react-native@0.87.0-nightly-20260529-88857d22f.patch + react-native@0.87.0-rc.4: patches/react-native@0.87.0-rc.4.patch From 7c1abbc5ab071d693282cc9eb1e0680bba9bda85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Sun, 9 Aug 2026 22:47:40 +0200 Subject: [PATCH 15/25] test-app: adopt built-in Kotlin on Android, opt out of the AGP 9 DSL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- apps/test-app/android/gradle.properties | 14 +++++++++++++- .../gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/apps/test-app/android/gradle.properties b/apps/test-app/android/gradle.properties index 08ca7f53..1c921552 100644 --- a/apps/test-app/android/gradle.properties +++ b/apps/test-app/android/gradle.properties @@ -50,4 +50,16 @@ 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 the new DSL that ships enabled in AGP 9, because both of +# react-native-test-app's Gradle modules still use the old one. AGP 10 removes +# this opt out, so it is 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. +# +# Note that we deliberately do NOT opt out of built-in Kotlin (the flag AGP 10 +# also removes): React Native's own ReactAndroid no longer applies the Kotlin +# plugin, and `react-native-node-api` only applies it when built-in Kotlin is +# unavailable, so the whole build is built-in-Kotlin native. +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 37f78a6a..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-9.3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 4b46e1b9a61bb13b982d6cdb6b6c4c18292000ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Sun, 9 Aug 2026 23:23:33 +0200 Subject: [PATCH 16/25] deps: bump react-native to a 0.88 nightly and drop the Windows patch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- apps/test-app/package.json | 10 +- package.json | 2 +- packages/host/package.json | 2 +- patches/react-native@0.87.0-rc.4.patch | 24 -- pnpm-lock.yaml | 314 ++++++++++++------------- pnpm-workspace.yaml | 2 - 6 files changed, 158 insertions(+), 196 deletions(-) delete mode 100644 patches/react-native@0.87.0-rc.4.patch diff --git a/apps/test-app/package.json b/apps/test-app/package.json index ccf09c1c..a56d29f3 100644 --- a/apps/test-app/package.json +++ b/apps/test-app/package.json @@ -30,9 +30,9 @@ "@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.87.0-rc.4", - "@react-native/metro-config": "0.87.0-rc.4", - "@react-native/typescript-config": "0.87.0-rc.4", + "@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", @@ -41,9 +41,9 @@ "mocha-remote-cli": "^1.13.2", "mocha-remote-react-native": "^1.13.2", "react": "19.2.3", - "react-native": "0.87.0-rc.4", + "react-native": "0.88.0-nightly-20260809-db662caea", "react-native-node-api": "workspace:*", - "react-native-test-app": "^5.1.9", + "react-native-test-app": "^5.4.8", "weak-node-api": "workspace:*" } } diff --git a/package.json b/package.json index 24d66780..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.87.0-rc.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/package.json b/packages/host/package.json index 554915c6..e748e41f 100644 --- a/packages/host/package.json +++ b/packages/host/package.json @@ -85,7 +85,7 @@ }, "peerDependencies": { "@babel/core": "^7.26.10", - "react-native": "0.87.0-rc.4", + "react-native": "0.88.0-nightly-20260809-db662caea", "weak-node-api": "workspace:*" } } diff --git a/patches/react-native@0.87.0-rc.4.patch b/patches/react-native@0.87.0-rc.4.patch deleted file mode 100644 index f21ac35e..00000000 --- a/patches/react-native@0.87.0-rc.4.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff --git a/settings.gradle.kts b/settings.gradle.kts -index 2036e0f16450b837223aad4b73cd1d556089d16d..a769520babe1423bb08399e5a932db50de7bad51 100644 ---- a/settings.gradle.kts -+++ b/settings.gradle.kts -@@ -35,6 +35,16 @@ project(":packages:react-native:ReactAndroid:hermes-engine").projectDir = - // for :packages and :packages:react-native as well as otherwise the build from - // source will fail with a missing folder exception. - --project(":packages").projectDir = file("/tmp") -- --project(":packages:react-native").projectDir = file("/tmp") -+// Patched by react-native-node-api: upstream hardcodes file("/tmp"), which does -+// not exist on Windows (there `/tmp` resolves to a non-existent /tmp), -+// so the build-from-source settings fail to configure. Use the JVM temp dir, -+// which exists on every platform (`/tmp` on posix, %TEMP% on Windows). -+// -+// Fixed upstream in facebook/react-native#57706, landed on main as 908872a6 -+// (2026-07-28) — after the 0.87 branch cut, so 0.87-stable does NOT carry it. -+// Remove this patch once we pin a react-native that contains that commit: a -+// nightly built from main on/after 2026-07-29, or the first stable line -+// branched after it (0.88+), or a 0.87.x that cherry-picks it. -+project(":packages").projectDir = file(System.getProperty("java.io.tmpdir", "/tmp")) -+ -+project(":packages:react-native").projectDir = file(System.getProperty("java.io.tmpdir", "/tmp")) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd974fe4..ba0121ea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,11 +4,6 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -patchedDependencies: - react-native@0.87.0-rc.4: - hash: 34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08 - path: patches/react-native@0.87.0-rc.4.patch - importers: .: @@ -53,8 +48,8 @@ importers: specifier: ^0.3.15 version: 0.3.21 react-native: - specifier: 0.87.0-rc.4 - version: 0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + 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 @@ -98,17 +93,17 @@ importers: specifier: workspace:* version: link:../../packages/node-tests '@react-native/babel-preset': - specifier: 0.87.0-rc.4 - version: 0.87.0-rc.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.87.0-rc.4 - version: 0.87.0-rc.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.87.0-rc.4 - version: 0.87.0-rc.4 + specifier: 0.88.0-nightly-20260809-db662caea + version: 0.88.0-nightly-20260809-db662caea '@rnx-kit/metro-config': specifier: ^2.2.4 - version: 2.2.4(@react-native-community/cli-types@20.2.0)(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(metro@0.87.0)(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + 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 @@ -126,19 +121,19 @@ importers: version: 1.13.2 mocha-remote-react-native: specifier: ^1.13.2 - version: 1.13.2(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + 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.2.3 version: 19.2.3 react-native: - specifier: 0.87.0-rc.4 - version: 0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + 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: ^5.1.9 - version: 5.4.5(@react-native-community/cli-types@20.2.0)(metro@0.87.0)(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + 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 @@ -252,8 +247,8 @@ importers: specifier: ^8.0.0 version: 8.0.0 react-native: - specifier: 0.87.0-rc.4 - version: 0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3) + 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 @@ -1999,81 +1994,81 @@ packages: engines: {node: '>=20.19.4'} hasBin: true - '@react-native/asset-utils@0.87.0-rc.4': - resolution: {integrity: sha512-EfiQ0ZvDxRUXvApzA4wsJy+e6NHw4LIkcFk2SZcmSxKni+DJF5hDxgfpJeVgh2TzQHzmaXRINUOINnKgro+zEA==} + '@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.87.0-rc.4': - resolution: {integrity: sha512-Jm8Jij3d9obVLIF4bQFi2LEaPG5njwz2EeR4WHe7sdO2f0tK4z6FMNDPw62TPm9koSPChEfXU0xk16wNBV2UMQ==} + '@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.87.0-rc.4': - resolution: {integrity: sha512-j2FM0CymBpcMtF4XCKisYFJvlJvVXb7dzeGX8PGpofxpK906O/hP5MkQeYO7JTIMs6WY/+Gmfy0ckGp0OuJh1A==} + '@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.87.0-rc.4': - resolution: {integrity: sha512-Cy70AK1rCe+S8ux2R9XhSe8MzzI7Jv7emTmJlx9wGaMbhuWeHg0TEAawJnJ2nj7kLiKvxI95A4Yvq8PM+GEjuQ==} + '@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.87.0-rc.4': - resolution: {integrity: sha512-O+F+oERD43GYDcywTUwF25VeL2uegq93uCC7QUwxsZn7ADR5Sxd3yOrO9VDeW+s2HTgBBbYvXljq6KML430VQQ==} + '@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': 0.87.0-rc.4 + '@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.87.0-rc.4': - resolution: {integrity: sha512-Mw2dICfMltllCd6CRN5YczLYzS2FOhPavW6p4j6UMojGsiRzAy8YOT7dLi5plv7u3qwggU/PUkg4kjQcJckfBg==} + '@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.87.0-rc.4': - resolution: {integrity: sha512-lb4NSh+q1bmoA2xmcu5DJcT0kfbCgriMf8i4rm1Y+IvTdjPgl7bMMu4C8vwTANSkZtx53AgyfBBATBg+q0e+QQ==} + '@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.87.0-rc.4': - resolution: {integrity: sha512-gtu7i16+R4V+eM5S54bCw+pWnpswwMxrDZYYQlZXOqeV7d5E/cDHhbzcsNBrMKgtp5+EsANnM9rkdQu6IKC6YQ==} + '@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.87.0-rc.4': - resolution: {integrity: sha512-cx+K21v+nnwbVJWEMjobJ724SyxEw5Xyz6iLg9HAz0e5epXdDMnbqiyImXCEbUvCLk4kq6YKQT6fz74WdxKwBA==} + '@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.87.0-rc.4': - resolution: {integrity: sha512-FFdmwLz4QCY5h4LNwIf+QUNkupmdF5cKVTr9uN4lWk1MOTYdFVfEd3Uy5a9IDL5syJ2dxZNMdv3yceZ3C2uZAg==} + '@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.87.0-rc.4': - resolution: {integrity: sha512-TfI3DgkI1nMduyIjaG5UZ4+tauI5D4M5FaLUeWqMtkTW9ba6WjcqYpk3xm6lLMT37JeKZVZsRk9pUD2/E1tWig==} + '@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.87.0-rc.4': - resolution: {integrity: sha512-r9sA/jZSYEiJCgI7pJN8tRGMqE7h4FGT8IVt9DTnWTof8wVox22fjGB6atPiRSADMOayfqg0e0XCA309jq2LyA==} + '@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.87.0-rc.4': - resolution: {integrity: sha512-3Jn9RESQpJhFg3BBfpiT1B5WK0YJAanO/OnbHu1vNNImly01Ui8payVddpsaUsnAkUmktacB07hpWTBHZ2vF2w==} + '@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.87.0-rc.4': - resolution: {integrity: sha512-QfYwGYXm59n/sbq6kPAew6ZL2uZ/Wnf/SoRHYirqjVWHP1f2UOhL/n92g+L3KTNM0pz1HRjl5kFRlGLfcDNyZg==} + '@react-native/typescript-config@0.88.0-nightly-20260809-db662caea': + resolution: {integrity: sha512-fEWkmJR2vzZRt6X4+Z1qGm4mXQ90RYBBe/KOSRoMfbYIZPmeL/vhnmuA6jQB/9dpXzA8oJyIE4xLs73I/spJIw==} - '@react-native/virtualized-lists@0.87.0-rc.4': - resolution: {integrity: sha512-MgAV4eG49CmLiz761Fjh9idVQQtjGlK7gkXroIa86m54QmrNFzZnf0WPtIZQQwrDSonTeHD1MZcSl4aN6oRgug==} + '@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.2.0 react: '*' - react-native: 0.87.0-rc.4 + react-native: 0.88.0-nightly-20260809-db662caea peerDependenciesMeta: '@types/react': optional: true @@ -2544,8 +2539,8 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-syntax-hermes-parser@0.36.1: - resolution: {integrity: sha512-ycduwJbvdvIMmVvlAZqGggS+pm5Eu4Bk9pcV9Sm2Z4PJNRVsKkv0g7vHj+LeuC1gHTeF67sJXFOq61IlqCa2hA==} + 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==} @@ -2666,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.3.0: - resolution: {integrity: sha512-p03azHlGjtyRvFEee3cyvtsRYdniSkwjkzmM/KmVnqT5d7QkkwpJBhis/zCLMYdQMVJ5tt140TBNqqrZPaWeFA==} - ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} @@ -2865,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'} @@ -3172,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'} @@ -3327,15 +3326,21 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - hermes-compiler@250829098.0.16: - resolution: {integrity: sha512-xsgzk+mUyvt9t1nUbF8USBlYxajTUtPJhVZ86q85s/SEoMKCF+52YZcudb0ENSnV3T3lV9mgB3s6R7+pH90zgw==} + 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.37.0: + resolution: {integrity: sha512-Frp4+A518C4zZgB2+Qo1srlM3y6nbrFbNNzBF3g7tEuQXHXTb2h39V25JQLNHotxclkD+AZTN/JCCpiTFlhIGg==} + hermes-parser@0.36.1: resolution: {integrity: sha512-GApNk4zLHi2UWoWZZkx7LNCOSzLSc5lB55pZ/PhK7ycFeg7u5LcF88p/WbpIi1XUDtE0MpHE3uRR3u3KB7TjSQ==} + hermes-parser@0.37.0: + resolution: {integrity: sha512-8PuWcyaF6VHQHL2dbU+QEIkbtHYQrTX/6+ep4VcBLJ3f/ehevowr5Zj8LQfYXQQGFG2O+df7hIMtt4PkkhfK3Q==} + homedir-polyfill@1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} @@ -3603,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==} @@ -3667,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'} @@ -3975,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==} @@ -4196,15 +4195,15 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-native-test-app@5.4.5: - resolution: {integrity: sha512-Vbv8hlj6/PZ/ZiVXoxtsbbe3nCsFLEDlcUl2DkeQ8Ryqo0ZMrx9ijD8ToRJgKnlb8NvVguZ6qFBH6RkG2N5cmQ==} + 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.76 - 0.79 '@expo/config-plugins': '>=5.0' react: 18.2 - 19.2 - react-native: 0.76 - 0.86 || >=0.86.0-0 <0.87.0 + 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: @@ -4217,8 +4216,8 @@ packages: react-native-windows: optional: true - react-native@0.87.0-rc.4: - resolution: {integrity: sha512-cmgycLQVEiaece2H8nqFvaRjX41PJuGHgtW6MmL2xuVjJGswqB22BJoUWXR6hKInCwmvM5H89VJtpCDbRKmRWQ==} + 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: @@ -6715,17 +6714,17 @@ snapshots: - typescript - utf-8-validate - '@react-native/asset-utils@0.87.0-rc.4': {} + '@react-native/asset-utils@0.88.0-nightly-20260809-db662caea': {} - '@react-native/babel-plugin-codegen@0.87.0-rc.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.87.0-rc.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.87.0-rc.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) @@ -6756,42 +6755,45 @@ snapshots: '@babel/plugin-transform-runtime': 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) - '@react-native/babel-plugin-codegen': 0.87.0-rc.4(@babel/core@7.29.7) - babel-plugin-syntax-hermes-parser: 0.36.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.87.0-rc.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 - hermes-parser: 0.36.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.87.0-rc.4(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.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/asset-utils': 0.87.0-rc.4 - '@react-native/dev-middleware': 0.87.0-rc.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.87.0 semver: 7.8.5 optionalDependencies: '@react-native-community/cli': 20.2.0(typescript@5.9.3) - '@react-native/metro-config': 0.87.0-rc.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.87.0-rc.4': {} + '@react-native/debugger-frontend@0.88.0-nightly-20260809-db662caea': {} - '@react-native/debugger-shell@0.87.0-rc.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) @@ -6799,18 +6801,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@react-native/dev-middleware@0.87.0-rc.4': + '@react-native/dev-middleware@0.88.0-nightly-20260809-db662caea': dependencies: '@isaacs/ttlcache': 1.4.1 - '@react-native/debugger-frontend': 0.87.0-rc.4 - '@react-native/debugger-shell': 0.87.0-rc.4 - chrome-launcher: 0.15.2 - chromium-edge-launcher: 0.3.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: 7.5.13 transitivePeerDependencies: @@ -6818,39 +6818,40 @@ snapshots: - supports-color - utf-8-validate - '@react-native/gradle-plugin@0.87.0-rc.4': {} + '@react-native/gradle-plugin@0.88.0-nightly-20260809-db662caea': {} - '@react-native/js-polyfills@0.87.0-rc.4': {} + '@react-native/js-polyfills@0.88.0-nightly-20260809-db662caea': {} - '@react-native/metro-babel-transformer@0.87.0-rc.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.87.0-rc.4(@babel/core@7.29.7) - hermes-parser: 0.36.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.87.0-rc.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.87.0-rc.4 - '@react-native/metro-babel-transformer': 0.87.0-rc.4(@babel/core@7.29.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' - supports-color - '@react-native/normalize-colors@0.87.0-rc.4': {} + '@react-native/normalize-colors@0.88.0-nightly-20260809-db662caea': {} - '@react-native/typescript-config@0.87.0-rc.4': {} + '@react-native/typescript-config@0.88.0-nightly-20260809-db662caea': {} - '@react-native/virtualized-lists@0.87.0-rc.4(@types/react@19.2.17)(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)': + '@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.2.3 - react-native: 0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(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 @@ -6859,23 +6860,23 @@ 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.87.0-rc.4(@babel/core@7.29.7))(metro@0.87.0)(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)': + '@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.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.2.3 - react-native: 0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(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.87.0-rc.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.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))': + '@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.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(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) '@rnx-kit/tools-filesystem@0.2.0': {} @@ -7342,9 +7343,9 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-syntax-hermes-parser@0.36.1: + babel-plugin-syntax-hermes-parser@0.37.0: dependencies: - hermes-parser: 0.36.1 + hermes-parser: 0.37.0 babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.29.7): dependencies: @@ -7470,25 +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.3.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 - transitivePeerDependencies: - - supports-color - ci-info@2.0.0: {} ci-info@3.9.0: {} @@ -7681,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 @@ -8033,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) @@ -8194,14 +8184,20 @@ snapshots: he@1.2.0: {} - hermes-compiler@250829098.0.16: {} + hermes-compiler@260318099.0.1: {} hermes-estree@0.36.1: {} + hermes-estree@0.37.0: {} + hermes-parser@0.36.1: dependencies: hermes-estree: 0.36.1 + hermes-parser@0.37.0: + dependencies: + hermes-estree: 0.37.0 + homedir-polyfill@1.0.3: dependencies: parse-passwd: 1.0.0 @@ -8448,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: @@ -8515,8 +8504,6 @@ snapshots: dependencies: tmpl: 1.0.5 - marky@1.3.0: {} - math-intrinsics@1.1.0: {} media-typer@1.1.0: {} @@ -8790,11 +8777,11 @@ snapshots: transitivePeerDependencies: - supports-color - mocha-remote-react-native@1.13.2(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3): + 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.2.3 - react-native: 0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(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 @@ -8944,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 @@ -9185,38 +9173,38 @@ snapshots: react-is@18.3.1: {} - react-native-test-app@5.4.5(@react-native-community/cli-types@20.2.0)(metro@0.87.0)(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3): + 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: '@isaacs/cliui': 9.0.0 - '@rnx-kit/react-native-host': 0.5.21(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3)) + '@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 fast-xml-builder: 1.3.0 fast-xml-parser: 5.10.1 prompts: 2.4.2 react: 19.2.3 - react-native: 0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(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 transitivePeerDependencies: - '@react-native-community/cli-types' - memfs - metro - react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(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): dependencies: - '@react-native/asset-utils': 0.87.0-rc.4 - '@react-native/codegen': 0.87.0-rc.4(@babel/core@7.29.7) - '@react-native/community-cli-plugin': 0.87.0-rc.4(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7)) - '@react-native/gradle-plugin': 0.87.0-rc.4 - '@react-native/normalize-colors': 0.87.0-rc.4 - '@react-native/virtualized-lists': 0.87.0-rc.4(@types/react@19.2.17)(react-native@0.87.0-rc.4(patch_hash=34fb46067fb53b2193e54fc2632cbb5d5c7c01beb23096d2efa1531640cc0e08)(@babel/core@7.29.7)(@react-native-community/cli@20.2.0(typescript@5.9.3))(@react-native/metro-config@0.87.0-rc.4(@babel/core@7.29.7))(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + '@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-plugin-syntax-hermes-parser: 0.36.1 + babel-plugin-syntax-hermes-parser: 0.37.0 base64-js: 1.5.1 - commander: 12.1.0 flow-enums-runtime: 0.0.6 - hermes-compiler: 250829098.0.16 + flow-parser: 0.325.0 + hermes-compiler: 260318099.0.1 invariant: 2.2.4 memoize-one: 5.2.1 metro-runtime: 0.87.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 632cdabc..c3bd5498 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -7,5 +7,3 @@ packages: # platform binary; allow just that one rather than disabling the safety globally. onlyBuiltDependencies: - esbuild -patchedDependencies: - react-native@0.87.0-rc.4: patches/react-native@0.87.0-rc.4.patch From c453478046d9c1d1d2d03d36e76ba13362a440cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Sun, 9 Aug 2026 23:45:08 +0200 Subject: [PATCH 17/25] host: link the renamed hermesvm prefab module on Android MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- packages/host/android/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ) From c6ef0ace607b2e7b29bab12ca94679a1c067120b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Sun, 9 Aug 2026 23:58:38 +0200 Subject: [PATCH 18/25] test-app: opt out of built-in Kotlin after all MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- apps/test-app/android/gradle.properties | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/apps/test-app/android/gradle.properties b/apps/test-app/android/gradle.properties index 1c921552..df4582c0 100644 --- a/apps/test-app/android/gradle.properties +++ b/apps/test-app/android/gradle.properties @@ -52,14 +52,20 @@ react.buildFromSource=true # Version of Kotlin to build against. #KOTLIN_VERSION=1.8.22 -# Opt out of the new DSL that ships enabled in AGP 9, because both of -# react-native-test-app's Gradle modules still use the old one. AGP 10 removes -# this opt out, so it is on borrowed time — tracked in +# 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. # -# Note that we deliberately do NOT opt out of built-in Kotlin (the flag AGP 10 -# also removes): React Native's own ReactAndroid no longer applies the Kotlin -# plugin, and `react-native-node-api` only applies it when built-in Kotlin is -# unavailable, so the whole build is built-in-Kotlin native. +# 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 From 2fca5b5defe775bec8361a998eb72876df9f1c5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Mon, 10 Aug 2026 20:01:26 +0200 Subject: [PATCH 19/25] test-app: fail the Android run as soon as the app crashes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `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) --- apps/test-app/package.json | 3 +- .../scripts/android-crash-watchdog.mts | 91 +++++++++++++++++++ apps/test-app/tsconfig.node-scripts.json | 2 +- 3 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 apps/test-app/scripts/android-crash-watchdog.mts diff --git a/apps/test-app/package.json b/apps/test-app/package.json index a56d29f3..b85c94f1 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 -- ", 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..85991504 --- /dev/null +++ b/apps/test-app/scripts/android-crash-watchdog.mts @@ -0,0 +1,91 @@ +/** + * 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"); + + const logcat = cp.spawn("adb", ["logcat", "-b", "crash"], { + stdio: ["ignore", "pipe", "inherit"], + }); + + // 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.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"] } From 77bfb13b545696f23809f4910ebd7483344e50a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Mon, 10 Aug 2026 20:21:55 +0200 Subject: [PATCH 20/25] test-app: don't let the crash watchdog hold the step's stderr open MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- apps/test-app/scripts/android-crash-watchdog.mts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/test-app/scripts/android-crash-watchdog.mts b/apps/test-app/scripts/android-crash-watchdog.mts index 85991504..40f2423a 100644 --- a/apps/test-app/scripts/android-crash-watchdog.mts +++ b/apps/test-app/scripts/android-crash-watchdog.mts @@ -52,10 +52,20 @@ async function main() { // 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", "inherit"], + 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; From c0c468a1020f7d8f3cc5b5b75daea3dd1c117845 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Mon, 10 Aug 2026 20:21:55 +0200 Subject: [PATCH 21/25] 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) --- packages/host/src/node/cli/hermes.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/host/src/node/cli/hermes.ts b/packages/host/src/node/cli/hermes.ts index 2f600533..e9893d5c 100644 --- a/packages/host/src/node/cli/hermes.ts +++ b/packages/host/src/node/cli/hermes.ts @@ -30,7 +30,16 @@ const HERMES_GIT_URL = "https://github.com/facebook/hermes.git"; // 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. -const HERMES_GIT_SHA = "efcf68e285865fd9d952070b08e751bcad63f25e"; +// +// 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 ", From 54bd0ac7f91c2fde93e38d2d4a5a2da05fa318e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Mon, 10 Aug 2026 21:46:58 +0200 Subject: [PATCH 22/25] host: create one Node-API env per addon MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- packages/host/cpp/CxxNodeApiHostModule.cpp | 16 ++++++++-------- packages/host/cpp/CxxNodeApiHostModule.hpp | 13 ++++++++----- packages/host/cpp/RuntimeNodeApiAsync.cpp | 11 +++++++++++ 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/packages/host/cpp/CxxNodeApiHostModule.cpp b/packages/host/cpp/CxxNodeApiHostModule.cpp index 113bd24d..05745892 100644 --- a/packages/host/cpp/CxxNodeApiHostModule.cpp +++ b/packages/host/cpp/CxxNodeApiHostModule.cpp @@ -127,11 +127,11 @@ bool CxxNodeApiHostModule::initializeNodeModule(jsi::Runtime &rt, // @see // https://github.com/callstackincubator/react-native-node-api/issues/4 - // Lazily create the Node-API environment backing this runtime. Hermes binds - // an env to its low-level VM runtime, which we reach through the (unstable) - // IHermes JSI interface. The env is owned by the runtime and shared across - // all addons, so we create it once and cache it. - if (env_ == nullptr) { + // 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 // . @@ -141,10 +141,10 @@ bool CxxNodeApiHostModule::initializeNodeModule(jsi::Runtime &rt, "create a Node-API environment"); abort(); } - env_ = hermes_napi_create_env(hermes->getVMRuntimeUnsafe(), nullptr); - assert(env_ != nullptr); + addon.env = hermes_napi_create_env(hermes->getVMRuntimeUnsafe(), nullptr); + assert(addon.env != nullptr); } - napi_env env = env_; + 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 2b2c97bc..7be3e598 100644 --- a/packages/host/cpp/CxxNodeApiHostModule.hpp +++ b/packages/host/cpp/CxxNodeApiHostModule.hpp @@ -26,15 +26,18 @@ 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_; - // The Node-API environment backing every addon loaded into this runtime. - // Created lazily on first use from the underlying Hermes VM runtime and - // shared across all addons (Node-API expects a single env per realm). - napi_env env_ = nullptr; - using LoaderPolicy = PosixLoader; // FIXME: HACK: This is temporary workaround // for my lazyness (work on iOS and Android) 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) { From 8d818c189fced9b8fa8cc4eaa6a6c6e0b9250f01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Mon, 10 Aug 2026 22:03:28 +0200 Subject: [PATCH 23/25] Add changeset for the static_h Node-API adoption Co-Authored-By: Claude Opus 5 (1M context) --- .changeset/eighty-moons-shave.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .changeset/eighty-moons-shave.md 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. From 3bacef685fa52a38cc330597a5237cbb53632706 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Mon, 10 Aug 2026 22:40:22 +0200 Subject: [PATCH 24/25] 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) --- AGENTS.md | 2 +- README.md | 12 ++++++------ docs/ANDROID.md | 6 +++--- docs/HOW-IT-WORKS.md | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) 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/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..c11e3549 100644 --- a/docs/HOW-IT-WORKS.md +++ b/docs/HOW-IT-WORKS.md @@ -39,15 +39,15 @@ 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: -- 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 engine-specific functions (see [js_native_api.h](https://github.com/nodejs/node/blob/main/src/js_native_api.h)) are implemented by the engine itself (currently only Hermes implements Node-API). - 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`. ## `my-app` regain control and call `add` From 78c8d58332c5b22a700b9cb0c7818978080dfd8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=A6n=20Hansen?= Date: Mon, 10 Aug 2026 22:47:24 +0200 Subject: [PATCH 25/25] 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) --- docs/HOW-IT-WORKS.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/HOW-IT-WORKS.md b/docs/HOW-IT-WORKS.md index c11e3549..b78f4686 100644 --- a/docs/HOW-IT-WORKS.md +++ b/docs/HOW-IT-WORKS.md @@ -45,10 +45,16 @@ The initialization function of a Node-API module expects a `napi_env`, which we ## 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 engine itself (currently only Hermes implements Node-API). -- 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`