From 042173a846ce1e7546e7fd7ea6375f5bc57ecc45 Mon Sep 17 00:00:00 2001 From: Tommy Nguyen <4123478+tido64@users.noreply.github.com> Date: Mon, 21 Jul 2025 09:43:07 +0200 Subject: [PATCH] fix: declare support for 0.81 --- example/App.tsx | 280 ------------------------- example/SafeAreaView.tsx | 15 -- example/index.ts | 2 +- example/package.json | 2 +- example/src/App.tsx | 77 +++++++ example/src/Feature.tsx | 44 ++++ example/src/LocalStorage.tsx | 25 +++ example/src/RemoteDebugging.tsx | 46 ++++ example/src/SafeAreaView.tsx | 22 ++ example/src/Separator.tsx | 8 + example/src/core.ts | 82 ++++++++ example/src/styles.ts | 74 +++++++ example/tsconfig.json | 4 +- package.json | 2 +- scripts/internal/set-react-version.mts | 2 +- yarn.lock | 35 ++-- 16 files changed, 405 insertions(+), 315 deletions(-) delete mode 100644 example/App.tsx delete mode 100644 example/SafeAreaView.tsx create mode 100644 example/src/App.tsx create mode 100644 example/src/Feature.tsx create mode 100644 example/src/LocalStorage.tsx create mode 100644 example/src/RemoteDebugging.tsx create mode 100644 example/src/SafeAreaView.tsx create mode 100644 example/src/Separator.tsx create mode 100644 example/src/core.ts create mode 100644 example/src/styles.ts diff --git a/example/App.tsx b/example/App.tsx deleted file mode 100644 index d1d5e580f..000000000 --- a/example/App.tsx +++ /dev/null @@ -1,280 +0,0 @@ -import React, { useCallback, useEffect, useMemo, useState } from "react"; -import type { NativeSyntheticEvent } from "react-native"; -import { - NativeModules, - ScrollView, - StatusBar, - StyleSheet, - Switch, - Text, - useColorScheme, - View, -} from "react-native"; -// @ts-expect-error no type definitions available -import { version as coreVersion } from "react-native/Libraries/Core/ReactNativeVersion"; -import { SafeAreaView } from "./SafeAreaView"; - -declare global { - export const RN$Bridgeless: boolean; -} - -type AppProps = { - concurrentRoot?: boolean; -}; - -type FeatureProps = - | { children: string; value: string } - | { - children: string; - value: boolean; - disabled?: boolean; - onValueChange?: (value: boolean) => void; - }; - -// https://github.com/facebook/react-native/blob/0abd5d63e1c0c4708f81bd698e6d011fa75f01e5/packages/new-app-screen/src/Theme.js#L16-L33 -const COLORS = { - light: { - background: "#f3f3f3", - backgroundHighlight: "#cfe6ee", - cardBackground: "#fff", - cardOutline: "#dae1e7", - textPrimary: "#000", - textSecondary: "#404756", - }, - dark: { - background: "#000", - backgroundHighlight: "#193c47", - cardBackground: "#222", - cardOutline: "#444", - textPrimary: "#fff", - textSecondary: "#c0c1c4", - }, -}; - -function getHermesVersion(): string | undefined { - const version = - "HermesInternal" in global && - HermesInternal && - "getRuntimeProperties" in HermesInternal && - typeof HermesInternal.getRuntimeProperties === "function" && - HermesInternal.getRuntimeProperties()["OSS Release Version"]; - if (!version) { - return undefined; - } - - return `Hermes ${version}`; -} - -function getReactNativeVersion(): string { - const { major, minor, patch, prerelease } = coreVersion; - const version = `${major}.${minor}.${patch}`; - return prerelease ? `${version}-${prerelease.replace("-", "\n")}` : version; -} - -function isBridgeless() { - return "RN$Bridgeless" in global && RN$Bridgeless === true; -} - -function isConcurrentReactEnabled(props: AppProps, isFabric: boolean): boolean { - const { major, minor } = coreVersion; - const version = major * 10000 + minor; - // As of 0.74, it won't be possible to opt-out: - // https://github.com/facebook/react-native/commit/30d186c3683228d4fb7a42f804eb2fdfa7c8ac03 - return isFabric && (version >= 74 || props.concurrentRoot !== false); -} - -function isFabricInstance( - ref: NativeSyntheticEvent["currentTarget"] -): boolean { - return Boolean( - // @ts-expect-error — https://github.com/facebook/react-native/blob/0.72-stable/packages/react-native/Libraries/Renderer/public/ReactFabricPublicInstanceUtils.js - ref["__nativeTag"] || - // @ts-expect-error — https://github.com/facebook/react-native/blob/0.72-stable/packages/react-native/Libraries/Renderer/public/ReactFabricPublicInstanceUtils.js - ref["_internalInstanceHandle"]?.stateNode?.canonical - ); -} - -function isOnOrOff(value: unknown): "Off" | "On" { - return value ? "On" : "Off"; -} - -function isRemoteDebuggingAvailable(): boolean { - return ( - !getHermesVersion() && - !isBridgeless() && - typeof NativeModules["DevSettings"]?.setIsDebuggingRemotely === "function" - ); -} - -function setRemoteDebugging(value: boolean) { - if (isRemoteDebuggingAvailable()) { - NativeModules["DevSettings"].setIsDebuggingRemotely(value); - } -} - -function testID(label: string): string { - return label.toLowerCase().replace(/\s+/g, "-") + "-value"; -} - -function useIsFabricComponent() { - const [isFabric, setIsFabric] = useState(isBridgeless()); - const setter = useCallback( - ({ currentTarget }: NativeSyntheticEvent) => { - setIsFabric(isFabricInstance(currentTarget)); - }, - [setIsFabric] - ); - return [isFabric, setter] as const; -} - -function useLocalStorageStatus() { - const [localValue, setLocalValue] = useState("Checking"); - useEffect(() => { - const key = "sample/local-storage"; - window?.localStorage?.setItem(key, "Available"); - setLocalValue(window?.localStorage?.getItem(key) ?? "Error"); - return () => window?.localStorage?.removeItem(key); - }, []); - return localValue; -} - -function useStyles() { - const colorScheme = useColorScheme(); - return useMemo(() => { - const colors = COLORS[colorScheme ?? "light"]; - - const fontSize = 18; - const groupBorderRadius = 8; - const margin = 16; - - return StyleSheet.create({ - body: { - backgroundColor: colors.background, - flex: 1, - }, - group: { - backgroundColor: colors.cardBackground, - borderRadius: groupBorderRadius, - margin, - }, - groupItemContainer: { - alignItems: "center", - flexDirection: "row", - paddingHorizontal: margin, - }, - groupItemLabel: { - color: colors.textPrimary, - flex: 1, - fontSize, - marginVertical: 12, - }, - groupItemValue: { - color: colors.textSecondary, - fontSize: fontSize, - textAlign: "right", - }, - separator: { - backgroundColor: colors.cardOutline, - height: StyleSheet.hairlineWidth, - marginStart: margin, - }, - title: { - fontSize: 40, - fontWeight: "700", - paddingTop: 64, - paddingHorizontal: 32, - paddingBottom: 40, - textAlign: "center", - }, - }); - }, [colorScheme]); -} - -function Feature({ - children: label, - value, - ...props -}: FeatureProps): React.ReactElement { - const styles = useStyles(); - return ( - - {label} - {typeof value === "boolean" ? ( - - ) : ( - - {value} - - )} - - ); -} - -function Separator(): React.ReactElement { - const styles = useStyles(); - return ; -} - -// TODO: Remove this component when we drop support for <0.79 -function DevMenu(): React.ReactElement | null { - const styles = useStyles(); - - if (!isRemoteDebuggingAvailable()) { - return null; - } - - // Remote debugging was removed in 0.79: - // https://github.com/facebook/react-native/commit/9aae84a688b5af87faf4b68676b6357de26f797f - try { - const { - isAsyncDebugging, - } = require("react-native/Libraries/Utilities/DebugEnvironment"); - - return ( - - - Remote Debugging - - - ); - } catch (_) { - return null; - } -} - -export function App(props: AppProps): React.ReactElement { - const isDarkMode = useColorScheme() === "dark"; - const styles = useStyles(); - const [isFabric, setIsFabric] = useIsFabricComponent(); - const localStorageStatus = useLocalStorageStatus(); - - return ( - - - - Welcome to React Native - - - window.localStorage - - - React Native - - JS Engine - - Fabric - - - Concurrent React - - - Bridgeless - - - - ); -} diff --git a/example/SafeAreaView.tsx b/example/SafeAreaView.tsx deleted file mode 100644 index 0f7dd9907..000000000 --- a/example/SafeAreaView.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import * as React from "react"; -import type { SafeAreaViewProps } from "react-native-safe-area-context"; -import { - SafeAreaProvider, - SafeAreaView as SafeAreaViewInternal, - initialWindowMetrics, -} from "react-native-safe-area-context"; - -export function SafeAreaView(props: SafeAreaViewProps) { - return ( - - - - ); -} diff --git a/example/index.ts b/example/index.ts index 556342f14..f082d664d 100644 --- a/example/index.ts +++ b/example/index.ts @@ -1,6 +1,6 @@ // @react-native-webapis import { AppRegistry } from "react-native"; -import { App } from "./App"; import { name as appName } from "./app.json"; +import { App } from "./src/App"; AppRegistry.registerComponent(appName, () => App); diff --git a/example/package.json b/example/package.json index 64ac0882b..b8723b75c 100644 --- a/example/package.json +++ b/example/package.json @@ -33,7 +33,7 @@ "@react-native-community/cli": "^15.0.1", "@react-native/babel-preset": "^0.78.0", "@react-native/metro-config": "^0.78.0", - "@rnx-kit/cli": "^0.18.7", + "@rnx-kit/cli": "^0.18.11", "@rnx-kit/metro-config": "^2.1.0", "@rnx-kit/polyfills": "^0.2.0", "@rnx-kit/tsconfig": "^2.0.0", diff --git a/example/src/App.tsx b/example/src/App.tsx new file mode 100644 index 000000000..4457f2e55 --- /dev/null +++ b/example/src/App.tsx @@ -0,0 +1,77 @@ +import React, { useCallback, useState } from "react"; +import type { NativeSyntheticEvent } from "react-native"; +import { + ScrollView, + StatusBar, + Text, + useColorScheme, + View, +} from "react-native"; +import { Feature } from "./Feature"; +import { LocalStorageStatus } from "./LocalStorage"; +import { RemoteDebugging } from "./RemoteDebugging"; +import { SafeAreaView } from "./SafeAreaView"; +import { Separator } from "./Separator"; +import { + getHermesVersion, + isBridgeless, + isConcurrentReactEnabled, + isFabricInstance, + ReactNativeVersion, +} from "./core"; +import { useStyles } from "./styles"; + +declare global { + export const RN$Bridgeless: boolean; +} + +type AppProps = { + concurrentRoot?: boolean; +}; + +function useIsFabricComponent() { + const [isFabric, setIsFabric] = useState(isBridgeless()); + const setter = useCallback( + ({ currentTarget }: NativeSyntheticEvent) => { + setIsFabric(isFabricInstance(currentTarget)); + }, + [setIsFabric] + ); + return [isFabric, setter] as const; +} + +export function App(props: AppProps): React.ReactElement { + const isDarkMode = useColorScheme() === "dark"; + const styles = useStyles(); + const [isFabric, setIsFabric] = useIsFabricComponent(); + + return ( + + + + Welcome to React Native + + + + + React Native + + + JS Engine + + Fabric + + + Concurrent React + + + Bridgeless + + + + ); +} diff --git a/example/src/Feature.tsx b/example/src/Feature.tsx new file mode 100644 index 000000000..ba298f8c2 --- /dev/null +++ b/example/src/Feature.tsx @@ -0,0 +1,44 @@ +import React from "react"; +import { Switch, Text, View } from "react-native"; +import { useStyles } from "./styles"; + +export type FeatureProps = + | { children: string; value: string } + | { + children: string; + value: boolean; + disabled?: boolean; + onValueChange?: (value: boolean) => void; + }; + +function testID(label: string): string { + return label.toLowerCase().replace(/\s+/g, "-") + "-value"; +} + +function toString(value: boolean | string): string { + if (typeof value === "string") { + return value; + } + + return value ? "On" : "Off"; +} + +export function Feature({ + children: label, + value, + ...props +}: FeatureProps): React.ReactElement { + const styles = useStyles(); + return ( + + {label} + {"onValueChange" in props ? ( + + ) : ( + + {toString(value)} + + )} + + ); +} diff --git a/example/src/LocalStorage.tsx b/example/src/LocalStorage.tsx new file mode 100644 index 000000000..521a6ff55 --- /dev/null +++ b/example/src/LocalStorage.tsx @@ -0,0 +1,25 @@ +import React, { useEffect, useState } from "react"; +import { View } from "react-native"; +import { Feature } from "./Feature"; +import { useStyles } from "./styles"; + +function useLocalStorageStatus() { + const [localValue, setLocalValue] = useState("Checking"); + useEffect(() => { + const key = "sample/local-storage"; + window?.localStorage?.setItem(key, "Available"); + setLocalValue(window?.localStorage?.getItem(key) ?? "Error"); + return () => window?.localStorage?.removeItem(key); + }, []); + return localValue; +} + +export function LocalStorageStatus(): React.ReactElement { + const styles = useStyles(); + const localStorageStatus = useLocalStorageStatus(); + return ( + + window.localStorage + + ); +} diff --git a/example/src/RemoteDebugging.tsx b/example/src/RemoteDebugging.tsx new file mode 100644 index 000000000..2540f2ef2 --- /dev/null +++ b/example/src/RemoteDebugging.tsx @@ -0,0 +1,46 @@ +import React from "react"; +import { NativeModules, View } from "react-native"; +import { Feature } from "./Feature"; +import { getHermesVersion, isBridgeless } from "./core"; +import { useStyles } from "./styles"; + +function isRemoteDebuggingAvailable(): boolean { + return ( + !getHermesVersion() && + !isBridgeless() && + typeof NativeModules["DevSettings"]?.setIsDebuggingRemotely === "function" + ); +} + +function setRemoteDebugging(value: boolean) { + if (isRemoteDebuggingAvailable()) { + NativeModules["DevSettings"].setIsDebuggingRemotely(value); + } +} + +// TODO: Remove this component when we drop support for <0.79 +export function RemoteDebugging(): React.ReactElement | null { + const styles = useStyles(); + + if (!isRemoteDebuggingAvailable()) { + return null; + } + + // Remote debugging was removed in 0.79: + // https://github.com/facebook/react-native/commit/9aae84a688b5af87faf4b68676b6357de26f797f + try { + const { + isAsyncDebugging, + } = require("react-native/Libraries/Utilities/DebugEnvironment"); + + return ( + + + Remote Debugging + + + ); + } catch (_) { + return null; + } +} diff --git a/example/src/SafeAreaView.tsx b/example/src/SafeAreaView.tsx new file mode 100644 index 000000000..27d738fa8 --- /dev/null +++ b/example/src/SafeAreaView.tsx @@ -0,0 +1,22 @@ +import * as React from "react"; +import { View } from "react-native"; +import type { SafeAreaViewProps } from "react-native-safe-area-context"; +import { + SafeAreaProvider, + SafeAreaView as SafeAreaViewInternal, + initialWindowMetrics, +} from "react-native-safe-area-context"; +import { isBridgeless } from "./core"; + +export function SafeAreaView(props: SafeAreaViewProps) { + // TODO: `SafeAreaView` currently crashes in bridgeless mode + if (isBridgeless()) { + return ; + } else { + return ( + + + + ); + } +} diff --git a/example/src/Separator.tsx b/example/src/Separator.tsx new file mode 100644 index 000000000..86ac02acf --- /dev/null +++ b/example/src/Separator.tsx @@ -0,0 +1,8 @@ +import React from "react"; +import { View } from "react-native"; +import { useStyles } from "./styles"; + +export function Separator(): React.ReactElement { + const styles = useStyles(); + return ; +} diff --git a/example/src/core.ts b/example/src/core.ts new file mode 100644 index 000000000..064b56889 --- /dev/null +++ b/example/src/core.ts @@ -0,0 +1,82 @@ +import type { NativeSyntheticEvent } from "react-native"; +import { NativeModules } from "react-native"; + +export type ReactNativeVersion = { + major: number; + minor: number; + patch: number; + prerelease?: string; + getVersionString: () => string; +}; + +export const ReactNativeVersion: ReactNativeVersion = (() => { + // https://github.com/facebook/react-native/commit/ec5638abd0e872be62b6ea5d8df9bed6335c2191 + const { ReactNativeVersion } = require("react-native"); + if (ReactNativeVersion) { + return ReactNativeVersion; + } + + const { version } = require("react-native/Libraries/Core/ReactNativeVersion"); + return { + ...version, + getVersionString: () => { + const { major, minor, patch, prerelease } = version; + const v = `${major}.${minor}.${patch}`; + return prerelease ? `${v}-${prerelease.replace("-", "\n")}` : v; + }, + }; +})(); + +export function getHermesVersion(): string | undefined { + const version = + "HermesInternal" in global && + HermesInternal && + "getRuntimeProperties" in HermesInternal && + typeof HermesInternal.getRuntimeProperties === "function" && + HermesInternal.getRuntimeProperties()["OSS Release Version"]; + if (!version) { + return undefined; + } + + return `Hermes ${version}`; +} + +export function isBridgeless() { + return "RN$Bridgeless" in global && RN$Bridgeless === true; +} + +export function isConcurrentReactEnabled( + props: { concurrentRoot?: boolean }, + isFabric: boolean +): boolean { + const { major, minor } = ReactNativeVersion; + const version = major * 10000 + minor; + // As of 0.74, it won't be possible to opt-out: + // https://github.com/facebook/react-native/commit/30d186c3683228d4fb7a42f804eb2fdfa7c8ac03 + return isFabric && (version >= 74 || props.concurrentRoot !== false); +} + +export function isFabricInstance( + ref: NativeSyntheticEvent["currentTarget"] +): boolean { + return Boolean( + // @ts-expect-error — https://github.com/facebook/react-native/blob/0.72-stable/packages/react-native/Libraries/Renderer/public/ReactFabricPublicInstanceUtils.js + ref["__nativeTag"] || + // @ts-expect-error — https://github.com/facebook/react-native/blob/0.72-stable/packages/react-native/Libraries/Renderer/public/ReactFabricPublicInstanceUtils.js + ref["_internalInstanceHandle"]?.stateNode?.canonical + ); +} + +export function isRemoteDebuggingAvailable(): boolean { + return ( + !getHermesVersion() && + !isBridgeless() && + typeof NativeModules["DevSettings"]?.setIsDebuggingRemotely === "function" + ); +} + +export function setRemoteDebugging(value: boolean) { + if (isRemoteDebuggingAvailable()) { + NativeModules["DevSettings"].setIsDebuggingRemotely(value); + } +} diff --git a/example/src/styles.ts b/example/src/styles.ts new file mode 100644 index 000000000..7f8e2e790 --- /dev/null +++ b/example/src/styles.ts @@ -0,0 +1,74 @@ +import { useMemo } from "react"; +import { StyleSheet, useColorScheme } from "react-native"; + +// https://github.com/facebook/react-native/blob/0abd5d63e1c0c4708f81bd698e6d011fa75f01e5/packages/new-app-screen/src/Theme.js#L16-L33 +const COLORS = { + light: { + background: "#f3f3f3", + backgroundHighlight: "#cfe6ee", + cardBackground: "#fff", + cardOutline: "#dae1e7", + textPrimary: "#000", + textSecondary: "#404756", + }, + dark: { + background: "#000", + backgroundHighlight: "#193c47", + cardBackground: "#222", + cardOutline: "#444", + textPrimary: "#fff", + textSecondary: "#c0c1c4", + }, +}; + +export function useStyles() { + const colorScheme = useColorScheme(); + return useMemo(() => { + const colors = COLORS[colorScheme ?? "light"]; + + const fontSize = 18; + const groupBorderRadius = 8; + const margin = 16; + + return StyleSheet.create({ + body: { + backgroundColor: colors.background, + flex: 1, + }, + group: { + backgroundColor: colors.cardBackground, + borderRadius: groupBorderRadius, + margin, + }, + groupItemContainer: { + alignItems: "center", + flexDirection: "row", + paddingHorizontal: margin, + }, + groupItemLabel: { + color: colors.textPrimary, + flex: 1, + fontSize, + marginVertical: 12, + }, + groupItemValue: { + color: colors.textSecondary, + fontSize: fontSize, + textAlign: "right", + }, + separator: { + backgroundColor: colors.cardOutline, + height: StyleSheet.hairlineWidth, + marginStart: margin, + }, + title: { + fontSize: 40, + fontWeight: "700", + paddingTop: 64, + paddingHorizontal: 32, + paddingBottom: 40, + textAlign: "center", + }, + }); + }, [colorScheme]); +} diff --git a/example/tsconfig.json b/example/tsconfig.json index b1abf1f11..e2d9fd84b 100644 --- a/example/tsconfig.json +++ b/example/tsconfig.json @@ -6,7 +6,7 @@ "lib": ["ES2021", "DOM"] }, "include": [ - "App.tsx", - "index.ts" + "index.ts", + "src/**/*" ] } diff --git a/package.json b/package.json index 61f85169e..8fd840708 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ "@callstack/react-native-visionos": "0.73 - 0.78", "@expo/config-plugins": ">=5.0", "react": "18.1 - 19.1", - "react-native": "0.70 - 0.80 || >=0.81.0-0 <0.81.0", + "react-native": "0.70 - 0.81 || >=0.82.0-0 <0.82.0", "react-native-macos": "^0.0.0-0 || 0.71 - 0.78", "react-native-windows": "^0.0.0-0 || 0.70 - 0.79" }, diff --git a/scripts/internal/set-react-version.mts b/scripts/internal/set-react-version.mts index 8ae6c0419..04dac6570 100644 --- a/scripts/internal/set-react-version.mts +++ b/scripts/internal/set-react-version.mts @@ -239,7 +239,7 @@ async function resolveCommonDependencies( "@react-native/metro-config": rnMetroConfigVersion, "metro-react-native-babel-preset": metroBabelPresetVersion, // Replace range to avoid React version mismatch - react: peerDependencies["react"].replace(/^\^/, "~"), + react: peerDependencies["react"].replace(/^\^/, ""), }; } diff --git a/yarn.lock b/yarn.lock index d2772559d..dfb3d850e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3697,9 +3697,9 @@ __metadata: languageName: node linkType: hard -"@rnx-kit/cli@npm:^0.18.7": - version: 0.18.11 - resolution: "@rnx-kit/cli@npm:0.18.11" +"@rnx-kit/cli@npm:^0.18.11": + version: 0.18.12 + resolution: "@rnx-kit/cli@npm:0.18.12" dependencies: "@rnx-kit/align-deps": "npm:^3.1.0" "@rnx-kit/config": "npm:^0.7.0" @@ -3730,7 +3730,7 @@ __metadata: optional: true bin: rnx-cli: bin/rnx-cli.cjs - checksum: 10c0/6d2fb5ab342290180cf74327e3e456b842e0b8213f14c98b85e6744deeb4872a304e028ee37fe95cf20a71adcd67e6ab4df5191cec7ea917edbff111fdc28966 + checksum: 10c0/bb72343173e7fb8237976c848f910ae70af267e0d0f2e7531c3514d9314ecaee075dd5d0024c891ae80becab4422adbc9ae0c0ba88670215ebcb4e18275812a7 languageName: node linkType: hard @@ -7613,21 +7613,21 @@ __metadata: linkType: hard "eslint-plugin-n@npm:^17.10.3": - version: 17.21.0 - resolution: "eslint-plugin-n@npm:17.21.0" + version: 17.21.3 + resolution: "eslint-plugin-n@npm:17.21.3" dependencies: "@eslint-community/eslint-utils": "npm:^4.5.0" enhanced-resolve: "npm:^5.17.1" eslint-plugin-es-x: "npm:^7.8.0" get-tsconfig: "npm:^4.8.1" globals: "npm:^15.11.0" + globrex: "npm:^0.1.2" ignore: "npm:^5.3.2" - minimatch: "npm:^9.0.5" semver: "npm:^7.6.3" ts-declaration-location: "npm:^1.0.6" peerDependencies: eslint: ">=8.23.0" - checksum: 10c0/23a27f7ddbefa5a11c37b944050245f9cf3590622e974431179e65a0dd76ff27909a439201279e4561d1979cdfeb93e434ae099526e91412e2f62ef2dd1f0b39 + checksum: 10c0/3d8b279aaf477ddde06f9b63f032e22da3d3c1edda75ff509c93a871fc36bbdd7e1005403113f2bc421d970d52e2c361f69d05a2bfbad14146c16f910952a764 languageName: node linkType: hard @@ -7843,7 +7843,7 @@ __metadata: "@react-native-webapis/web-storage": "npm:^0.4.1" "@react-native/babel-preset": "npm:^0.78.0" "@react-native/metro-config": "npm:^0.78.0" - "@rnx-kit/cli": "npm:^0.18.7" + "@rnx-kit/cli": "npm:^0.18.11" "@rnx-kit/metro-config": "npm:^2.1.0" "@rnx-kit/polyfills": "npm:^0.2.0" "@rnx-kit/tsconfig": "npm:^2.0.0" @@ -8706,6 +8706,13 @@ __metadata: languageName: node linkType: hard +"globrex@npm:^0.1.2": + version: 0.1.2 + resolution: "globrex@npm:0.1.2" + checksum: 10c0/a54c029520cf58bda1d8884f72bd49b4cd74e977883268d931fd83bcbd1a9eb96d57c7dbd4ad80148fb9247467ebfb9b215630b2ed7563b2a8de02e1ff7f89d1 + languageName: node + linkType: hard + "gopd@npm:^1.0.1, gopd@npm:^1.2.0": version: 1.2.0 resolution: "gopd@npm:1.2.0" @@ -10341,14 +10348,14 @@ __metadata: linkType: hard "memfs@npm:^4.0.0": - version: 4.17.2 - resolution: "memfs@npm:4.17.2" + version: 4.23.0 + resolution: "memfs@npm:4.23.0" dependencies: "@jsonjoy.com/json-pack": "npm:^1.0.3" "@jsonjoy.com/util": "npm:^1.3.0" tree-dump: "npm:^1.0.1" tslib: "npm:^2.0.0" - checksum: 10c0/9cce5886a10e590887cd63271ba6198f037e537a8ee84048cfe27f851adfc9b7fd3e5b49ac5d31fe8d9c753ffa57ac4d1f8eb4a27a3927047945bd420a4cc38a + checksum: 10c0/243997097e5f10c1ab8a2f1e6aeda0cb233b402aba07000d668c61434dc176887404e62d779f3aab6140ba879294a0e3ee3d7d5bfc6421722e65529ebf0c4481 languageName: node linkType: hard @@ -10722,7 +10729,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.0, minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": +"minimatch@npm:^9.0.0, minimatch@npm:^9.0.4": version: 9.0.5 resolution: "minimatch@npm:9.0.5" dependencies: @@ -12395,7 +12402,7 @@ __metadata: "@callstack/react-native-visionos": 0.73 - 0.78 "@expo/config-plugins": ">=5.0" react: 18.1 - 19.1 - react-native: 0.70 - 0.80 || >=0.81.0-0 <0.81.0 + react-native: 0.70 - 0.81 || >=0.82.0-0 <0.82.0 react-native-macos: ^0.0.0-0 || 0.71 - 0.78 react-native-windows: ^0.0.0-0 || 0.70 - 0.79 peerDependenciesMeta: