From 6ef300f1146b00bf3e28a9062822efa4754e7932 Mon Sep 17 00:00:00 2001 From: artus9033 Date: Mon, 11 May 2026 22:15:22 +0200 Subject: [PATCH 01/26] chore: enable debug logging of brownfield plugin in demo apps --- apps/ExpoApp54/app.json | 2 +- apps/ExpoApp55/app.json | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/ExpoApp54/app.json b/apps/ExpoApp54/app.json index 169d9305..0fc8c569 100644 --- a/apps/ExpoApp54/app.json +++ b/apps/ExpoApp54/app.json @@ -41,7 +41,7 @@ } } ], - "@callstack/react-native-brownfield" + ["@callstack/react-native-brownfield", { "debug": true }] ], "experiments": { "typedRoutes": true, diff --git a/apps/ExpoApp55/app.json b/apps/ExpoApp55/app.json index cced3d0d..798b92d4 100644 --- a/apps/ExpoApp55/app.json +++ b/apps/ExpoApp55/app.json @@ -37,8 +37,10 @@ } } ], - "@callstack/react-native-brownfield", - "expo-image" + ["@callstack/react-native-brownfield", { "debug": true }], + "expo-image", + "expo-font", + "expo-web-browser" ], "experiments": { "typedRoutes": true, From c7a5d0dcc866b9067856cd7cf1313a965afdd8b5 Mon Sep 17 00:00:00 2001 From: artus9033 Date: Mon, 11 May 2026 22:38:43 +0200 Subject: [PATCH 02/26] feat: support RN Apple prebuilts in brownfield --- .changeset/use-prebuilt-rn-core-flag.md | 7 + CONTRIBUTING.md | 24 ++ apps/AppleApp/prepareXCFrameworks.js | 11 +- docs/docs/docs/cli/brownfield.mdx | 33 +- docs/docs/docs/getting-started/ios.mdx | 15 + .../commands/__tests__/packageIos.test.ts | 66 ++++ .../cli/src/brownfield/commands/packageIos.ts | 312 ++++++++++-------- .../ios/ExpoHostRuntime.swift | 1 - .../ios/ReactNativeHostRuntime.swift | 4 +- .../src/expo-config-plugin/logging.ts | 4 + 10 files changed, 326 insertions(+), 151 deletions(-) create mode 100644 .changeset/use-prebuilt-rn-core-flag.md create mode 100644 packages/cli/src/brownfield/commands/__tests__/packageIos.test.ts diff --git a/.changeset/use-prebuilt-rn-core-flag.md b/.changeset/use-prebuilt-rn-core-flag.md new file mode 100644 index 00000000..6211fc6a --- /dev/null +++ b/.changeset/use-prebuilt-rn-core-flag.md @@ -0,0 +1,7 @@ +--- +'@callstack/brownfield-cli': minor +--- + +Support RN prebuilts in Brownfield, by default enabled in RN >= 0.84, opt-in in RN 0.83. + +Add `--use-prebuilt-rn-core` to `brownfield package:ios` so callers can opt into or out of React Native Apple prebuilt binaries; omitting the flag defers to version-aware defaults handled by Rock. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e6111f37..6d93d467 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,3 +32,27 @@ We use [changesets](https://github.com/changesets/changesets) to make it easier - `build:example:ios-consumer:expo55` - builds the example native iOS consumer app (`apps/AppleApp`) consuming the Expo 55 RN app (`apps/ExpoApp55`) artifact - `build:example:ios-consumer:expo54` - builds the example native iOS consumer app (`apps/AppleApp`) consuming the Expo 54 RN app (`apps/ExpoApp54`) artifact - `build:example:ios-consumer:vanilla` - builds the example native iOS consumer (`apps/AppleApp`) app's flavor consuming the vanilla RN app (`apps/RNApp`) artifact + +## Running demo apps + +Each of the apps in `apps/` provides scripts for running them. You can run them either standalone, or package for brownfield. + +## Standalone run + +## Packaging for brownfield + +## Running a brownfield host app + +There are 2 brownfield host apps. + +> [!IMPORTANT] +> Each of the scripts below requires you to **first** package the consumed RN application with `yarn brownfield:package:ios`, e.g. `cd apps/ExpoApp55 && yarn brownfield:package:ios`. + +- `apps/AndroidApp` - for Android + - `build:example:android-consumer:expo54` - consumes Expo 54 + - `build:example:android-consumer:expo55` - consumes Expo 55 + - `build:example:android-consumer:vanilla` - consumes the vanilla `RNApp` +- `apps/AppleApp` - for Apple + - `build:example:ios-consumer:expo54` - consumes Expo 54 + - `build:example:ios-consumer:expo55` - consumes Expo 55 + - `build:example:ios-consumer:vanilla` - consumes the vanilla `RNApp` diff --git a/apps/AppleApp/prepareXCFrameworks.js b/apps/AppleApp/prepareXCFrameworks.js index f161180d..c5327a83 100644 --- a/apps/AppleApp/prepareXCFrameworks.js +++ b/apps/AppleApp/prepareXCFrameworks.js @@ -1,5 +1,5 @@ import path from 'node:path'; -import fs, { globSync } from 'node:fs'; +import fs from 'node:fs'; import { fileURLToPath } from 'url'; import { dirname } from 'path'; @@ -53,8 +53,12 @@ fs.cpSync(sourcePackagePath, targetPackagePath, { recursive: true }); * - Brownie (constant) * - hermesvm <- this changes depending on RN version: for RN < 0.82 it's hermes.xcframework, for RN >= 0.82 it's hermesvm.xcframework * - ReactBrownfield (constant) - * * The trick is to rename the artifacts to match the Xcode project configuration. + * + * Brownfield versions >= 3.7.0 support RN Apple prebuilts. + * RN 0.83 (oldest supported by Brownfield v3) ships opt-in support (first in 0.81), which can be opted-in for via `--use-prebuilt-rn-core` flag. + * RN >= 0.84 ships prebuilts by default, therefore Brownfield enables them in packaging by default for RN >= 0.84. + * */ // handle hermesvm.xcframework / hermes.xcframework @@ -80,6 +84,9 @@ const validNames = [ 'hermesvm.xcframework', 'ReactBrownfield.xcframework', 'BrownfieldNavigation.xcframework', + // below: optional, emitted when RN is packaged with prebuilt iOS pods + 'React.xcframework', + 'ReactNativeDependencies.xcframework', ]; for (const file of fs.readdirSync(targetPackagePath)) { diff --git a/docs/docs/docs/cli/brownfield.mdx b/docs/docs/docs/cli/brownfield.mdx index 0d61e0a6..b5d3d11c 100644 --- a/docs/docs/docs/cli/brownfield.mdx +++ b/docs/docs/docs/cli/brownfield.mdx @@ -20,22 +20,23 @@ Simply run `npx brownfield package:ios` to create an XCFramework that you can la Available arguments: -| Argument | Description | -| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| --verbose | Enable verbose logging | -| --configuration | Explicitly set the scheme configuration to use. This option is case sensitive. | -| --scheme | Explicitly set Xcode scheme to use | -| --target | Explicitly set Xcode target to use | -| --extra-params | Custom params that will be passed to xcodebuild command | -| --export-extra-params | Custom params that will be passed to xcodebuild export archive command. Example: `--export-extra-params "-allowProvisioningUpdates"` | -| --export-options-plist | Name of the export options file for archiving. Defaults to: `ExportOptions.plist` | -| --build-folder | Location for iOS build artifacts. Corresponds to Xcode's "-derivedDataPath". By default, the '\/.brownfield/build' path will be used. | -| --destination | Define destination(s) for the build. You can pass multiple destinations as separate values or repeated use of the flag. Values: "simulator", "device", or xcodebuild destinations | -| --archive | Create an Xcode archive (IPA) of the build, required for uploading to App Store Connect or distributing to TestFlight | -| --no-install-pods | Skip automatic CocoaPods installation | -| --no-new-arch | Run React Native in legacy async architecture | -| --local | Force local build with xcodebuild | -| --verbose | Enable verbose logging | +| Argument | Description | +| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| --verbose | Enable verbose logging | +| --configuration | Explicitly set the scheme configuration to use. This option is case sensitive. | +| --scheme | Explicitly set Xcode scheme to use | +| --target | Explicitly set Xcode target to use | +| --extra-params | Custom params that will be passed to xcodebuild command | +| --export-extra-params | Custom params that will be passed to xcodebuild export archive command. Example: `--export-extra-params "-allowProvisioningUpdates"` | +| --export-options-plist | Name of the export options file for archiving. Defaults to: `ExportOptions.plist` | +| --build-folder | Location for iOS build artifacts. Corresponds to Xcode's "-derivedDataPath". By default, the '\/.brownfield/build' path will be used. | +| --destination | Define destination(s) for the build. You can pass multiple destinations as separate values or repeated use of the flag. Values: "simulator", "device", or xcodebuild destinations | +| --archive | Create an Xcode archive (IPA) of the build, required for uploading to App Store Connect or distributing to TestFlight | +| --use-prebuilt-rn-core [bool] | Controls usage of React Native Apple prebuilt binaries for the packaging Xcode build. Omit for version-aware defaults (see [Getting Started — iOS — React Native Prebuilts](/docs/getting-started/ios#react-native-prebuilts)). Pass `true`, `false`, or use the flag without a value as shorthand for `true`. | +| --no-install-pods | Skip automatic CocoaPods installation | +| --no-new-arch | Run React Native in legacy async architecture | +| --local | Force local build with xcodebuild | +| --verbose | Enable verbose logging | The build directory will be placed in the `/.brownfield/build` folder by default and the build outputs (XCFrameworks) will be created in the `/.brownfield/package/build` folder: diff --git a/docs/docs/docs/getting-started/ios.mdx b/docs/docs/docs/getting-started/ios.mdx index b4f353e9..3878986f 100644 --- a/docs/docs/docs/getting-started/ios.mdx +++ b/docs/docs/docs/getting-started/ios.mdx @@ -124,6 +124,7 @@ This creates the XCFramework in **`ios/.brownfield/package/build/`** (relative t - **`ReactBrownfield.xcframework`** - React Native Brownfield library - `Brownie.xcframework` - Brownie shared state library (only when using the Brownie package) - `BrownfieldNavigation.xcframework` - Brownfield navigation integration (only when using the brownfield-navigation package) for React Native navigation + - **`React.xcframework`** and **`ReactNativeDependencies.xcframework`** - they are emitted in supported configurations, as described in [React Native Prebuilts](#react-native-prebuilts) section ![Frameworks in Xcode Sidebar](/images/frameworks-sidebar.png) @@ -216,6 +217,20 @@ struct ContentView: View { } ``` +## React Native Prebuilts + +React Native can ship prebuilt iOS artifacts, which greatly speeds up the build time. Brownfield supports them since version 3.7.0 in the following scenarios: + +- RN 0.83 (oldest supported by Brownfield v3) ships opt-in support (first in 0.81), which can be opted-in for via `--use-prebuilt-rn-core` flag. +- RN >= 0.84 ships prebuilts by default, therefore Brownfield enables them in packaging by default for RN >= 0.84. + +When using the --use-prebuilt-rn-core flag: + +- for RN 0.83, Brownfield will use prebuilts if that flag is set to true (default behaviour in flag absence: prebuilts **are not** used) +- for RN >= 0.84: + - Brownfield will use prebuilts if that flag is not set, or is set to true (default behaviour in flag absence: prebuilts **are** used) + - if the flag is explicitly set to false, Brownfield will **not** use prebuilts + ## Next Steps - [Swift API Reference](/docs/api-reference/react-native-brownfield/swift) diff --git a/packages/cli/src/brownfield/commands/__tests__/packageIos.test.ts b/packages/cli/src/brownfield/commands/__tests__/packageIos.test.ts new file mode 100644 index 00000000..7739d6dc --- /dev/null +++ b/packages/cli/src/brownfield/commands/__tests__/packageIos.test.ts @@ -0,0 +1,66 @@ +import { Command, Option } from 'commander'; +import * as rockTools from '@rock-js/tools'; +import { describe, expect, test } from 'vitest'; + +import { parseUsePrebuiltRnCoreArgument } from '../packageIos.js'; + +/** Mirrors `--use-prebuilt-rn-core` on `packageIosCommand` (preset + parser). */ +function parsePackageIosArgv(argv: string[]) { + const program = new Command('package:ios').addOption( + new Option('--use-prebuilt-rn-core [bool]', 'test') + .preset(true) + .argParser(parseUsePrebuiltRnCoreArgument) + ); + program.parse(argv, { from: 'user' }); + return program.opts() as { usePrebuiltRnCore?: boolean }; +} + +describe('parseUsePrebuiltRnCoreArgument', () => { + test.each([ + ['true', true], + ['True', true], + [' TRUE ', true], + ['1', true], + ['false', false], + ['FALSE', false], + [' 0 ', false], + ['0', false], + ])('parses %j as %s', (input, expected) => { + expect(parseUsePrebuiltRnCoreArgument(input)).toBe(expected); + }); + + test('passes through boolean (Commander preset)', () => { + expect(parseUsePrebuiltRnCoreArgument(true)).toBe(true); + expect(parseUsePrebuiltRnCoreArgument(false)).toBe(false); + expect(() => parseUsePrebuiltRnCoreArgument('maybe')).toThrow( + rockTools.RockError + ); + expect(() => parseUsePrebuiltRnCoreArgument('')).toThrow( + rockTools.RockError + ); + expect(() => parseUsePrebuiltRnCoreArgument('2')).toThrow( + rockTools.RockError + ); + }); +}); + +describe('--use-prebuilt-rn-core (Commander)', () => { + test('omits property when flag is absent', () => { + expect(parsePackageIosArgv([])).toEqual({}); + }); + + test('bare flag is shorthand for true (preset)', () => { + expect( + parsePackageIosArgv(['--use-prebuilt-rn-core']).usePrebuiltRnCore + ).toBe(true); + }); + + test('explicit true and false', () => { + expect( + parsePackageIosArgv(['--use-prebuilt-rn-core', 'true']).usePrebuiltRnCore + ).toBe(true); + expect( + parsePackageIosArgv(['--use-prebuilt-rn-core', 'false']).usePrebuiltRnCore + ).toBe(false); + }); +}); diff --git a/packages/cli/src/brownfield/commands/packageIos.ts b/packages/cli/src/brownfield/commands/packageIos.ts index 501f5856..f42792c8 100644 --- a/packages/cli/src/brownfield/commands/packageIos.ts +++ b/packages/cli/src/brownfield/commands/packageIos.ts @@ -8,13 +8,14 @@ import { } from '@rock-js/platform-apple-helpers'; import { packageIosAction } from '@rock-js/plugin-brownfield-ios'; import { + RockError, colorLink, getReactNativeVersion, logger, relativeToCwd, } from '@rock-js/tools'; -import { Command } from 'commander'; +import { Command, Option } from 'commander'; import { runExpoPrebuildIfNeeded } from '../utils/expo.js'; import { getProjectInfo } from '../utils/project.js'; @@ -27,6 +28,36 @@ import { runBrownieCodegenIfApplicable } from '../../brownie/helpers/runBrownieC import { runNavigationCodegenIfApplicable } from '../../navigation/helpers/runNavigationCodegenIfApplicable.js'; import { stripFrameworkBinary } from '../utils/stripFrameworkBinary.js'; +/** Help text for `--use-prebuilt-rn-core` (keep in sync with docs/docs/docs/getting-started/ios.mdx, "React Native Prebuilts" section). */ +const USE_PREBUILT_RN_CORE_HELP = + 'Whether the Xcode build for packaging should use React Native Apple prebuilt binaries (via CocoaPods). ' + + 'If you omit this flag, Brownfield follows version-aware defaults: for React Native 0.84 and newer, prebuilts are enabled by default; for RN 0.83, they are disabled unless you opt in. ' + + 'Pass true or false to force either behavior. Use the flag without a value as shorthand for true (same as `--use-prebuilt-rn-core true`). ' + + 'See the Brownfield iOS guide for details: https://oss.callstack.com/react-native-brownfield/docs/getting-started/ios#react-native-prebuilts'; + +export function parseUsePrebuiltRnCoreArgument( + value: string | boolean +): boolean { + if (typeof value === 'boolean') { + return value; + } + const normalized = value.trim().toLowerCase(); + if (normalized === 'true' || normalized === '1') { + return true; + } + if (normalized === 'false' || normalized === '0') { + return false; + } + throw new RockError( + `Invalid value for --use-prebuilt-rn-core: expected true or false, received "${value}"` + ); +} + +type PackageIosCliFlags = AppleBuildFlags & { + /** Set when `--use-prebuilt-rn-core` is passed; omitted when the flag is absent (Rock applies RN version defaults). */ + usePrebuiltRnCore?: boolean; +}; + export const packageIosCommand = curryOptions( new Command('package:ios').description('Build iOS XCFramework'), getBuildOptions({ platformName: 'ios' }).map((option) => @@ -39,139 +70,158 @@ export const packageIosCommand = curryOptions( } : option ) -).action( - actionRunner(async (options: AppleBuildFlags) => { - const { projectRoot, platformConfig, userConfig } = getProjectInfo('ios'); - await runExpoPrebuildIfNeeded({ projectRoot, platform: 'ios' }); - - if (!userConfig.project.ios) { - throw new Error('iOS project not found.'); - } - - if (!userConfig.project.ios.xcodeProject) { - throw new Error('iOS Xcode project not found in the configuration.'); - } - - let dotBrownfieldDir = path.join( - // for Expo projects, platformConfig?.sourceDir == "", but for non-Expo projects, it's "ios" - ...(userConfig.project.ios.sourceDir.trim().length > 0 - ? [userConfig.project.ios.sourceDir] - : [projectRoot, 'ios']), - '.brownfield' - ); - - // non-Expo projects have a relative sourceDir path, so we need to make it absolute - if (!path.isAbsolute(dotBrownfieldDir)) { - dotBrownfieldDir = path.join(projectRoot, dotBrownfieldDir); - } - - options.buildFolder ??= path.join(dotBrownfieldDir, 'build'); - - // The new_architecture.rb script scans Info.plist and fails on binary plist files, - // which is the case for our XCFrameworks. - // We're reusing the "build" directory which is excluded from the scan. - // Reference: https://github.com/facebook/react-native/blob/490c5e8dcc6cdb19c334cc39e93a39a48ba71e96/packages/react-native/scripts/cocoapods/new_architecture.rb#L171 - const packageDir = path.join(dotBrownfieldDir, 'package', 'build'); - const configuration = options.configuration ?? 'Debug'; - - const { hasBrownie } = await runBrownieCodegenIfApplicable( - projectRoot, - 'swift' - ); - const { hasNavigation } = await runNavigationCodegenIfApplicable(projectRoot); - - await packageIosAction( - options, - { +) + .addOption( + new Option('--use-prebuilt-rn-core [bool]', USE_PREBUILT_RN_CORE_HELP) + .preset(true) + .default(true) + .argParser(parseUsePrebuiltRnCoreArgument) + ) + .action( + actionRunner(async (options: PackageIosCliFlags) => { + const { projectRoot, platformConfig, userConfig } = getProjectInfo('ios'); + await runExpoPrebuildIfNeeded({ projectRoot, platform: 'ios' }); + + if (!userConfig.project.ios) { + throw new Error('iOS project not found.'); + } + + if (!userConfig.project.ios.xcodeProject) { + throw new Error('iOS Xcode project not found in the configuration.'); + } + + let dotBrownfieldDir = path.join( + // for Expo projects, platformConfig?.sourceDir == "", but for non-Expo projects, it's "ios" + ...(userConfig.project.ios.sourceDir.trim().length > 0 + ? [userConfig.project.ios.sourceDir] + : [projectRoot, 'ios']), + '.brownfield' + ); + + // non-Expo projects have a relative sourceDir path, so we need to make it absolute + if (!path.isAbsolute(dotBrownfieldDir)) { + dotBrownfieldDir = path.join(projectRoot, dotBrownfieldDir); + } + + options.buildFolder ??= path.join(dotBrownfieldDir, 'build'); + options.verbose ??= logger.isVerbose(); + + // The new_architecture.rb script scans Info.plist and fails on binary plist files, + // which is the case for our XCFrameworks. + // We're reusing the "build" directory which is excluded from the scan. + // Reference: https://github.com/facebook/react-native/blob/490c5e8dcc6cdb19c334cc39e93a39a48ba71e96/packages/react-native/scripts/cocoapods/new_architecture.rb#L171 + const packageDir = path.join(dotBrownfieldDir, 'package', 'build'); + const configuration = options.configuration ?? 'Debug'; + + const { hasBrownie } = await runBrownieCodegenIfApplicable( projectRoot, - reactNativePath: userConfig.reactNativePath, - // below: the userConfig.reactNativeVersion may be a non-semver-format string, - // e.g. '0.82' (note the missing patch component), - // therefore we resolve it manually from RN's package.json using Rock's utils - reactNativeVersion: getReactNativeVersion(projectRoot), - usePrebuiltRNCore: false, // for brownfield, it is required to build RN from source - packageDir, // the output directory for artifacts - skipCache: true, // cache is dependent on existence of Rock config file - }, - platformConfig - ); - - const reactBrownfieldXcframeworkPath = path.join( - packageDir, - 'ReactBrownfield.xcframework' - ); - if (fs.existsSync(reactBrownfieldXcframeworkPath)) { - // Strip the binary from ReactBrownfield.xcframework to make it interface-only. - // This avoids duplicate symbols when consumer apps embed both BrownfieldLib - // (which contains ReactBrownfield symbols) and ReactBrownfield.xcframework. - stripFrameworkBinary(reactBrownfieldXcframeworkPath); - } - - if (hasBrownie) { - const productsPath = path.join(options.buildFolder, 'Build', 'Products'); - const brownieOutputPath = path.join(packageDir, 'Brownie.xcframework'); - - await mergeFrameworks({ - sourceDir: userConfig.project.ios.sourceDir, - frameworkPaths: [ - path.join( - productsPath, - `${configuration}-iphoneos`, - 'Brownie', - 'Brownie.framework' - ), - path.join( - productsPath, - `${configuration}-iphonesimulator`, - 'Brownie', - 'Brownie.framework' - ), - ], - outputPath: brownieOutputPath, - }); - - // Strip the binary from Brownie.xcframework to make it interface-only. - // This avoids duplicate symbols when consumer apps embed both BrownfieldLib - // (which contains Brownie symbols) and Brownie.xcframework. - stripFrameworkBinary(brownieOutputPath); - - logger.success( - `Brownie.xcframework created at ${colorLink(relativeToCwd(brownieOutputPath))}` + 'swift' ); - } - - if (hasNavigation) { - const productsPath = path.join(options.buildFolder, 'Build', 'Products'); - const brownfieldNavigationOutputPath = path.join(packageDir, 'BrownfieldNavigation.xcframework'); - - await mergeFrameworks({ - sourceDir: userConfig.project.ios.sourceDir, - frameworkPaths: [ - path.join( - productsPath, - `${configuration}-iphoneos`, - 'BrownfieldNavigation', - 'BrownfieldNavigation.framework' - ), - path.join( - productsPath, - `${configuration}-iphonesimulator`, - 'BrownfieldNavigation', - 'BrownfieldNavigation.framework' - ), - ], - outputPath: brownfieldNavigationOutputPath, - }); - - - stripFrameworkBinary(brownfieldNavigationOutputPath); - - logger.success( - `BrownfieldNavigation.xcframework created at ${colorLink(relativeToCwd(brownfieldNavigationOutputPath))}` + const { hasNavigation } = + await runNavigationCodegenIfApplicable(projectRoot); + + await packageIosAction( + options, + { + projectRoot, + reactNativePath: userConfig.reactNativePath, + // below: the userConfig.reactNativeVersion may be a non-semver-format string, + // e.g. '0.82' (note the missing patch component), + // therefore we resolve it manually from RN's package.json using Rock's utils + reactNativeVersion: getReactNativeVersion(projectRoot), + packageDir, // the output directory for artifacts + skipCache: true, // cache is dependent on existence of Rock config file + usePrebuiltRNCore: options.usePrebuiltRnCore, + }, + platformConfig ); - } - }) -); + + const reactBrownfieldXcframeworkPath = path.join( + packageDir, + 'ReactBrownfield.xcframework' + ); + if (fs.existsSync(reactBrownfieldXcframeworkPath)) { + // Strip the binary from ReactBrownfield.xcframework to make it interface-only. + // This avoids duplicate symbols when consumer apps embed both BrownfieldLib + // (which contains ReactBrownfield symbols) and ReactBrownfield.xcframework. + stripFrameworkBinary(reactBrownfieldXcframeworkPath); + } + + if (hasBrownie) { + const productsPath = path.join( + options.buildFolder, + 'Build', + 'Products' + ); + const brownieOutputPath = path.join(packageDir, 'Brownie.xcframework'); + + await mergeFrameworks({ + sourceDir: userConfig.project.ios.sourceDir, + frameworkPaths: [ + path.join( + productsPath, + `${configuration}-iphoneos`, + 'Brownie', + 'Brownie.framework' + ), + path.join( + productsPath, + `${configuration}-iphonesimulator`, + 'Brownie', + 'Brownie.framework' + ), + ], + outputPath: brownieOutputPath, + }); + + // Strip the binary from Brownie.xcframework to make it interface-only. + // This avoids duplicate symbols when consumer apps embed both BrownfieldLib + // (which contains Brownie symbols) and Brownie.xcframework. + stripFrameworkBinary(brownieOutputPath); + + logger.success( + `Brownie.xcframework created at ${colorLink(relativeToCwd(brownieOutputPath))}` + ); + } + + if (hasNavigation) { + const productsPath = path.join( + options.buildFolder, + 'Build', + 'Products' + ); + const brownfieldNavigationOutputPath = path.join( + packageDir, + 'BrownfieldNavigation.xcframework' + ); + + await mergeFrameworks({ + sourceDir: userConfig.project.ios.sourceDir, + frameworkPaths: [ + path.join( + productsPath, + `${configuration}-iphoneos`, + 'BrownfieldNavigation', + 'BrownfieldNavigation.framework' + ), + path.join( + productsPath, + `${configuration}-iphonesimulator`, + 'BrownfieldNavigation', + 'BrownfieldNavigation.framework' + ), + ], + outputPath: brownfieldNavigationOutputPath, + }); + + stripFrameworkBinary(brownfieldNavigationOutputPath); + + logger.success( + `BrownfieldNavigation.xcframework created at ${colorLink(relativeToCwd(brownfieldNavigationOutputPath))}` + ); + } + }) + ); export const packageIosExample = new ExampleUsage( 'package:ios --scheme BrownfieldLib --configuration Release', diff --git a/packages/react-native-brownfield/ios/ExpoHostRuntime.swift b/packages/react-native-brownfield/ios/ExpoHostRuntime.swift index 2beb99fe..bfad894f 100644 --- a/packages/react-native-brownfield/ios/ExpoHostRuntime.swift +++ b/packages/react-native-brownfield/ios/ExpoHostRuntime.swift @@ -1,6 +1,5 @@ import UIKit internal import React -internal import React_RCTAppDelegate internal import ReactAppDependencyProvider #if canImport(Expo) diff --git a/packages/react-native-brownfield/ios/ReactNativeHostRuntime.swift b/packages/react-native-brownfield/ios/ReactNativeHostRuntime.swift index 097dc0a2..ea529437 100644 --- a/packages/react-native-brownfield/ios/ReactNativeHostRuntime.swift +++ b/packages/react-native-brownfield/ios/ReactNativeHostRuntime.swift @@ -1,7 +1,8 @@ +#if !canImport(Expo) import UIKit internal import React internal import React_RCTAppDelegate -internal import ReactAppDependencyProvider +internal import React_RCTReactNativeFactory class ReactNativeBrownfieldDelegate: RCTDefaultReactNativeFactoryDelegate { var entryFile = "index" @@ -161,3 +162,4 @@ final class ReactNativeHostRuntime { } } } +#endif diff --git a/packages/react-native-brownfield/src/expo-config-plugin/logging.ts b/packages/react-native-brownfield/src/expo-config-plugin/logging.ts index a2dd018b..bd6e240a 100644 --- a/packages/react-native-brownfield/src/expo-config-plugin/logging.ts +++ b/packages/react-native-brownfield/src/expo-config-plugin/logging.ts @@ -19,6 +19,10 @@ export class Logger { console.debug(`${LOG_TAG} ${message}`, ...args); } + static getIsDebug() { + return this.debug; + } + static logWarning(message: string, ...args: any[]) { console.warn(`${LOG_TAG} ${message}`, ...args); } From bf946a250cd408d8d61f2009bb924461a834efc9 Mon Sep 17 00:00:00 2001 From: artus9033 Date: Tue, 12 May 2026 10:56:30 +0200 Subject: [PATCH 03/26] chore: embed proper frameworks --- ...ctbrownfield-swiftinterface-xcframework.md | 5 ++ .../project.pbxproj | 60 +++++++++++-------- 2 files changed, 41 insertions(+), 24 deletions(-) create mode 100644 .changeset/reactbrownfield-swiftinterface-xcframework.md diff --git a/.changeset/reactbrownfield-swiftinterface-xcframework.md b/.changeset/reactbrownfield-swiftinterface-xcframework.md new file mode 100644 index 00000000..fd8a21f1 --- /dev/null +++ b/.changeset/reactbrownfield-swiftinterface-xcframework.md @@ -0,0 +1,5 @@ +--- +'@callstack/react-native-brownfield': patch +--- + +Force `BUILD_LIBRARY_FOR_DISTRIBUTION` / `SWIFT_EMIT_MODULE_INTERFACE` on the CocoaPods ReactBrownfield, Brownie and BrownfieldNavigation targets so Release builds emit `.swiftinterface` files and `xcodebuild -create-xcframework` (brownfield `package:ios`) can merge slices. diff --git a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj index 78323de0..ddcc87ce 100644 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj @@ -7,30 +7,36 @@ objects = { /* Begin PBXBuildFile section */ - 614B23922F50633200CB6363 /* BrownfieldLib.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238D2F50633200CB6363 /* BrownfieldLib.xcframework */; }; - 614B23932F50633200CB6363 /* BrownfieldLib.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238D2F50633200CB6363 /* BrownfieldLib.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 614B23942F50633200CB6363 /* Brownie.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238E2F50633200CB6363 /* Brownie.xcframework */; }; - 614B23952F50633200CB6363 /* Brownie.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238E2F50633200CB6363 /* Brownie.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 614B23962F50633200CB6363 /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238F2F50633200CB6363 /* BrownfieldNavigation.xcframework */; }; - 614B23972F50633200CB6363 /* BrownfieldNavigation.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238F2F50633200CB6363 /* BrownfieldNavigation.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 614B23982F50633200CB6363 /* hermesvm.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B23902F50633200CB6363 /* hermesvm.xcframework */; }; - 614B23992F50633200CB6363 /* hermesvm.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B23902F50633200CB6363 /* hermesvm.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 614B239A2F50633200CB6363 /* ReactBrownfield.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B23912F50633200CB6363 /* ReactBrownfield.xcframework */; }; - 614B239B2F50633200CB6363 /* ReactBrownfield.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B23912F50633200CB6363 /* ReactBrownfield.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 79413FEC2FB3210C00A8B941 /* ReactBrownfield.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79413FEA2FB3210300A8B941 /* ReactBrownfield.xcframework */; }; + 79413FED2FB3210C00A8B941 /* ReactBrownfield.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79413FEA2FB3210300A8B941 /* ReactBrownfield.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B1886C2FB31F7B007EE35D /* BrownfieldLib.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238D2F50633200CB6363 /* BrownfieldLib.xcframework */; }; + 79B1886D2FB31F7C007EE35D /* BrownfieldLib.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238D2F50633200CB6363 /* BrownfieldLib.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B1886F2FB31F7D007EE35D /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238F2F50633200CB6363 /* BrownfieldNavigation.xcframework */; }; + 79B188702FB31F7D007EE35D /* BrownfieldNavigation.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238F2F50633200CB6363 /* BrownfieldNavigation.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B188712FB31F80007EE35D /* hermesvm.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B23902F50633200CB6363 /* hermesvm.xcframework */; }; + 79B188722FB31F80007EE35D /* hermesvm.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B23902F50633200CB6363 /* hermesvm.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B188732FB31F81007EE35D /* Brownie.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238E2F50633200CB6363 /* Brownie.xcframework */; }; + 79B188742FB31F81007EE35D /* Brownie.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238E2F50633200CB6363 /* Brownie.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B188752FB31F83007EE35D /* React.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09EC2FB31F2E0028CB26 /* React.xcframework */; }; + 79B188762FB31F83007EE35D /* React.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09EC2FB31F2E0028CB26 /* React.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B188792FB31F86007EE35D /* ReactNativeDependencies.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09ED2FB31F2E0028CB26 /* ReactNativeDependencies.xcframework */; }; + 79B1887A2FB31F86007EE35D /* ReactNativeDependencies.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09ED2FB31F2E0028CB26 /* ReactNativeDependencies.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ - 798DE8D92F0EC98E00CFC6F3 /* Embed Frameworks */ = { + 79B1886E2FB31F7C007EE35D /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - 614B23972F50633200CB6363 /* BrownfieldNavigation.xcframework in Embed Frameworks */, - 614B23952F50633200CB6363 /* Brownie.xcframework in Embed Frameworks */, - 614B239B2F50633200CB6363 /* ReactBrownfield.xcframework in Embed Frameworks */, - 614B23992F50633200CB6363 /* hermesvm.xcframework in Embed Frameworks */, - 614B23932F50633200CB6363 /* BrownfieldLib.xcframework in Embed Frameworks */, + 79B188742FB31F81007EE35D /* Brownie.xcframework in Embed Frameworks */, + 79B1887A2FB31F86007EE35D /* ReactNativeDependencies.xcframework in Embed Frameworks */, + 79B188722FB31F80007EE35D /* hermesvm.xcframework in Embed Frameworks */, + 79B188702FB31F7D007EE35D /* BrownfieldNavigation.xcframework in Embed Frameworks */, + 79413FED2FB3210C00A8B941 /* ReactBrownfield.xcframework in Embed Frameworks */, + 79B1886D2FB31F7C007EE35D /* BrownfieldLib.xcframework in Embed Frameworks */, + 79B188762FB31F83007EE35D /* React.xcframework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -42,8 +48,10 @@ 614B238E2F50633200CB6363 /* Brownie.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Brownie.xcframework; path = package/Brownie.xcframework; sourceTree = ""; }; 614B238F2F50633200CB6363 /* BrownfieldNavigation.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = BrownfieldNavigation.xcframework; path = package/BrownfieldNavigation.xcframework; sourceTree = ""; }; 614B23902F50633200CB6363 /* hermesvm.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = hermesvm.xcframework; path = package/hermesvm.xcframework; sourceTree = ""; }; - 614B23912F50633200CB6363 /* ReactBrownfield.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ReactBrownfield.xcframework; path = package/ReactBrownfield.xcframework; sourceTree = ""; }; + 793A09EC2FB31F2E0028CB26 /* React.xcframework */ = {isa = PBXFileReference; expectedSignature = "SelfSigned:BEEAE960B121B398BB228BD547298BD461DFFFD862BD3AD794A38F6D426F6741"; lastKnownFileType = wrapper.xcframework; name = React.xcframework; path = ../ExpoApp55/ios/.brownfield/package/build/React.xcframework; sourceTree = SOURCE_ROOT; }; + 793A09ED2FB31F2E0028CB26 /* ReactNativeDependencies.xcframework */ = {isa = PBXFileReference; expectedSignature = "SelfSigned:BEEAE960B121B398BB228BD547298BD461DFFFD862BD3AD794A38F6D426F6741"; lastKnownFileType = wrapper.xcframework; name = ReactNativeDependencies.xcframework; path = ../ExpoApp55/ios/.brownfield/package/build/ReactNativeDependencies.xcframework; sourceTree = SOURCE_ROOT; }; 793C76A72EEBF938008A2A34 /* Brownfield Apple App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Brownfield Apple App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 79413FEA2FB3210300A8B941 /* ReactBrownfield.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ReactBrownfield.xcframework; path = ../ExpoApp55/ios/.brownfield/package/build/ReactBrownfield.xcframework; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedRootGroup section */ @@ -59,11 +67,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 614B23962F50633200CB6363 /* BrownfieldNavigation.xcframework in Frameworks */, - 614B23942F50633200CB6363 /* Brownie.xcframework in Frameworks */, - 614B239A2F50633200CB6363 /* ReactBrownfield.xcframework in Frameworks */, - 614B23982F50633200CB6363 /* hermesvm.xcframework in Frameworks */, - 614B23922F50633200CB6363 /* BrownfieldLib.xcframework in Frameworks */, + 79B188732FB31F81007EE35D /* Brownie.xcframework in Frameworks */, + 79B1886F2FB31F7D007EE35D /* BrownfieldNavigation.xcframework in Frameworks */, + 79B188792FB31F86007EE35D /* ReactNativeDependencies.xcframework in Frameworks */, + 79B188712FB31F80007EE35D /* hermesvm.xcframework in Frameworks */, + 79413FEC2FB3210C00A8B941 /* ReactBrownfield.xcframework in Frameworks */, + 79B1886C2FB31F7B007EE35D /* BrownfieldLib.xcframework in Frameworks */, + 79B188752FB31F83007EE35D /* React.xcframework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -76,8 +86,10 @@ 614B238D2F50633200CB6363 /* BrownfieldLib.xcframework */, 614B238F2F50633200CB6363 /* BrownfieldNavigation.xcframework */, 614B238E2F50633200CB6363 /* Brownie.xcframework */, + 79413FEA2FB3210300A8B941 /* ReactBrownfield.xcframework */, 614B23902F50633200CB6363 /* hermesvm.xcframework */, - 614B23912F50633200CB6363 /* ReactBrownfield.xcframework */, + 793A09EC2FB31F2E0028CB26 /* React.xcframework */, + 793A09ED2FB31F2E0028CB26 /* ReactNativeDependencies.xcframework */, ); name = Frameworks; sourceTree = ""; @@ -109,7 +121,7 @@ 793C76A32EEBF938008A2A34 /* Sources */, 793C76A42EEBF938008A2A34 /* Frameworks */, 793C76A52EEBF938008A2A34 /* Resources */, - 798DE8D92F0EC98E00CFC6F3 /* Embed Frameworks */, + 79B1886E2FB31F7C007EE35D /* Embed Frameworks */, ); buildRules = ( ); From 1bc8380b7b0dfc938d5e6b077790db6a3dc18827 Mon Sep 17 00:00:00 2001 From: artus9033 Date: Tue, 12 May 2026 10:57:51 +0200 Subject: [PATCH 04/26] chore: enable verbose logging in demo app build scripts --- apps/ExpoApp54/package.json | 6 +++--- apps/ExpoApp55/package.json | 6 +++--- apps/RNApp/package.json | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/ExpoApp54/package.json b/apps/ExpoApp54/package.json index 0a85eaf7..5578d59c 100644 --- a/apps/ExpoApp54/package.json +++ b/apps/ExpoApp54/package.json @@ -11,9 +11,9 @@ "lint": "expo lint", "prebuild": "expo prebuild", "brownfield:prepare:android:ci": "cd .. && node --experimental-strip-types --no-warnings ./scripts/prepare-android-build-gradle-for-ci.ts ExpoApp54", - "brownfield:package:android": "brownfield package:android --module-name brownfieldlib --variant release", - "brownfield:publish:android": "brownfield publish:android --module-name brownfieldlib", - "brownfield:package:ios": "brownfield package:ios --scheme BrownfieldLib --configuration Release" + "brownfield:package:android": "brownfield package:android --module-name brownfieldlib --variant release --verbose", + "brownfield:publish:android": "brownfield publish:android --module-name brownfieldlib --verbose", + "brownfield:package:ios": "brownfield package:ios --scheme BrownfieldLib --configuration Release --verbose" }, "dependencies": { "@callstack/brownfield-navigation": "workspace:^", diff --git a/apps/ExpoApp55/package.json b/apps/ExpoApp55/package.json index 4dfb63e1..3e07bb7d 100644 --- a/apps/ExpoApp55/package.json +++ b/apps/ExpoApp55/package.json @@ -10,9 +10,9 @@ "lint": "expo lint", "prebuild": "expo prebuild", "brownfield:prepare:android:ci": "cd .. && node --experimental-strip-types --no-warnings ./scripts/prepare-android-build-gradle-for-ci.ts ExpoApp55", - "brownfield:package:android": "brownfield package:android --module-name brownfieldlib --variant release", - "brownfield:publish:android": "brownfield publish:android --module-name brownfieldlib", - "brownfield:package:ios": "brownfield package:ios --scheme BrownfieldLib --configuration Release" + "brownfield:package:android": "brownfield package:android --module-name brownfieldlib --variant release --verbose", + "brownfield:publish:android": "brownfield publish:android --module-name brownfieldlib --verbose", + "brownfield:package:ios": "brownfield package:ios --scheme BrownfieldLib --configuration Release --verbose" }, "dependencies": { "@callstack/brownfield-navigation": "workspace:^", diff --git a/apps/RNApp/package.json b/apps/RNApp/package.json index 8ec3f40e..6d6bf385 100644 --- a/apps/RNApp/package.json +++ b/apps/RNApp/package.json @@ -7,9 +7,9 @@ "ios": "react-native run-ios", "build:example:android-rn": "react-native build-android", "build:example:ios-rn": "react-native build-ios", - "brownfield:package:android": "brownfield package:android --module-name :BrownfieldLib --variant release", - "brownfield:publish:android": "brownfield publish:android --module-name :BrownfieldLib", - "brownfield:package:ios": "brownfield package:ios --scheme BrownfieldLib --configuration Release", + "brownfield:package:android": "brownfield package:android --module-name :BrownfieldLib --variant release --verbose", + "brownfield:publish:android": "brownfield publish:android --module-name :BrownfieldLib --verbose", + "brownfield:package:ios": "brownfield package:ios --scheme BrownfieldLib --configuration Release --verbose", "lint": "eslint .", "start": "react-native start", "test": "jest", From f0af44fe99636ebffbda779eb778e9a6713332a4 Mon Sep 17 00:00:00 2001 From: artus9033 Date: Tue, 12 May 2026 10:58:07 +0200 Subject: [PATCH 05/26] chore: upgrade dependencies in ExpoApp55 --- apps/ExpoApp55/package.json | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/apps/ExpoApp55/package.json b/apps/ExpoApp55/package.json index 3e07bb7d..a5bef002 100644 --- a/apps/ExpoApp55/package.json +++ b/apps/ExpoApp55/package.json @@ -22,28 +22,28 @@ "@react-navigation/bottom-tabs": "^7.10.1", "@react-navigation/elements": "^2.9.10", "@react-navigation/native": "^7.1.28", - "expo": "~55.0.5", - "expo-constants": "~55.0.7", - "expo-device": "~55.0.9", - "expo-font": "~55.0.4", - "expo-glass-effect": "~55.0.8", - "expo-image": "~55.0.6", - "expo-linking": "~55.0.7", - "expo-router": "~55.0.5", - "expo-splash-screen": "~55.0.10", - "expo-status-bar": "~55.0.4", - "expo-symbols": "~55.0.5", - "expo-system-ui": "~55.0.9", - "expo-web-browser": "~55.0.8", + "expo": "~55.0.23", + "expo-constants": "~55.0.16", + "expo-device": "~55.0.16", + "expo-font": "~55.0.7", + "expo-glass-effect": "~55.0.11", + "expo-image": "~55.0.10", + "expo-linking": "~55.0.15", + "expo-router": "~55.0.14", + "expo-splash-screen": "~55.0.20", + "expo-status-bar": "~55.0.6", + "expo-symbols": "~55.0.8", + "expo-system-ui": "~55.0.17", + "expo-web-browser": "~55.0.15", "react": "19.2.0", "react-dom": "19.2.0", - "react-native": "0.83.2", + "react-native": "0.83.6", "react-native-gesture-handler": "~2.30.0", "react-native-reanimated": "4.2.1", "react-native-safe-area-context": "~5.6.2", "react-native-screens": "~4.23.0", "react-native-web": "~0.21.0", - "react-native-worklets": "0.7.2" + "react-native-worklets": "0.7.4" }, "devDependencies": { "@types/react": "~19.2.10", From cd5553607c520773b80b2762e7721065015b5aba Mon Sep 17 00:00:00 2001 From: artus9033 Date: Tue, 12 May 2026 10:58:45 +0200 Subject: [PATCH 06/26] fix: emit swiftversioninfo from packages --- docs/docs/docs/getting-started/ios.mdx | 2 +- .../BrownfieldNavigation.podspec | 3 +++ packages/brownie/Brownie.podspec | 3 +++ .../react-native-brownfield/ReactBrownfield.podspec | 13 ++++++++++--- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/docs/docs/docs/getting-started/ios.mdx b/docs/docs/docs/getting-started/ios.mdx index 3878986f..9ed90b8c 100644 --- a/docs/docs/docs/getting-started/ios.mdx +++ b/docs/docs/docs/getting-started/ios.mdx @@ -120,11 +120,11 @@ This creates the XCFramework in **`ios/.brownfield/package/build/`** (relative t 1. Open **`ios/.brownfield/package/build`** directory (relative to your React Native project root) 2. Drag these files into your native iOS app's Xcode project: - **`.xcframework`** - Your React Native framework + - only if [using prebuilts](#react-native-prebuilts): **`React.xcframework`** and **`ReactNativeDependencies.xcframework`** - React Native frameworks emitted in supported configurations, as described in [React Native Prebuilts](#react-native-prebuilts) section - **`hermesvm.xcframework`** - JavaScript runtime (or `hermes.xcframework` for RN < 0.82.0) - **`ReactBrownfield.xcframework`** - React Native Brownfield library - `Brownie.xcframework` - Brownie shared state library (only when using the Brownie package) - `BrownfieldNavigation.xcframework` - Brownfield navigation integration (only when using the brownfield-navigation package) for React Native navigation - - **`React.xcframework`** and **`ReactNativeDependencies.xcframework`** - they are emitted in supported configurations, as described in [React Native Prebuilts](#react-native-prebuilts) section ![Frameworks in Xcode Sidebar](/images/frameworks-sidebar.png) diff --git a/packages/brownfield-navigation/BrownfieldNavigation.podspec b/packages/brownfield-navigation/BrownfieldNavigation.podspec index ac83dccf..ec135e4a 100644 --- a/packages/brownfield-navigation/BrownfieldNavigation.podspec +++ b/packages/brownfield-navigation/BrownfieldNavigation.podspec @@ -15,7 +15,10 @@ Pod::Spec.new do |spec| spec.source = { :git => "git@github.com:callstack/react-native-brownfield.git", :tag => "#{spec.version}" } spec.source_files = "ios/**/*.{h,m,mm,swift}" spec.pod_target_xcconfig = { + # below: needed to build the XCFramework with `.swiftinterface` files, required by xcodebuild -create-xcframework to succeed 'DEFINES_MODULE' => 'YES', + 'BUILD_LIBRARY_FOR_DISTRIBUTION' => 'YES', + 'SWIFT_EMIT_MODULE_INTERFACE' => 'YES', } install_modules_dependencies(spec) diff --git a/packages/brownie/Brownie.podspec b/packages/brownie/Brownie.podspec index 117c7143..bbd98503 100644 --- a/packages/brownie/Brownie.podspec +++ b/packages/brownie/Brownie.podspec @@ -21,7 +21,10 @@ Pod::Spec.new do |spec| spec.private_header_files = "cpp/**/*.h" spec.pod_target_xcconfig = { + # below: needed to build the XCFramework with `.swiftinterface` files, required by xcodebuild -create-xcframework to succeed 'DEFINES_MODULE' => 'YES', + 'BUILD_LIBRARY_FOR_DISTRIBUTION' => 'YES', + 'SWIFT_EMIT_MODULE_INTERFACE' => 'YES', 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++20', 'HEADER_SEARCH_PATHS' => '$(inherited) "${PODS_ROOT}/boost" "${PODS_ROOT}/RCT-Folly" "${PODS_TARGET_SRCROOT}/cpp"' } diff --git a/packages/react-native-brownfield/ReactBrownfield.podspec b/packages/react-native-brownfield/ReactBrownfield.podspec index d839b157..bc884e7a 100644 --- a/packages/react-native-brownfield/ReactBrownfield.podspec +++ b/packages/react-native-brownfield/ReactBrownfield.podspec @@ -16,13 +16,20 @@ Pod::Spec.new do |spec| spec.source = { :git => "git@github.com:callstack/react-native-brownfield.git", :tag => "#{spec.version}" } spec.source_files = "ios/**/*.{h,m,mm,swift}" spec.pod_target_xcconfig = { + # below: needed to build the XCFramework with `.swiftinterface` files, required by xcodebuild -create-xcframework to succeed 'DEFINES_MODULE' => 'YES', + 'BUILD_LIBRARY_FOR_DISTRIBUTION' => 'YES', + 'SWIFT_EMIT_MODULE_INTERFACE' => 'YES', 'OTHER_SWIFT_FLAGS' => "-enable-experimental-feature AccessLevelOnImport" } - spec.dependency 'ReactAppDependencyProvider' - add_dependency(spec, "React-RCTAppDelegate") - + if ENV['RCT_USE_PREBUILT_RNCORE'] == '1' + spec.dependency 'React-Core-prebuilt' + else + spec.dependency 'ReactAppDependencyProvider' + spec.dependency "React-RCTAppDelegate" + end + if ENV['REACT_NATIVE_BROWNFIELD_USE_EXPO_HOST'] == '1' spec.dependency 'Expo' end From c77bfbf89a10ec3d85510c5775e2f47e61a6954a Mon Sep 17 00:00:00 2001 From: artus9033 Date: Tue, 12 May 2026 10:59:18 +0200 Subject: [PATCH 07/26] chore: nodemon do not exit on build failure --- packages/brownie/package.json | 2 +- packages/react-native-brownfield/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/brownie/package.json b/packages/brownie/package.json index f83cec58..30f4c0f2 100644 --- a/packages/brownie/package.json +++ b/packages/brownie/package.json @@ -37,7 +37,7 @@ "lint": "eslint .", "typecheck": "tsc --noEmit", "build": "bob build", - "dev": "nodemon --watch src --ext js,ts,json --exec \"bob build\"" + "dev": "nodemon --exitcrash false --watch src --ext js,ts,json --exec \"bob build\"" }, "keywords": [ "brownie", diff --git a/packages/react-native-brownfield/package.json b/packages/react-native-brownfield/package.json index 0bdafe04..fc9c4f49 100644 --- a/packages/react-native-brownfield/package.json +++ b/packages/react-native-brownfield/package.json @@ -47,7 +47,7 @@ "lint": "eslint .", "typecheck": "tsc --noEmit", "build": "bob build", - "dev": "nodemon --ext '*' --watch src --exec \"bob build\"", + "dev": "nodemon --exitcrash false --ext '*' --watch src --exec \"bob build\"", "build:brownfield": "yarn run build", "prepack": "cp ../../README.md ./README.md", "postpack": "rm ./README.md", From 8e93fa3ef0c0caa1f9e92c442031835499ea35e2 Mon Sep 17 00:00:00 2001 From: artus9033 Date: Tue, 12 May 2026 11:43:09 +0200 Subject: [PATCH 08/26] docs: update frameworks screenshot --- docs/docs/docs/getting-started/ios.mdx | 2 +- docs/docs/public/images/frameworks-sidebar.png | Bin 31548 -> 0 bytes docs/docs/public/images/frameworks.png | Bin 0 -> 149732 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 docs/docs/public/images/frameworks-sidebar.png create mode 100644 docs/docs/public/images/frameworks.png diff --git a/docs/docs/docs/getting-started/ios.mdx b/docs/docs/docs/getting-started/ios.mdx index 9ed90b8c..a1343d62 100644 --- a/docs/docs/docs/getting-started/ios.mdx +++ b/docs/docs/docs/getting-started/ios.mdx @@ -126,7 +126,7 @@ This creates the XCFramework in **`ios/.brownfield/package/build/`** (relative t - `Brownie.xcframework` - Brownie shared state library (only when using the Brownie package) - `BrownfieldNavigation.xcframework` - Brownfield navigation integration (only when using the brownfield-navigation package) for React Native navigation -![Frameworks in Xcode Sidebar](/images/frameworks-sidebar.png) +![Frameworks in Xcode Sidebar](/images/frameworks.png) ## 7. Initialize React Native diff --git a/docs/docs/public/images/frameworks-sidebar.png b/docs/docs/public/images/frameworks-sidebar.png deleted file mode 100644 index 1acb9a7e9d3c4ec7682dd2862317c3fd0bd2f47c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31548 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 diff --git a/docs/docs/public/images/frameworks.png b/docs/docs/public/images/frameworks.png new file mode 100644 index 0000000000000000000000000000000000000000..b9ba969b9fbaa7ead97d7a84a34ae35f51c038db GIT binary patch literal 149732 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�APt1=nS2lznZNuOC%5$&FawbRq@C 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 oH(`xBMCKU{MtmVTu)+ABJKD%D Date: Tue, 12 May 2026 11:52:45 +0200 Subject: [PATCH 09/26] chore: nodemon do not exit on build failure --- apps/ExpoApp55/entry.tsx | 2 +- packages/brownfield-navigation/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/ExpoApp55/entry.tsx b/apps/ExpoApp55/entry.tsx index 86abd0e1..852ce9ba 100644 --- a/apps/ExpoApp55/entry.tsx +++ b/apps/ExpoApp55/entry.tsx @@ -3,7 +3,7 @@ import { AppRegistry } from 'react-native'; import RNApp from './RNApp'; function App() { - const ctx = require.context('./app'); + const ctx = require.context('./src/app'); return ; } diff --git a/packages/brownfield-navigation/package.json b/packages/brownfield-navigation/package.json index a964c0b0..48c8fe14 100644 --- a/packages/brownfield-navigation/package.json +++ b/packages/brownfield-navigation/package.json @@ -29,7 +29,7 @@ "lint": "eslint .", "typecheck": "tsc --noEmit", "build": "bob build", - "dev": "nodemon --watch src --ext js,ts,json --exec \"bob build\"", + "dev": "nodemon --exitcrash false --watch src --ext js,ts,json --exec \"bob build\"", "build:brownfield": "yarn run build", "prepack": "cp ../../README.md ./README.md", "postpack": "rm ./README.md" From 666dd6c536bfec99372e12e57b325044c101e0e5 Mon Sep 17 00:00:00 2001 From: artus9033 Date: Tue, 12 May 2026 12:12:45 +0200 Subject: [PATCH 10/26] docs: update CONTRIBUTING.md with demo app reference --- CONTRIBUTING.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6d93d467..bd9d49a3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -56,3 +56,8 @@ There are 2 brownfield host apps. - `build:example:ios-consumer:expo54` - consumes Expo 54 - `build:example:ios-consumer:expo55` - consumes Expo 55 - `build:example:ios-consumer:vanilla` - consumes the vanilla `RNApp` + +For iOS, the scripts use the previously packaged artifacts from the respective directory `apps/{RNApp,Expo55,Expo54}` and invoke `prepareXCFrameworks.js` to copy over the XCFrameworks to the `apps/AppleApp/package` directory, from which the XCode project consumes well-known XCFramework files. + +> [!IMPORTANT] +> You can build & run the `AppleApp` directly from XCode GUI, but before running it, after changing the scheme between Expo / Vanilla or making any changes & re-packaging the RN app, you need to re-run the `build:example:ios-consumer:...` script once again for the built artifacts to be available in the `apps/AppleApp/package` directory. Otherwise, you will still be building with the old artifacts. From 32f28f0880fad97773b12ba22ed8982d876ff26e Mon Sep 17 00:00:00 2001 From: artus9033 Date: Wed, 13 May 2026 01:13:34 +0200 Subject: [PATCH 11/26] chore: embed frameworks with signing in AppleApp --- .../project.pbxproj | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj index ddcc87ce..64683b35 100644 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj @@ -7,36 +7,36 @@ objects = { /* Begin PBXBuildFile section */ - 79413FEC2FB3210C00A8B941 /* ReactBrownfield.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79413FEA2FB3210300A8B941 /* ReactBrownfield.xcframework */; }; - 79413FED2FB3210C00A8B941 /* ReactBrownfield.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79413FEA2FB3210300A8B941 /* ReactBrownfield.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79B1886C2FB31F7B007EE35D /* BrownfieldLib.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238D2F50633200CB6363 /* BrownfieldLib.xcframework */; }; - 79B1886D2FB31F7C007EE35D /* BrownfieldLib.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238D2F50633200CB6363 /* BrownfieldLib.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79B1886F2FB31F7D007EE35D /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238F2F50633200CB6363 /* BrownfieldNavigation.xcframework */; }; - 79B188702FB31F7D007EE35D /* BrownfieldNavigation.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238F2F50633200CB6363 /* BrownfieldNavigation.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79B188712FB31F80007EE35D /* hermesvm.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B23902F50633200CB6363 /* hermesvm.xcframework */; }; - 79B188722FB31F80007EE35D /* hermesvm.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B23902F50633200CB6363 /* hermesvm.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79B188732FB31F81007EE35D /* Brownie.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238E2F50633200CB6363 /* Brownie.xcframework */; }; - 79B188742FB31F81007EE35D /* Brownie.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238E2F50633200CB6363 /* Brownie.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79B188752FB31F83007EE35D /* React.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09EC2FB31F2E0028CB26 /* React.xcframework */; }; - 79B188762FB31F83007EE35D /* React.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09EC2FB31F2E0028CB26 /* React.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79B188792FB31F86007EE35D /* ReactNativeDependencies.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09ED2FB31F2E0028CB26 /* ReactNativeDependencies.xcframework */; }; - 79B1887A2FB31F86007EE35D /* ReactNativeDependencies.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09ED2FB31F2E0028CB26 /* ReactNativeDependencies.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79688AB62FB3EA8400D728BD /* ReactNativeDependencies.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09ED2FB31F2E0028CB26 /* ReactNativeDependencies.xcframework */; }; + 79688AB72FB3EA8400D728BD /* ReactNativeDependencies.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09ED2FB31F2E0028CB26 /* ReactNativeDependencies.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 79688AB92FB3EA8400D728BD /* ReactBrownfield.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79413FEA2FB3210300A8B941 /* ReactBrownfield.xcframework */; }; + 79688ABA2FB3EA8400D728BD /* ReactBrownfield.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79413FEA2FB3210300A8B941 /* ReactBrownfield.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 79688ABB2FB3EA8600D728BD /* React.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09EC2FB31F2E0028CB26 /* React.xcframework */; }; + 79688ABC2FB3EA8600D728BD /* React.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09EC2FB31F2E0028CB26 /* React.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 79688ABD2FB3EA8700D728BD /* hermesvm.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B23902F50633200CB6363 /* hermesvm.xcframework */; }; + 79688ABE2FB3EA8700D728BD /* hermesvm.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B23902F50633200CB6363 /* hermesvm.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 79688ABF2FB3EA8900D728BD /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238F2F50633200CB6363 /* BrownfieldNavigation.xcframework */; }; + 79688AC02FB3EA8900D728BD /* BrownfieldNavigation.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238F2F50633200CB6363 /* BrownfieldNavigation.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 79688AC12FB3EA8A00D728BD /* BrownfieldLib.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238D2F50633200CB6363 /* BrownfieldLib.xcframework */; }; + 79688AC22FB3EA8A00D728BD /* BrownfieldLib.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238D2F50633200CB6363 /* BrownfieldLib.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 79688AC32FB3EA8B00D728BD /* Brownie.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238E2F50633200CB6363 /* Brownie.xcframework */; }; + 79688AC42FB3EA8B00D728BD /* Brownie.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238E2F50633200CB6363 /* Brownie.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ - 79B1886E2FB31F7C007EE35D /* Embed Frameworks */ = { + 79688AB82FB3EA8400D728BD /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - 79B188742FB31F81007EE35D /* Brownie.xcframework in Embed Frameworks */, - 79B1887A2FB31F86007EE35D /* ReactNativeDependencies.xcframework in Embed Frameworks */, - 79B188722FB31F80007EE35D /* hermesvm.xcframework in Embed Frameworks */, - 79B188702FB31F7D007EE35D /* BrownfieldNavigation.xcframework in Embed Frameworks */, - 79413FED2FB3210C00A8B941 /* ReactBrownfield.xcframework in Embed Frameworks */, - 79B1886D2FB31F7C007EE35D /* BrownfieldLib.xcframework in Embed Frameworks */, - 79B188762FB31F83007EE35D /* React.xcframework in Embed Frameworks */, + 79688AC42FB3EA8B00D728BD /* Brownie.xcframework in Embed Frameworks */, + 79688AC02FB3EA8900D728BD /* BrownfieldNavigation.xcframework in Embed Frameworks */, + 79688ABC2FB3EA8600D728BD /* React.xcframework in Embed Frameworks */, + 79688AB72FB3EA8400D728BD /* ReactNativeDependencies.xcframework in Embed Frameworks */, + 79688AC22FB3EA8A00D728BD /* BrownfieldLib.xcframework in Embed Frameworks */, + 79688ABE2FB3EA8700D728BD /* hermesvm.xcframework in Embed Frameworks */, + 79688ABA2FB3EA8400D728BD /* ReactBrownfield.xcframework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -67,13 +67,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 79B188732FB31F81007EE35D /* Brownie.xcframework in Frameworks */, - 79B1886F2FB31F7D007EE35D /* BrownfieldNavigation.xcframework in Frameworks */, - 79B188792FB31F86007EE35D /* ReactNativeDependencies.xcframework in Frameworks */, - 79B188712FB31F80007EE35D /* hermesvm.xcframework in Frameworks */, - 79413FEC2FB3210C00A8B941 /* ReactBrownfield.xcframework in Frameworks */, - 79B1886C2FB31F7B007EE35D /* BrownfieldLib.xcframework in Frameworks */, - 79B188752FB31F83007EE35D /* React.xcframework in Frameworks */, + 79688AC32FB3EA8B00D728BD /* Brownie.xcframework in Frameworks */, + 79688ABF2FB3EA8900D728BD /* BrownfieldNavigation.xcframework in Frameworks */, + 79688AB62FB3EA8400D728BD /* ReactNativeDependencies.xcframework in Frameworks */, + 79688AB92FB3EA8400D728BD /* ReactBrownfield.xcframework in Frameworks */, + 79688AC12FB3EA8A00D728BD /* BrownfieldLib.xcframework in Frameworks */, + 79688ABD2FB3EA8700D728BD /* hermesvm.xcframework in Frameworks */, + 79688ABB2FB3EA8600D728BD /* React.xcframework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -121,7 +121,7 @@ 793C76A32EEBF938008A2A34 /* Sources */, 793C76A42EEBF938008A2A34 /* Frameworks */, 793C76A52EEBF938008A2A34 /* Resources */, - 79B1886E2FB31F7C007EE35D /* Embed Frameworks */, + 79688AB82FB3EA8400D728BD /* Embed Frameworks */, ); buildRules = ( ); From 68f941f3ab096ffe7d829e0b58566281e3ebbbf6 Mon Sep 17 00:00:00 2001 From: artus9033 Date: Wed, 13 May 2026 11:15:37 +0200 Subject: [PATCH 12/26] fix: brownfield app dylib install name with @rpath --- .../src/expo-config-plugin/ios/xcodeHelpers.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/react-native-brownfield/src/expo-config-plugin/ios/xcodeHelpers.ts b/packages/react-native-brownfield/src/expo-config-plugin/ios/xcodeHelpers.ts index 82f577eb..1fc08d49 100644 --- a/packages/react-native-brownfield/src/expo-config-plugin/ios/xcodeHelpers.ts +++ b/packages/react-native-brownfield/src/expo-config-plugin/ios/xcodeHelpers.ts @@ -215,6 +215,10 @@ function getFrameworkBuildSettings( PRODUCT_BUNDLE_IDENTIFIER: `"${bundleIdentifier}"`, IPHONEOS_DEPLOYMENT_TARGET: deploymentTarget, + // Ensure the BrownfieldLib (or equivalent name) is installed at the correct path + DYLIB_INSTALL_NAME_BASE: '"@rpath"', + LD_DYLIB_INSTALL_NAME: '"@rpath/$(EXECUTABLE_PATH)"', + // Swift settings - use modern Swift version (5.0+) to avoid legacy Swift 3.x migration prompts SWIFT_VERSION: '5.0', TARGETED_DEVICE_FAMILY: `"1,2"`, From 2949b2ee2b17975d2dd7d433896819849a85760c Mon Sep 17 00:00:00 2001 From: artus9033 Date: Wed, 13 May 2026 11:17:01 +0200 Subject: [PATCH 13/26] fix(demo): code-sign frameworks on copy in AppleApp --- .../Brownfield Apple App.xcodeproj/project.pbxproj | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj index 64683b35..a6d22bbc 100644 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj @@ -8,19 +8,19 @@ /* Begin PBXBuildFile section */ 79688AB62FB3EA8400D728BD /* ReactNativeDependencies.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09ED2FB31F2E0028CB26 /* ReactNativeDependencies.xcframework */; }; - 79688AB72FB3EA8400D728BD /* ReactNativeDependencies.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09ED2FB31F2E0028CB26 /* ReactNativeDependencies.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 79688AB72FB3EA8400D728BD /* ReactNativeDependencies.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09ED2FB31F2E0028CB26 /* ReactNativeDependencies.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 79688AB92FB3EA8400D728BD /* ReactBrownfield.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79413FEA2FB3210300A8B941 /* ReactBrownfield.xcframework */; }; - 79688ABA2FB3EA8400D728BD /* ReactBrownfield.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79413FEA2FB3210300A8B941 /* ReactBrownfield.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 79688ABA2FB3EA8400D728BD /* ReactBrownfield.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79413FEA2FB3210300A8B941 /* ReactBrownfield.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 79688ABB2FB3EA8600D728BD /* React.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09EC2FB31F2E0028CB26 /* React.xcframework */; }; - 79688ABC2FB3EA8600D728BD /* React.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09EC2FB31F2E0028CB26 /* React.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 79688ABC2FB3EA8600D728BD /* React.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09EC2FB31F2E0028CB26 /* React.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 79688ABD2FB3EA8700D728BD /* hermesvm.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B23902F50633200CB6363 /* hermesvm.xcframework */; }; - 79688ABE2FB3EA8700D728BD /* hermesvm.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B23902F50633200CB6363 /* hermesvm.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 79688ABE2FB3EA8700D728BD /* hermesvm.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B23902F50633200CB6363 /* hermesvm.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 79688ABF2FB3EA8900D728BD /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238F2F50633200CB6363 /* BrownfieldNavigation.xcframework */; }; - 79688AC02FB3EA8900D728BD /* BrownfieldNavigation.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238F2F50633200CB6363 /* BrownfieldNavigation.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 79688AC02FB3EA8900D728BD /* BrownfieldNavigation.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238F2F50633200CB6363 /* BrownfieldNavigation.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 79688AC12FB3EA8A00D728BD /* BrownfieldLib.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238D2F50633200CB6363 /* BrownfieldLib.xcframework */; }; - 79688AC22FB3EA8A00D728BD /* BrownfieldLib.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238D2F50633200CB6363 /* BrownfieldLib.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 79688AC22FB3EA8A00D728BD /* BrownfieldLib.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238D2F50633200CB6363 /* BrownfieldLib.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 79688AC32FB3EA8B00D728BD /* Brownie.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238E2F50633200CB6363 /* Brownie.xcframework */; }; - 79688AC42FB3EA8B00D728BD /* Brownie.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238E2F50633200CB6363 /* Brownie.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 79688AC42FB3EA8B00D728BD /* Brownie.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238E2F50633200CB6363 /* Brownie.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ From d9319b43049a43bdb79be87c1b97a5e299f488e1 Mon Sep 17 00:00:00 2001 From: artus9033 Date: Wed, 13 May 2026 11:24:17 +0200 Subject: [PATCH 14/26] chore: upgrade Rock & dependencies --- apps/AppleApp/package.json | 2 +- packages/cli/package.json | 10 +- yarn.lock | 1132 ++++++++++++++++++++++++------------ 3 files changed, 767 insertions(+), 377 deletions(-) diff --git a/apps/AppleApp/package.json b/apps/AppleApp/package.json index bb30a574..3eb1817f 100644 --- a/apps/AppleApp/package.json +++ b/apps/AppleApp/package.json @@ -11,6 +11,6 @@ "internal::build::common": "xcodebuild -project \"Brownfield Apple App.xcodeproj\" -sdk iphonesimulator build CODE_SIGNING_ALLOWED=NO -derivedDataPath ./build" }, "devDependencies": { - "@rock-js/tools": "^0.12.12" + "@rock-js/tools": "^0.13.3" } } diff --git a/packages/cli/package.json b/packages/cli/package.json index 141fd1bc..9afea510 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -75,11 +75,11 @@ "@expo/config": "^12.0.13", "@react-native-community/cli-config": "^20.0.0", "@react-native-community/cli-config-android": "^20.0.0", - "@rock-js/platform-android": "^0.12.12", - "@rock-js/platform-apple-helpers": "^0.12.12", - "@rock-js/plugin-brownfield-android": "^0.12.12", - "@rock-js/plugin-brownfield-ios": "^0.12.12", - "@rock-js/tools": "^0.12.12", + "@rock-js/platform-android": "^0.13.3", + "@rock-js/platform-apple-helpers": "^0.13.3", + "@rock-js/plugin-brownfield-android": "^0.13.3", + "@rock-js/plugin-brownfield-ios": "^0.13.3", + "@rock-js/tools": "^0.13.3", "commander": "^14.0.3", "quicktype-core": "^23.2.6", "quicktype-typescript-input": "^23.2.6", diff --git a/yarn.lock b/yarn.lock index fb84082d..b665f390 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1757,11 +1757,11 @@ __metadata: "@react-native-community/cli-types": "npm:^20.0.0" "@react-native/babel-preset": "npm:0.82.1" "@react-native/eslint-config": "npm:0.82.1" - "@rock-js/platform-android": "npm:^0.12.12" - "@rock-js/platform-apple-helpers": "npm:^0.12.12" - "@rock-js/plugin-brownfield-android": "npm:^0.12.12" - "@rock-js/plugin-brownfield-ios": "npm:^0.12.12" - "@rock-js/tools": "npm:^0.12.12" + "@rock-js/platform-android": "npm:^0.13.3" + "@rock-js/platform-apple-helpers": "npm:^0.13.3" + "@rock-js/plugin-brownfield-android": "npm:^0.13.3" + "@rock-js/plugin-brownfield-ios": "npm:^0.13.3" + "@rock-js/tools": "npm:^0.13.3" "@types/babel__core": "npm:^7.20.5" "@types/babel__preset-env": "npm:^7.10.0" "@types/node": "npm:^25.5.0" @@ -1837,28 +1837,28 @@ __metadata: "@types/react": "npm:~19.2.10" eslint: "npm:^9.25.0" eslint-config-expo: "npm:~55.0.0" - expo: "npm:~55.0.5" - expo-constants: "npm:~55.0.7" - expo-device: "npm:~55.0.9" - expo-font: "npm:~55.0.4" - expo-glass-effect: "npm:~55.0.8" - expo-image: "npm:~55.0.6" - expo-linking: "npm:~55.0.7" - expo-router: "npm:~55.0.5" - expo-splash-screen: "npm:~55.0.10" - expo-status-bar: "npm:~55.0.4" - expo-symbols: "npm:~55.0.5" - expo-system-ui: "npm:~55.0.9" - expo-web-browser: "npm:~55.0.8" + expo: "npm:~55.0.23" + expo-constants: "npm:~55.0.16" + expo-device: "npm:~55.0.16" + expo-font: "npm:~55.0.7" + expo-glass-effect: "npm:~55.0.11" + expo-image: "npm:~55.0.10" + expo-linking: "npm:~55.0.15" + expo-router: "npm:~55.0.14" + expo-splash-screen: "npm:~55.0.20" + expo-status-bar: "npm:~55.0.6" + expo-symbols: "npm:~55.0.8" + expo-system-ui: "npm:~55.0.17" + expo-web-browser: "npm:~55.0.15" react: "npm:19.2.0" react-dom: "npm:19.2.0" - react-native: "npm:0.83.2" + react-native: "npm:0.83.6" react-native-gesture-handler: "npm:~2.30.0" react-native-reanimated: "npm:4.2.1" react-native-safe-area-context: "npm:~5.6.2" react-native-screens: "npm:~4.23.0" react-native-web: "npm:~0.21.0" - react-native-worklets: "npm:0.7.2" + react-native-worklets: "npm:0.7.4" typescript: "npm:~5.9.2" languageName: unknown linkType: soft @@ -1867,7 +1867,7 @@ __metadata: version: 0.0.0-use.local resolution: "@callstack/brownfield-example-ios-app@workspace:apps/AppleApp" dependencies: - "@rock-js/tools": "npm:^0.12.12" + "@rock-js/tools": "npm:^0.13.3" languageName: unknown linkType: soft @@ -2809,31 +2809,31 @@ __metadata: languageName: node linkType: hard -"@expo/cli@npm:55.0.16": - version: 55.0.16 - resolution: "@expo/cli@npm:55.0.16" +"@expo/cli@npm:55.0.29": + version: 55.0.29 + resolution: "@expo/cli@npm:55.0.29" dependencies: "@expo/code-signing-certificates": "npm:^0.0.6" - "@expo/config": "npm:~55.0.8" - "@expo/config-plugins": "npm:~55.0.6" + "@expo/config": "npm:~55.0.16" + "@expo/config-plugins": "npm:~55.0.8" "@expo/devcert": "npm:^1.2.1" - "@expo/env": "npm:~2.1.1" - "@expo/image-utils": "npm:^0.8.12" - "@expo/json-file": "npm:^10.0.12" - "@expo/log-box": "npm:55.0.7" - "@expo/metro": "npm:~54.2.0" - "@expo/metro-config": "npm:~55.0.9" - "@expo/osascript": "npm:^2.4.2" - "@expo/package-manager": "npm:^1.10.3" - "@expo/plist": "npm:^0.5.2" - "@expo/prebuild-config": "npm:^55.0.8" - "@expo/require-utils": "npm:^55.0.2" - "@expo/router-server": "npm:^55.0.10" - "@expo/schema-utils": "npm:^55.0.2" + "@expo/env": "npm:~2.1.2" + "@expo/image-utils": "npm:^0.8.14" + "@expo/json-file": "npm:^10.0.14" + "@expo/log-box": "npm:55.0.12" + "@expo/metro": "npm:~55.1.1" + "@expo/metro-config": "npm:~55.0.20" + "@expo/osascript": "npm:^2.4.3" + "@expo/package-manager": "npm:^1.10.5" + "@expo/plist": "npm:^0.5.3" + "@expo/prebuild-config": "npm:^55.0.17" + "@expo/require-utils": "npm:^55.0.5" + "@expo/router-server": "npm:^55.0.16" + "@expo/schema-utils": "npm:^55.0.4" "@expo/spawn-async": "npm:^1.7.2" "@expo/ws-tunnel": "npm:^1.0.1" "@expo/xcpretty": "npm:^4.4.0" - "@react-native/dev-middleware": "npm:0.83.2" + "@react-native/dev-middleware": "npm:0.83.6" accepts: "npm:^1.3.8" arg: "npm:^5.0.2" better-opn: "npm:~3.0.2" @@ -2844,13 +2844,13 @@ __metadata: compression: "npm:^1.7.4" connect: "npm:^3.7.0" debug: "npm:^4.3.4" - dnssd-advertise: "npm:^1.1.3" - expo-server: "npm:^55.0.6" - fetch-nodeshim: "npm:^0.4.6" + dnssd-advertise: "npm:^1.1.4" + expo-server: "npm:^55.0.9" + fetch-nodeshim: "npm:^0.4.10" getenv: "npm:^2.0.0" glob: "npm:^13.0.0" - lan-network: "npm:^0.2.0" - multitars: "npm:^0.2.3" + lan-network: "npm:^0.2.1" + multitars: "npm:^1.0.0" node-forge: "npm:^1.3.3" npm-package-arg: "npm:^11.0.0" ora: "npm:^3.4.0" @@ -2881,7 +2881,7 @@ __metadata: optional: true bin: expo-internal: build/bin/cli - checksum: 10/fa11c770965de33e0f74b74b5cf4869a46778c128d92abfee9fc4fa8a301adc53a06b16a9d991db98dc93feeb57654e6e22333bcb2893a8060b4ec995ba30258 + checksum: 10/60f68786562b03ccb8bc7d507c996808207df9935ec3be803f10bbf1c3cbea19e9054086e484c13b540919d323dc324dec48d570fe0c53410a37b510beb6a95f languageName: node linkType: hard @@ -2916,12 +2916,12 @@ __metadata: languageName: node linkType: hard -"@expo/config-plugins@npm:~55.0.6": - version: 55.0.6 - resolution: "@expo/config-plugins@npm:55.0.6" +"@expo/config-plugins@npm:~55.0.8": + version: 55.0.8 + resolution: "@expo/config-plugins@npm:55.0.8" dependencies: "@expo/config-types": "npm:^55.0.5" - "@expo/json-file": "npm:~10.0.12" + "@expo/json-file": "npm:~10.0.13" "@expo/plist": "npm:^0.5.2" "@expo/sdk-runtime-versions": "npm:^1.0.0" chalk: "npm:^4.1.2" @@ -2933,7 +2933,7 @@ __metadata: slugify: "npm:^1.6.6" xcode: "npm:^3.0.1" xml2js: "npm:0.6.0" - checksum: 10/2805380b694f9e21c7e2bfaba0ad6a8266af6093f7fc4ba413b5a7099329620eaecbbaa070c506f8e5eb06c8cb605f48e7491adba6ddf989e36bff14a396c48a + checksum: 10/41ad533f83a01ffec8ca580fcf282a5aa61cd0494a8e29ce68ba11d929091c96dfeac49521e03144e2eb8551525096065e8c2e36bebd2bb2d1fddf89380312c4 languageName: node linkType: hard @@ -2972,22 +2972,21 @@ __metadata: languageName: node linkType: hard -"@expo/config@npm:~55.0.8": - version: 55.0.8 - resolution: "@expo/config@npm:55.0.8" +"@expo/config@npm:~55.0.16": + version: 55.0.16 + resolution: "@expo/config@npm:55.0.16" dependencies: - "@expo/config-plugins": "npm:~55.0.6" + "@expo/config-plugins": "npm:~55.0.8" "@expo/config-types": "npm:^55.0.5" - "@expo/json-file": "npm:^10.0.12" - "@expo/require-utils": "npm:^55.0.2" + "@expo/json-file": "npm:^10.0.14" + "@expo/require-utils": "npm:^55.0.5" deepmerge: "npm:^4.3.1" getenv: "npm:^2.0.0" glob: "npm:^13.0.0" - resolve-from: "npm:^5.0.0" resolve-workspace-root: "npm:^2.0.0" semver: "npm:^7.6.0" slugify: "npm:^1.3.4" - checksum: 10/028a8ebe0684191697672f2e346755d63f1bf97ad6a39dbf88998f9b9a53cbdf7296219a851d3b947125faf38f6bc690b627ccc9e8bac4c450e3a1101963f068 + checksum: 10/5a50551ee480000af34c33728998bfc89018c19553deb8bc6fba1ee1e93f0daadfadadd4fc5f92db953b4464c7704104fbcf11b8bf5857e02b988499c3736535 languageName: node linkType: hard @@ -3018,9 +3017,9 @@ __metadata: languageName: node linkType: hard -"@expo/devtools@npm:55.0.2": - version: 55.0.2 - resolution: "@expo/devtools@npm:55.0.2" +"@expo/devtools@npm:55.0.3": + version: 55.0.3 + resolution: "@expo/devtools@npm:55.0.3" dependencies: chalk: "npm:^4.1.2" peerDependencies: @@ -3031,29 +3030,29 @@ __metadata: optional: true react-native: optional: true - checksum: 10/0a43121fb5a7993dfe0c112e287e292358c099c4f02dbd1f80e67fe8bb7cff21be77cf389fefcc84f86e2955066e4b0e70e447cf48ca8772de47c6eef114ecdd + checksum: 10/035dc13e742a25c3f51e34e05e6d14247ff2be67be5fc6ecbd79e213e5b9ab5e200d8dc4e374afa0c282f05544a51277f79af8dbd616dc3bb1040b65aacafb6a languageName: node linkType: hard -"@expo/dom-webview@npm:^55.0.3": - version: 55.0.3 - resolution: "@expo/dom-webview@npm:55.0.3" +"@expo/dom-webview@npm:^55.0.6": + version: 55.0.6 + resolution: "@expo/dom-webview@npm:55.0.6" peerDependencies: expo: "*" react: "*" react-native: "*" - checksum: 10/e93ec71dc764b57fb109ed97794b8b033a88ab9656bee875853f838777590ff85bc7614f1af95e9ea528a3424e18fa27be80fe252565f0dff980e8766a56d7f9 + checksum: 10/37f42099a76b17eed14cc73d5dd2ed22acc36ac44f1b7cd628f90a06629d24cb4097b43904cdb684124ed150dbfb230b25b16d3feed5f2c272dca24435b0c127 languageName: node linkType: hard -"@expo/env@npm:^2.0.11, @expo/env@npm:~2.1.1": - version: 2.1.1 - resolution: "@expo/env@npm:2.1.1" +"@expo/env@npm:^2.1.2": + version: 2.2.1 + resolution: "@expo/env@npm:2.2.1" dependencies: chalk: "npm:^4.0.0" debug: "npm:^4.3.4" getenv: "npm:^2.0.0" - checksum: 10/19be4c7131b1d718a456018dfe3133b6c021b71b8689b11b208d03aae947c0f0848ce21996adf9010c1b87d765b46b14484f1d1f30f73db466b9500024bfac53 + checksum: 10/d0ba25ad9acddc56e8973f6a630282a0b207004b46457aace0b5829e5c7ff7f81d8f84b73e6dd5b796ef2613e41387c884f259e12f3c2db5548dc6e69be99eb1 languageName: node linkType: hard @@ -3070,6 +3069,17 @@ __metadata: languageName: node linkType: hard +"@expo/env@npm:~2.1.2": + version: 2.1.2 + resolution: "@expo/env@npm:2.1.2" + dependencies: + chalk: "npm:^4.0.0" + debug: "npm:^4.3.4" + getenv: "npm:^2.0.0" + checksum: 10/e127ae2449de94afc52e41c8a4254b21eb6df047ba24da8b0a3baa245840338dc1eb00c8447fed6059ead13dae8dddef4ce8ce44c44f4154a886007967f473af + languageName: node + linkType: hard + "@expo/fingerprint@npm:0.15.4": version: 0.15.4 resolution: "@expo/fingerprint@npm:0.15.4" @@ -3091,11 +3101,11 @@ __metadata: languageName: node linkType: hard -"@expo/fingerprint@npm:0.16.6": - version: 0.16.6 - resolution: "@expo/fingerprint@npm:0.16.6" +"@expo/fingerprint@npm:0.16.7": + version: 0.16.7 + resolution: "@expo/fingerprint@npm:0.16.7" dependencies: - "@expo/env": "npm:^2.0.11" + "@expo/env": "npm:^2.1.2" "@expo/spawn-async": "npm:^1.7.2" arg: "npm:^5.0.2" chalk: "npm:^4.1.2" @@ -3108,11 +3118,26 @@ __metadata: semver: "npm:^7.6.0" bin: fingerprint: bin/cli.js - checksum: 10/2bf59bd6964c17c7bbcf66f963684909345f7b0b5da459be5cc34f27eae4860cd18e8644db30a2cec1553f67b81dce26983d00e34dbafa59f2e0bfa5783fc787 + checksum: 10/b7a84ccc5a9a45eeecaa6f6e5238fe760d31b8d4f030c8f98260acbeb4df4087911ba16d6d871c51310e886d5122f2e3283d0b2b367433f00017d373dff662c1 languageName: node linkType: hard -"@expo/image-utils@npm:^0.8.12, @expo/image-utils@npm:^0.8.8": +"@expo/image-utils@npm:^0.8.14": + version: 0.8.14 + resolution: "@expo/image-utils@npm:0.8.14" + dependencies: + "@expo/require-utils": "npm:^55.0.5" + "@expo/spawn-async": "npm:^1.7.2" + chalk: "npm:^4.0.0" + getenv: "npm:^2.0.0" + jimp-compact: "npm:0.16.1" + parse-png: "npm:^2.1.0" + semver: "npm:^7.6.0" + checksum: 10/2940cda3ed2e4677cf5b897639859978c6477984a33b86f7ef8e48051219dfacb8a65dbbe9c30c4833b544c9824c117a5e0ccf2e8746b3a636b900332134c2fb + languageName: node + linkType: hard + +"@expo/image-utils@npm:^0.8.8": version: 0.8.12 resolution: "@expo/image-utils@npm:0.8.12" dependencies: @@ -3127,7 +3152,7 @@ __metadata: languageName: node linkType: hard -"@expo/json-file@npm:^10.0.12, @expo/json-file@npm:^10.0.8, @expo/json-file@npm:~10.0.12, @expo/json-file@npm:~10.0.8": +"@expo/json-file@npm:^10.0.12, @expo/json-file@npm:^10.0.8, @expo/json-file@npm:~10.0.8": version: 10.0.12 resolution: "@expo/json-file@npm:10.0.12" dependencies: @@ -3137,29 +3162,49 @@ __metadata: languageName: node linkType: hard -"@expo/local-build-cache-provider@npm:55.0.6": - version: 55.0.6 - resolution: "@expo/local-build-cache-provider@npm:55.0.6" +"@expo/json-file@npm:^10.0.14, @expo/json-file@npm:^10.1.0": + version: 10.1.1 + resolution: "@expo/json-file@npm:10.1.1" + dependencies: + "@babel/code-frame": "npm:^7.20.0" + json5: "npm:^2.2.3" + checksum: 10/39227d4f34c71ec61fabda22965c9833aa090eff616abb7faba013b88c8e049c7b8052eac9abd67c704d7a7b69b4301805c0b5d62ef3bbd41f176f32fe5caef1 + languageName: node + linkType: hard + +"@expo/json-file@npm:~10.0.13, @expo/json-file@npm:~10.0.14": + version: 10.0.14 + resolution: "@expo/json-file@npm:10.0.14" + dependencies: + "@babel/code-frame": "npm:^7.20.0" + json5: "npm:^2.2.3" + checksum: 10/205d2abda670499c91888658cf4483d52acc75a244d4a07651fb95b6f4e713c19f89f1a6a3c0033289a13cd9f4158e58e93025bc94c6840ecdbe0bd96c1786e1 + languageName: node + linkType: hard + +"@expo/local-build-cache-provider@npm:55.0.12": + version: 55.0.12 + resolution: "@expo/local-build-cache-provider@npm:55.0.12" dependencies: - "@expo/config": "npm:~55.0.8" + "@expo/config": "npm:~55.0.16" chalk: "npm:^4.1.2" - checksum: 10/e5571c294f82e009d1cb7150380029483875b0655060c5bc488f4375e664f5e55a526708b438edf84ec04be6a872a69147489242a7ef9f2dfc272e32e8f2928f + checksum: 10/dc973bf93685c1baf8c53cd0b08ad43bd07075cd81e02937e7d1ff7ffe8a375298a6bba99988a89322e801155ade5a2625845c7a3653d6996e6abeab5baf69f2 languageName: node linkType: hard -"@expo/log-box@npm:55.0.7": - version: 55.0.7 - resolution: "@expo/log-box@npm:55.0.7" +"@expo/log-box@npm:55.0.12": + version: 55.0.12 + resolution: "@expo/log-box@npm:55.0.12" dependencies: - "@expo/dom-webview": "npm:^55.0.3" + "@expo/dom-webview": "npm:^55.0.6" anser: "npm:^1.4.9" stacktrace-parser: "npm:^0.1.10" peerDependencies: - "@expo/dom-webview": ^55.0.3 + "@expo/dom-webview": ^55.0.6 expo: "*" react: "*" react-native: "*" - checksum: 10/812ea909c527d21a284d6ce273351836b8848618611d6cece0e2a284a7314f9cd7d8ba0deed96125790cdbdd993bdcb68c45d1612604ea4e300021e13f80302b + checksum: 10/9229329d28af711f0e229e80889aa18223b90c132f74674c61b0f890a82427836335f0fc14379c9c190e146316f639e93946745166e0cb584ab5265a5e79ae2f languageName: node linkType: hard @@ -3197,17 +3242,17 @@ __metadata: languageName: node linkType: hard -"@expo/metro-config@npm:55.0.9, @expo/metro-config@npm:~55.0.9": - version: 55.0.9 - resolution: "@expo/metro-config@npm:55.0.9" +"@expo/metro-config@npm:55.0.20, @expo/metro-config@npm:~55.0.20": + version: 55.0.20 + resolution: "@expo/metro-config@npm:55.0.20" dependencies: "@babel/code-frame": "npm:^7.20.0" "@babel/core": "npm:^7.20.0" "@babel/generator": "npm:^7.20.5" - "@expo/config": "npm:~55.0.8" - "@expo/env": "npm:~2.1.1" - "@expo/json-file": "npm:~10.0.12" - "@expo/metro": "npm:~54.2.0" + "@expo/config": "npm:~55.0.16" + "@expo/env": "npm:~2.1.2" + "@expo/json-file": "npm:~10.0.14" + "@expo/metro": "npm:~55.1.1" "@expo/spawn-async": "npm:^1.7.2" browserslist: "npm:^4.25.0" chalk: "npm:^4.1.0" @@ -3225,15 +3270,15 @@ __metadata: peerDependenciesMeta: expo: optional: true - checksum: 10/02a705ea91f712ef450bc55ab7b2470ba133d9992bdabb47e9df4b8c2cec143bd1e772547a9a8186bea8a477522eabbd944cc57a585a0cadd1539748bd8f09b8 + checksum: 10/eb2ab253e1faceee965cea66dd5cef04b271b4ed121dc386fd7120d7302bfcd0eb067d061c84d8ea88118d718bbe7583f134ede4e3aeb4fe51f0d6814bf558fe languageName: node linkType: hard -"@expo/metro-runtime@npm:^55.0.6": - version: 55.0.6 - resolution: "@expo/metro-runtime@npm:55.0.6" +"@expo/metro-runtime@npm:^55.0.11": + version: 55.0.11 + resolution: "@expo/metro-runtime@npm:55.0.11" dependencies: - "@expo/log-box": "npm:55.0.7" + "@expo/log-box": "npm:55.0.12" anser: "npm:^1.4.9" pretty-format: "npm:^29.7.0" stacktrace-parser: "npm:^0.1.10" @@ -3246,7 +3291,7 @@ __metadata: peerDependenciesMeta: react-dom: optional: true - checksum: 10/cae7fc019f65be573709bc86ef8eaad297bc1c8cd5ed8ed7a4ddb2342faf5a6021217a82344583d60079ceea694ab2613bd15afdcc5cf3390c0528198fe3aaa9 + checksum: 10/24af73525d0ffc4732c7189cf5edaf6f99fb61af1a795fe7a6affac580bc74f3db9c10bd28021b7938a1ba8e6a456808cdd4e7884e6b9e12a2e6316dc8945a36 languageName: node linkType: hard @@ -3292,7 +3337,29 @@ __metadata: languageName: node linkType: hard -"@expo/osascript@npm:^2.3.8, @expo/osascript@npm:^2.4.2": +"@expo/metro@npm:~55.1.1": + version: 55.1.1 + resolution: "@expo/metro@npm:55.1.1" + dependencies: + metro: "npm:0.83.7" + metro-babel-transformer: "npm:0.83.7" + metro-cache: "npm:0.83.7" + metro-cache-key: "npm:0.83.7" + metro-config: "npm:0.83.7" + metro-core: "npm:0.83.7" + metro-file-map: "npm:0.83.7" + metro-minify-terser: "npm:0.83.7" + metro-resolver: "npm:0.83.7" + metro-runtime: "npm:0.83.7" + metro-source-map: "npm:0.83.7" + metro-symbolicate: "npm:0.83.7" + metro-transform-plugins: "npm:0.83.7" + metro-transform-worker: "npm:0.83.7" + checksum: 10/f74451f45ffe970c5e244d4021060840624aee8242ca57a4092fb4a9cebb350ae102b7b2f71383a456b4143653fb32bce157955ee26661daa2b1e3a2950f49af + languageName: node + linkType: hard + +"@expo/osascript@npm:^2.3.8": version: 2.4.2 resolution: "@expo/osascript@npm:2.4.2" dependencies: @@ -3301,7 +3368,30 @@ __metadata: languageName: node linkType: hard -"@expo/package-manager@npm:^1.10.3, @expo/package-manager@npm:^1.9.10": +"@expo/osascript@npm:^2.4.3": + version: 2.5.1 + resolution: "@expo/osascript@npm:2.5.1" + dependencies: + "@expo/spawn-async": "npm:^1.7.2" + checksum: 10/119e3b00cc8774b79805f68f80fbf79a097d689d6465e3e0305de643d7877cd4a71d0419084081a19dc36e0fe67e39968699b45f24cf604534ba2ea534594580 + languageName: node + linkType: hard + +"@expo/package-manager@npm:^1.10.5": + version: 1.11.1 + resolution: "@expo/package-manager@npm:1.11.1" + dependencies: + "@expo/json-file": "npm:^10.1.0" + "@expo/spawn-async": "npm:^1.7.2" + chalk: "npm:^4.0.0" + npm-package-arg: "npm:^11.0.0" + ora: "npm:^3.4.0" + resolve-workspace-root: "npm:^2.0.0" + checksum: 10/368c9d1e0aa46690dd491bfc3b430cf95f4a4d1917312dbe46e9ce491409815304d215183b99d9d236d5be4cf11c9919762b7cb9cf9e16d089e85676c0aa8c3f + languageName: node + linkType: hard + +"@expo/package-manager@npm:^1.9.10": version: 1.10.3 resolution: "@expo/package-manager@npm:1.10.3" dependencies: @@ -3337,6 +3427,17 @@ __metadata: languageName: node linkType: hard +"@expo/plist@npm:^0.5.3": + version: 0.5.3 + resolution: "@expo/plist@npm:0.5.3" + dependencies: + "@xmldom/xmldom": "npm:^0.8.8" + base64-js: "npm:^1.5.1" + xmlbuilder: "npm:^15.1.1" + checksum: 10/ea8eb855c4101e0baedaf57a70078611920bcda29738b574b28ef2ba457172459f18654382443b5143e9bb1f4f381d91eac29baeb84b0af1a08bf1006415c1c7 + languageName: node + linkType: hard + "@expo/prebuild-config@npm:^54.0.8": version: 54.0.8 resolution: "@expo/prebuild-config@npm:54.0.8" @@ -3357,29 +3458,29 @@ __metadata: languageName: node linkType: hard -"@expo/prebuild-config@npm:^55.0.8": - version: 55.0.8 - resolution: "@expo/prebuild-config@npm:55.0.8" +"@expo/prebuild-config@npm:^55.0.17": + version: 55.0.17 + resolution: "@expo/prebuild-config@npm:55.0.17" dependencies: - "@expo/config": "npm:~55.0.8" - "@expo/config-plugins": "npm:~55.0.6" + "@expo/config": "npm:~55.0.16" + "@expo/config-plugins": "npm:~55.0.8" "@expo/config-types": "npm:^55.0.5" - "@expo/image-utils": "npm:^0.8.12" - "@expo/json-file": "npm:^10.0.12" - "@react-native/normalize-colors": "npm:0.83.2" + "@expo/image-utils": "npm:^0.8.14" + "@expo/json-file": "npm:^10.0.14" + "@react-native/normalize-colors": "npm:0.83.6" debug: "npm:^4.3.1" resolve-from: "npm:^5.0.0" semver: "npm:^7.6.0" xml2js: "npm:0.6.0" peerDependencies: expo: "*" - checksum: 10/9e84b93c03c85de550bb463da135f8fce534cfa95dc5897bebfef40ee7154ef7a2a2c09f74341038380a602744c6350362a71df990251cceded24931acc0163a + checksum: 10/8dce6263862ab20331b2779135c3e87385934437598e6ffffca0b2903a8858e56a1fdb603bfcbc507bc124e4043d49d828331df028b5710b498fd071e50e1e41 languageName: node linkType: hard -"@expo/require-utils@npm:^55.0.2": - version: 55.0.2 - resolution: "@expo/require-utils@npm:55.0.2" +"@expo/require-utils@npm:^55.0.5": + version: 55.0.5 + resolution: "@expo/require-utils@npm:55.0.5" dependencies: "@babel/code-frame": "npm:^7.20.0" "@babel/core": "npm:^7.25.2" @@ -3389,22 +3490,22 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10/19c7c82a46c23e03478203c828d99e9c31ae6328eca5683aabd54fe2fe51097e10aaeb02a64cfe527f0ca20694fac3cc94e7b81a314e114eada14df0ad29e323 + checksum: 10/0799a241d771d80becf8ff01564d3a49e9b8a30ef08da9123bcc33a3c67b2c545aa05c5841bbf33621f44b01559a16684c1cfcafd0119f816e4af57c07ac267d languageName: node linkType: hard -"@expo/router-server@npm:^55.0.10": - version: 55.0.10 - resolution: "@expo/router-server@npm:55.0.10" +"@expo/router-server@npm:^55.0.16": + version: 55.0.16 + resolution: "@expo/router-server@npm:55.0.16" dependencies: debug: "npm:^4.3.4" peerDependencies: - "@expo/metro-runtime": ^55.0.6 + "@expo/metro-runtime": ^55.0.11 expo: "*" - expo-constants: ^55.0.7 - expo-font: ^55.0.4 + expo-constants: ^55.0.16 + expo-font: ^55.0.7 expo-router: "*" - expo-server: ^55.0.6 + expo-server: ^55.0.9 react: "*" react-dom: "*" react-server-dom-webpack: ~19.0.1 || ~19.1.2 || ~19.2.1 @@ -3417,7 +3518,7 @@ __metadata: optional: true react-server-dom-webpack: optional: true - checksum: 10/c0c0ede7e586af5b9bf99f95eadd486a266f1407b05b046d7c23fc758523d2dc8f301c0168d6aa78f9f84d51e3d56750cde53ddefa3f65bd362a05b230783ed6 + checksum: 10/f9bd7a57fb12f00697aa8457936826f35bf4589c36cc12f88892f0904fd4c44a2e70e47a5d7c569fb15deb9bd1a93c56dff96bdaade4ebc4a8e3e70deb7f5ec2 languageName: node linkType: hard @@ -3428,10 +3529,10 @@ __metadata: languageName: node linkType: hard -"@expo/schema-utils@npm:^55.0.2": - version: 55.0.2 - resolution: "@expo/schema-utils@npm:55.0.2" - checksum: 10/a5ded5555112f0490af0a9794d876f8c0433a14c46f9f315c581920782d9e8c6e830f401e03e174a5ca245f90d8b07143f3e98f762cd2644d307413792f58dd7 +"@expo/schema-utils@npm:^55.0.4": + version: 55.0.4 + resolution: "@expo/schema-utils@npm:55.0.4" + checksum: 10/e8c1658917d7da56ccbe0763b575c17bc8101db598a054985bd3b3fbb3185099cba77192be765cbf119a3ba0f5d273f6033445103497d523112937b443836943 languageName: node linkType: hard @@ -4880,10 +4981,10 @@ __metadata: languageName: node linkType: hard -"@react-native/assets-registry@npm:0.83.2": - version: 0.83.2 - resolution: "@react-native/assets-registry@npm:0.83.2" - checksum: 10/62a4bfd803209795079878ed57ea9275c50added84b3ad514ffae43b0036f7e3319b0241c47f29f454d52b4739c42bf5e0171205697c2b8b45366b37bfca7e1d +"@react-native/assets-registry@npm:0.83.6": + version: 0.83.6 + resolution: "@react-native/assets-registry@npm:0.83.6" + checksum: 10/9ae3c3a4d8831149ec1c96aff7a93392505c22b3bbbddc55d9fa9ae6ff3ea7a8d824fbb923b07f4bd185c74afbd1c9dbc53f7c3a1a161f902a9df91430595c4c languageName: node linkType: hard @@ -4914,13 +5015,13 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-plugin-codegen@npm:0.83.2": - version: 0.83.2 - resolution: "@react-native/babel-plugin-codegen@npm:0.83.2" +"@react-native/babel-plugin-codegen@npm:0.83.6": + version: 0.83.6 + resolution: "@react-native/babel-plugin-codegen@npm:0.83.6" dependencies: "@babel/traverse": "npm:^7.25.3" - "@react-native/codegen": "npm:0.83.2" - checksum: 10/fa28a674da9d4c515ccde850858bd27b1b508825f02bd415f4e48f8e2f0becf41a6d2f96e8578e0670d50dc1b36d2fe7403194c0f52d31bf87728982a13399d1 + "@react-native/codegen": "npm:0.83.6" + checksum: 10/eef3f3fec061c51a7dc042da93fc6e1d9712256ea8d76fb1f1b9ad3813a3a4a3385d33f184cedf2a0adc76112024922510787067678ee52828c053ea8947a08a languageName: node linkType: hard @@ -5044,9 +5145,9 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-preset@npm:0.83.2": - version: 0.83.2 - resolution: "@react-native/babel-preset@npm:0.83.2" +"@react-native/babel-preset@npm:0.83.6": + version: 0.83.6 + resolution: "@react-native/babel-preset@npm:0.83.6" dependencies: "@babel/core": "npm:^7.25.2" "@babel/plugin-proposal-export-default-from": "npm:^7.24.7" @@ -5089,13 +5190,13 @@ __metadata: "@babel/plugin-transform-typescript": "npm:^7.25.2" "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" "@babel/template": "npm:^7.25.0" - "@react-native/babel-plugin-codegen": "npm:0.83.2" + "@react-native/babel-plugin-codegen": "npm:0.83.6" babel-plugin-syntax-hermes-parser: "npm:0.32.0" babel-plugin-transform-flow-enums: "npm:^0.0.2" react-refresh: "npm:^0.14.0" peerDependencies: "@babel/core": "*" - checksum: 10/e35d3bd86caaf49abc2703d43319aa68195f8f9c48b42f8dc70ead5127b41178bda5d6a39c64f39c12a3b1eeafc1ddd4746e2d108fec1619adcc0d664702e7d5 + checksum: 10/204cf777078649203c18b5ed5765577641312ab47dbaa4415bb3805ec928c0ef36177e3036984d4d44dc986477e3bf68a0b59642e67b2a121831acf25b286a30 languageName: node linkType: hard @@ -5176,9 +5277,9 @@ __metadata: languageName: node linkType: hard -"@react-native/codegen@npm:0.83.2": - version: 0.83.2 - resolution: "@react-native/codegen@npm:0.83.2" +"@react-native/codegen@npm:0.83.6": + version: 0.83.6 + resolution: "@react-native/codegen@npm:0.83.6" dependencies: "@babel/core": "npm:^7.25.2" "@babel/parser": "npm:^7.25.3" @@ -5189,7 +5290,7 @@ __metadata: yargs: "npm:^17.6.2" peerDependencies: "@babel/core": "*" - checksum: 10/757095d1b7b20574012751bd647242bb2e5b67b14afb6c5a2b80e51bb36e474aaf34c6c6600cc09b23745bc38469dab99ec56c53f7a8737ca1ec4b9aa52fbdde + checksum: 10/5f819725e455953b387ae098ab05da0950f790ab5337f1131c779895f0de576c4b491f1017b7ce10c3530e55566859d398386e0e65baaa19089c5c5edb430e37 languageName: node linkType: hard @@ -5256,16 +5357,16 @@ __metadata: languageName: node linkType: hard -"@react-native/community-cli-plugin@npm:0.83.2": - version: 0.83.2 - resolution: "@react-native/community-cli-plugin@npm:0.83.2" +"@react-native/community-cli-plugin@npm:0.83.6": + version: 0.83.6 + resolution: "@react-native/community-cli-plugin@npm:0.83.6" dependencies: - "@react-native/dev-middleware": "npm:0.83.2" + "@react-native/dev-middleware": "npm:0.83.6" debug: "npm:^4.4.0" invariant: "npm:^2.2.4" - metro: "npm:^0.83.3" - metro-config: "npm:^0.83.3" - metro-core: "npm:^0.83.3" + metro: "npm:^0.83.6" + metro-config: "npm:^0.83.6" + metro-core: "npm:^0.83.6" semver: "npm:^7.1.3" peerDependencies: "@react-native-community/cli": "*" @@ -5275,7 +5376,7 @@ __metadata: optional: true "@react-native/metro-config": optional: true - checksum: 10/2683c34c2c8c56fa9d765baf97701893ff57816f606d115938be0684ac7829782721d927d7957e7075d8399d7cbfa71af205f79fae3bc7e633b5c54ed1de8dbb + checksum: 10/48ef4b15aa34d3b39217d8ce1b4508259f88da5526a08107cc92a38a07876c41cad09de1d8eb12955ac5e992b44492a071fd73b5a4315da8b1e9c276a349f479 languageName: node linkType: hard @@ -5316,10 +5417,10 @@ __metadata: languageName: node linkType: hard -"@react-native/debugger-frontend@npm:0.83.2": - version: 0.83.2 - resolution: "@react-native/debugger-frontend@npm:0.83.2" - checksum: 10/17e9452c73fc464daa13655d8a9e5868298e47b6b3e67ca41d624f176c6c493ae37c4a56a4b1106edf0a85902127501e8e29d1bf70dcf5205bba7a81a304f359 +"@react-native/debugger-frontend@npm:0.83.6": + version: 0.83.6 + resolution: "@react-native/debugger-frontend@npm:0.83.6" + checksum: 10/d9f40d58e88f80fefca26cccd7e44637fe61a7f8bd68727b1b3a6f8070ef030c54f805fdc34dd67e6e214a1def8c835bed7e7b2d2e1b0d19c342fb733e0f9460 languageName: node linkType: hard @@ -5340,13 +5441,13 @@ __metadata: languageName: node linkType: hard -"@react-native/debugger-shell@npm:0.83.2": - version: 0.83.2 - resolution: "@react-native/debugger-shell@npm:0.83.2" +"@react-native/debugger-shell@npm:0.83.6": + version: 0.83.6 + resolution: "@react-native/debugger-shell@npm:0.83.6" dependencies: cross-spawn: "npm:^7.0.6" fb-dotslash: "npm:0.5.8" - checksum: 10/214590025f5dd7781dc906c2945dd21f595bc5534c807e2af29133175dcb05d9be979a95857ff186bcc97cc307a99d26a6b993798c643cee7d5203bb56c64b47 + checksum: 10/d4f2c3096b7a976f1881db60a6a8e66d7951662f311cb4b9cc368bc753cb3e15c29cfdb1d6bf0f975a102eba78c94994d62dea5fdb37ef1d04f50f865af57a0a languageName: node linkType: hard @@ -5400,13 +5501,13 @@ __metadata: languageName: node linkType: hard -"@react-native/dev-middleware@npm:0.83.2": - version: 0.83.2 - resolution: "@react-native/dev-middleware@npm:0.83.2" +"@react-native/dev-middleware@npm:0.83.6": + version: 0.83.6 + resolution: "@react-native/dev-middleware@npm:0.83.6" dependencies: "@isaacs/ttlcache": "npm:^1.4.1" - "@react-native/debugger-frontend": "npm:0.83.2" - "@react-native/debugger-shell": "npm:0.83.2" + "@react-native/debugger-frontend": "npm:0.83.6" + "@react-native/debugger-shell": "npm:0.83.6" chrome-launcher: "npm:^0.15.2" chromium-edge-launcher: "npm:^0.2.0" connect: "npm:^3.6.5" @@ -5416,7 +5517,7 @@ __metadata: open: "npm:^7.0.3" serve-static: "npm:^1.16.2" ws: "npm:^7.5.10" - checksum: 10/cb5f90aa8c64c20efeaa36a9cc66ea8e7180a8d5b6c1068d52f42e269d4786049829a9b620f5090542c48f0dbb4100527bb61fbe0db8b39050cfc0f76a94388e + checksum: 10/16b9bd3f6219ca9584408d436a6d837ee81496ee2919a39b112820a145d237e143123a2ed0b810aa3004d62fdf9aad291ece7a31f282a95098ad5a0a76df4af2 languageName: node linkType: hard @@ -5514,10 +5615,10 @@ __metadata: languageName: node linkType: hard -"@react-native/gradle-plugin@npm:0.83.2": - version: 0.83.2 - resolution: "@react-native/gradle-plugin@npm:0.83.2" - checksum: 10/09517663800636f2352ce95c183e51c5c69037baf93bf6cf3cad947fe062510b77aca38dc8e85164fad54c73db8a8e83968652f76ee1d9965e2e417da45522c0 +"@react-native/gradle-plugin@npm:0.83.6": + version: 0.83.6 + resolution: "@react-native/gradle-plugin@npm:0.83.6" + checksum: 10/b2d83f8277edd931e0ff228698e1ec6aefffcd71fa93cf23b9564b5a72788e8fbccc13543eb89f9510781ae86e5041e517d5f8f3e04a5a48925580edb0ab12a0 languageName: node linkType: hard @@ -5557,10 +5658,10 @@ __metadata: languageName: node linkType: hard -"@react-native/js-polyfills@npm:0.83.2": - version: 0.83.2 - resolution: "@react-native/js-polyfills@npm:0.83.2" - checksum: 10/da869dba00ff02561e1dd017d617ac1b48286a465e419ce750bec0963cead0b51bd100507e977cd6c9ba6bb983b5e76eb0fecc7842fed69db23e6a968557c18e +"@react-native/js-polyfills@npm:0.83.6": + version: 0.83.6 + resolution: "@react-native/js-polyfills@npm:0.83.6" + checksum: 10/455dd7f69ec7b187790c3a2db1bc128199cf340ea36702ebaaee87d37c20dbbcbf75c69c0c91e82f4b320af9bb7a70fe537b0842454f2add2040902edfdaf164 languageName: node linkType: hard @@ -5611,10 +5712,10 @@ __metadata: languageName: node linkType: hard -"@react-native/normalize-colors@npm:0.83.2": - version: 0.83.2 - resolution: "@react-native/normalize-colors@npm:0.83.2" - checksum: 10/57e09d151ac697b55207fd9ef47de79598682610c13d6d6c40be2de40abd1c0bc2b52e8acadead779ab19538e8a56e17f205a3c13ab7fa51b368e342c9f94d08 +"@react-native/normalize-colors@npm:0.83.6": + version: 0.83.6 + resolution: "@react-native/normalize-colors@npm:0.83.6" + checksum: 10/b59b27a7889293f1dce5fcfb12151e0927099c3446f0f603e1f2d5e90cb91634cbf5d0d4dc6d67ee7ada4680f3533e96845ec64084cc97944280faf94caa209c languageName: node linkType: hard @@ -5673,9 +5774,9 @@ __metadata: languageName: node linkType: hard -"@react-native/virtualized-lists@npm:0.83.2": - version: 0.83.2 - resolution: "@react-native/virtualized-lists@npm:0.83.2" +"@react-native/virtualized-lists@npm:0.83.6": + version: 0.83.6 + resolution: "@react-native/virtualized-lists@npm:0.83.6" dependencies: invariant: "npm:^2.2.4" nullthrows: "npm:^1.1.1" @@ -5686,7 +5787,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/ba4d794330f869f51565abb1717af929a817bcfdfabb6684b3307e4289706345db174062ed79ca6b340f5a7b2952e02e62a821cfb86bc24f41bbf2ee931a882c + checksum: 10/1f888e09f09a16071978fc7e2c7aa69a2a212fbaf82fae69e74ecd181d8aa0e878a3942e42557bf3dc73e8c93e0f98b7c52fe30836228b33803e3053e39fb1dc languageName: node linkType: hard @@ -5724,6 +5825,23 @@ __metadata: languageName: node linkType: hard +"@react-navigation/bottom-tabs@npm:^7.15.5": + version: 7.15.13 + resolution: "@react-navigation/bottom-tabs@npm:7.15.13" + dependencies: + "@react-navigation/elements": "npm:^2.9.17" + color: "npm:^4.2.3" + sf-symbols-typescript: "npm:^2.1.0" + peerDependencies: + "@react-navigation/native": ^7.2.4 + react: ">= 18.2.0" + react-native: "*" + react-native-safe-area-context: ">= 4.0.0" + react-native-screens: ">= 4.0.0" + checksum: 10/2110f10081ae45646dfd9b36a2c83c64beedd7b53186b3b2affff99f736def51d43bdf6518e64b13454b8e5a80b4e2959a73fc5a9f0a0d16d82014f6c8d641da + languageName: node + linkType: hard + "@react-navigation/core@npm:^7.16.1": version: 7.16.1 resolution: "@react-navigation/core@npm:7.16.1" @@ -5762,7 +5880,27 @@ __metadata: languageName: node linkType: hard -"@react-navigation/native-stack@npm:^7.10.1, @react-navigation/native-stack@npm:^7.14.5, @react-navigation/native-stack@npm:^7.3.16": +"@react-navigation/elements@npm:^2.9.17": + version: 2.9.17 + resolution: "@react-navigation/elements@npm:2.9.17" + dependencies: + color: "npm:^4.2.3" + use-latest-callback: "npm:^0.2.4" + use-sync-external-store: "npm:^1.5.0" + peerDependencies: + "@react-native-masked-view/masked-view": ">= 0.2.0" + "@react-navigation/native": ^7.2.4 + react: ">= 18.2.0" + react-native: "*" + react-native-safe-area-context: ">= 4.0.0" + peerDependenciesMeta: + "@react-native-masked-view/masked-view": + optional: true + checksum: 10/31a7896f2090b36a39045afac0b069d0589508c321fa403719b66bc0d8ad2968441e62c3a8a89be1beb67152a2c6cbbc6e4e12c19772f93308ec4465cceb1ba8 + languageName: node + linkType: hard + +"@react-navigation/native-stack@npm:^7.14.5, @react-navigation/native-stack@npm:^7.3.16": version: 7.14.5 resolution: "@react-navigation/native-stack@npm:7.14.5" dependencies: @@ -5805,59 +5943,59 @@ __metadata: languageName: node linkType: hard -"@rock-js/platform-android@npm:^0.12.12": - version: 0.12.12 - resolution: "@rock-js/platform-android@npm:0.12.12" +"@rock-js/platform-android@npm:^0.13.3": + version: 0.13.3 + resolution: "@rock-js/platform-android@npm:0.13.3" dependencies: "@react-native-community/cli-config-android": "npm:^20.0.0" - "@rock-js/tools": "npm:^0.12.12" + "@rock-js/tools": "npm:^0.13.3" tslib: "npm:^2.3.0" - checksum: 10/c909218db9d6b4a58a0ed30e3d81e090cd39bb2a325af85f8ac4608eb50db26fc9aaed11de5518cd68a68d6d4e17ea8055f7f346d82091c2445415f2788317ea + checksum: 10/00c15b4364b8f168d0159529782604ce22d67fc1e0dd05b25168e5cf8feb3226f3190d1d8a3995fe2b3eb937d6b016a422a6d07f66a32f163a9ea1db3f85e97c languageName: node linkType: hard -"@rock-js/platform-apple-helpers@npm:^0.12.12": - version: 0.12.12 - resolution: "@rock-js/platform-apple-helpers@npm:0.12.12" +"@rock-js/platform-apple-helpers@npm:^0.13.3": + version: 0.13.3 + resolution: "@rock-js/platform-apple-helpers@npm:0.13.3" dependencies: "@react-native-community/cli-config": "npm:^20.0.0" "@react-native-community/cli-config-apple": "npm:^20.0.0" - "@rock-js/tools": "npm:^0.12.12" + "@rock-js/tools": "npm:^0.13.3" adm-zip: "npm:^0.5.16" fast-xml-parser: "npm:^4.5.0" tslib: "npm:^2.3.0" - checksum: 10/092cabda57874d6d9295f00b7879cc138432d40ef4a476f5bd2ec9bd3b81939e8b996e9b7d69d65c78ae48f088eafe7fe369a2c810e623024d146ecd38e1231d + checksum: 10/3e66ce7833bbe85ea035540087d17047d69d455b4c25116eb88377cc589319e6cecd1bcaee525011f5ec85ce727029ac6f2b13760dfc6f174495ea95e7cc3fde languageName: node linkType: hard -"@rock-js/plugin-brownfield-android@npm:^0.12.12": - version: 0.12.12 - resolution: "@rock-js/plugin-brownfield-android@npm:0.12.12" +"@rock-js/plugin-brownfield-android@npm:^0.13.3": + version: 0.13.3 + resolution: "@rock-js/plugin-brownfield-android@npm:0.13.3" dependencies: "@react-native-community/cli-config-android": "npm:^20.0.0" - "@rock-js/platform-android": "npm:^0.12.12" - "@rock-js/tools": "npm:^0.12.12" + "@rock-js/platform-android": "npm:^0.13.3" + "@rock-js/tools": "npm:^0.13.3" tslib: "npm:^2.3.0" - checksum: 10/67ec3b84e16f84a4f44c3e2b8855dad517ad18049790cf4724740d1d7b7a70406ba3023cf86a29167a4e950ca88814f43e3fec5e15bbeab850f1bed7eee7b036 + checksum: 10/ecb183c2fbeb1b989b2340e4abd20030500df74bdb629855800ed97cd1a83c2e4a671890d65f11e8f802d00b0e36619bef64c09a7a39f071403ba52d9d291791 languageName: node linkType: hard -"@rock-js/plugin-brownfield-ios@npm:^0.12.12": - version: 0.12.12 - resolution: "@rock-js/plugin-brownfield-ios@npm:0.12.12" +"@rock-js/plugin-brownfield-ios@npm:^0.13.3": + version: 0.13.3 + resolution: "@rock-js/plugin-brownfield-ios@npm:0.13.3" dependencies: "@react-native-community/cli-config-apple": "npm:^20.0.0" "@react-native-community/cli-types": "npm:^20.0.0" - "@rock-js/platform-apple-helpers": "npm:^0.12.12" - "@rock-js/tools": "npm:^0.12.12" + "@rock-js/platform-apple-helpers": "npm:^0.13.3" + "@rock-js/tools": "npm:^0.13.3" tslib: "npm:^2.3.0" - checksum: 10/4f7a8753753000e92abfba8689083599df2f671bf4c78b7ee353ac5766fc7a2018cb03a32135657fcf4b3f0ebae82375086104bf4546fccc2a27b42e13f460cc + checksum: 10/4dbd9c3f4a0985126c946f30d910fcdadf110e8f1ace3c188105128f007080dfd42b51d7bb18b65a55d1f7af8fff562e0113cffe8475bfd8398a2cc87cad951f languageName: node linkType: hard -"@rock-js/tools@npm:^0.12.12": - version: 0.12.12 - resolution: "@rock-js/tools@npm:0.12.12" +"@rock-js/tools@npm:^0.13.3": + version: 0.13.3 + resolution: "@rock-js/tools@npm:0.13.3" dependencies: "@clack/prompts": "npm:^0.11.0" adm-zip: "npm:^0.5.16" @@ -5869,7 +6007,7 @@ __metadata: string-argv: "npm:^0.3.2" tar: "npm:^7.5.1" tslib: "npm:^2.3.0" - checksum: 10/a5cc371798d97585034c604e3805ae5f022b5a133672ee80cd6ba80f70fc3e91943e01a9b2d40886b84c0b078b97b3dfa96a7938fbebb1c12f0ce890812c21c2 + checksum: 10/5034f552e8dcaf3aedaa8f511cb08d073672ff76c37faeb07d35aacf2188082477d196065de8d6fc06f429eda64542d497797436a1179c19c26b72a71bbe6bc2 languageName: node linkType: hard @@ -7969,9 +8107,9 @@ __metadata: languageName: node linkType: hard -"babel-preset-expo@npm:~55.0.11": - version: 55.0.11 - resolution: "babel-preset-expo@npm:55.0.11" +"babel-preset-expo@npm:~55.0.21": + version: 55.0.21 + resolution: "babel-preset-expo@npm:55.0.21" dependencies: "@babel/generator": "npm:^7.20.5" "@babel/helper-module-imports": "npm:^7.25.9" @@ -7989,7 +8127,7 @@ __metadata: "@babel/plugin-transform-runtime": "npm:^7.24.7" "@babel/preset-react": "npm:^7.22.15" "@babel/preset-typescript": "npm:^7.23.0" - "@react-native/babel-preset": "npm:0.83.2" + "@react-native/babel-preset": "npm:0.83.6" babel-plugin-react-compiler: "npm:^1.0.0" babel-plugin-react-native-web: "npm:~0.21.0" babel-plugin-syntax-hermes-parser: "npm:^0.32.0" @@ -7999,7 +8137,7 @@ __metadata: peerDependencies: "@babel/runtime": ^7.20.0 expo: "*" - expo-widgets: ^55.0.4 + expo-widgets: ^55.0.17 react-refresh: ">=0.14.0 <1.0.0" peerDependenciesMeta: "@babel/runtime": @@ -8008,7 +8146,7 @@ __metadata: optional: true expo-widgets: optional: true - checksum: 10/4fd4ef180038f5d3a39003424bd4cbc9ddadeede87f3930a3b342f8d4d0202cd79899faa48c4445ed3a2f79a576cb0807a51c930df73ddb9a30cc68e3b0c26ab + checksum: 10/fcfaca81817bc48934af802b0559bb4c0881627fcffe3d4e413445abada6145b61c2273c812ebd970d97f8452708ca9f7b265780a00226157a26963f95c0e7fa languageName: node linkType: hard @@ -9257,10 +9395,10 @@ __metadata: languageName: node linkType: hard -"dnssd-advertise@npm:^1.1.3": - version: 1.1.3 - resolution: "dnssd-advertise@npm:1.1.3" - checksum: 10/76cb498953c7e455d85b2092a977eba7c347ba7b14892d812b2a089587c97e72d87d47967c5c77e64cdbe6706a8153b848e9df790c91b15cc829e2415e1afa6e +"dnssd-advertise@npm:^1.1.4": + version: 1.1.4 + resolution: "dnssd-advertise@npm:1.1.4" + checksum: 10/b8a50bac99bc96d79a42bec68fe7ffcf233d5d6accf2be762dfdb2e11ce2cc1be462ab56e7162b60a34a9b90d7222c5e97d2e5d0f44983ab00956328e999d55f languageName: node linkType: hard @@ -10298,17 +10436,17 @@ __metadata: languageName: node linkType: hard -"expo-asset@npm:~55.0.8": - version: 55.0.8 - resolution: "expo-asset@npm:55.0.8" +"expo-asset@npm:~55.0.17": + version: 55.0.17 + resolution: "expo-asset@npm:55.0.17" dependencies: - "@expo/image-utils": "npm:^0.8.12" - expo-constants: "npm:~55.0.7" + "@expo/image-utils": "npm:^0.8.14" + expo-constants: "npm:~55.0.16" peerDependencies: expo: "*" react: "*" react-native: "*" - checksum: 10/82489ab1c703f915418c9a6acd212d612f0fe62fd170177906c5b20c8b3f7c845ecc229ab19dd369163df40f31dd0552fb0d2cbf9b46031cd489e9b669934342 + checksum: 10/41f8ae57ddfa3414331784fe9aba61172ee3cb4b91834b4318393b831e61428a08711194ba9aebc1dc18963c770d6b8b0aa135628f659e6e64469cad9a8ddc0e languageName: node linkType: hard @@ -10325,27 +10463,26 @@ __metadata: languageName: node linkType: hard -"expo-constants@npm:~55.0.7": - version: 55.0.7 - resolution: "expo-constants@npm:55.0.7" +"expo-constants@npm:~55.0.16": + version: 55.0.16 + resolution: "expo-constants@npm:55.0.16" dependencies: - "@expo/config": "npm:~55.0.8" - "@expo/env": "npm:~2.1.1" + "@expo/env": "npm:~2.1.2" peerDependencies: expo: "*" react-native: "*" - checksum: 10/04b8210fe8492e9ff572e250c5b4cd48985ae44af0ad53e951f3f93f680cbc637b9121903eb02c1065ff29f0f9c661eb31c07b4f3af5c8a4bb6cc0ef0f1fd618 + checksum: 10/80caf27dc74972b4a0245e2268be51748eb403622f30b9129c6838fa80740a88f31e4941f2f9c493fdd1cd0c8512b440dfc9cf78a26eb7ca92826c54cd4641b2 languageName: node linkType: hard -"expo-device@npm:~55.0.9": - version: 55.0.9 - resolution: "expo-device@npm:55.0.9" +"expo-device@npm:~55.0.16": + version: 55.0.16 + resolution: "expo-device@npm:55.0.16" dependencies: ua-parser-js: "npm:^0.7.33" peerDependencies: expo: "*" - checksum: 10/aa3e3cb1f5d238ac5da4c4a41e1a14582f802230869eb25f6b8e99140021ce7572eb8268431827539a14971368d8942b42c3a15a9cc45249d27262cb3945b2b0 + checksum: 10/016909837c058f5fe283cc187e56dd764115b304a9cc7e5dd0d86eaf11c3fb9fa779f8f1264b0fd41528168183654ad8becdac76d03eec5183f33aaba7884f86 languageName: node linkType: hard @@ -10359,13 +10496,13 @@ __metadata: languageName: node linkType: hard -"expo-file-system@npm:~55.0.10": - version: 55.0.10 - resolution: "expo-file-system@npm:55.0.10" +"expo-file-system@npm:~55.0.19": + version: 55.0.19 + resolution: "expo-file-system@npm:55.0.19" peerDependencies: expo: "*" react-native: "*" - checksum: 10/cf6cca908aed92fd226135f7c4609e8751ed69f512717076711db5b7697447b52a9b639204b5fd76ebc420a34e816deae647b939c273d00963a1e0654a8b3854 + checksum: 10/38d72bb8942664adbe4aefb4376bfba627b0f791e75d7821f0905be276027f6d7885bcd4d06b4664a414dea557e1f0b79b4982505229ee41093f1d2c79357ea5 languageName: node linkType: hard @@ -10382,27 +10519,27 @@ __metadata: languageName: node linkType: hard -"expo-font@npm:~55.0.4": - version: 55.0.4 - resolution: "expo-font@npm:55.0.4" +"expo-font@npm:~55.0.7": + version: 55.0.7 + resolution: "expo-font@npm:55.0.7" dependencies: fontfaceobserver: "npm:^2.1.0" peerDependencies: expo: "*" react: "*" react-native: "*" - checksum: 10/d590354e45c5a4a7a801ab04e4eec6b2a0bf42a2dde7e618f13cdf799d6ce86ccbfabb124de6b1f9ec0a077e74532429169d737948a1bdb0496b762fbf503c31 + checksum: 10/cde958ae7ce04040830d36159ebd4111f8ecf4aefaed51f5b68b475b1c205a4f380a37e25e84dddea93b13a59d61caf11c4e2cae67218d75e171d0d5aabb9854 languageName: node linkType: hard -"expo-glass-effect@npm:^55.0.8, expo-glass-effect@npm:~55.0.8": - version: 55.0.8 - resolution: "expo-glass-effect@npm:55.0.8" +"expo-glass-effect@npm:^55.0.11, expo-glass-effect@npm:~55.0.11": + version: 55.0.11 + resolution: "expo-glass-effect@npm:55.0.11" peerDependencies: expo: "*" react: "*" react-native: "*" - checksum: 10/b3bcd5a4e65fda96a417f9033bb895104f8142cce6bba8656fdbfa60ab7da39bdbb235c8d527593fea4115b4065455f12657afdfb7cacda3b5cf7f3c22b49f36 + checksum: 10/407ae77908e7dcbb1a00c09075ee7755bb5611318ca7308cc34e10d94544e33ff3ca199d4fcfccdd2efdc3cfd350cc96bf4f6403ebb9c925648f3739380a4b1a languageName: node linkType: hard @@ -10415,9 +10552,9 @@ __metadata: languageName: node linkType: hard -"expo-image@npm:^55.0.6, expo-image@npm:~55.0.6": - version: 55.0.6 - resolution: "expo-image@npm:55.0.6" +"expo-image@npm:^55.0.10, expo-image@npm:~55.0.10": + version: 55.0.10 + resolution: "expo-image@npm:55.0.10" dependencies: sf-symbols-typescript: "npm:^2.2.0" peerDependencies: @@ -10428,7 +10565,7 @@ __metadata: peerDependenciesMeta: react-native-web: optional: true - checksum: 10/69da92574bf4971e7be7350a3b874fa70ee8795c038f1fea54fe2f96d3a1345329cc36117fc362f11f9d8f77bbecf4161abe221cfa6cd0c70e8759160e7d1d6f + checksum: 10/df91255194350fcd68367137c793ee289c285bab416d357780215e383ae886efbbb022d72822f75d340f4aeeab2ea505c999ee69cdbaa2b1ec1cf730ef8040be languageName: node linkType: hard @@ -10457,26 +10594,26 @@ __metadata: languageName: node linkType: hard -"expo-keep-awake@npm:~55.0.4": - version: 55.0.4 - resolution: "expo-keep-awake@npm:55.0.4" +"expo-keep-awake@npm:~55.0.8": + version: 55.0.8 + resolution: "expo-keep-awake@npm:55.0.8" peerDependencies: expo: "*" react: "*" - checksum: 10/02c47078b3600be15a59574f4840ba7b9a65c491bd8436e7147d3e02d61993fc14f2ade5897301c18652fb206203001416a1b66242a239ebb9f29519560eae3a + checksum: 10/33e7be3350a8fbe08a1f895554f195c420912febd93e6cbb3ca0ce29dcaa1a4d665b339858af4a52c031ef387b45ad23668fa379fa424978f9794157feafb40b languageName: node linkType: hard -"expo-linking@npm:~55.0.7": - version: 55.0.7 - resolution: "expo-linking@npm:55.0.7" +"expo-linking@npm:~55.0.15": + version: 55.0.15 + resolution: "expo-linking@npm:55.0.15" dependencies: - expo-constants: "npm:~55.0.7" + expo-constants: "npm:~55.0.16" invariant: "npm:^2.2.4" peerDependencies: react: "*" react-native: "*" - checksum: 10/cc971074b39269415e95fbc5df1f02e31263b4170b5428da876bbad2c8c7de0ce2e7f6a4bdee71f9d02fac4665fd310571ba26acf15a89507704fd9658624375 + checksum: 10/43f171bfb33e67c3cc6cdcc7ac188a81b1651480824aae6b62752380194bcc9359da641590e9580e8e21250508e17ebfeb11a701ccbfbb6137ae2043717ec5c4 languageName: node linkType: hard @@ -10508,17 +10645,17 @@ __metadata: languageName: node linkType: hard -"expo-modules-autolinking@npm:55.0.9": - version: 55.0.9 - resolution: "expo-modules-autolinking@npm:55.0.9" +"expo-modules-autolinking@npm:55.0.21": + version: 55.0.21 + resolution: "expo-modules-autolinking@npm:55.0.21" dependencies: - "@expo/require-utils": "npm:^55.0.2" + "@expo/require-utils": "npm:^55.0.5" "@expo/spawn-async": "npm:^1.7.2" chalk: "npm:^4.1.0" commander: "npm:^7.2.0" bin: expo-modules-autolinking: bin/expo-modules-autolinking.js - checksum: 10/94ffdce56d5961ce9142eaec98ec53b113a5d9bb8bc4e7f150b79140a834df47f309a6dbb0f19938d38f61ea2c256eae2fc19f3b198a280eb6af254f9f3eb41e + checksum: 10/42e8180d9c3e0d9308468f4b38844b00280c68353a4cb04228b5537af69f280f5bffaed76e0de7e96154bb843624ff02fef19031b312dc77c7cefd3d1089d64c languageName: node linkType: hard @@ -10534,36 +10671,40 @@ __metadata: languageName: node linkType: hard -"expo-modules-core@npm:55.0.15": - version: 55.0.15 - resolution: "expo-modules-core@npm:55.0.15" +"expo-modules-core@npm:55.0.25": + version: 55.0.25 + resolution: "expo-modules-core@npm:55.0.25" dependencies: invariant: "npm:^2.2.4" peerDependencies: react: "*" react-native: "*" - checksum: 10/ee7526b3661c27ce1097d2943b9ed461430c8fbbb9dcfb7154f479640d6e1ed0435ebf045f35594efe3873f282dee9220c95695e7068e549100b27dbc95ed788 + react-native-worklets: ^0.7.4 || ^0.8.0 + peerDependenciesMeta: + react-native-worklets: + optional: true + checksum: 10/9a1121a46d15ba585f05893c4b785ed767bf595722b19c181a4867fca982ac769b295d230f5197345b91353a8202c16f92005923f7671ddf5166c85678124657 languageName: node linkType: hard -"expo-router@npm:~55.0.5": - version: 55.0.5 - resolution: "expo-router@npm:55.0.5" +"expo-router@npm:~55.0.14": + version: 55.0.14 + resolution: "expo-router@npm:55.0.14" dependencies: - "@expo/metro-runtime": "npm:^55.0.6" - "@expo/schema-utils": "npm:^55.0.2" + "@expo/metro-runtime": "npm:^55.0.11" + "@expo/schema-utils": "npm:^55.0.4" "@radix-ui/react-slot": "npm:^1.2.0" "@radix-ui/react-tabs": "npm:^1.1.12" - "@react-navigation/bottom-tabs": "npm:^7.10.1" - "@react-navigation/native": "npm:^7.1.28" - "@react-navigation/native-stack": "npm:^7.10.1" + "@react-navigation/bottom-tabs": "npm:^7.15.5" + "@react-navigation/native": "npm:^7.1.33" + "@react-navigation/native-stack": "npm:^7.14.5" client-only: "npm:^0.0.1" debug: "npm:^4.3.4" escape-string-regexp: "npm:^4.0.0" - expo-glass-effect: "npm:^55.0.8" - expo-image: "npm:^55.0.6" - expo-server: "npm:^55.0.6" - expo-symbols: "npm:^55.0.5" + expo-glass-effect: "npm:^55.0.11" + expo-image: "npm:^55.0.10" + expo-server: "npm:^55.0.9" + expo-symbols: "npm:^55.0.8" fast-deep-equal: "npm:^3.1.3" invariant: "npm:^2.2.4" nanoid: "npm:^3.3.8" @@ -10577,13 +10718,13 @@ __metadata: use-latest-callback: "npm:^0.2.1" vaul: "npm:^1.1.2" peerDependencies: - "@expo/log-box": 55.0.7 - "@expo/metro-runtime": ^55.0.6 - "@react-navigation/drawer": ^7.7.2 + "@expo/log-box": 55.0.12 + "@expo/metro-runtime": ^55.0.11 + "@react-navigation/drawer": ^7.9.4 "@testing-library/react-native": ">= 13.2.0" expo: "*" - expo-constants: ^55.0.7 - expo-linking: ^55.0.7 + expo-constants: ^55.0.16 + expo-linking: ^55.0.15 react: "*" react-dom: "*" react-native: "*" @@ -10608,7 +10749,7 @@ __metadata: optional: true react-server-dom-webpack: optional: true - checksum: 10/518cfca237a8126245befce6d2b21838f815e489f3989161d04f6be87e4d68785b7dad46402b734c7a5fba8d66c42382fc4f8fd143116bb69a1935f34c5d214d + checksum: 10/c795fe1ae1f64b886986f54a92fa284e769fbac0181422a62623ec01eff3c3f8c8e17c29fe7ffe80c1f156a5aed53c1c22f17f273cd2c7d749781826a11d370b languageName: node linkType: hard @@ -10681,10 +10822,10 @@ __metadata: languageName: node linkType: hard -"expo-server@npm:^55.0.6": - version: 55.0.6 - resolution: "expo-server@npm:55.0.6" - checksum: 10/966ce7100313ed7ba2f9298eee14e828f8eac420636d0a1b59f60fd6aecfee205a5eea53883c9fa107b6bda15ab00cf37349c4fabfa7993c3f7b8039978c3318 +"expo-server@npm:^55.0.9": + version: 55.0.9 + resolution: "expo-server@npm:55.0.9" + checksum: 10/3480ebc69fe7ae6c6d4b3aa9b848c91f8482f0ee8659e08415731068685562eeca112b0407683cdfdd7b9d76c79ab2e79e67f459cd9383459aa3772d8826dec2 languageName: node linkType: hard @@ -10699,14 +10840,14 @@ __metadata: languageName: node linkType: hard -"expo-splash-screen@npm:~55.0.10": - version: 55.0.10 - resolution: "expo-splash-screen@npm:55.0.10" +"expo-splash-screen@npm:~55.0.20": + version: 55.0.20 + resolution: "expo-splash-screen@npm:55.0.20" dependencies: - "@expo/prebuild-config": "npm:^55.0.8" + "@expo/prebuild-config": "npm:^55.0.17" peerDependencies: expo: "*" - checksum: 10/9966837daff34d5d0a0b0701b7183cbfac3aafbc4149a2d09fce8d9f0c0271d2c1919ab6de826e81d6a090cba3f347c7ebbec06138995cb8552dcd8464fb5dc5 + checksum: 10/11ef87698de1e412633f25b0b97be0782970370f78933737c6d77a2bdc32dab45b12281e87791deb63db1213cde08ce11ca896c7214c5b5fc3759675ce705efb languageName: node linkType: hard @@ -10722,21 +10863,21 @@ __metadata: languageName: node linkType: hard -"expo-status-bar@npm:~55.0.4": - version: 55.0.4 - resolution: "expo-status-bar@npm:55.0.4" +"expo-status-bar@npm:~55.0.6": + version: 55.0.6 + resolution: "expo-status-bar@npm:55.0.6" dependencies: react-native-is-edge-to-edge: "npm:^1.2.1" peerDependencies: react: "*" react-native: "*" - checksum: 10/2f53930386ede3c46c78cb678d1ef7d66a330a703e3c24afd835e8a301477dba697c00e1deae25c1dd8406f17742e3a94e33d57a8c1b1f4365bcfe0084b0567c + checksum: 10/0459cc356f03e0161c6a8ba85233672dde1603c80432c8090c3b1de4740aa12fde571475fea2b9d53af7b8a3580ac3b91b859c63baf7fcfb747c8efaea3d338f languageName: node linkType: hard -"expo-symbols@npm:^55.0.5, expo-symbols@npm:~55.0.5": - version: 55.0.5 - resolution: "expo-symbols@npm:55.0.5" +"expo-symbols@npm:^55.0.8, expo-symbols@npm:~55.0.8": + version: 55.0.8 + resolution: "expo-symbols@npm:55.0.8" dependencies: "@expo-google-fonts/material-symbols": "npm:^0.4.1" sf-symbols-typescript: "npm:^2.0.0" @@ -10745,7 +10886,7 @@ __metadata: expo-font: "*" react: "*" react-native: "*" - checksum: 10/992834df221bd792ff251fc622bd5c6ecb3f1c1862a58273c9edef5e9934870c8f53693871a53dff20bc37792cd16e886fc5475e2e98de8955f95bcd825cc61d + checksum: 10/2b7d066a7d63583f4424b1c25f7b103fd905cee39acea929bb3b5189fa799fa731d6877a61f30b6c16d46715df6273b4e5f6eabbc2146da21c644214d8507b39 languageName: node linkType: hard @@ -10761,11 +10902,11 @@ __metadata: languageName: node linkType: hard -"expo-system-ui@npm:~55.0.9": - version: 55.0.9 - resolution: "expo-system-ui@npm:55.0.9" +"expo-system-ui@npm:~55.0.17": + version: 55.0.17 + resolution: "expo-system-ui@npm:55.0.17" dependencies: - "@react-native/normalize-colors": "npm:0.83.2" + "@react-native/normalize-colors": "npm:0.83.6" debug: "npm:^4.3.2" peerDependencies: expo: "*" @@ -10774,7 +10915,7 @@ __metadata: peerDependenciesMeta: react-native-web: optional: true - checksum: 10/3ff1d6c2349c18f0c73d089ff591ce83ce434b9aa9ebed43249fdb1f627ddfd9d754203e5ad054d774f815b2676753e84081c0bc61c6dd413dc8b9a41bb33ee2 + checksum: 10/a3baa00ede3059fd22a2f59aa8464c3712c6244b37742ed75bcf4515a8355b9d1473f6847612d19c08d28ba782117a2808c374812e089523d2a36d818f4f86e7 languageName: node linkType: hard @@ -10805,13 +10946,13 @@ __metadata: languageName: node linkType: hard -"expo-web-browser@npm:~55.0.8": - version: 55.0.9 - resolution: "expo-web-browser@npm:55.0.9" +"expo-web-browser@npm:~55.0.15": + version: 55.0.15 + resolution: "expo-web-browser@npm:55.0.15" peerDependencies: expo: "*" react-native: "*" - checksum: 10/0d7edbf9e046fbe98bc74d64c97b94477cde5904338b12356a646f87baafa4bcc59a54fbc88e1f231a08d2819c9149785afe8ecc047ee88ab3aec8f061640b3f + checksum: 10/94a72d924eb0af09ba36ae152e6a7d8039ac94597e0c9174c765febb9b55cb32b3570fa7f1522c47403dee9fe4f18986727b92da265c66dc4c0cdca3b1a76159 languageName: node linkType: hard @@ -10861,30 +11002,30 @@ __metadata: languageName: node linkType: hard -"expo@npm:~55.0.5": - version: 55.0.6 - resolution: "expo@npm:55.0.6" +"expo@npm:~55.0.23": + version: 55.0.23 + resolution: "expo@npm:55.0.23" dependencies: "@babel/runtime": "npm:^7.20.0" - "@expo/cli": "npm:55.0.16" - "@expo/config": "npm:~55.0.8" - "@expo/config-plugins": "npm:~55.0.6" - "@expo/devtools": "npm:55.0.2" - "@expo/fingerprint": "npm:0.16.6" - "@expo/local-build-cache-provider": "npm:55.0.6" - "@expo/log-box": "npm:55.0.7" - "@expo/metro": "npm:~54.2.0" - "@expo/metro-config": "npm:55.0.9" + "@expo/cli": "npm:55.0.29" + "@expo/config": "npm:~55.0.16" + "@expo/config-plugins": "npm:~55.0.8" + "@expo/devtools": "npm:55.0.3" + "@expo/fingerprint": "npm:0.16.7" + "@expo/local-build-cache-provider": "npm:55.0.12" + "@expo/log-box": "npm:55.0.12" + "@expo/metro": "npm:~55.1.1" + "@expo/metro-config": "npm:55.0.20" "@expo/vector-icons": "npm:^15.0.2" "@ungap/structured-clone": "npm:^1.3.0" - babel-preset-expo: "npm:~55.0.11" - expo-asset: "npm:~55.0.8" - expo-constants: "npm:~55.0.7" - expo-file-system: "npm:~55.0.10" - expo-font: "npm:~55.0.4" - expo-keep-awake: "npm:~55.0.4" - expo-modules-autolinking: "npm:55.0.9" - expo-modules-core: "npm:55.0.15" + babel-preset-expo: "npm:~55.0.21" + expo-asset: "npm:~55.0.17" + expo-constants: "npm:~55.0.16" + expo-file-system: "npm:~55.0.19" + expo-font: "npm:~55.0.7" + expo-keep-awake: "npm:~55.0.8" + expo-modules-autolinking: "npm:55.0.21" + expo-modules-core: "npm:55.0.25" pretty-format: "npm:^29.7.0" react-refresh: "npm:^0.14.2" whatwg-url-minimum: "npm:^0.1.1" @@ -10905,7 +11046,7 @@ __metadata: expo: bin/cli expo-modules-autolinking: bin/autolinking fingerprint: bin/fingerprint - checksum: 10/d310d49c05861d240cd793f63688e68a68ed8376083e8f95e25b647c797248efb4d487ec6f6f7aa68a221f87ac4b20afcc1356ee42dd9676f4b99d311ad5800e + checksum: 10/643a838e3148b850bf29ff3b6c2850e47521db7bd3afd2e27b1f7576dfcb60ead9a39dbca73ead31af8023cd256a12dd1d6281e60f6c14b63f7f988e30d6f40c languageName: node linkType: hard @@ -11073,10 +11214,10 @@ __metadata: languageName: node linkType: hard -"fetch-nodeshim@npm:^0.4.6": - version: 0.4.9 - resolution: "fetch-nodeshim@npm:0.4.9" - checksum: 10/6afd1e97df591ac1b5ed75df58f6970f5a4a182a5fa0adc07fdf8664c1fcb7bf87624ad6683465d58581a2709da5bf3ea96e96e4868a7f918b364ec3aed5de41 +"fetch-nodeshim@npm:^0.4.10": + version: 0.4.10 + resolution: "fetch-nodeshim@npm:0.4.10" + checksum: 10/4abc48fe6bb2c44493f4d781a8d746e99133b18e456f44626fde36852e9f63fe7a3f71c1b0316e49725398c19b46d503389b4622e6e62b81f70add6da4b43cd7 languageName: node linkType: hard @@ -11860,6 +12001,13 @@ __metadata: languageName: node linkType: hard +"hermes-estree@npm:0.35.0": + version: 0.35.0 + resolution: "hermes-estree@npm:0.35.0" + checksum: 10/d10283d0189ab2270ecae08632ed4f15eb79f206add4960d198aa6efd5686e1c92ed37c17a020c730281e46ff2f56661f3d787bdfb1692218c1495b329049747 + languageName: node + linkType: hard + "hermes-parser@npm:0.29.1, hermes-parser@npm:^0.29.1": version: 0.29.1 resolution: "hermes-parser@npm:0.29.1" @@ -11905,6 +12053,15 @@ __metadata: languageName: node linkType: hard +"hermes-parser@npm:0.35.0": + version: 0.35.0 + resolution: "hermes-parser@npm:0.35.0" + dependencies: + hermes-estree: "npm:0.35.0" + checksum: 10/62be25fa41b708db21c4db9153b0d60cfbf9bd4645f1712eb559b3be8c191266b5b381df60fbbc45416799f73c2361eb69a81eead21dc5159fe2ea72f946d5f7 + languageName: node + linkType: hard + "hermes-parser@npm:^0.25.1": version: 0.25.1 resolution: "hermes-parser@npm:0.25.1" @@ -13543,12 +13700,12 @@ __metadata: languageName: node linkType: hard -"lan-network@npm:^0.2.0": - version: 0.2.0 - resolution: "lan-network@npm:0.2.0" +"lan-network@npm:^0.2.1": + version: 0.2.1 + resolution: "lan-network@npm:0.2.1" bin: lan-network: dist/lan-network-cli.js - checksum: 10/221291b52503454b37b0f51670f4b4a2844b727e73a706ce6b5167813ac00d06be333e2a8c6be3dc645222b99cc246d68f59642dd892c80d76bd294802b28f94 + checksum: 10/6c39acaaa915c2cd89950c3347352b8743b50710ead1686652791bf93359fabc712affc423b340bb5eb4c2ff20a60120e5d8ddb2b4dced42fc3d8aad126cf525 languageName: node linkType: hard @@ -14386,6 +14543,19 @@ __metadata: languageName: node linkType: hard +"metro-babel-transformer@npm:0.83.7": + version: 0.83.7 + resolution: "metro-babel-transformer@npm:0.83.7" + dependencies: + "@babel/core": "npm:^7.25.2" + flow-enums-runtime: "npm:^0.0.6" + hermes-parser: "npm:0.35.0" + metro-cache-key: "npm:0.83.7" + nullthrows: "npm:^1.1.1" + checksum: 10/b213f9479daf690b11117c63a628e036ffcbb993fee571565142a34c9ae5c7ef1839eb7759c676d910edd58c1f442337f4d834de794904397091205f275b7f24 + languageName: node + linkType: hard + "metro-babel-transformer@npm:0.84.2": version: 0.84.2 resolution: "metro-babel-transformer@npm:0.84.2" @@ -14416,6 +14586,15 @@ __metadata: languageName: node linkType: hard +"metro-cache-key@npm:0.83.7": + version: 0.83.7 + resolution: "metro-cache-key@npm:0.83.7" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/bc0110eb61ce5903dae3992528f6933146889883d0999f8f01464a3b5bdd255dffa6a562bb921738004194cdf55d175b96cfaffdc17a5df6468c629b22ff7286 + languageName: node + linkType: hard + "metro-cache-key@npm:0.84.2": version: 0.84.2 resolution: "metro-cache-key@npm:0.84.2" @@ -14449,6 +14628,18 @@ __metadata: languageName: node linkType: hard +"metro-cache@npm:0.83.7": + version: 0.83.7 + resolution: "metro-cache@npm:0.83.7" + dependencies: + exponential-backoff: "npm:^3.1.1" + flow-enums-runtime: "npm:^0.0.6" + https-proxy-agent: "npm:^7.0.5" + metro-core: "npm:0.83.7" + checksum: 10/3f080c954fcb6e5894f7b6c4d7d8cdf03ecd1a5c175a5dcdb2d9c1751f135f7fdadea3014456524288baa3a4504a313bfd7872080f75b4da2f7c60c91b6bd88e + languageName: node + linkType: hard + "metro-cache@npm:0.84.2": version: 0.84.2 resolution: "metro-cache@npm:0.84.2" @@ -14477,7 +14668,7 @@ __metadata: languageName: node linkType: hard -"metro-config@npm:0.83.5, metro-config@npm:^0.83.1, metro-config@npm:^0.83.3": +"metro-config@npm:0.83.5, metro-config@npm:^0.83.1": version: 0.83.5 resolution: "metro-config@npm:0.83.5" dependencies: @@ -14493,6 +14684,22 @@ __metadata: languageName: node linkType: hard +"metro-config@npm:0.83.7, metro-config@npm:^0.83.6": + version: 0.83.7 + resolution: "metro-config@npm:0.83.7" + dependencies: + connect: "npm:^3.6.5" + flow-enums-runtime: "npm:^0.0.6" + jest-validate: "npm:^29.7.0" + metro: "npm:0.83.7" + metro-cache: "npm:0.83.7" + metro-core: "npm:0.83.7" + metro-runtime: "npm:0.83.7" + yaml: "npm:^2.6.1" + checksum: 10/e73a76b1b5a2bd27d1e1cd3b221ddef4ec7a19a00379bd9ad124038d7705810b75fcaa44a7dd6e20f70950c0309ed78f9510821bfe8fda7910dad93c827419c8 + languageName: node + linkType: hard + "metro-config@npm:0.84.2, metro-config@npm:^0.84.0": version: 0.84.2 resolution: "metro-config@npm:0.84.2" @@ -14520,7 +14727,7 @@ __metadata: languageName: node linkType: hard -"metro-core@npm:0.83.5, metro-core@npm:^0.83.1, metro-core@npm:^0.83.3": +"metro-core@npm:0.83.5, metro-core@npm:^0.83.1": version: 0.83.5 resolution: "metro-core@npm:0.83.5" dependencies: @@ -14531,6 +14738,17 @@ __metadata: languageName: node linkType: hard +"metro-core@npm:0.83.7, metro-core@npm:^0.83.6": + version: 0.83.7 + resolution: "metro-core@npm:0.83.7" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + lodash.throttle: "npm:^4.1.1" + metro-resolver: "npm:0.83.7" + checksum: 10/afa1e5121452dcc9a882c96c04830a9a3062ea06a648c60e353df6ed568795c75c7c8e923e415777c2f88ed3ebb687daf21b1a98b169c4b509c71ac77046129b + languageName: node + linkType: hard + "metro-core@npm:0.84.2, metro-core@npm:^0.84.0": version: 0.84.2 resolution: "metro-core@npm:0.84.2" @@ -14576,6 +14794,23 @@ __metadata: languageName: node linkType: hard +"metro-file-map@npm:0.83.7": + version: 0.83.7 + resolution: "metro-file-map@npm:0.83.7" + dependencies: + debug: "npm:^4.4.0" + fb-watchman: "npm:^2.0.0" + flow-enums-runtime: "npm:^0.0.6" + graceful-fs: "npm:^4.2.4" + invariant: "npm:^2.2.4" + jest-worker: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + nullthrows: "npm:^1.1.1" + walker: "npm:^1.0.7" + checksum: 10/175fee3f2d407bbc01b6312ecab63ce515d3d7de97c9404a563a390c24d03074cd3e983d46d31dba56806dda53c52adc4c40ec29d23dd620e82f43f8f36db371 + languageName: node + linkType: hard + "metro-file-map@npm:0.84.2": version: 0.84.2 resolution: "metro-file-map@npm:0.84.2" @@ -14613,6 +14848,16 @@ __metadata: languageName: node linkType: hard +"metro-minify-terser@npm:0.83.7": + version: 0.83.7 + resolution: "metro-minify-terser@npm:0.83.7" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + terser: "npm:^5.15.0" + checksum: 10/195bc658adbd4b49e13e4df6c00bbabd868a9449def0ee8d87d2706868e10731c337697130381a07e4477bb67f2d2f16dea2f369a1bdb80f78e15a0c4abab70b + languageName: node + linkType: hard + "metro-minify-terser@npm:0.84.2": version: 0.84.2 resolution: "metro-minify-terser@npm:0.84.2" @@ -14641,6 +14886,15 @@ __metadata: languageName: node linkType: hard +"metro-resolver@npm:0.83.7": + version: 0.83.7 + resolution: "metro-resolver@npm:0.83.7" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/cf29c2e05a0cf1455be40ee66cf47d8876c41f3412eec68c6d168455d0bbe3f40501bc40d5862be2e526fc82900ee9216b8f85596bc343f5e69ddc841978a2d9 + languageName: node + linkType: hard + "metro-resolver@npm:0.84.2": version: 0.84.2 resolution: "metro-resolver@npm:0.84.2" @@ -14660,7 +14914,7 @@ __metadata: languageName: node linkType: hard -"metro-runtime@npm:0.83.5, metro-runtime@npm:^0.83.1, metro-runtime@npm:^0.83.3": +"metro-runtime@npm:0.83.5, metro-runtime@npm:^0.83.1": version: 0.83.5 resolution: "metro-runtime@npm:0.83.5" dependencies: @@ -14670,6 +14924,16 @@ __metadata: languageName: node linkType: hard +"metro-runtime@npm:0.83.7, metro-runtime@npm:^0.83.6": + version: 0.83.7 + resolution: "metro-runtime@npm:0.83.7" + dependencies: + "@babel/runtime": "npm:^7.25.0" + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/4d7f57ff4ae50d56eb857293ae3d16c76df07b14852c6f697719602cc9fdd43906df9a11b6340b78ca3ad324cd87646a238dc9ab3061387023ba68c80efae6ab + languageName: node + linkType: hard + "metro-runtime@npm:0.84.2, metro-runtime@npm:^0.84.0": version: 0.84.2 resolution: "metro-runtime@npm:0.84.2" @@ -14698,7 +14962,7 @@ __metadata: languageName: node linkType: hard -"metro-source-map@npm:0.83.5, metro-source-map@npm:^0.83.1, metro-source-map@npm:^0.83.3": +"metro-source-map@npm:0.83.5, metro-source-map@npm:^0.83.1": version: 0.83.5 resolution: "metro-source-map@npm:0.83.5" dependencies: @@ -14715,6 +14979,23 @@ __metadata: languageName: node linkType: hard +"metro-source-map@npm:0.83.7, metro-source-map@npm:^0.83.6": + version: 0.83.7 + resolution: "metro-source-map@npm:0.83.7" + dependencies: + "@babel/traverse": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + invariant: "npm:^2.2.4" + metro-symbolicate: "npm:0.83.7" + nullthrows: "npm:^1.1.1" + ob1: "npm:0.83.7" + source-map: "npm:^0.5.6" + vlq: "npm:^1.0.0" + checksum: 10/f1f8d5a411d65f14ffe2778229bc5236b57028bfc9821808f353f56fbe6344050b403b5fa843618cb086c6043028a96b4206c2dea870d4b1d03ee1d85e52e7c6 + languageName: node + linkType: hard + "metro-source-map@npm:0.84.2, metro-source-map@npm:^0.84.0": version: 0.84.2 resolution: "metro-source-map@npm:0.84.2" @@ -14764,6 +15045,22 @@ __metadata: languageName: node linkType: hard +"metro-symbolicate@npm:0.83.7": + version: 0.83.7 + resolution: "metro-symbolicate@npm:0.83.7" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + invariant: "npm:^2.2.4" + metro-source-map: "npm:0.83.7" + nullthrows: "npm:^1.1.1" + source-map: "npm:^0.5.6" + vlq: "npm:^1.0.0" + bin: + metro-symbolicate: src/index.js + checksum: 10/a371abce2c8cf5d61aeeceeb36b342f7ddb5bc178d8aa73e8df679c4c0698e93022c090776414413aff0c9b6027cec3fb1067ea91baa1af1ee63bc1221b7aa0f + languageName: node + linkType: hard + "metro-symbolicate@npm:0.84.2": version: 0.84.2 resolution: "metro-symbolicate@npm:0.84.2" @@ -14808,6 +15105,20 @@ __metadata: languageName: node linkType: hard +"metro-transform-plugins@npm:0.83.7": + version: 0.83.7 + resolution: "metro-transform-plugins@npm:0.83.7" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + nullthrows: "npm:^1.1.1" + checksum: 10/df2a7140ed83c78dddcf2c86f26a642318df1827a51f019f8bed5636167bbf86e483eede0cc68afc1e87c9da51d48d2bf75635c55d125a345769d3869d7feb31 + languageName: node + linkType: hard + "metro-transform-plugins@npm:0.84.2": version: 0.84.2 resolution: "metro-transform-plugins@npm:0.84.2" @@ -14864,6 +15175,27 @@ __metadata: languageName: node linkType: hard +"metro-transform-worker@npm:0.83.7": + version: 0.83.7 + resolution: "metro-transform-worker@npm:0.83.7" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/parser": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + flow-enums-runtime: "npm:^0.0.6" + metro: "npm:0.83.7" + metro-babel-transformer: "npm:0.83.7" + metro-cache: "npm:0.83.7" + metro-cache-key: "npm:0.83.7" + metro-minify-terser: "npm:0.83.7" + metro-source-map: "npm:0.83.7" + metro-transform-plugins: "npm:0.83.7" + nullthrows: "npm:^1.1.1" + checksum: 10/f99098f488782e25248e065e71ee72b413b08a855aafb672b1d62eaa53ab7570a475f560f65b22112ffa9f6b7129d843f5b2022f441377066c674e0bedc0b58c + languageName: node + linkType: hard + "metro-transform-worker@npm:0.84.2": version: 0.84.2 resolution: "metro-transform-worker@npm:0.84.2" @@ -14935,7 +15267,7 @@ __metadata: languageName: node linkType: hard -"metro@npm:0.83.5, metro@npm:^0.83.1, metro@npm:^0.83.3": +"metro@npm:0.83.5, metro@npm:^0.83.1": version: 0.83.5 resolution: "metro@npm:0.83.5" dependencies: @@ -14985,6 +15317,55 @@ __metadata: languageName: node linkType: hard +"metro@npm:0.83.7, metro@npm:^0.83.6": + version: 0.83.7 + resolution: "metro@npm:0.83.7" + dependencies: + "@babel/code-frame": "npm:^7.29.0" + "@babel/core": "npm:^7.25.2" + "@babel/generator": "npm:^7.29.1" + "@babel/parser": "npm:^7.29.0" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + accepts: "npm:^2.0.0" + ci-info: "npm:^2.0.0" + connect: "npm:^3.6.5" + debug: "npm:^4.4.0" + error-stack-parser: "npm:^2.0.6" + flow-enums-runtime: "npm:^0.0.6" + graceful-fs: "npm:^4.2.4" + hermes-parser: "npm:0.35.0" + image-size: "npm:^1.0.2" + invariant: "npm:^2.2.4" + jest-worker: "npm:^29.7.0" + jsc-safe-url: "npm:^0.2.2" + lodash.throttle: "npm:^4.1.1" + metro-babel-transformer: "npm:0.83.7" + metro-cache: "npm:0.83.7" + metro-cache-key: "npm:0.83.7" + metro-config: "npm:0.83.7" + metro-core: "npm:0.83.7" + metro-file-map: "npm:0.83.7" + metro-resolver: "npm:0.83.7" + metro-runtime: "npm:0.83.7" + metro-source-map: "npm:0.83.7" + metro-symbolicate: "npm:0.83.7" + metro-transform-plugins: "npm:0.83.7" + metro-transform-worker: "npm:0.83.7" + mime-types: "npm:^3.0.1" + nullthrows: "npm:^1.1.1" + serialize-error: "npm:^2.1.0" + source-map: "npm:^0.5.6" + throat: "npm:^5.0.0" + ws: "npm:^7.5.10" + yargs: "npm:^17.6.2" + bin: + metro: src/cli.js + checksum: 10/c641c560fe2ca7a9d72028df044e16880966415b2139cc25617098b917f15fe32e349f2448c4b0e8d08cd655f4491eb3e09577cd360ea3fea98e9eb7dc56f444 + languageName: node + linkType: hard + "metro@npm:0.84.2, metro@npm:^0.84.0": version: 0.84.2 resolution: "metro@npm:0.84.2" @@ -15740,10 +16121,10 @@ __metadata: languageName: node linkType: hard -"multitars@npm:^0.2.3": - version: 0.2.4 - resolution: "multitars@npm:0.2.4" - checksum: 10/20a9f234e8789bd9456f2133fd770642708c016428e8953e9f5ea62e1c8fa00b505e6d8ff1d7b9d8e44bf93163da6ec239e1b30bbab065a2100f61e72b8313b5 +"multitars@npm:^1.0.0": + version: 1.0.0 + resolution: "multitars@npm:1.0.0" + checksum: 10/acb10b29e81f2eba51f98c2296277c5b8be58fbfb0fdd833b5497c09f000b1d7d27504c00a96ba603d0a1d3bf3f34b8aa55bb70c45bfd923b6eb223bfb65b21d languageName: node linkType: hard @@ -15997,6 +16378,15 @@ __metadata: languageName: node linkType: hard +"ob1@npm:0.83.7": + version: 0.83.7 + resolution: "ob1@npm:0.83.7" + dependencies: + flow-enums-runtime: "npm:^0.0.6" + checksum: 10/ae366176de833457e77db78b60f2c514550f16eb53a08f5c53bc660d0e5d3126d782107d71b77a49d3bfdc8b1c614320510efea5318864e6ed49d915f7ef4b89 + languageName: node + linkType: hard + "ob1@npm:0.84.2": version: 0.84.2 resolution: "ob1@npm:0.84.2" @@ -17248,9 +17638,9 @@ __metadata: languageName: node linkType: hard -"react-native-worklets@npm:0.7.2": - version: 0.7.2 - resolution: "react-native-worklets@npm:0.7.2" +"react-native-worklets@npm:0.7.4": + version: 0.7.4 + resolution: "react-native-worklets@npm:0.7.4" dependencies: "@babel/plugin-transform-arrow-functions": "npm:7.27.1" "@babel/plugin-transform-class-properties": "npm:7.27.1" @@ -17267,7 +17657,7 @@ __metadata: "@babel/core": "*" react: "*" react-native: "*" - checksum: 10/4bc9b71a3a63f589da6f9bc7d889218f4a0e8d80737fb79e9e78298924774a99db254089428a877b0f1e434acdd00099a86a2424f33bf908283eb1b60adaea0e + checksum: 10/922b209940e298d21313d22f8a6eb87ad603442850c7ff8bc9cfef694cb211d7ec9903e24ee20b6bcf6164f8e7c165b65307dcca3d67465fdffda1c45fe05d1d languageName: node linkType: hard @@ -17372,18 +17762,18 @@ __metadata: languageName: node linkType: hard -"react-native@npm:0.83.2": - version: 0.83.2 - resolution: "react-native@npm:0.83.2" +"react-native@npm:0.83.6": + version: 0.83.6 + resolution: "react-native@npm:0.83.6" dependencies: "@jest/create-cache-key-function": "npm:^29.7.0" - "@react-native/assets-registry": "npm:0.83.2" - "@react-native/codegen": "npm:0.83.2" - "@react-native/community-cli-plugin": "npm:0.83.2" - "@react-native/gradle-plugin": "npm:0.83.2" - "@react-native/js-polyfills": "npm:0.83.2" - "@react-native/normalize-colors": "npm:0.83.2" - "@react-native/virtualized-lists": "npm:0.83.2" + "@react-native/assets-registry": "npm:0.83.6" + "@react-native/codegen": "npm:0.83.6" + "@react-native/community-cli-plugin": "npm:0.83.6" + "@react-native/gradle-plugin": "npm:0.83.6" + "@react-native/js-polyfills": "npm:0.83.6" + "@react-native/normalize-colors": "npm:0.83.6" + "@react-native/virtualized-lists": "npm:0.83.6" abort-controller: "npm:^3.0.0" anser: "npm:^1.4.9" ansi-regex: "npm:^5.0.0" @@ -17397,8 +17787,8 @@ __metadata: invariant: "npm:^2.2.4" jest-environment-node: "npm:^29.7.0" memoize-one: "npm:^5.0.0" - metro-runtime: "npm:^0.83.3" - metro-source-map: "npm:^0.83.3" + metro-runtime: "npm:^0.83.6" + metro-source-map: "npm:^0.83.6" nullthrows: "npm:^1.1.1" pretty-format: "npm:^29.7.0" promise: "npm:^8.3.0" @@ -17419,7 +17809,7 @@ __metadata: optional: true bin: react-native: cli.js - checksum: 10/415d10079de4b21608b303809c938154fcd55731204827c34334d331acd8edb0162b72ee146ee61202ecdd2a0c6a5d4e9b35dc82e39a22cd8ff870a2f6b4ac1c + checksum: 10/d57fc43d7a7c9e0e55efac941ebe6d5781f91d28db8f78eba822e74fe5decdc1f5a8f024b18d79dc08928e8dbc374469df1a910aa58f2241e2e7c637f1366f20 languageName: node linkType: hard From ebddd2007160ebcc81132ae0edd445e756af70bc Mon Sep 17 00:00:00 2001 From: artus9033 Date: Wed, 13 May 2026 13:37:42 +0200 Subject: [PATCH 15/26] chore: upgrade dependencies in ExpoApp54 --- apps/ExpoApp54/app.json | 8 +++++++- apps/ExpoApp54/package.json | 6 +++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/apps/ExpoApp54/app.json b/apps/ExpoApp54/app.json index 0fc8c569..7a9dd532 100644 --- a/apps/ExpoApp54/app.json +++ b/apps/ExpoApp54/app.json @@ -41,7 +41,13 @@ } } ], - ["@callstack/react-native-brownfield", { "debug": true }] + [ + "@callstack/react-native-brownfield", + { + "debug": true + } + ], + "expo-web-browser" ], "experiments": { "typedRoutes": true, diff --git a/apps/ExpoApp54/package.json b/apps/ExpoApp54/package.json index 5578d59c..50189081 100644 --- a/apps/ExpoApp54/package.json +++ b/apps/ExpoApp54/package.json @@ -20,18 +20,18 @@ "@callstack/brownie": "workspace:^", "@callstack/react-native-brownfield": "workspace:^", "@expo/vector-icons": "^15.0.3", - "expo": "~54.0.33", + "expo": "~54.0.34", "expo-constants": "~18.0.13", "expo-font": "~14.0.11", "expo-haptics": "~15.0.8", "expo-image": "~3.0.11", - "expo-linking": "~8.0.11", + "expo-linking": "~8.0.12", "expo-router": "~6.0.23", "expo-splash-screen": "~31.0.13", "expo-status-bar": "~3.0.9", "expo-symbols": "~1.0.8", "expo-system-ui": "~6.0.9", - "expo-web-browser": "~15.0.10", + "expo-web-browser": "~15.0.11", "react": "19.1.0", "react-dom": "19.1.0", "react-native": "0.81.5", From 47db72aaed63b77903207ccd5872edfc655333d4 Mon Sep 17 00:00:00 2001 From: artus9033 Date: Wed, 13 May 2026 13:38:01 +0200 Subject: [PATCH 16/26] chore: restructure ios code of react-native-brownfield --- .../ios/{ => Expo}/ExpoHostRuntime.swift | 0 .../project.pbxproj | 98 ++++++++++++++----- .../ReactNativeHostRuntime.swift | 0 .../ios/{ => Views}/ReactNativeView.swift | 0 .../ReactNativeViewController.swift | 0 5 files changed, 74 insertions(+), 24 deletions(-) rename packages/react-native-brownfield/ios/{ => Expo}/ExpoHostRuntime.swift (100%) rename packages/react-native-brownfield/ios/{ => Vanilla}/ReactNativeHostRuntime.swift (100%) rename packages/react-native-brownfield/ios/{ => Views}/ReactNativeView.swift (100%) rename packages/react-native-brownfield/ios/{ => Views}/ReactNativeViewController.swift (100%) diff --git a/packages/react-native-brownfield/ios/ExpoHostRuntime.swift b/packages/react-native-brownfield/ios/Expo/ExpoHostRuntime.swift similarity index 100% rename from packages/react-native-brownfield/ios/ExpoHostRuntime.swift rename to packages/react-native-brownfield/ios/Expo/ExpoHostRuntime.swift diff --git a/packages/react-native-brownfield/ios/ReactNativeBrownfield.xcodeproj/project.pbxproj b/packages/react-native-brownfield/ios/ReactNativeBrownfield.xcodeproj/project.pbxproj index 3a133eea..b6e6a78e 100644 --- a/packages/react-native-brownfield/ios/ReactNativeBrownfield.xcodeproj/project.pbxproj +++ b/packages/react-native-brownfield/ios/ReactNativeBrownfield.xcodeproj/project.pbxproj @@ -7,10 +7,16 @@ objects = { /* Begin PBXBuildFile section */ - 696CB249230EF9EA000207AF /* ReactNativeBrownfieldNotifications.m in Sources */ = {isa = PBXBuildFile; fileRef = 696CB243230EF9EA000207AF /* ReactNativeBrownfieldNotifications.m */; }; - 696CB24A230EF9EA000207AF /* ReactNativeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 696CB244230EF9EA000207AF /* ReactNativeViewController.m */; }; - 696CB24B230EF9EA000207AF /* ReactNativeBrownfield.m in Sources */ = {isa = PBXBuildFile; fileRef = 696CB245230EF9EA000207AF /* ReactNativeBrownfield.m */; }; - 696CB24C230EF9EA000207AF /* ReactNativeBrownfieldModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 696CB246230EF9EA000207AF /* ReactNativeBrownfieldModule.m */; }; + 79FEE7742FB499C700E407DE /* BrownfieldBundlePathResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79FEE76D2FB499C700E407DE /* BrownfieldBundlePathResolver.swift */; }; + 79FEE7752FB499C700E407DE /* ReactNativeBrownfieldModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 79FEE7722FB499C700E407DE /* ReactNativeBrownfieldModule.mm */; }; + 79FEE7762FB499C700E407DE /* Notification+Brownfield.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79FEE76F2FB499C700E407DE /* Notification+Brownfield.swift */; }; + 79FEE7772FB499C700E407DE /* ReactNativeBrownfieldModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79FEE7732FB499C700E407DE /* ReactNativeBrownfieldModule.swift */; }; + 79FEE7782FB499C700E407DE /* JSBundleLoadObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79FEE76E2FB499C700E407DE /* JSBundleLoadObserver.swift */; }; + 79FEE7792FB499C700E407DE /* ReactNativeBrownfield.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79FEE7702FB499C700E407DE /* ReactNativeBrownfield.swift */; }; + 79FEE77D2FB499E400E407DE /* ReactNativeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79FEE77B2FB499E400E407DE /* ReactNativeView.swift */; }; + 79FEE77E2FB499E400E407DE /* ReactNativeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79FEE77C2FB499E400E407DE /* ReactNativeViewController.swift */; }; + 79FEE7802FB499EC00E407DE /* ReactNativeHostRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79FEE77F2FB499EC00E407DE /* ReactNativeHostRuntime.swift */; }; + 79FEE7822FB499F300E407DE /* ExpoHostRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79FEE7812FB499F300E407DE /* ExpoHostRuntime.swift */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -27,14 +33,17 @@ /* Begin PBXFileReference section */ 696CB229230EF910000207AF /* libReactNativeBrownfield.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libReactNativeBrownfield.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 696CB241230EF9EA000207AF /* ReactNativeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReactNativeViewController.h; sourceTree = ""; }; - 696CB242230EF9EA000207AF /* ReactNativeBrownfieldModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReactNativeBrownfieldModule.h; sourceTree = ""; }; - 696CB243230EF9EA000207AF /* ReactNativeBrownfieldNotifications.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReactNativeBrownfieldNotifications.m; sourceTree = ""; }; - 696CB244230EF9EA000207AF /* ReactNativeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReactNativeViewController.m; sourceTree = ""; }; - 696CB245230EF9EA000207AF /* ReactNativeBrownfield.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReactNativeBrownfield.m; sourceTree = ""; }; - 696CB246230EF9EA000207AF /* ReactNativeBrownfieldModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReactNativeBrownfieldModule.m; sourceTree = ""; }; - 696CB247230EF9EA000207AF /* ReactNativeBrownfieldNotifications.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReactNativeBrownfieldNotifications.h; sourceTree = ""; }; - 696CB248230EF9EA000207AF /* ReactNativeBrownfield.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReactNativeBrownfield.h; sourceTree = ""; }; + 79FEE76D2FB499C700E407DE /* BrownfieldBundlePathResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrownfieldBundlePathResolver.swift; sourceTree = ""; }; + 79FEE76E2FB499C700E407DE /* JSBundleLoadObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSBundleLoadObserver.swift; sourceTree = ""; }; + 79FEE76F2FB499C700E407DE /* Notification+Brownfield.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+Brownfield.swift"; sourceTree = ""; }; + 79FEE7702FB499C700E407DE /* ReactNativeBrownfield.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactNativeBrownfield.swift; sourceTree = ""; }; + 79FEE7712FB499C700E407DE /* ReactNativeBrownfieldModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ReactNativeBrownfieldModule.h; sourceTree = ""; }; + 79FEE7722FB499C700E407DE /* ReactNativeBrownfieldModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ReactNativeBrownfieldModule.mm; sourceTree = ""; }; + 79FEE7732FB499C700E407DE /* ReactNativeBrownfieldModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactNativeBrownfieldModule.swift; sourceTree = ""; }; + 79FEE77B2FB499E400E407DE /* ReactNativeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactNativeView.swift; sourceTree = ""; }; + 79FEE77C2FB499E400E407DE /* ReactNativeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactNativeViewController.swift; sourceTree = ""; }; + 79FEE77F2FB499EC00E407DE /* ReactNativeHostRuntime.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReactNativeHostRuntime.swift; sourceTree = ""; }; + 79FEE7812FB499F300E407DE /* ExpoHostRuntime.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExpoHostRuntime.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -51,15 +60,17 @@ 696CB220230EF910000207AF = { isa = PBXGroup; children = ( - 696CB248230EF9EA000207AF /* ReactNativeBrownfield.h */, - 696CB245230EF9EA000207AF /* ReactNativeBrownfield.m */, - 696CB242230EF9EA000207AF /* ReactNativeBrownfieldModule.h */, - 696CB246230EF9EA000207AF /* ReactNativeBrownfieldModule.m */, - 696CB247230EF9EA000207AF /* ReactNativeBrownfieldNotifications.h */, - 696CB243230EF9EA000207AF /* ReactNativeBrownfieldNotifications.m */, - 696CB241230EF9EA000207AF /* ReactNativeViewController.h */, - 696CB244230EF9EA000207AF /* ReactNativeViewController.m */, + 79FEE76C2FB499A800E407DE /* Views */, + 79FEE76B2FB4998300E407DE /* Vanilla */, + 79FEE7692FB4997100E407DE /* Expo */, 696CB22A230EF910000207AF /* Products */, + 79FEE76D2FB499C700E407DE /* BrownfieldBundlePathResolver.swift */, + 79FEE76E2FB499C700E407DE /* JSBundleLoadObserver.swift */, + 79FEE76F2FB499C700E407DE /* Notification+Brownfield.swift */, + 79FEE7702FB499C700E407DE /* ReactNativeBrownfield.swift */, + 79FEE7712FB499C700E407DE /* ReactNativeBrownfieldModule.h */, + 79FEE7722FB499C700E407DE /* ReactNativeBrownfieldModule.mm */, + 79FEE7732FB499C700E407DE /* ReactNativeBrownfieldModule.swift */, ); sourceTree = ""; }; @@ -71,6 +82,31 @@ name = Products; sourceTree = ""; }; + 79FEE7692FB4997100E407DE /* Expo */ = { + isa = PBXGroup; + children = ( + 79FEE7812FB499F300E407DE /* ExpoHostRuntime.swift */, + ); + path = Expo; + sourceTree = ""; + }; + 79FEE76B2FB4998300E407DE /* Vanilla */ = { + isa = PBXGroup; + children = ( + 79FEE77F2FB499EC00E407DE /* ReactNativeHostRuntime.swift */, + ); + path = Vanilla; + sourceTree = ""; + }; + 79FEE76C2FB499A800E407DE /* Views */ = { + isa = PBXGroup; + children = ( + 79FEE77B2FB499E400E407DE /* ReactNativeView.swift */, + 79FEE77C2FB499E400E407DE /* ReactNativeViewController.swift */, + ); + path = Views; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -102,6 +138,7 @@ TargetAttributes = { 696CB228230EF910000207AF = { CreatedOnToolsVersion = 10.2.1; + LastSwiftMigration = 2650; }; }; }; @@ -127,10 +164,16 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 696CB24C230EF9EA000207AF /* ReactNativeBrownfieldModule.m in Sources */, - 696CB24B230EF9EA000207AF /* ReactNativeBrownfield.m in Sources */, - 696CB249230EF9EA000207AF /* ReactNativeBrownfieldNotifications.m in Sources */, - 696CB24A230EF9EA000207AF /* ReactNativeViewController.m in Sources */, + 79FEE7802FB499EC00E407DE /* ReactNativeHostRuntime.swift in Sources */, + 79FEE7742FB499C700E407DE /* BrownfieldBundlePathResolver.swift in Sources */, + 79FEE7752FB499C700E407DE /* ReactNativeBrownfieldModule.mm in Sources */, + 79FEE7762FB499C700E407DE /* Notification+Brownfield.swift in Sources */, + 79FEE7822FB499F300E407DE /* ExpoHostRuntime.swift in Sources */, + 79FEE7772FB499C700E407DE /* ReactNativeBrownfieldModule.swift in Sources */, + 79FEE7782FB499C700E407DE /* JSBundleLoadObserver.swift in Sources */, + 79FEE7792FB499C700E407DE /* ReactNativeBrownfield.swift in Sources */, + 79FEE77D2FB499E400E407DE /* ReactNativeView.swift in Sources */, + 79FEE77E2FB499E400E407DE /* ReactNativeViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -252,11 +295,15 @@ 696CB233230EF910000207AF /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = PJL7DA2X5F; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_OBJC_BRIDGING_HEADER = "ReactNativeBrownfield-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 6.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -264,11 +311,14 @@ 696CB234230EF910000207AF /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = PJL7DA2X5F; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_OBJC_BRIDGING_HEADER = "ReactNativeBrownfield-Bridging-Header.h"; + SWIFT_VERSION = 6.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/packages/react-native-brownfield/ios/ReactNativeHostRuntime.swift b/packages/react-native-brownfield/ios/Vanilla/ReactNativeHostRuntime.swift similarity index 100% rename from packages/react-native-brownfield/ios/ReactNativeHostRuntime.swift rename to packages/react-native-brownfield/ios/Vanilla/ReactNativeHostRuntime.swift diff --git a/packages/react-native-brownfield/ios/ReactNativeView.swift b/packages/react-native-brownfield/ios/Views/ReactNativeView.swift similarity index 100% rename from packages/react-native-brownfield/ios/ReactNativeView.swift rename to packages/react-native-brownfield/ios/Views/ReactNativeView.swift diff --git a/packages/react-native-brownfield/ios/ReactNativeViewController.swift b/packages/react-native-brownfield/ios/Views/ReactNativeViewController.swift similarity index 100% rename from packages/react-native-brownfield/ios/ReactNativeViewController.swift rename to packages/react-native-brownfield/ios/Views/ReactNativeViewController.swift From ebd03e67d537821f53be8fc43489f35f63aa0ed2 Mon Sep 17 00:00:00 2001 From: artus9033 Date: Wed, 13 May 2026 13:39:45 +0200 Subject: [PATCH 17/26] chore: conditionally compile all source code in ExpoHostRuntime.swift --- packages/react-native-brownfield/ios/Expo/ExpoHostRuntime.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native-brownfield/ios/Expo/ExpoHostRuntime.swift b/packages/react-native-brownfield/ios/Expo/ExpoHostRuntime.swift index bfad894f..2170fcde 100644 --- a/packages/react-native-brownfield/ios/Expo/ExpoHostRuntime.swift +++ b/packages/react-native-brownfield/ios/Expo/ExpoHostRuntime.swift @@ -1,8 +1,8 @@ +#if canImport(Expo) import UIKit internal import React internal import ReactAppDependencyProvider -#if canImport(Expo) internal import Expo final class ExpoHostRuntime { From f9a4e94e782371717c8001a40e3e4c3472d325da Mon Sep 17 00:00:00 2001 From: artus9033 Date: Wed, 13 May 2026 14:29:48 +0200 Subject: [PATCH 18/26] fix: vanilla ReactNativeHostRuntime --- packages/react-native-brownfield/ReactBrownfield.podspec | 6 +++--- .../ios/Vanilla/ReactNativeHostRuntime.swift | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/react-native-brownfield/ReactBrownfield.podspec b/packages/react-native-brownfield/ReactBrownfield.podspec index bc884e7a..dfd5b5d7 100644 --- a/packages/react-native-brownfield/ReactBrownfield.podspec +++ b/packages/react-native-brownfield/ReactBrownfield.podspec @@ -25,11 +25,11 @@ Pod::Spec.new do |spec| if ENV['RCT_USE_PREBUILT_RNCORE'] == '1' spec.dependency 'React-Core-prebuilt' - else - spec.dependency 'ReactAppDependencyProvider' - spec.dependency "React-RCTAppDelegate" end + spec.dependency 'ReactAppDependencyProvider' + spec.dependency 'React-RCTAppDelegate' + if ENV['REACT_NATIVE_BROWNFIELD_USE_EXPO_HOST'] == '1' spec.dependency 'Expo' end diff --git a/packages/react-native-brownfield/ios/Vanilla/ReactNativeHostRuntime.swift b/packages/react-native-brownfield/ios/Vanilla/ReactNativeHostRuntime.swift index ea529437..56fbb1b2 100644 --- a/packages/react-native-brownfield/ios/Vanilla/ReactNativeHostRuntime.swift +++ b/packages/react-native-brownfield/ios/Vanilla/ReactNativeHostRuntime.swift @@ -2,7 +2,7 @@ import UIKit internal import React internal import React_RCTAppDelegate -internal import React_RCTReactNativeFactory +internal import ReactAppDependencyProvider class ReactNativeBrownfieldDelegate: RCTDefaultReactNativeFactoryDelegate { var entryFile = "index" From a08437a9b34efd32f9ce7118be168d1c39dc30ac Mon Sep 17 00:00:00 2001 From: artus9033 Date: Wed, 13 May 2026 14:30:24 +0200 Subject: [PATCH 19/26] chore: fix paths to artifacts in AppleApp --- .../project.pbxproj | 70 ++++++++----------- 1 file changed, 28 insertions(+), 42 deletions(-) diff --git a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj index a6d22bbc..35dce76c 100644 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj @@ -7,20 +7,13 @@ objects = { /* Begin PBXBuildFile section */ - 79688AB62FB3EA8400D728BD /* ReactNativeDependencies.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09ED2FB31F2E0028CB26 /* ReactNativeDependencies.xcframework */; }; - 79688AB72FB3EA8400D728BD /* ReactNativeDependencies.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09ED2FB31F2E0028CB26 /* ReactNativeDependencies.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79688AB92FB3EA8400D728BD /* ReactBrownfield.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79413FEA2FB3210300A8B941 /* ReactBrownfield.xcframework */; }; - 79688ABA2FB3EA8400D728BD /* ReactBrownfield.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79413FEA2FB3210300A8B941 /* ReactBrownfield.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79688ABB2FB3EA8600D728BD /* React.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09EC2FB31F2E0028CB26 /* React.xcframework */; }; - 79688ABC2FB3EA8600D728BD /* React.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 793A09EC2FB31F2E0028CB26 /* React.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79688ABD2FB3EA8700D728BD /* hermesvm.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B23902F50633200CB6363 /* hermesvm.xcframework */; }; - 79688ABE2FB3EA8700D728BD /* hermesvm.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B23902F50633200CB6363 /* hermesvm.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79688ABF2FB3EA8900D728BD /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238F2F50633200CB6363 /* BrownfieldNavigation.xcframework */; }; - 79688AC02FB3EA8900D728BD /* BrownfieldNavigation.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238F2F50633200CB6363 /* BrownfieldNavigation.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79688AC12FB3EA8A00D728BD /* BrownfieldLib.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238D2F50633200CB6363 /* BrownfieldLib.xcframework */; }; - 79688AC22FB3EA8A00D728BD /* BrownfieldLib.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238D2F50633200CB6363 /* BrownfieldLib.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 79688AC32FB3EA8B00D728BD /* Brownie.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238E2F50633200CB6363 /* Brownie.xcframework */; }; - 79688AC42FB3EA8B00D728BD /* Brownie.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 614B238E2F50633200CB6363 /* Brownie.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B1D9A02FB4A61400A5F42B /* ReactBrownfield.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; }; + 79B1D9A12FB4A61400A5F42B /* ReactNativeDependencies.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; }; + 79B1D9A22FB4A61400A5F42B /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; }; + 79B1D9A32FB4A61400A5F42B /* BrownfieldLib.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; }; + 79B1D9A42FB4A61400A5F42B /* Brownie.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; }; + 79B1D9A52FB4A61400A5F42B /* hermesvm.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */; }; + 79B1D9A62FB4A61400A5F42B /* React.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99D2FB4A61400A5F42B /* React.xcframework */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -30,13 +23,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 79688AC42FB3EA8B00D728BD /* Brownie.xcframework in Embed Frameworks */, - 79688AC02FB3EA8900D728BD /* BrownfieldNavigation.xcframework in Embed Frameworks */, - 79688ABC2FB3EA8600D728BD /* React.xcframework in Embed Frameworks */, - 79688AB72FB3EA8400D728BD /* ReactNativeDependencies.xcframework in Embed Frameworks */, - 79688AC22FB3EA8A00D728BD /* BrownfieldLib.xcframework in Embed Frameworks */, - 79688ABE2FB3EA8700D728BD /* hermesvm.xcframework in Embed Frameworks */, - 79688ABA2FB3EA8400D728BD /* ReactBrownfield.xcframework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -44,14 +30,14 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 614B238D2F50633200CB6363 /* BrownfieldLib.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = BrownfieldLib.xcframework; path = package/BrownfieldLib.xcframework; sourceTree = ""; }; - 614B238E2F50633200CB6363 /* Brownie.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Brownie.xcframework; path = package/Brownie.xcframework; sourceTree = ""; }; - 614B238F2F50633200CB6363 /* BrownfieldNavigation.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = BrownfieldNavigation.xcframework; path = package/BrownfieldNavigation.xcframework; sourceTree = ""; }; - 614B23902F50633200CB6363 /* hermesvm.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = hermesvm.xcframework; path = package/hermesvm.xcframework; sourceTree = ""; }; - 793A09EC2FB31F2E0028CB26 /* React.xcframework */ = {isa = PBXFileReference; expectedSignature = "SelfSigned:BEEAE960B121B398BB228BD547298BD461DFFFD862BD3AD794A38F6D426F6741"; lastKnownFileType = wrapper.xcframework; name = React.xcframework; path = ../ExpoApp55/ios/.brownfield/package/build/React.xcframework; sourceTree = SOURCE_ROOT; }; - 793A09ED2FB31F2E0028CB26 /* ReactNativeDependencies.xcframework */ = {isa = PBXFileReference; expectedSignature = "SelfSigned:BEEAE960B121B398BB228BD547298BD461DFFFD862BD3AD794A38F6D426F6741"; lastKnownFileType = wrapper.xcframework; name = ReactNativeDependencies.xcframework; path = ../ExpoApp55/ios/.brownfield/package/build/ReactNativeDependencies.xcframework; sourceTree = SOURCE_ROOT; }; 793C76A72EEBF938008A2A34 /* Brownfield Apple App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Brownfield Apple App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 79413FEA2FB3210300A8B941 /* ReactBrownfield.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ReactBrownfield.xcframework; path = ../ExpoApp55/ios/.brownfield/package/build/ReactBrownfield.xcframework; sourceTree = SOURCE_ROOT; }; + 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = BrownfieldLib.xcframework; path = package/BrownfieldLib.xcframework; sourceTree = ""; }; + 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = BrownfieldNavigation.xcframework; path = package/BrownfieldNavigation.xcframework; sourceTree = ""; }; + 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Brownie.xcframework; path = package/Brownie.xcframework; sourceTree = ""; }; + 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = hermesvm.xcframework; path = package/hermesvm.xcframework; sourceTree = ""; }; + 79B1D99D2FB4A61400A5F42B /* React.xcframework */ = {isa = PBXFileReference; expectedSignature = "SelfSigned:BEEAE960B121B398BB228BD547298BD461DFFFD862BD3AD794A38F6D426F6741"; lastKnownFileType = wrapper.xcframework; name = React.xcframework; path = package/React.xcframework; sourceTree = ""; }; + 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ReactBrownfield.xcframework; path = package/ReactBrownfield.xcframework; sourceTree = ""; }; + 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */ = {isa = PBXFileReference; expectedSignature = "SelfSigned:BEEAE960B121B398BB228BD547298BD461DFFFD862BD3AD794A38F6D426F6741"; lastKnownFileType = wrapper.xcframework; name = ReactNativeDependencies.xcframework; path = package/ReactNativeDependencies.xcframework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedRootGroup section */ @@ -67,13 +53,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 79688AC32FB3EA8B00D728BD /* Brownie.xcframework in Frameworks */, - 79688ABF2FB3EA8900D728BD /* BrownfieldNavigation.xcframework in Frameworks */, - 79688AB62FB3EA8400D728BD /* ReactNativeDependencies.xcframework in Frameworks */, - 79688AB92FB3EA8400D728BD /* ReactBrownfield.xcframework in Frameworks */, - 79688AC12FB3EA8A00D728BD /* BrownfieldLib.xcframework in Frameworks */, - 79688ABD2FB3EA8700D728BD /* hermesvm.xcframework in Frameworks */, - 79688ABB2FB3EA8600D728BD /* React.xcframework in Frameworks */, + 79B1D9A02FB4A61400A5F42B /* ReactBrownfield.xcframework in Frameworks */, + 79B1D9A12FB4A61400A5F42B /* ReactNativeDependencies.xcframework in Frameworks */, + 79B1D9A22FB4A61400A5F42B /* BrownfieldNavigation.xcframework in Frameworks */, + 79B1D9A32FB4A61400A5F42B /* BrownfieldLib.xcframework in Frameworks */, + 79B1D9A42FB4A61400A5F42B /* Brownie.xcframework in Frameworks */, + 79B1D9A52FB4A61400A5F42B /* hermesvm.xcframework in Frameworks */, + 79B1D9A62FB4A61400A5F42B /* React.xcframework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -83,13 +69,13 @@ 6108E5322F40A26800EA8FA1 /* Frameworks */ = { isa = PBXGroup; children = ( - 614B238D2F50633200CB6363 /* BrownfieldLib.xcframework */, - 614B238F2F50633200CB6363 /* BrownfieldNavigation.xcframework */, - 614B238E2F50633200CB6363 /* Brownie.xcframework */, - 79413FEA2FB3210300A8B941 /* ReactBrownfield.xcframework */, - 614B23902F50633200CB6363 /* hermesvm.xcframework */, - 793A09EC2FB31F2E0028CB26 /* React.xcframework */, - 793A09ED2FB31F2E0028CB26 /* ReactNativeDependencies.xcframework */, + 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */, + 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */, + 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */, + 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */, + 79B1D99D2FB4A61400A5F42B /* React.xcframework */, + 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */, + 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */, ); name = Frameworks; sourceTree = ""; From d3a85c85daeb7ee1fd6e24542b8dfee9bbdb269c Mon Sep 17 00:00:00 2001 From: artus9033 Date: Wed, 13 May 2026 14:42:28 +0200 Subject: [PATCH 20/26] chore: embed & sign frameworks in AppleApp --- .../project.pbxproj | 42 ++++++++++++------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj index 35dce76c..a91c4fb0 100644 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj @@ -7,13 +7,20 @@ objects = { /* Begin PBXBuildFile section */ - 79B1D9A02FB4A61400A5F42B /* ReactBrownfield.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; }; - 79B1D9A12FB4A61400A5F42B /* ReactNativeDependencies.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; }; - 79B1D9A22FB4A61400A5F42B /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; }; - 79B1D9A32FB4A61400A5F42B /* BrownfieldLib.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; }; - 79B1D9A42FB4A61400A5F42B /* Brownie.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; }; - 79B1D9A52FB4A61400A5F42B /* hermesvm.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */; }; - 79B1D9A62FB4A61400A5F42B /* React.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99D2FB4A61400A5F42B /* React.xcframework */; }; + 795327712FB4A902008398F3 /* BrownfieldLib.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; }; + 795327722FB4A902008398F3 /* BrownfieldLib.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 795327732FB4A904008398F3 /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; }; + 795327742FB4A904008398F3 /* BrownfieldNavigation.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 795327752FB4A905008398F3 /* Brownie.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; }; + 795327762FB4A905008398F3 /* Brownie.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 795327772FB4A906008398F3 /* hermesvm.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */; }; + 795327782FB4A906008398F3 /* hermesvm.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 795327792FB4A908008398F3 /* React.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99D2FB4A61400A5F42B /* React.xcframework */; }; + 7953277A2FB4A908008398F3 /* React.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99D2FB4A61400A5F42B /* React.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 7953277B2FB4A909008398F3 /* ReactBrownfield.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; }; + 7953277C2FB4A909008398F3 /* ReactBrownfield.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 7953277D2FB4A90A008398F3 /* ReactNativeDependencies.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; }; + 7953277E2FB4A90A008398F3 /* ReactNativeDependencies.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -23,6 +30,13 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( + 795327762FB4A905008398F3 /* Brownie.xcframework in Embed Frameworks */, + 7953277C2FB4A909008398F3 /* ReactBrownfield.xcframework in Embed Frameworks */, + 7953277E2FB4A90A008398F3 /* ReactNativeDependencies.xcframework in Embed Frameworks */, + 795327742FB4A904008398F3 /* BrownfieldNavigation.xcframework in Embed Frameworks */, + 795327782FB4A906008398F3 /* hermesvm.xcframework in Embed Frameworks */, + 795327722FB4A902008398F3 /* BrownfieldLib.xcframework in Embed Frameworks */, + 7953277A2FB4A908008398F3 /* React.xcframework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -53,13 +67,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 79B1D9A02FB4A61400A5F42B /* ReactBrownfield.xcframework in Frameworks */, - 79B1D9A12FB4A61400A5F42B /* ReactNativeDependencies.xcframework in Frameworks */, - 79B1D9A22FB4A61400A5F42B /* BrownfieldNavigation.xcframework in Frameworks */, - 79B1D9A32FB4A61400A5F42B /* BrownfieldLib.xcframework in Frameworks */, - 79B1D9A42FB4A61400A5F42B /* Brownie.xcframework in Frameworks */, - 79B1D9A52FB4A61400A5F42B /* hermesvm.xcframework in Frameworks */, - 79B1D9A62FB4A61400A5F42B /* React.xcframework in Frameworks */, + 795327752FB4A905008398F3 /* Brownie.xcframework in Frameworks */, + 795327732FB4A904008398F3 /* BrownfieldNavigation.xcframework in Frameworks */, + 7953277D2FB4A90A008398F3 /* ReactNativeDependencies.xcframework in Frameworks */, + 795327772FB4A906008398F3 /* hermesvm.xcframework in Frameworks */, + 7953277B2FB4A909008398F3 /* ReactBrownfield.xcframework in Frameworks */, + 795327712FB4A902008398F3 /* BrownfieldLib.xcframework in Frameworks */, + 795327792FB4A908008398F3 /* React.xcframework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; From ec7027a074d3eabfe171b989f887441696f661e4 Mon Sep 17 00:00:00 2001 From: artus9033 Date: Wed, 13 May 2026 14:48:56 +0200 Subject: [PATCH 21/26] chore: update Podfile in RNApp --- apps/RNApp/ios/Podfile.lock | 1538 +++++------------ .../RNApp/ios/RNApp.xcodeproj/project.pbxproj | 24 + 2 files changed, 429 insertions(+), 1133 deletions(-) diff --git a/apps/RNApp/ios/Podfile.lock b/apps/RNApp/ios/Podfile.lock index 391b3e8d..a2792b90 100644 --- a/apps/RNApp/ios/Podfile.lock +++ b/apps/RNApp/ios/Podfile.lock @@ -1,17 +1,10 @@ PODS: - - boost (1.84.0) - - BrownfieldNavigation (3.6.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - BrownfieldNavigation (3.6.1): + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -26,20 +19,14 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - - Brownie (3.6.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - Brownie (3.6.1): + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -54,35 +41,12 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - - DoubleConversion (1.1.6) - - fast_float (8.0.0) - FBLazyVector (0.85.0) - - fmt (12.1.0) - - glog (0.3.5) - hermes-engine (250829098.0.10): - hermes-engine/Pre-built (= 250829098.0.10) - hermes-engine/Pre-built (250829098.0.10) - - RCT-Folly (2024.11.18.00): - - boost - - DoubleConversion - - fast_float (= 8.0.0) - - fmt (= 12.1.0) - - glog - - RCT-Folly/Default (= 2024.11.18.00) - - RCT-Folly/Default (2024.11.18.00): - - boost - - DoubleConversion - - fast_float (= 8.0.0) - - fmt (= 12.1.0) - - glog - - RCT-Folly/Fabric (2024.11.18.00): - - boost - - DoubleConversion - - fast_float (= 8.0.0) - - fmt (= 12.1.0) - - glog - RCTDeprecation (0.85.0) - RCTRequired (0.85.0) - RCTSwiftUI (0.85.0) @@ -107,15 +71,9 @@ PODS: - React-RCTVibration (= 0.85.0) - React-callinvoker (0.85.0) - React-Core (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTDeprecation + - React-Core-prebuilt - React-Core/Default (= 0.85.0) - React-cxxreact - React-featureflags @@ -129,18 +87,14 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket + - ReactNativeDependencies - Yoga + - React-Core-prebuilt (0.85.0): + - ReactNativeDependencies - React-Core/CoreModulesHeaders (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -154,18 +108,12 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket + - ReactNativeDependencies - Yoga - React-Core/Default (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTDeprecation + - React-Core-prebuilt - React-cxxreact - React-featureflags - React-hermes @@ -178,18 +126,12 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket + - ReactNativeDependencies - Yoga - React-Core/DevSupport (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTDeprecation + - React-Core-prebuilt - React-Core/Default (= 0.85.0) - React-Core/RCTWebSocket (= 0.85.0) - React-cxxreact @@ -204,18 +146,12 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket + - ReactNativeDependencies - Yoga - React-Core/RCTActionSheetHeaders (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -229,18 +165,12 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket + - ReactNativeDependencies - Yoga - React-Core/RCTAnimationHeaders (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -254,18 +184,12 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket + - ReactNativeDependencies - Yoga - React-Core/RCTBlobHeaders (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -279,18 +203,12 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket + - ReactNativeDependencies - Yoga - React-Core/RCTImageHeaders (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -304,18 +222,12 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket + - ReactNativeDependencies - Yoga - React-Core/RCTLinkingHeaders (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -329,18 +241,12 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket + - ReactNativeDependencies - Yoga - React-Core/RCTNetworkHeaders (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -354,18 +260,12 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket + - ReactNativeDependencies - Yoga - React-Core/RCTSettingsHeaders (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -379,18 +279,12 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket + - ReactNativeDependencies - Yoga - React-Core/RCTTextHeaders (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -404,18 +298,12 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket + - ReactNativeDependencies - Yoga - React-Core/RCTVibrationHeaders (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -429,18 +317,12 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket + - ReactNativeDependencies - Yoga - React-Core/RCTWebSocket (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTDeprecation + - React-Core-prebuilt - React-Core/Default (= 0.85.0) - React-cxxreact - React-featureflags @@ -454,17 +336,11 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket + - ReactNativeDependencies - Yoga - React-CoreModules (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly - - RCT-Folly/Fabric - RCTTypeSafety (= 0.85.0) + - React-Core-prebuilt - React-Core/CoreModulesHeaders (= 0.85.0) - React-debug - React-jsi (= 0.85.0) @@ -478,17 +354,11 @@ PODS: - React-runtimeexecutor - React-utils - ReactCommon - - SocketRocket + - ReactNativeDependencies - React-cxxreact (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - React-callinvoker (= 0.85.0) + - React-Core-prebuilt - React-debug (= 0.85.0) - React-jsi (= 0.85.0) - React-jsinspector @@ -499,17 +369,11 @@ PODS: - React-runtimeexecutor - React-timing (= 0.85.0) - React-utils - - SocketRocket + - ReactNativeDependencies - React-debug (0.85.0) - React-defaultsnativemodule (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine + - React-Core-prebuilt - React-domnativemodule - React-Fabric/animated - React-featureflags @@ -521,17 +385,11 @@ PODS: - React-microtasksnativemodule - React-RCTFBReactNativeSpec - React-webperformancenativemodule - - SocketRocket + - ReactNativeDependencies - Yoga - React-domnativemodule (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine + - React-Core-prebuilt - React-Fabric - React-Fabric/bridging - React-FabricComponents @@ -541,20 +399,14 @@ PODS: - React-RCTFBReactNativeSpec - React-runtimeexecutor - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - React-Fabric (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric/animated (= 0.85.0) @@ -585,19 +437,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/animated (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric/animationbackend @@ -611,19 +457,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/animationbackend (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -636,19 +476,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/animations (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -661,19 +495,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/attributedstring (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -686,19 +514,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/bridging (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -711,19 +533,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/componentregistry (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -736,19 +552,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/componentregistrynative (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -761,19 +571,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/components (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric/components/legacyviewmanagerinterop (= 0.85.0) @@ -790,19 +594,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/components/legacyviewmanagerinterop (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -815,19 +613,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/components/root (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -840,19 +632,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/components/scrollview (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -865,19 +651,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/components/view (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -891,20 +671,14 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - React-Fabric/consistency (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -917,19 +691,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/core (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -942,19 +710,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/dom (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -967,19 +729,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/imagemanager (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -992,19 +748,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/leakchecker (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -1017,19 +767,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/mounting (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -1042,19 +786,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/observers (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric/observers/events (= 0.85.0) @@ -1069,19 +807,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/observers/events (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -1094,19 +826,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/observers/intersection (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -1119,19 +845,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/scheduler (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric/animationbackend @@ -1148,19 +868,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/telemetry (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -1173,19 +887,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/uimanager (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric/uimanager/consistency (= 0.85.0) @@ -1200,19 +908,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-Fabric/uimanager/consistency (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -1226,19 +928,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-FabricComponents (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1254,20 +950,14 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - React-FabricComponents/components (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1292,20 +982,14 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - React-FabricComponents/components/inputaccessory (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1319,20 +1003,14 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - React-FabricComponents/components/iostextinput (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1346,20 +1024,14 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - React-FabricComponents/components/modal (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1373,20 +1045,14 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - React-FabricComponents/components/rncore (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1400,20 +1066,14 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - React-FabricComponents/components/safeareaview (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1427,20 +1087,14 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - React-FabricComponents/components/scrollview (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1454,20 +1108,14 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - React-FabricComponents/components/switch (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1481,20 +1129,14 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - React-FabricComponents/components/text (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1508,20 +1150,14 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - React-FabricComponents/components/textinput (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1535,20 +1171,14 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - React-FabricComponents/components/unimplementedview (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1562,20 +1192,14 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - React-FabricComponents/components/virtualview (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1589,20 +1213,14 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - React-FabricComponents/textlayoutmanager (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric @@ -1616,19 +1234,13 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - React-FabricImage (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired (= 0.85.0) - RCTTypeSafety (= 0.85.0) + - React-Core-prebuilt - React-Fabric - React-featureflags - React-graphics @@ -1639,55 +1251,31 @@ PODS: - React-rendererdebug - React-utils - ReactCommon - - SocketRocket + - ReactNativeDependencies - Yoga - React-featureflags (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly - - RCT-Folly/Fabric - - SocketRocket + - React-Core-prebuilt + - ReactNativeDependencies - React-featureflagsnativemodule (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - React-Core-prebuilt - React-featureflags - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-graphics (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - React-Core-prebuilt - React-featureflags - React-jsi - React-jsiexecutor - React-utils - - SocketRocket + - ReactNativeDependencies - React-hermes (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine + - React-Core-prebuilt - React-cxxreact (= 0.85.0) - React-jsi - React-jsiexecutor (= 0.85.0) @@ -1698,47 +1286,29 @@ PODS: - React-oscompat - React-perflogger (= 0.85.0) - React-runtimeexecutor - - SocketRocket + - ReactNativeDependencies - React-idlecallbacksnativemodule (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - React-Core-prebuilt - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec - React-runtimeexecutor - React-runtimescheduler - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-ImageManager (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly - - RCT-Folly/Fabric + - React-Core-prebuilt - React-Core/Default - React-debug - React-Fabric - React-graphics - React-rendererdebug - React-utils - - SocketRocket + - ReactNativeDependencies - React-intersectionobservernativemodule (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine + - React-Core-prebuilt - React-cxxreact - React-Fabric - React-Fabric/bridging @@ -1749,42 +1319,24 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - React-jserrorhandler (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-jsi - ReactCommon/turbomodule/bridging - - SocketRocket + - ReactNativeDependencies - React-jsi (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric - - SocketRocket + - hermes-engine + - React-Core-prebuilt + - ReactNativeDependencies - React-jsiexecutor (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine + - React-Core-prebuilt - React-cxxreact - React-debug - React-jserrorhandler @@ -1796,16 +1348,10 @@ PODS: - React-perflogger - React-runtimeexecutor - React-utils - - SocketRocket + - ReactNativeDependencies - React-jsinspector (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - React-Core-prebuilt - React-featureflags - React-jsi - React-jsinspectorcdp @@ -1815,49 +1361,25 @@ PODS: - React-perflogger (= 0.85.0) - React-runtimeexecutor - React-utils - - SocketRocket + - ReactNativeDependencies - React-jsinspectorcdp (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly - - RCT-Folly/Fabric - - SocketRocket + - React-Core-prebuilt + - ReactNativeDependencies - React-jsinspectornetwork (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly - - RCT-Folly/Fabric + - React-Core-prebuilt - React-jsinspectorcdp - - SocketRocket + - ReactNativeDependencies - React-jsinspectortracing (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - React-Core-prebuilt - React-jsi - React-jsinspectornetwork - React-oscompat - React-timing - - SocketRocket + - ReactNativeDependencies - React-jsitooling (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine + - React-Core-prebuilt - React-cxxreact (= 0.85.0) - React-debug - React-jsi (= 0.85.0) @@ -1866,54 +1388,30 @@ PODS: - React-jsinspectortracing - React-runtimeexecutor - React-utils - - SocketRocket + - ReactNativeDependencies - React-jsitracing (0.85.0): - React-jsi - React-logger (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly - - RCT-Folly/Fabric - - SocketRocket + - React-Core-prebuilt + - ReactNativeDependencies - React-Mapbuffer (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly - - RCT-Folly/Fabric - - React-debug - - SocketRocket + - React-Core-prebuilt + - React-debug + - ReactNativeDependencies - React-microtasksnativemodule (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - React-Core-prebuilt - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - react-native-safe-area-context (5.7.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -1930,20 +1428,14 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - react-native-safe-area-context/common (5.7.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -1958,20 +1450,14 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - react-native-safe-area-context/fabric (5.7.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -1987,19 +1473,13 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - React-NativeModulesApple (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - React-callinvoker - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -2009,69 +1489,39 @@ PODS: - React-runtimeexecutor - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - React-networking (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly - - RCT-Folly/Fabric + - React-Core-prebuilt - React-jsinspectornetwork - React-jsinspectortracing - React-performancetimeline - React-timing - - SocketRocket + - ReactNativeDependencies - React-oscompat (0.85.0) - React-perflogger (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly - - RCT-Folly/Fabric - - SocketRocket + - React-Core-prebuilt + - ReactNativeDependencies - React-performancecdpmetrics (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - React-Core-prebuilt - React-jsi - React-performancetimeline - React-runtimeexecutor - React-timing - - SocketRocket + - ReactNativeDependencies - React-performancetimeline (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly - - RCT-Folly/Fabric + - React-Core-prebuilt - React-featureflags - React-jsinspector - React-jsinspectortracing - React-perflogger - React-timing - - SocketRocket + - ReactNativeDependencies - React-RCTActionSheet (0.85.0): - React-Core/RCTActionSheetHeaders (= 0.85.0) - React-RCTAnimation (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly - - RCT-Folly/Fabric - RCTTypeSafety + - React-Core-prebuilt - React-Core/RCTAnimationHeaders - React-debug - React-featureflags @@ -2079,19 +1529,13 @@ PODS: - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - SocketRocket + - ReactNativeDependencies - React-RCTAppDelegate (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-CoreModules - React-debug - React-defaultsnativemodule @@ -2113,16 +1557,10 @@ PODS: - React-runtimescheduler - React-utils - ReactCommon - - SocketRocket + - ReactNativeDependencies - React-RCTBlob (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine + - React-Core-prebuilt - React-Core/RCTBlobHeaders - React-Core/RCTWebSocket - React-jsi @@ -2132,18 +1570,12 @@ PODS: - React-RCTFBReactNativeSpec - React-RCTNetwork - ReactCommon - - SocketRocket + - ReactNativeDependencies - React-RCTFabric (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTSwiftUIWrapper - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-FabricComponents @@ -2168,37 +1600,25 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket + - ReactNativeDependencies - Yoga - React-RCTFBReactNativeSpec (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec/components (= 0.85.0) - ReactCommon - - SocketRocket + - ReactNativeDependencies - React-RCTFBReactNativeSpec/components (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -2208,24 +1628,18 @@ PODS: - React-rendererdebug - React-utils - ReactCommon - - SocketRocket + - ReactNativeDependencies - Yoga - React-RCTImage (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly - - RCT-Folly/Fabric - RCTTypeSafety + - React-Core-prebuilt - React-Core/RCTImageHeaders - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - React-RCTNetwork - ReactCommon - - SocketRocket + - ReactNativeDependencies - React-RCTLinking (0.85.0): - React-Core/RCTLinkingHeaders (= 0.85.0) - React-jsi (= 0.85.0) @@ -2234,14 +1648,8 @@ PODS: - ReactCommon - ReactCommon/turbomodule/core (= 0.85.0) - React-RCTNetwork (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly - - RCT-Folly/Fabric - RCTTypeSafety + - React-Core-prebuilt - React-Core/RCTNetworkHeaders - React-debug - React-featureflags @@ -2252,17 +1660,11 @@ PODS: - React-networking - React-RCTFBReactNativeSpec - ReactCommon - - SocketRocket + - ReactNativeDependencies - React-RCTRuntime (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - React-Core + - React-Core-prebuilt - React-debug - React-jsi - React-jsinspector @@ -2274,63 +1676,39 @@ PODS: - React-runtimeexecutor - React-RuntimeHermes - React-utils - - SocketRocket + - ReactNativeDependencies - React-RCTSettings (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly - - RCT-Folly/Fabric - RCTTypeSafety + - React-Core-prebuilt - React-Core/RCTSettingsHeaders - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - SocketRocket + - ReactNativeDependencies - React-RCTText (0.85.0): - React-Core/RCTTextHeaders (= 0.85.0) - Yoga - React-RCTVibration (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly - - RCT-Folly/Fabric + - React-Core-prebuilt - React-Core/RCTVibrationHeaders - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - SocketRocket + - ReactNativeDependencies - React-rendererconsistency (0.85.0) - React-renderercss (0.85.0): - React-debug - React-utils - React-rendererdebug (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly - - RCT-Folly/Fabric - - React-debug - - SocketRocket + - React-Core-prebuilt + - React-debug + - ReactNativeDependencies - React-RuntimeApple (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - React-callinvoker + - React-Core-prebuilt - React-Core/Default - React-CoreModules - React-cxxreact @@ -2349,16 +1727,10 @@ PODS: - React-RuntimeHermes - React-runtimescheduler - React-utils - - SocketRocket + - ReactNativeDependencies - React-RuntimeCore (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine + - React-Core-prebuilt - React-cxxreact - React-Fabric - React-featureflags @@ -2371,29 +1743,17 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket + - ReactNativeDependencies - React-runtimeexecutor (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly - - RCT-Folly/Fabric + - React-Core-prebuilt - React-debug - React-featureflags - React-jsi (= 0.85.0) - React-utils - - SocketRocket + - ReactNativeDependencies - React-RuntimeHermes (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - React-Core-prebuilt - React-featureflags - React-hermes - React-jsi @@ -2405,17 +1765,11 @@ PODS: - React-RuntimeCore - React-runtimeexecutor - React-utils - - SocketRocket + - ReactNativeDependencies - React-runtimescheduler (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - React-callinvoker + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags @@ -2427,30 +1781,18 @@ PODS: - React-runtimeexecutor - React-timing - React-utils - - SocketRocket + - ReactNativeDependencies - React-timing (0.85.0): - React-debug - React-utils (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - React-Core-prebuilt - React-debug - React-jsi (= 0.85.0) - - SocketRocket + - ReactNativeDependencies - React-webperformancenativemodule (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine + - React-Core-prebuilt - React-cxxreact - React-jsi - React-jsiexecutor @@ -2458,21 +1800,15 @@ PODS: - React-RCTFBReactNativeSpec - React-runtimeexecutor - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - ReactAppDependencyProvider (0.85.0): - ReactCodegen - - ReactBrownfield (3.6.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - ReactBrownfield (3.6.1): + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -2489,20 +1825,14 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - ReactCodegen (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-FabricImage @@ -2516,59 +1846,35 @@ PODS: - React-utils - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - ReactCommon (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - RCT-Folly - - RCT-Folly/Fabric + - React-Core-prebuilt - ReactCommon/turbomodule (= 0.85.0) - - SocketRocket + - ReactNativeDependencies - ReactCommon/turbomodule (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - React-callinvoker (= 0.85.0) + - React-Core-prebuilt - React-cxxreact (= 0.85.0) - React-jsi (= 0.85.0) - React-logger (= 0.85.0) - React-perflogger (= 0.85.0) - ReactCommon/turbomodule/bridging (= 0.85.0) - ReactCommon/turbomodule/core (= 0.85.0) - - SocketRocket + - ReactNativeDependencies - ReactCommon/turbomodule/bridging (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - React-callinvoker (= 0.85.0) + - React-Core-prebuilt - React-cxxreact (= 0.85.0) - React-jsi (= 0.85.0) - React-logger (= 0.85.0) - React-perflogger (= 0.85.0) - - SocketRocket + - ReactNativeDependencies - ReactCommon/turbomodule/core (0.85.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - React-callinvoker (= 0.85.0) + - React-Core-prebuilt - React-cxxreact (= 0.85.0) - React-debug (= 0.85.0) - React-featureflags (= 0.85.0) @@ -2576,19 +1882,14 @@ PODS: - React-logger (= 0.85.0) - React-perflogger (= 0.85.0) - React-utils (= 0.85.0) - - SocketRocket + - ReactNativeDependencies + - ReactNativeDependencies (0.85.0) - RNScreens (4.24.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -2604,21 +1905,15 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - RNScreens/common (= 4.24.0) - - SocketRocket - Yoga - RNScreens/common (4.24.0): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - RCT-Folly - - RCT-Folly/Fabric + - hermes-engine - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -2634,22 +1929,15 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - SocketRocket + - ReactNativeDependencies - Yoga - - SocketRocket (0.7.1) - Yoga (0.0.0) DEPENDENCIES: - - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - "BrownfieldNavigation (from `../node_modules/@callstack/brownfield-navigation`)" - "Brownie (from `../node_modules/@callstack/brownie`)" - - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - - fast_float (from `../node_modules/react-native/third-party-podspecs/fast_float.podspec`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - - fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`) - - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) - RCTRequired (from `../node_modules/react-native/Libraries/Required`) - RCTSwiftUI (from `../node_modules/react-native/ReactApple/RCTSwiftUI`) @@ -2658,6 +1946,7 @@ DEPENDENCIES: - React (from `../node_modules/react-native/`) - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) - React-Core (from `../node_modules/react-native/`) + - React-Core-prebuilt (from `../node_modules/react-native/React-Core-prebuilt.podspec`) - React-Core/RCTWebSocket (from `../node_modules/react-native/`) - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) @@ -2721,36 +2010,20 @@ DEPENDENCIES: - ReactBrownfield (from `../../../packages/react-native-brownfield`) - ReactCodegen (from `build/generated/ios/ReactCodegen`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - ReactNativeDependencies (from `../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec`) - RNScreens (from `../node_modules/react-native-screens`) - - SocketRocket (~> 0.7.1) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) -SPEC REPOS: - trunk: - - SocketRocket - EXTERNAL SOURCES: - boost: - :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" BrownfieldNavigation: :path: "../node_modules/@callstack/brownfield-navigation" Brownie: :path: "../node_modules/@callstack/brownie" - DoubleConversion: - :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" - fast_float: - :podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec" FBLazyVector: :path: "../node_modules/react-native/Libraries/FBLazyVector" - fmt: - :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" - glog: - :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" hermes-engine: :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" :tag: hermes-v250829098.0.10 - RCT-Folly: - :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTDeprecation: :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" RCTRequired: @@ -2767,6 +2040,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/callinvoker" React-Core: :path: "../node_modules/react-native/" + React-Core-prebuilt: + :podspec: "../node_modules/react-native/React-Core-prebuilt.podspec" React-CoreModules: :path: "../node_modules/react-native/React/CoreModules" React-cxxreact: @@ -2891,95 +2166,92 @@ EXTERNAL SOURCES: :path: build/generated/ios/ReactCodegen ReactCommon: :path: "../node_modules/react-native/ReactCommon" + ReactNativeDependencies: + :podspec: "../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec" RNScreens: :path: "../node_modules/react-native-screens" Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: - boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 - BrownfieldNavigation: 0a4abcd0295639640d0222ac5c47ab63d94983c8 - Brownie: c75e781646955724c3b385e1a53704cc06491bf0 - DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb - fast_float: b32c788ed9c6a8c584d114d0047beda9664e7cc6 - FBLazyVector: dfb9ab6ee2eac316f7869edf6ec27b9e872329f0 - fmt: 530618a01105dae0fa3a2f27c81ae11fa8f67eac - glog: e56ede4028c4b7418e6b1195a36b1656bb35e225 - hermes-engine: 133acc7688f66a6db232bff7de874c7129b01e1e - RCT-Folly: 36c4f904fb6cd0219dcb76b94e9502d2a72fab0b - RCTDeprecation: df7412cdad525035c3adeb14c1dc35b344e98187 - RCTRequired: 28a4bf1ef190650fcd6973d8a6a8f8beb30ef807 - RCTSwiftUI: 3003f1af83c332be5946ec0433fedcf0ada06551 - RCTSwiftUIWrapper: 8f3fffae1ef081441a25f02d7724155ced60a444 - RCTTypeSafety: 94675f4478b5bdc80edd36b017bcd61cda7ae48b + BrownfieldNavigation: 5026c705a47b3ae85432b25cd0aebafd25d830cc + Brownie: 8e376601513d37f71a91f34da78cb07a8afb17b6 + FBLazyVector: c00c20551d40126351a6783c47ce75f5b374851b + hermes-engine: 865366c41db76094b5ce731c46e47db280bb283b + RCTDeprecation: 3bb167081b134461cfeb875ff7ae1945f8635257 + RCTRequired: 74839f55d5058a133a0bc4569b0afec750957f64 + RCTSwiftUI: 87a316382f3eab4dd13d2a0d0fd2adcce917361a + RCTSwiftUIWrapper: a31d45fd2891c1e44c1912d9d0c0fac18ed275a0 + RCTTypeSafety: abdf2eaed5501a52f2000de668ccfc60b78c3b27 React: 1b1536b9099195944034e65b1830f463caaa8390 - React-callinvoker: 4959a69fb49a4aa112b4c7bf0c1bd9ca3710d9a6 - React-Core: 5a71c4ca1f28b013e1b866f3a611a37dda2da674 - React-CoreModules: e779ef68cf531fa9af3f79802d8bf1dbfb3ac6f4 - React-cxxreact: 5022998454941ce93938f65efe5c9426a749d0f7 - React-debug: 2b75669c8916bb6897cc29b0c0fadf6083453ba6 - React-defaultsnativemodule: 1b85e0359bdd79bd25c92d361a7fc129fc0ba491 - React-domnativemodule: a3bd7f86e0c34a4b6e3b29d305825d8443d81196 - React-Fabric: e27ac294acdb388e4369db01fba8faeaa989d1cc - React-FabricComponents: 62023ca4f970d53dbea9866fb681afd68171642e - React-FabricImage: e13b7b2bc7a466f528b7d49a150686ee43a5519a - React-featureflags: ab7758e3e5d174c1b3dc9a410f7f911cb7cb1c4b - React-featureflagsnativemodule: 53e9cfbf7d90aff82734c5970242d45e0befbab7 - React-graphics: d1b81b7d3d1c6f637462f57e2490e118fdd94840 - React-hermes: 32dbf6fbb37cdbf6bf297f6d220d3a5be3b7a58a - React-idlecallbacksnativemodule: 609904842dde4336d0ee4ebf45e1035125f15f9a - React-ImageManager: 4927e5fe51263ea83032be6a2255e657da2195b0 - React-intersectionobservernativemodule: 95042156fdeeef8e6344e9caadc53de263d329f8 - React-jserrorhandler: d0ea3b3f9280ecf0ad77daceec98a953ec0f68cd - React-jsi: 5ebf5605fe779ce8fe995fbdd8000459cf4833b8 - React-jsiexecutor: 3d1df80a63fc7be59cb051b98e5c0b80d0c9c5eb - React-jsinspector: 496f29c27929cc5b2125a46c18d60cd6a8c94bfd - React-jsinspectorcdp: 6572484e28c4c9bcc1014eb680f8cb00504ea049 - React-jsinspectornetwork: 76065e2ae6ad45dfdf76074cc36b4bcefaa7bdb1 - React-jsinspectortracing: e013bdf2e6b41eb52132805710c28423aaedb2b7 - React-jsitooling: 78a74455dd30a734bc06de5879e7d0a433bf45ad - React-jsitracing: a7565cbcbf2e3b777ce4d8ad93ed4c4fccc4b5dd - React-logger: 8a3faffeb34f66ad45b70a87f4fc4b522c8cc792 - React-Mapbuffer: 4331996a168afe9027277cf20c5b905a9662dd23 - React-microtasksnativemodule: d74758fc92424808e0d82fb0692415e40c6b4e14 - react-native-safe-area-context: eda63a662750758c1fdd7e719c9f1026c8d161cb - React-NativeModulesApple: 637070d914b8136cb6c0d7c58c69acb61de2c724 - React-networking: 418a705cf5cb57bf9309c4a06c8b3292b59dc441 - React-oscompat: 2c4945336d3a1e509944c6a6a530bc1b6e756581 - React-perflogger: 829d1bd2a11e740af9e42d8321c5c6ec13448792 - React-performancecdpmetrics: 3e2ad886fa5ee2f8527de6d1db05f863997a1d55 - React-performancetimeline: 415fe0260fc28f6fcf39964b0128b5e0aa42b609 - React-RCTActionSheet: b4830feb56db4f96fb8c1b57f5b709260b2f3039 - React-RCTAnimation: 5cb95b92df9d5335849640e7c49b0f2efa80a415 - React-RCTAppDelegate: 64b498a0a6cd87824604f6b13dd3d05036ef611f - React-RCTBlob: a4678060524ff793669966862942474ca3489791 - React-RCTFabric: 3f20a27a4684c3c8eaee5a605f13efb3797ce819 - React-RCTFBReactNativeSpec: 0cb61c4c41c124b492664df466eecf9adce9cbbd - React-RCTImage: b5d3b1bc9a1e8d5e37a8b07c7e13d014a17edec8 - React-RCTLinking: d6b816eab9a73152715a0fb68d4d5dcd0dc1446a - React-RCTNetwork: 7b3e25b45cfb7f97eca1d0d0e97c3f7823f13a2e - React-RCTRuntime: 440e9b96d8bcbaf218101acc79dc24b012574055 - React-RCTSettings: 665d4017d92344abb61a9e58bbf86a45afe3326e - React-RCTText: 7cd0aea67ce3099250a23be29ef24060e9ba8d8b - React-RCTVibration: 3d59ee80b015749b7804fc6e452f8254f683862a - React-rendererconsistency: ebae5a9bd0c5349d5350679f7da7beac6682a2b9 - React-renderercss: cf6832fa2dc52cb14631b31ba6a0037e1e3fc1e3 - React-rendererdebug: 9ff5660d01ff6ab2ec6c2cb3f1fa12b601f025bb - React-RuntimeApple: 7d10b238856130859c0c0aad06ca1aa9970330e9 - React-RuntimeCore: d61e9d2b89df25ffc6fa055f7f2c5a8e8ccc7477 - React-runtimeexecutor: 0796640a20eca301aa696bdbf9054417f8ad4fc9 - React-RuntimeHermes: bc6db55565bfeb1a197e16d5f33cfc6f5dda9a55 - React-runtimescheduler: 0374e12502b3af2a697ef0ad846527cb41599aea - React-timing: fe2bc8d6652855e0f6081e141d9877078f24da52 - React-utils: f2dc3878565c3cc54bdf7f65a106efaf93f189a6 - React-webperformancenativemodule: 214e42892a044b865f73ad4f88cac6979c27aa76 + React-callinvoker: 6dff6d17d1d6cc8fdf85468a649bafed473c65f5 + React-Core: 00faa4d038298089a1d5a5b21dde8660c4f0820d + React-Core-prebuilt: e933b7f7a79e408ff99d9475f911ef8bbe5af8ca + React-CoreModules: a17807f849bfd86045b0b9a75ec8c19373b482f6 + React-cxxreact: c7b53ace5827be54048288bce5c55f337c41e95f + React-debug: 1f20c32441d0090cf67e6b966895f4ccd929d84c + React-defaultsnativemodule: a6ebd891f2d4d9351dc5f31c865e4e4cc7fd5596 + React-domnativemodule: 464aff9e0539fd739bf286786ce3c3462482ca65 + React-Fabric: c297ae62e6af0cbfe084b778439baf8eef6afe1d + React-FabricComponents: bac22b6e8b43ae46d64a4b74eadb2cadfc7668b3 + React-FabricImage: 94b22abd2af1aecbbd7cb2c9710ec9d5b1046f7f + React-featureflags: b6106128a8596c1be7d4271c826d9f0b721771ce + React-featureflagsnativemodule: 9f68ae1386967ce313feca2627b6d5b3dd3eedc6 + React-graphics: d7d83bb83f5c20e56d6ca6f788e2e6b37058396e + React-hermes: 2def7f96a41a78196e65722619aca3d285a19c53 + React-idlecallbacksnativemodule: 3e3183edac96e406fc23b18216bb0e8c3a866c85 + React-ImageManager: 4cd85ef9e5a1ca85d6ca6db9f35492c9002d295e + React-intersectionobservernativemodule: 7e3bf5c45562b58d9a096fef5ab9a286372781b7 + React-jserrorhandler: 21c2a8bcfc58322275c8b79f4176e5feb8dddb59 + React-jsi: f4b843b6851635f64e2bc17fd176b33dec120ebc + React-jsiexecutor: eb8bd947675ef44bedf6d8990a23681fc758aff0 + React-jsinspector: 897d491597d266f8658789bace8e3d7667a6920b + React-jsinspectorcdp: 9c955d97d35a40dd2c805b245dafd76004462ade + React-jsinspectornetwork: fb4ff1d7cbee2d6104b284eb268e786d1ce6e811 + React-jsinspectortracing: 22139f69ed2849ed337100ea49f020557c33cd48 + React-jsitooling: dbc3a9c1d145463f81b26b881922f75a13ad53fd + React-jsitracing: 3967b9943abd18f1d3e8378f2ccefc4e67905838 + React-logger: ee47d5f3b59a46a006c65038ed5d0b1143e37510 + React-Mapbuffer: ecc590a57aaab305582cc545acc20972680d46b6 + React-microtasksnativemodule: 11067639ecc70dc33f5da19fc31fde80e25e1845 + react-native-safe-area-context: ba7283e541a5f57c6b27a7e33f2c40b8977888c0 + React-NativeModulesApple: 9c1f8815ebd72cc1c75587fe588513f6dd9cb708 + React-networking: 79d340f8cd323295d466afbc40ff5d4b596aa1a6 + React-oscompat: 5361d0fa7905ba1c3b3c5e7c464d6be9d2d85f4b + React-perflogger: 44ecaa45852241f80e07c0787c8b65516f5e774f + React-performancecdpmetrics: 38853c3cd78961de382c1edcc3ecb2504e37837d + React-performancetimeline: c7884cf5a132a52674c5f2c496b00b57c833884f + React-RCTActionSheet: e3d1db66ef805645e83e6e80f2e21922328a79a7 + React-RCTAnimation: dc39e18331edfa4e4f3631ab83086ce4ba15c4bb + React-RCTAppDelegate: d08cad1065637eecaf347286807ca25d5e966396 + React-RCTBlob: bd5a11e3b206b86ccdcffa9538a5a4bea0acc0dd + React-RCTFabric: 6b0a0b4b0efbab9f0a6e8d5fd329bf538940dbe1 + React-RCTFBReactNativeSpec: 432e0c674537ca58cef544e942a5ef141d35fe34 + React-RCTImage: 11407de524bafcc1790394728ca3fe40c6719093 + React-RCTLinking: 707855a5142f65472096a2910044444d390e8c96 + React-RCTNetwork: 8033c7c90b0983dcf994220a9bdeaef428f0b3da + React-RCTRuntime: 1fce8f2eaec2fc9b9b6ec0c5adc53e47efb01b0e + React-RCTSettings: cf450b5c44e1d8379b06ac9469c8a81c35ecd7c4 + React-RCTText: 19f706ee0de06dd92945da223d8558d849209e9d + React-RCTVibration: 3383f98add29944aebdcdfa89598b09b1cadf13c + React-rendererconsistency: 6851f38dab1216446a2fec803357ebbdfc32a0bb + React-renderercss: 71e1618a5d0244143702293bc25d351c57218036 + React-rendererdebug: a6b409110a81409e9001ce236c1c779fa117e1f3 + React-RuntimeApple: ba296b048f1dd80883a73f3aae4d6acf9479f599 + React-RuntimeCore: e3cf61d86a908c3f10224b9aa1b67c13af67afe8 + React-runtimeexecutor: f70ca4ad104263dfd70bc32c187021485d1305e2 + React-RuntimeHermes: 32850102fe41ea5bf8248aeb0a76ccbe06a1c16f + React-runtimescheduler: 5a8c857de6ad793dd1fba1916862ee419566226e + React-timing: ab856c0faeb19d7ff5f360203c4ebdade7f7041a + React-utils: f747ea9fa3f4b293533ec4ef7976d1e37f004ef8 + React-webperformancenativemodule: cf676ba871cc4b6ae175f75b92e8c689960c4141 ReactAppDependencyProvider: 5787b37b8e2e51dfeab697ec031cc7c4080dcea2 - ReactBrownfield: 9e36bd174c53254c7a283a6305a4b26589e75f97 - ReactCodegen: 6ddd8f44847646a047320a22f5ddb10b27a515c9 - ReactCommon: 6a42764f1136fb9ac210e05e88a0733a00ee23d3 - RNScreens: e902eba58a27d3ad399a495d578e8aba3ea0f490 - SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - Yoga: c032154b93caa7298059b4731854ed59dcefbac2 + ReactBrownfield: de7023931b75798565c5d69f1666e4c0cd99a7ab + ReactCodegen: d9ba64702c846111b3eeb157ea2e15aa5bb2ea55 + ReactCommon: fe2a3af8975e63efa60f95fca8c34dc85deee360 + ReactNativeDependencies: f44834e109bfe5fff184146c0df7fe0b3526b97f + RNScreens: c58f17578c73435d8c00998cac0d89ad8105263c + Yoga: ce94692032f0a4e4ca7ed9e52a284cb208fcdbbb PODFILE CHECKSUM: 7c116a16dd0744063c8c6293dbfc638c9d447c19 diff --git a/apps/RNApp/ios/RNApp.xcodeproj/project.pbxproj b/apps/RNApp/ios/RNApp.xcodeproj/project.pbxproj index 62818347..6f208d6e 100644 --- a/apps/RNApp/ios/RNApp.xcodeproj/project.pbxproj +++ b/apps/RNApp/ios/RNApp.xcodeproj/project.pbxproj @@ -668,6 +668,18 @@ "${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios", "${PODS_CONFIGURATION_BUILD_DIR}/React-featureflags/React_featureflags.framework/Headers", "${PODS_CONFIGURATION_BUILD_DIR}/React-renderercss/React_renderercss.framework/Headers", + "${PODS_ROOT}/ReactCommon", + "${PODS_ROOT}/ReactCommon/react/nativemodule/core", + "${PODS_ROOT}/React-runtimeexecutor", + "${PODS_ROOT}/React-runtimeexecutor/platform/ios", + "${PODS_ROOT}/ReactCommon-Samples", + "${PODS_ROOT}/ReactCommon-Samples/platform/ios", + "${PODS_ROOT}/React-Fabric/react/renderer/components/view/platform/cxx", + "${PODS_ROOT}/React-NativeModulesApple", + "${PODS_ROOT}/React-graphics", + "${PODS_ROOT}/React-graphics/react/renderer/graphics/platform/ios", + "${PODS_ROOT}/React-featureflags", + "${PODS_ROOT}/React-renderercss", ); IPHONEOS_DEPLOYMENT_TARGET = 15.1; LD_RUNPATH_SEARCH_PATHS = ( @@ -758,6 +770,18 @@ "${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios", "${PODS_CONFIGURATION_BUILD_DIR}/React-featureflags/React_featureflags.framework/Headers", "${PODS_CONFIGURATION_BUILD_DIR}/React-renderercss/React_renderercss.framework/Headers", + "${PODS_ROOT}/ReactCommon", + "${PODS_ROOT}/ReactCommon/react/nativemodule/core", + "${PODS_ROOT}/React-runtimeexecutor", + "${PODS_ROOT}/React-runtimeexecutor/platform/ios", + "${PODS_ROOT}/ReactCommon-Samples", + "${PODS_ROOT}/ReactCommon-Samples/platform/ios", + "${PODS_ROOT}/React-Fabric/react/renderer/components/view/platform/cxx", + "${PODS_ROOT}/React-NativeModulesApple", + "${PODS_ROOT}/React-graphics", + "${PODS_ROOT}/React-graphics/react/renderer/graphics/platform/ios", + "${PODS_ROOT}/React-featureflags", + "${PODS_ROOT}/React-renderercss", ); IPHONEOS_DEPLOYMENT_TARGET = 15.1; LD_RUNPATH_SEARCH_PATHS = ( From c2a3e4b0e0b4cf547caeff3fcc305e8c245b9faa Mon Sep 17 00:00:00 2001 From: artus9033 Date: Wed, 13 May 2026 17:11:11 +0200 Subject: [PATCH 22/26] chore: commit yarn.lock --- yarn.lock | 141 +++++++++++++++++++++++++----------------------------- 1 file changed, 66 insertions(+), 75 deletions(-) diff --git a/yarn.lock b/yarn.lock index b665f390..44bf08e1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1800,18 +1800,18 @@ __metadata: "@types/react": "npm:~19.1.10" eslint: "npm:^9.25.0" eslint-config-expo: "npm:~10.0.0" - expo: "npm:~54.0.33" + expo: "npm:~54.0.34" expo-constants: "npm:~18.0.13" expo-font: "npm:~14.0.11" expo-haptics: "npm:~15.0.8" expo-image: "npm:~3.0.11" - expo-linking: "npm:~8.0.11" + expo-linking: "npm:~8.0.12" expo-router: "npm:~6.0.23" expo-splash-screen: "npm:~31.0.13" expo-status-bar: "npm:~3.0.9" expo-symbols: "npm:~1.0.8" expo-system-ui: "npm:~6.0.9" - expo-web-browser: "npm:~15.0.10" + expo-web-browser: "npm:~15.0.11" react: "npm:19.1.0" react-dom: "npm:19.1.0" react-native: "npm:0.81.5" @@ -2727,9 +2727,9 @@ __metadata: languageName: node linkType: hard -"@expo/cli@npm:54.0.23": - version: 54.0.23 - resolution: "@expo/cli@npm:54.0.23" +"@expo/cli@npm:54.0.24": + version: 54.0.24 + resolution: "@expo/cli@npm:54.0.24" dependencies: "@0no-co/graphql.web": "npm:^1.0.8" "@expo/code-signing-certificates": "npm:^0.0.6" @@ -2740,7 +2740,7 @@ __metadata: "@expo/image-utils": "npm:^0.8.8" "@expo/json-file": "npm:^10.0.8" "@expo/metro": "npm:~54.2.0" - "@expo/metro-config": "npm:~54.0.14" + "@expo/metro-config": "npm:~54.0.15" "@expo/osascript": "npm:^2.3.8" "@expo/package-manager": "npm:^1.9.10" "@expo/plist": "npm:^0.4.8" @@ -2763,16 +2763,16 @@ __metadata: connect: "npm:^3.7.0" debug: "npm:^4.3.4" env-editor: "npm:^0.4.1" - expo-server: "npm:^1.0.5" + expo-server: "npm:^1.0.6" freeport-async: "npm:^2.0.0" getenv: "npm:^2.0.0" glob: "npm:^13.0.0" - lan-network: "npm:^0.1.6" + lan-network: "npm:^0.2.1" minimatch: "npm:^9.0.0" node-forge: "npm:^1.3.3" npm-package-arg: "npm:^11.0.0" ora: "npm:^3.4.0" - picomatch: "npm:^3.0.1" + picomatch: "npm:^4.0.3" pretty-bytes: "npm:^5.6.0" pretty-format: "npm:^29.7.0" progress: "npm:^2.0.3" @@ -2805,7 +2805,7 @@ __metadata: optional: true bin: expo-internal: build/bin/cli - checksum: 10/9a41c55aa7f628ad44048c9f41cd8d7f4f73a8bfc01adaa956ddaae87d332ae979eadb52bdab894ef5b1c9b5722486ccdb999057d8b9eed392c827f476feb79f + checksum: 10/23d6ef754b4b19b1b36d689c0466d4b249b704dc824a9a1164aab48a4920946aa49f45ff2d94d361f7b547f2311e0741489e8ee89e9be53ccc46cf75f29dcdab languageName: node linkType: hard @@ -3080,9 +3080,9 @@ __metadata: languageName: node linkType: hard -"@expo/fingerprint@npm:0.15.4": - version: 0.15.4 - resolution: "@expo/fingerprint@npm:0.15.4" +"@expo/fingerprint@npm:0.15.5": + version: 0.15.5 + resolution: "@expo/fingerprint@npm:0.15.5" dependencies: "@expo/spawn-async": "npm:^1.7.2" arg: "npm:^5.0.2" @@ -3091,13 +3091,13 @@ __metadata: getenv: "npm:^2.0.0" glob: "npm:^13.0.0" ignore: "npm:^5.3.1" - minimatch: "npm:^9.0.0" + minimatch: "npm:^10.2.2" p-limit: "npm:^3.1.0" resolve-from: "npm:^5.0.0" semver: "npm:^7.6.0" bin: fingerprint: bin/cli.js - checksum: 10/854c5b8c298d145d58d47d45081f14fd1fc3c4880e6706257c4863ea4e56a368d055d1043538c74e35f5b23971c945bcd3e62750ffe23d2210f73d3712447b5a + checksum: 10/27b1814c3e551737301e90f4e8df34af32c3da6b8a14d62d417df3e954ff248fd81af98066b501038c0b0ab720ba604306c46a2f8f8bc5c91f24a41324d88096 languageName: node linkType: hard @@ -3208,9 +3208,9 @@ __metadata: languageName: node linkType: hard -"@expo/metro-config@npm:54.0.14, @expo/metro-config@npm:~54.0.14": - version: 54.0.14 - resolution: "@expo/metro-config@npm:54.0.14" +"@expo/metro-config@npm:54.0.15, @expo/metro-config@npm:~54.0.15": + version: 54.0.15 + resolution: "@expo/metro-config@npm:54.0.15" dependencies: "@babel/code-frame": "npm:^7.20.0" "@babel/core": "npm:^7.20.0" @@ -3230,7 +3230,7 @@ __metadata: hermes-parser: "npm:^0.29.1" jsc-safe-url: "npm:^0.2.4" lightningcss: "npm:^1.30.1" - minimatch: "npm:^9.0.0" + picomatch: "npm:^4.0.3" postcss: "npm:~8.4.32" resolve-from: "npm:^5.0.0" peerDependencies: @@ -3238,7 +3238,7 @@ __metadata: peerDependenciesMeta: expo: optional: true - checksum: 10/c1a67c187fcd9f3dd43cd1b33a500644715768ab55939d5e2ff354311709ea5fed2bb3c103610b0ddac961d7ab2f94f7a1d1f25d033af98690ed6b9cec9ac787 + checksum: 10/875b4ae8c9b3dc06ac8db2dbc25ec3082fdfb3f7e1fdc7223e555f1627601633c95510b442c38cc2a0f63e4fd05fbb9b4ab6156ec0a27528f285b113e2561905 languageName: node linkType: hard @@ -10422,17 +10422,17 @@ __metadata: languageName: node linkType: hard -"expo-asset@npm:~12.0.12": - version: 12.0.12 - resolution: "expo-asset@npm:12.0.12" +"expo-asset@npm:~12.0.13": + version: 12.0.13 + resolution: "expo-asset@npm:12.0.13" dependencies: "@expo/image-utils": "npm:^0.8.8" - expo-constants: "npm:~18.0.12" + expo-constants: "npm:~18.0.13" peerDependencies: expo: "*" react: "*" react-native: "*" - checksum: 10/7034316d820837c92ac70274be56a8e59181f1513805f8a4c85e16f12e1dd75ac6d6ae0b231bd8a76adbb71be6163c05b31b1d437f15b14745c70cc1f255c8a1 + checksum: 10/02ab81f36bd9c33a2e161df580efd0fcead533a98d55b310d44975fa15fbac904cd653701172734efcfa96ae71d3c3127a4d00467b1d3a63d8a0e5444a851ab8 languageName: node linkType: hard @@ -10450,7 +10450,7 @@ __metadata: languageName: node linkType: hard -"expo-constants@npm:~18.0.12, expo-constants@npm:~18.0.13": +"expo-constants@npm:~18.0.13": version: 18.0.13 resolution: "expo-constants@npm:18.0.13" dependencies: @@ -10486,13 +10486,13 @@ __metadata: languageName: node linkType: hard -"expo-file-system@npm:~19.0.21": - version: 19.0.21 - resolution: "expo-file-system@npm:19.0.21" +"expo-file-system@npm:~19.0.22": + version: 19.0.22 + resolution: "expo-file-system@npm:19.0.22" peerDependencies: expo: "*" react-native: "*" - checksum: 10/00a2f13f8139724016f8b811303dd4a4070a315f80ee9e1877bcfd00773b38caafe4f1d3d7d4a87777e4ff53ba645aae0b4430e875f9ee5f277b88372b507811 + checksum: 10/832f8dc9cf51625d587baa1ca20dc8f191bbf1b99766942299dd0de232d30f85e0afd76f5dd8b8c362f8aed299a21abe85c2f2f057446749c579d2622c11a8c8 languageName: node linkType: hard @@ -10617,22 +10617,22 @@ __metadata: languageName: node linkType: hard -"expo-linking@npm:~8.0.11": - version: 8.0.11 - resolution: "expo-linking@npm:8.0.11" +"expo-linking@npm:~8.0.12": + version: 8.0.12 + resolution: "expo-linking@npm:8.0.12" dependencies: - expo-constants: "npm:~18.0.12" + expo-constants: "npm:~18.0.13" invariant: "npm:^2.2.4" peerDependencies: react: "*" react-native: "*" - checksum: 10/b43851e173e5b2b21ac7cfc1fef05ae1cb39209c82af73943abb1e701a767e3759cf4a85e47bb181ab8a0c7b080f9b9d9b7d52f6c54f620f06dad7848e05f336 + checksum: 10/e3f7a914955bcd2cf54572d6a6f8d3d13c3e2bc802a5fc2e7d7350fc002995282a91d8097eb7bf06336f8fa1dbfe5d0761a8536252739fa5ec12162de33109f4 languageName: node linkType: hard -"expo-modules-autolinking@npm:3.0.24": - version: 3.0.24 - resolution: "expo-modules-autolinking@npm:3.0.24" +"expo-modules-autolinking@npm:3.0.25": + version: 3.0.25 + resolution: "expo-modules-autolinking@npm:3.0.25" dependencies: "@expo/spawn-async": "npm:^1.7.2" chalk: "npm:^4.1.0" @@ -10641,7 +10641,7 @@ __metadata: resolve-from: "npm:^5.0.0" bin: expo-modules-autolinking: bin/expo-modules-autolinking.js - checksum: 10/e3b77d2fa84b77e53dca2ef608b48c4db196957c76ac7cc1aba4eb2cca44b5082a16f7af8a3549a342c7a1362f069a76fb9ebdab4be6b467e3791ad48387e15a + checksum: 10/bdee2bf9eebebdd0f2562a815b04ac54714b13dc6050de0cb55aa4640cd04f2f33c4845a110ec1754bde0b8c3863f197cf85bb2fb4aa0a5e2dfec45004ea7a03 languageName: node linkType: hard @@ -10659,15 +10659,15 @@ __metadata: languageName: node linkType: hard -"expo-modules-core@npm:3.0.29": - version: 3.0.29 - resolution: "expo-modules-core@npm:3.0.29" +"expo-modules-core@npm:3.0.30": + version: 3.0.30 + resolution: "expo-modules-core@npm:3.0.30" dependencies: invariant: "npm:^2.2.4" peerDependencies: react: "*" react-native: "*" - checksum: 10/db23a1c7321db54f40f0bcb9c18e7239d798fb7fb5d8ceedf09879f7ff4d90a85e375851796008006441326ed61c00ba00950b06bc7ea74f6ba648a9dac9d053 + checksum: 10/092155a0a905623d3361f619b5077242120d1cad271147479b0e4e88fb83fd3bf3d95d2a73ee0f147a4905b5bc9cc6dc610b593886d4d0f0f28a81d229907000 languageName: node linkType: hard @@ -10822,6 +10822,13 @@ __metadata: languageName: node linkType: hard +"expo-server@npm:^1.0.6": + version: 1.0.6 + resolution: "expo-server@npm:1.0.6" + checksum: 10/eda5a44250eaad66994f9ee79b163e45c4b80703746040d1b782e23865d875e86d8d915d822d388999f0bd1a57eae52e72f2ce4fdfa9132ec595189542fd6204 + languageName: node + linkType: hard + "expo-server@npm:^55.0.9": version: 55.0.9 resolution: "expo-server@npm:55.0.9" @@ -10936,13 +10943,13 @@ __metadata: languageName: node linkType: hard -"expo-web-browser@npm:~15.0.10": - version: 15.0.10 - resolution: "expo-web-browser@npm:15.0.10" +"expo-web-browser@npm:~15.0.11": + version: 15.0.11 + resolution: "expo-web-browser@npm:15.0.11" peerDependencies: expo: "*" react-native: "*" - checksum: 10/1496e68370d8b78ba8218408668a88919ea5668fcfd4e1470541be75a8a97647d9018460284ad64ce6873931bc82e301b261e37d7e0e71f019d94b6d8737b1ee + checksum: 10/56472ec29d8c6687e75e686be4af0f278d0d89aad64dcff221ea5897c09eac29ab5358c0a63a27fc7db8261482c23d52dc93116aeecfb0becfd650acb2aa926b languageName: node linkType: hard @@ -10956,28 +10963,28 @@ __metadata: languageName: node linkType: hard -"expo@npm:~54.0.33": - version: 54.0.33 - resolution: "expo@npm:54.0.33" +"expo@npm:~54.0.34": + version: 54.0.34 + resolution: "expo@npm:54.0.34" dependencies: "@babel/runtime": "npm:^7.20.0" - "@expo/cli": "npm:54.0.23" + "@expo/cli": "npm:54.0.24" "@expo/config": "npm:~12.0.13" "@expo/config-plugins": "npm:~54.0.4" "@expo/devtools": "npm:0.1.8" - "@expo/fingerprint": "npm:0.15.4" + "@expo/fingerprint": "npm:0.15.5" "@expo/metro": "npm:~54.2.0" - "@expo/metro-config": "npm:54.0.14" + "@expo/metro-config": "npm:54.0.15" "@expo/vector-icons": "npm:^15.0.3" "@ungap/structured-clone": "npm:^1.3.0" babel-preset-expo: "npm:~54.0.10" - expo-asset: "npm:~12.0.12" + expo-asset: "npm:~12.0.13" expo-constants: "npm:~18.0.13" - expo-file-system: "npm:~19.0.21" + expo-file-system: "npm:~19.0.22" expo-font: "npm:~14.0.11" expo-keep-awake: "npm:~15.0.8" - expo-modules-autolinking: "npm:3.0.24" - expo-modules-core: "npm:3.0.29" + expo-modules-autolinking: "npm:3.0.25" + expo-modules-core: "npm:3.0.30" pretty-format: "npm:^29.7.0" react-refresh: "npm:^0.14.2" whatwg-url-without-unicode: "npm:8.0.0-3" @@ -10998,7 +11005,7 @@ __metadata: expo: bin/cli expo-modules-autolinking: bin/autolinking fingerprint: bin/fingerprint - checksum: 10/ed672f78333cf50545ea1cca8181506604150cca01a8aae782da30ddcba185d68f2d48f2ca10dee575a7abbc7913cca3f4c3d34d98373b0e9706b344030fa929 + checksum: 10/3dd144407c134d9f21e57df34391d4d28a8fac2d978a8e83d5c998a69c4b1b4982579cd936595a90a199df29b89bc07ddf904badb1b256a63290d37c635bffe8 languageName: node linkType: hard @@ -13691,15 +13698,6 @@ __metadata: languageName: node linkType: hard -"lan-network@npm:^0.1.6": - version: 0.1.7 - resolution: "lan-network@npm:0.1.7" - bin: - lan-network: dist/lan-network-cli.js - checksum: 10/005b6a30c114b7caa69922756cf5d5dd07679dab254127823255525b426c979388db0f1f74d7c364d96fb2c4dabcbe29bed8ed97a96c290431f3c6127a592f46 - languageName: node - linkType: hard - "lan-network@npm:^0.2.1": version: 0.2.1 resolution: "lan-network@npm:0.2.1" @@ -16926,13 +16924,6 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^3.0.1": - version: 3.0.2 - resolution: "picomatch@npm:3.0.2" - checksum: 10/361c157f850d0d7dfa8878833525af4d4f4a02731242c7bf9a3540e08905a17950d10fc6f009552e88068baeacffe8348ef8c47bec08cd23a87a37de6dab247c - languageName: node - linkType: hard - "picomatch@npm:^4.0.3, picomatch@npm:^4.0.4": version: 4.0.4 resolution: "picomatch@npm:4.0.4" From 2a4d37403725b9a6753f4010b827c86dcc986e17 Mon Sep 17 00:00:00 2001 From: artus9033 Date: Thu, 14 May 2026 23:04:03 +0200 Subject: [PATCH 23/26] feat: make RN core prebuilts unsupported for Expo < 55 due to lack of support in Expo internals in brownfield scenarios --- .changeset/use-prebuilt-rn-core-flag.md | 4 +- docs/docs/docs/cli/brownfield.mdx | 34 ++++---- docs/docs/docs/getting-started/ios.mdx | 11 ++- .../cli/src/brownfield/commands/packageIos.ts | 7 +- .../utils/__tests__/usePrebuiltRnCore.test.ts | 80 +++++++++++++++++++ packages/cli/src/brownfield/utils/project.ts | 9 +++ .../src/brownfield/utils/usePrebuiltRnCore.ts | 49 ++++++++++++ 7 files changed, 171 insertions(+), 23 deletions(-) create mode 100644 packages/cli/src/brownfield/utils/__tests__/usePrebuiltRnCore.test.ts create mode 100644 packages/cli/src/brownfield/utils/usePrebuiltRnCore.ts diff --git a/.changeset/use-prebuilt-rn-core-flag.md b/.changeset/use-prebuilt-rn-core-flag.md index 6211fc6a..20931b6a 100644 --- a/.changeset/use-prebuilt-rn-core-flag.md +++ b/.changeset/use-prebuilt-rn-core-flag.md @@ -2,6 +2,6 @@ '@callstack/brownfield-cli': minor --- -Support RN prebuilts in Brownfield, by default enabled in RN >= 0.84, opt-in in RN 0.83. +Support RN prebuilts in Brownfield, by default enabled in RN >= 0.84, opt-in in RN 0.83; or in Expo 55+ (Expo 54 is not supported). -Add `--use-prebuilt-rn-core` to `brownfield package:ios` so callers can opt into or out of React Native Apple prebuilt binaries; omitting the flag defers to version-aware defaults handled by Rock. +Add `--use-prebuilt-rn-core` to `brownfield package:ios` so callers can opt into or out of React Native Apple prebuilt binaries; omitting the flag defers to version-aware defaults handled by Rock. The CLI rejects `--use-prebuilt-rn-core` when React Native is older than 0.81 or when the project is Expo SDK older than 55. diff --git a/docs/docs/docs/cli/brownfield.mdx b/docs/docs/docs/cli/brownfield.mdx index b5d3d11c..1e029a30 100644 --- a/docs/docs/docs/cli/brownfield.mdx +++ b/docs/docs/docs/cli/brownfield.mdx @@ -20,23 +20,23 @@ Simply run `npx brownfield package:ios` to create an XCFramework that you can la Available arguments: -| Argument | Description | -| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| --verbose | Enable verbose logging | -| --configuration | Explicitly set the scheme configuration to use. This option is case sensitive. | -| --scheme | Explicitly set Xcode scheme to use | -| --target | Explicitly set Xcode target to use | -| --extra-params | Custom params that will be passed to xcodebuild command | -| --export-extra-params | Custom params that will be passed to xcodebuild export archive command. Example: `--export-extra-params "-allowProvisioningUpdates"` | -| --export-options-plist | Name of the export options file for archiving. Defaults to: `ExportOptions.plist` | -| --build-folder | Location for iOS build artifacts. Corresponds to Xcode's "-derivedDataPath". By default, the '\/.brownfield/build' path will be used. | -| --destination | Define destination(s) for the build. You can pass multiple destinations as separate values or repeated use of the flag. Values: "simulator", "device", or xcodebuild destinations | -| --archive | Create an Xcode archive (IPA) of the build, required for uploading to App Store Connect or distributing to TestFlight | -| --use-prebuilt-rn-core [bool] | Controls usage of React Native Apple prebuilt binaries for the packaging Xcode build. Omit for version-aware defaults (see [Getting Started — iOS — React Native Prebuilts](/docs/getting-started/ios#react-native-prebuilts)). Pass `true`, `false`, or use the flag without a value as shorthand for `true`. | -| --no-install-pods | Skip automatic CocoaPods installation | -| --no-new-arch | Run React Native in legacy async architecture | -| --local | Force local build with xcodebuild | -| --verbose | Enable verbose logging | +| Argument | Description | +| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| --verbose | Enable verbose logging | +| --configuration | Explicitly set the scheme configuration to use. This option is case sensitive. | +| --scheme | Explicitly set Xcode scheme to use | +| --target | Explicitly set Xcode target to use | +| --extra-params | Custom params that will be passed to xcodebuild command | +| --export-extra-params | Custom params that will be passed to xcodebuild export archive command. Example: `--export-extra-params "-allowProvisioningUpdates"` | +| --export-options-plist | Name of the export options file for archiving. Defaults to: `ExportOptions.plist` | +| --build-folder | Location for iOS build artifacts. Corresponds to Xcode's "-derivedDataPath". By default, the '\/.brownfield/build' path will be used. | +| --destination | Define destination(s) for the build. You can pass multiple destinations as separate values or repeated use of the flag. Values: "simulator", "device", or xcodebuild destinations | +| --archive | Create an Xcode archive (IPA) of the build, required for uploading to App Store Connect or distributing to TestFlight | +| --use-prebuilt-rn-core [bool] | Controls usage of React Native Apple prebuilt binaries for the packaging Xcode build. Omit for version-aware defaults (see [Getting Started — iOS — React Native Prebuilts](/docs/getting-started/ios#react-native-prebuilts)). Pass `true`, `false`, or use the flag without a value as shorthand for `true`. Supported only for Expo 55+ OR vanilla RN >= 0.81. | +| --no-install-pods | Skip automatic CocoaPods installation | +| --no-new-arch | Run React Native in legacy async architecture | +| --local | Force local build with xcodebuild | +| --verbose | Enable verbose logging | The build directory will be placed in the `/.brownfield/build` folder by default and the build outputs (XCFrameworks) will be created in the `/.brownfield/package/build` folder: diff --git a/docs/docs/docs/getting-started/ios.mdx b/docs/docs/docs/getting-started/ios.mdx index a1343d62..a5e1e70a 100644 --- a/docs/docs/docs/getting-started/ios.mdx +++ b/docs/docs/docs/getting-started/ios.mdx @@ -221,15 +221,20 @@ struct ContentView: View { React Native can ship prebuilt iOS artifacts, which greatly speeds up the build time. Brownfield supports them since version 3.7.0 in the following scenarios: -- RN 0.83 (oldest supported by Brownfield v3) ships opt-in support (first in 0.81), which can be opted-in for via `--use-prebuilt-rn-core` flag. -- RN >= 0.84 ships prebuilts by default, therefore Brownfield enables them in packaging by default for RN >= 0.84. +1. In "Vanilla" React Native projects: + - RN 0.83 (oldest supported by Brownfield v3) ships opt-in support (first in 0.81), which can be opted-in for via `--use-prebuilt-rn-core` flag. + - RN >= 0.84 ships prebuilts by default, therefore Brownfield enables them in packaging by default for RN >= 0.84. +2. In Expo projects: + - with Expo 55+, enabled by default + - unsupported in Expo < 55 due to lack of support for packaging brownfield with prebuilts in Expo internals (attempting to results in native build issues) -When using the --use-prebuilt-rn-core flag: +When using the `--use-prebuilt-rn-core` flag: - for RN 0.83, Brownfield will use prebuilts if that flag is set to true (default behaviour in flag absence: prebuilts **are not** used) - for RN >= 0.84: - Brownfield will use prebuilts if that flag is not set, or is set to true (default behaviour in flag absence: prebuilts **are** used) - if the flag is explicitly set to false, Brownfield will **not** use prebuilts +- will fail for RN < 0.81, or Expo < 55 due to Brownfield CLI checks (those scenarios will not work with prebuilts) ## Next Steps diff --git a/packages/cli/src/brownfield/commands/packageIos.ts b/packages/cli/src/brownfield/commands/packageIos.ts index f42792c8..d6394865 100644 --- a/packages/cli/src/brownfield/commands/packageIos.ts +++ b/packages/cli/src/brownfield/commands/packageIos.ts @@ -19,6 +19,7 @@ import { Command, Option } from 'commander'; import { runExpoPrebuildIfNeeded } from '../utils/expo.js'; import { getProjectInfo } from '../utils/project.js'; +import { assertUsePrebuiltRnCoreSupported } from '../utils/usePrebuiltRnCore.js'; import { actionRunner, curryOptions, @@ -74,12 +75,16 @@ export const packageIosCommand = curryOptions( .addOption( new Option('--use-prebuilt-rn-core [bool]', USE_PREBUILT_RN_CORE_HELP) .preset(true) - .default(true) .argParser(parseUsePrebuiltRnCoreArgument) ) .action( actionRunner(async (options: PackageIosCliFlags) => { const { projectRoot, platformConfig, userConfig } = getProjectInfo('ios'); + + if (options.usePrebuiltRnCore === true) { + assertUsePrebuiltRnCoreSupported({ projectRoot }); + } + await runExpoPrebuildIfNeeded({ projectRoot, platform: 'ios' }); if (!userConfig.project.ios) { diff --git a/packages/cli/src/brownfield/utils/__tests__/usePrebuiltRnCore.test.ts b/packages/cli/src/brownfield/utils/__tests__/usePrebuiltRnCore.test.ts new file mode 100644 index 00000000..87d95015 --- /dev/null +++ b/packages/cli/src/brownfield/utils/__tests__/usePrebuiltRnCore.test.ts @@ -0,0 +1,80 @@ +import * as rockTools from '@rock-js/tools'; +import { beforeEach, describe, expect, test, vi } from 'vitest'; + +import * as projectUtils from '../project.js'; +import { assertUsePrebuiltRnCoreSupported } from '../usePrebuiltRnCore.js'; + +vi.mock('@rock-js/tools', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + getReactNativeVersion: vi.fn(), + }; +}); + +vi.mock('../project.js', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + getExpoSdkMajor: vi.fn(), + isExpoProject: vi.fn(), + }; +}); + +describe('assertUsePrebuiltRnCoreSupported', () => { + beforeEach(() => { + vi.mocked(rockTools.getReactNativeVersion).mockReset(); + vi.mocked(projectUtils.isExpoProject).mockReset(); + vi.mocked(projectUtils.getExpoSdkMajor).mockReset(); + }); + + test('allows vanilla RN >= 0.81', () => { + vi.mocked(rockTools.getReactNativeVersion).mockReturnValue('0.83.0'); + vi.mocked(projectUtils.isExpoProject).mockReturnValue(false); + + expect(() => + assertUsePrebuiltRnCoreSupported({ projectRoot: '/project' }) + ).not.toThrow(); + }); + + test('rejects vanilla RN < 0.81', () => { + vi.mocked(rockTools.getReactNativeVersion).mockReturnValue('0.80.0'); + vi.mocked(projectUtils.isExpoProject).mockReturnValue(false); + + expect(() => + assertUsePrebuiltRnCoreSupported({ projectRoot: '/project' }) + ).toThrow(rockTools.RockError); + expect(() => + assertUsePrebuiltRnCoreSupported({ projectRoot: '/project' }) + ).toThrow(/React Native 0\.81\.0 or newer/); + }); + + test('rejects unknown react-native version', () => { + vi.mocked(rockTools.getReactNativeVersion).mockReturnValue('unknown'); + vi.mocked(projectUtils.isExpoProject).mockReturnValue(false); + + expect(() => + assertUsePrebuiltRnCoreSupported({ projectRoot: '/project' }) + ).toThrow(/unable to resolve the installed react-native version/); + }); + + test('allows Expo SDK >= 55 when RN is supported', () => { + vi.mocked(rockTools.getReactNativeVersion).mockReturnValue('0.83.0'); + vi.mocked(projectUtils.isExpoProject).mockReturnValue(true); + vi.mocked(projectUtils.getExpoSdkMajor).mockReturnValue(55); + + expect(() => + assertUsePrebuiltRnCoreSupported({ projectRoot: '/project' }) + ).not.toThrow(); + }); + + test('rejects Expo SDK < 55 even when RN is supported', () => { + vi.mocked(rockTools.getReactNativeVersion).mockReturnValue('0.83.0'); + vi.mocked(projectUtils.isExpoProject).mockReturnValue(true); + vi.mocked(projectUtils.getExpoSdkMajor).mockReturnValue(54); + + expect(() => + assertUsePrebuiltRnCoreSupported({ projectRoot: '/project' }) + ).toThrow(/Expo SDK 55 or newer/); + }); +}); diff --git a/packages/cli/src/brownfield/utils/project.ts b/packages/cli/src/brownfield/utils/project.ts index 3d5c7266..af3aea22 100644 --- a/packages/cli/src/brownfield/utils/project.ts +++ b/packages/cli/src/brownfield/utils/project.ts @@ -56,6 +56,15 @@ export function isExpoProject(projectRoot: string): boolean { return hasExpoConfig && dependsOnExpo; } +export function getExpoSdkMajor(projectRoot: string): number | null { + const rawExpoVersion = getExpoConfigIfIsExpo(projectRoot)?.exp.sdkVersion; + if (!rawExpoVersion) { + return null; + } + const expoSdkMajor = parseInt(rawExpoVersion.split('.')[0], 10); + return Number.isFinite(expoSdkMajor) ? expoSdkMajor : null; +} + /** * Fills the RNC CLI project config from the Expo config by mutating the passed in `options.projectConfig` object in place */ diff --git a/packages/cli/src/brownfield/utils/usePrebuiltRnCore.ts b/packages/cli/src/brownfield/utils/usePrebuiltRnCore.ts new file mode 100644 index 00000000..d3ea04d9 --- /dev/null +++ b/packages/cli/src/brownfield/utils/usePrebuiltRnCore.ts @@ -0,0 +1,49 @@ +import { + getReactNativeVersion, + RockError, + versionCompare, +} from '@rock-js/tools'; + +import { getExpoSdkMajor, isExpoProject } from './project.js'; + +export const MIN_REACT_NATIVE_VERSION_FOR_USE_PREBUILT_RN_CORE = '0.81.0'; +export const MIN_EXPO_SDK_MAJOR_FOR_USE_PREBUILT_RN_CORE = 55; + +export function assertUsePrebuiltRnCoreSupported({ + projectRoot, +}: { + projectRoot: string; +}): void { + const reactNativeVersion = getReactNativeVersion(projectRoot); + + if (reactNativeVersion === 'unknown') { + throw new RockError( + 'Cannot use --use-prebuilt-rn-core: unable to resolve the installed react-native version.' + ); + } + + if ( + versionCompare( + reactNativeVersion, + MIN_REACT_NATIVE_VERSION_FOR_USE_PREBUILT_RN_CORE + ) < 0 + ) { + throw new RockError( + `--use-prebuilt-rn-core requires React Native ${MIN_REACT_NATIVE_VERSION_FOR_USE_PREBUILT_RN_CORE} or newer (found ${reactNativeVersion}).` + ); + } + + if (isExpoProject(projectRoot)) { + const expoSdkMajor = getExpoSdkMajor(projectRoot); + + if ( + expoSdkMajor === null || + expoSdkMajor < MIN_EXPO_SDK_MAJOR_FOR_USE_PREBUILT_RN_CORE + ) { + const sdkLabel = expoSdkMajor === null ? 'unknown' : String(expoSdkMajor); + throw new RockError( + `--use-prebuilt-rn-core requires Expo SDK ${MIN_EXPO_SDK_MAJOR_FOR_USE_PREBUILT_RN_CORE} or newer (found SDK ${sdkLabel}).` + ); + } + } +} From 86375cd7bdeebac7a169ae84f8308e7aa201b4e5 Mon Sep 17 00:00:00 2001 From: artus9033 Date: Fri, 15 May 2026 09:20:31 +0200 Subject: [PATCH 24/26] chore: downgrade jest due to problems --- apps/RNApp/package.json | 2 +- yarn.lock | 746 +++------------------------------------- 2 files changed, 43 insertions(+), 705 deletions(-) diff --git a/apps/RNApp/package.json b/apps/RNApp/package.json index 1c15a7e6..ee760f79 100644 --- a/apps/RNApp/package.json +++ b/apps/RNApp/package.json @@ -45,7 +45,7 @@ "@types/react": "^19.2.0", "@types/react-test-renderer": "^19.1.0", "eslint": "^9.39.3", - "jest": "^30.3.0", + "jest": "^29.7.0", "prettier": "^3.8.1", "react-native-monorepo-config": "^0.3.3", "react-test-renderer": "19.2.3", diff --git a/yarn.lock b/yarn.lock index a5d19ad8..1524200e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -60,7 +60,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.20.0, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.4, @babel/core@npm:^7.25.2, @babel/core@npm:^7.27.4, @babel/core@npm:^7.28.5, @babel/core@npm:^7.29.0": +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.20.0, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.4, @babel/core@npm:^7.25.2, @babel/core@npm:^7.28.5, @babel/core@npm:^7.29.0": version: 7.29.0 resolution: "@babel/core@npm:7.29.0" dependencies: @@ -97,7 +97,7 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.20.5, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.27.5, @babel/generator@npm:^7.29.0, @babel/generator@npm:^7.29.1, @babel/generator@npm:^7.7.2": +"@babel/generator@npm:^7.20.5, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.29.0, @babel/generator@npm:^7.29.1, @babel/generator@npm:^7.7.2": version: 7.29.1 resolution: "@babel/generator@npm:7.29.1" dependencies: @@ -669,7 +669,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.27.1, @babel/plugin-syntax-typescript@npm:^7.28.6, @babel/plugin-syntax-typescript@npm:^7.7.2": +"@babel/plugin-syntax-typescript@npm:^7.28.6, @babel/plugin-syntax-typescript@npm:^7.7.2": version: 7.28.6 resolution: "@babel/plugin-syntax-typescript@npm:7.28.6" dependencies: @@ -1834,7 +1834,7 @@ __metadata: "@types/react": "npm:^19.2.0" "@types/react-test-renderer": "npm:^19.1.0" eslint: "npm:^9.39.3" - jest: "npm:^30.3.0" + jest: "npm:^29.7.0" prettier: "npm:^3.8.1" react: "npm:19.2.3" react-native: "npm:0.85.0" @@ -3572,20 +3572,6 @@ __metadata: languageName: node linkType: hard -"@jest/console@npm:30.4.1": - version: 30.4.1 - resolution: "@jest/console@npm:30.4.1" - dependencies: - "@jest/types": "npm:30.4.1" - "@types/node": "npm:*" - chalk: "npm:^4.1.2" - jest-message-util: "npm:30.4.1" - jest-util: "npm:30.4.1" - slash: "npm:^3.0.0" - checksum: 10/4eb463d29654c20716f5f9cde43e5d958cb3b9234477df57da5b3814c3f1a4a0ab611a8eaf4b5abc146190a012584d7025f445f3560ed62acd843fc95c0a0e65 - languageName: node - linkType: hard - "@jest/console@npm:^29.7.0": version: 29.7.0 resolution: "@jest/console@npm:29.7.0" @@ -3600,47 +3586,6 @@ __metadata: languageName: node linkType: hard -"@jest/core@npm:30.4.2": - version: 30.4.2 - resolution: "@jest/core@npm:30.4.2" - dependencies: - "@jest/console": "npm:30.4.1" - "@jest/pattern": "npm:30.4.0" - "@jest/reporters": "npm:30.4.1" - "@jest/test-result": "npm:30.4.1" - "@jest/transform": "npm:30.4.1" - "@jest/types": "npm:30.4.1" - "@types/node": "npm:*" - ansi-escapes: "npm:^4.3.2" - chalk: "npm:^4.1.2" - ci-info: "npm:^4.2.0" - exit-x: "npm:^0.2.2" - fast-json-stable-stringify: "npm:^2.1.0" - graceful-fs: "npm:^4.2.11" - jest-changed-files: "npm:30.4.1" - jest-config: "npm:30.4.2" - jest-haste-map: "npm:30.4.1" - jest-message-util: "npm:30.4.1" - jest-regex-util: "npm:30.4.0" - jest-resolve: "npm:30.4.1" - jest-resolve-dependencies: "npm:30.4.2" - jest-runner: "npm:30.4.2" - jest-runtime: "npm:30.4.2" - jest-snapshot: "npm:30.4.1" - jest-util: "npm:30.4.1" - jest-validate: "npm:30.4.1" - jest-watcher: "npm:30.4.1" - pretty-format: "npm:30.4.1" - slash: "npm:^3.0.0" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: 10/ecc695392685ab56c6df5d29d6f7927141071d8f3f75e5f7c7664f0faded1307caf5daf051074252d5ddb9546bf2bfe3b0c63ca81fe6238dc34e1bb5f8a7a261 - languageName: node - linkType: hard - "@jest/core@npm:^29.7.0": version: 29.7.0 resolution: "@jest/core@npm:29.7.0" @@ -3698,18 +3643,6 @@ __metadata: languageName: node linkType: hard -"@jest/environment@npm:30.4.1": - version: 30.4.1 - resolution: "@jest/environment@npm:30.4.1" - dependencies: - "@jest/fake-timers": "npm:30.4.1" - "@jest/types": "npm:30.4.1" - "@types/node": "npm:*" - jest-mock: "npm:30.4.1" - checksum: 10/c25946fee29604f5aa24ea059bc3cc7bc4c8cdaf26db1ed6ffa4f28e37f5193cc4e868650c807d89caff4123e44d07b58200d4cb5960ebdb7d66531509d76359 - languageName: node - linkType: hard - "@jest/environment@npm:^29.7.0": version: 29.7.0 resolution: "@jest/environment@npm:29.7.0" @@ -3740,16 +3673,6 @@ __metadata: languageName: node linkType: hard -"@jest/expect@npm:30.4.1": - version: 30.4.1 - resolution: "@jest/expect@npm:30.4.1" - dependencies: - expect: "npm:30.4.1" - jest-snapshot: "npm:30.4.1" - checksum: 10/40ae0317a3590ced7a7fd21c49e6b1af6b122e6a83822e643af83f02034dfed6485248cae08d6bcf9380039ba3824ac56db18478712c64ddf5f709ee23cf30cd - languageName: node - linkType: hard - "@jest/expect@npm:^29.7.0": version: 29.7.0 resolution: "@jest/expect@npm:29.7.0" @@ -3760,20 +3683,6 @@ __metadata: languageName: node linkType: hard -"@jest/fake-timers@npm:30.4.1": - version: 30.4.1 - resolution: "@jest/fake-timers@npm:30.4.1" - dependencies: - "@jest/types": "npm:30.4.1" - "@sinonjs/fake-timers": "npm:^15.4.0" - "@types/node": "npm:*" - jest-message-util: "npm:30.4.1" - jest-mock: "npm:30.4.1" - jest-util: "npm:30.4.1" - checksum: 10/bc7aff23548395d6e7957bc24f699f921a9616f2357ab49616b0468c7b5e94e6ac4cbdd45d306f1a5d7f72e2a055294f52be3666e4c1da7c137874c5b226e1c6 - languageName: node - linkType: hard - "@jest/fake-timers@npm:^29.7.0": version: 29.7.0 resolution: "@jest/fake-timers@npm:29.7.0" @@ -3795,18 +3704,6 @@ __metadata: languageName: node linkType: hard -"@jest/globals@npm:30.4.1": - version: 30.4.1 - resolution: "@jest/globals@npm:30.4.1" - dependencies: - "@jest/environment": "npm:30.4.1" - "@jest/expect": "npm:30.4.1" - "@jest/types": "npm:30.4.1" - jest-mock: "npm:30.4.1" - checksum: 10/5fe04b9c3b97f0061e4464201ee0dd674dd958843eb80542791d1c576c51f12aaa3f3b369e136d5fd3f8c716f9c9bbfbb76491a3cbc3c4efb3cc71063f909132 - languageName: node - linkType: hard - "@jest/globals@npm:^29.2.1, @jest/globals@npm:^29.7.0": version: 29.7.0 resolution: "@jest/globals@npm:29.7.0" @@ -3829,42 +3726,6 @@ __metadata: languageName: node linkType: hard -"@jest/reporters@npm:30.4.1": - version: 30.4.1 - resolution: "@jest/reporters@npm:30.4.1" - dependencies: - "@bcoe/v8-coverage": "npm:^0.2.3" - "@jest/console": "npm:30.4.1" - "@jest/test-result": "npm:30.4.1" - "@jest/transform": "npm:30.4.1" - "@jest/types": "npm:30.4.1" - "@jridgewell/trace-mapping": "npm:^0.3.25" - "@types/node": "npm:*" - chalk: "npm:^4.1.2" - collect-v8-coverage: "npm:^1.0.2" - exit-x: "npm:^0.2.2" - glob: "npm:^10.5.0" - graceful-fs: "npm:^4.2.11" - istanbul-lib-coverage: "npm:^3.0.0" - istanbul-lib-instrument: "npm:^6.0.0" - istanbul-lib-report: "npm:^3.0.0" - istanbul-lib-source-maps: "npm:^5.0.0" - istanbul-reports: "npm:^3.1.3" - jest-message-util: "npm:30.4.1" - jest-util: "npm:30.4.1" - jest-worker: "npm:30.4.1" - slash: "npm:^3.0.0" - string-length: "npm:^4.0.2" - v8-to-istanbul: "npm:^9.0.1" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: 10/e14e3717c9fe49004b6406cc53554f90954345917bb5f077d23e3a2cecde26d90493e1522d95f63b6c14ef06fb63d45b695ac6400d63b96fecc7a80d1ef83f4d - languageName: node - linkType: hard - "@jest/reporters@npm:^29.7.0": version: 29.7.0 resolution: "@jest/reporters@npm:29.7.0" @@ -3920,29 +3781,6 @@ __metadata: languageName: node linkType: hard -"@jest/snapshot-utils@npm:30.4.1": - version: 30.4.1 - resolution: "@jest/snapshot-utils@npm:30.4.1" - dependencies: - "@jest/types": "npm:30.4.1" - chalk: "npm:^4.1.2" - graceful-fs: "npm:^4.2.11" - natural-compare: "npm:^1.4.0" - checksum: 10/8f17768702153267388b3043f358027385e591ac4668699bfce3547cb8e08ac146a074913bcddf68c0a4f7155e24a6d582d27f4592f5c3bd5f9fbc3f9182ef78 - languageName: node - linkType: hard - -"@jest/source-map@npm:30.0.1": - version: 30.0.1 - resolution: "@jest/source-map@npm:30.0.1" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.25" - callsites: "npm:^3.1.0" - graceful-fs: "npm:^4.2.11" - checksum: 10/161b27cdf8d9d80fd99374d55222b90478864c6990514be6ebee72b7184a034224c9aceed12c476f3a48d48601bf8ed2e0c047a5a81bd907dc192ebe71365ed4 - languageName: node - linkType: hard - "@jest/source-map@npm:^29.6.3": version: 29.6.3 resolution: "@jest/source-map@npm:29.6.3" @@ -3954,18 +3792,6 @@ __metadata: languageName: node linkType: hard -"@jest/test-result@npm:30.4.1": - version: 30.4.1 - resolution: "@jest/test-result@npm:30.4.1" - dependencies: - "@jest/console": "npm:30.4.1" - "@jest/types": "npm:30.4.1" - "@types/istanbul-lib-coverage": "npm:^2.0.6" - collect-v8-coverage: "npm:^1.0.2" - checksum: 10/c420182d72cef64827981230b4c84b2de3f4312067e7baf1e3e13c501dc57f73faa09fed1a5ed1a6e96bc29f6c67ac2c14de5f973945f14853010729678cb44a - languageName: node - linkType: hard - "@jest/test-result@npm:^29.7.0": version: 29.7.0 resolution: "@jest/test-result@npm:29.7.0" @@ -3978,18 +3804,6 @@ __metadata: languageName: node linkType: hard -"@jest/test-sequencer@npm:30.4.1": - version: 30.4.1 - resolution: "@jest/test-sequencer@npm:30.4.1" - dependencies: - "@jest/test-result": "npm:30.4.1" - graceful-fs: "npm:^4.2.11" - jest-haste-map: "npm:30.4.1" - slash: "npm:^3.0.0" - checksum: 10/d911ef0c527c402d41537aa5f9754725a58732c1c6616401454633fd45729da0b2f01b4c50322b1b789a9f2d4edf3a24aecb0b2e4ca4d873c4335894b63bc5b0 - languageName: node - linkType: hard - "@jest/test-sequencer@npm:^29.7.0": version: 29.7.0 resolution: "@jest/test-sequencer@npm:29.7.0" @@ -4002,28 +3816,6 @@ __metadata: languageName: node linkType: hard -"@jest/transform@npm:30.4.1": - version: 30.4.1 - resolution: "@jest/transform@npm:30.4.1" - dependencies: - "@babel/core": "npm:^7.27.4" - "@jest/types": "npm:30.4.1" - "@jridgewell/trace-mapping": "npm:^0.3.25" - babel-plugin-istanbul: "npm:^7.0.1" - chalk: "npm:^4.1.2" - convert-source-map: "npm:^2.0.0" - fast-json-stable-stringify: "npm:^2.1.0" - graceful-fs: "npm:^4.2.11" - jest-haste-map: "npm:30.4.1" - jest-regex-util: "npm:30.4.0" - jest-util: "npm:30.4.1" - pirates: "npm:^4.0.7" - slash: "npm:^3.0.0" - write-file-atomic: "npm:^5.0.1" - checksum: 10/7b570451f6c26360f1b852c2281dcc4e36fe685dbc159cf5eabf83d49d6aae4569f444d38f3afb5b3b6e0b809eb41b65f3145c0cac5fee3eec9c9b178fb1f0ea - languageName: node - linkType: hard - "@jest/transform@npm:^29.7.0": version: 29.7.0 resolution: "@jest/transform@npm:29.7.0" @@ -4130,7 +3922,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28, @jridgewell/trace-mapping@npm:^0.3.31": +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28, @jridgewell/trace-mapping@npm:^0.3.31": version: 0.3.31 resolution: "@jridgewell/trace-mapping@npm:0.3.31" dependencies: @@ -6599,7 +6391,7 @@ __metadata: languageName: node linkType: hard -"@sinonjs/commons@npm:^3.0.0, @sinonjs/commons@npm:^3.0.1": +"@sinonjs/commons@npm:^3.0.0": version: 3.0.1 resolution: "@sinonjs/commons@npm:3.0.1" dependencies: @@ -6617,15 +6409,6 @@ __metadata: languageName: node linkType: hard -"@sinonjs/fake-timers@npm:^15.4.0": - version: 15.4.0 - resolution: "@sinonjs/fake-timers@npm:15.4.0" - dependencies: - "@sinonjs/commons": "npm:^3.0.1" - checksum: 10/3960a9fe065f38a4228c66d184eeb101e8a6af9cbfc8454dd5d45ac397201da72134048d4e808a25993494885b172dd6deecdad9949bbf4c1d3a220ef561f6cc - languageName: node - linkType: hard - "@standard-schema/spec@npm:^1.1.0": version: 1.1.0 resolution: "@standard-schema/spec@npm:1.1.0" @@ -7653,7 +7436,7 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.2": +"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" dependencies: @@ -7740,7 +7523,7 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:^3.0.3, anymatch@npm:^3.1.3, anymatch@npm:~3.1.2": +"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": version: 3.1.3 resolution: "anymatch@npm:3.1.3" dependencies: @@ -8022,23 +7805,6 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:30.4.1": - version: 30.4.1 - resolution: "babel-jest@npm:30.4.1" - dependencies: - "@jest/transform": "npm:30.4.1" - "@types/babel__core": "npm:^7.20.5" - babel-plugin-istanbul: "npm:^7.0.1" - babel-preset-jest: "npm:30.4.0" - chalk: "npm:^4.1.2" - graceful-fs: "npm:^4.2.11" - slash: "npm:^3.0.0" - peerDependencies: - "@babel/core": ^7.11.0 || ^8.0.0-0 - checksum: 10/f739152bee60b368b27676441c54e235b49bca10329bb6395b54cca5982ced1f7a5a2c504e406e1082aac3dc68ab518771c9de62cf66ffe00993ad071a58fd1b - languageName: node - linkType: hard - "babel-jest@npm:^29.2.1, babel-jest@npm:^29.7.0": version: 29.7.0 resolution: "babel-jest@npm:29.7.0" @@ -8069,28 +7835,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-istanbul@npm:^7.0.1": - version: 7.0.1 - resolution: "babel-plugin-istanbul@npm:7.0.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.0.0" - "@istanbuljs/load-nyc-config": "npm:^1.0.0" - "@istanbuljs/schema": "npm:^0.1.3" - istanbul-lib-instrument: "npm:^6.0.2" - test-exclude: "npm:^6.0.0" - checksum: 10/fe9f865f975aaa7a033de9ccb2b63fdcca7817266c5e98d3e02ac7ffd774c695093d215302796cb3770a71ef4574e7a9b298504c3c0c104cf4b48c8eda67b2a6 - languageName: node - linkType: hard - -"babel-plugin-jest-hoist@npm:30.4.0": - version: 30.4.0 - resolution: "babel-plugin-jest-hoist@npm:30.4.0" - dependencies: - "@types/babel__core": "npm:^7.20.5" - checksum: 10/112f984b3b4315f7ff15d5d17df7f5aa4b500e562c67c2eafcd9974af4369c17d50feed2f9c95cbcec32faba8ccb04f8b62828aca41a47d5fdedc532b49fbf19 - languageName: node - linkType: hard - "babel-plugin-jest-hoist@npm:^29.6.3": version: 29.6.3 resolution: "babel-plugin-jest-hoist@npm:29.6.3" @@ -8234,7 +7978,7 @@ __metadata: languageName: node linkType: hard -"babel-preset-current-node-syntax@npm:^1.0.0, babel-preset-current-node-syntax@npm:^1.2.0": +"babel-preset-current-node-syntax@npm:^1.0.0": version: 1.2.0 resolution: "babel-preset-current-node-syntax@npm:1.2.0" dependencies: @@ -8341,18 +8085,6 @@ __metadata: languageName: node linkType: hard -"babel-preset-jest@npm:30.4.0": - version: 30.4.0 - resolution: "babel-preset-jest@npm:30.4.0" - dependencies: - babel-plugin-jest-hoist: "npm:30.4.0" - babel-preset-current-node-syntax: "npm:^1.2.0" - peerDependencies: - "@babel/core": ^7.11.0 || ^8.0.0-beta.1 - checksum: 10/7fbdcaa1f24b2efbc1b658220df849a375858bd5e208cefcf53b116bca972b28565a0715521cc20bec41adbd20ff73b9dbbdea3634bd71f50062f0ce694a7159 - languageName: node - linkType: hard - "babel-preset-jest@npm:^29.6.3": version: 29.6.3 resolution: "babel-preset-jest@npm:29.6.3" @@ -8650,7 +8382,7 @@ __metadata: languageName: node linkType: hard -"callsites@npm:^3.0.0, callsites@npm:^3.1.0": +"callsites@npm:^3.0.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" checksum: 10/072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 @@ -8664,7 +8396,7 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:^6.2.0, camelcase@npm:^6.3.0": +"camelcase@npm:^6.2.0": version: 6.3.0 resolution: "camelcase@npm:6.3.0" checksum: 10/8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d @@ -8853,13 +8585,6 @@ __metadata: languageName: node linkType: hard -"cjs-module-lexer@npm:^2.1.0": - version: 2.2.0 - resolution: "cjs-module-lexer@npm:2.2.0" - checksum: 10/fc8eb5c1919504366d8260a150d93c4e857740e770467dc59ca0cc34de4b66c93075559a5af65618f359187866b1be40e036f4e1a1bab2f1e06001c216415f74 - languageName: node - linkType: hard - "cli-cursor@npm:^2.1.0": version: 2.1.0 resolution: "cli-cursor@npm:2.1.0" @@ -8967,7 +8692,7 @@ __metadata: languageName: node linkType: hard -"collect-v8-coverage@npm:^1.0.0, collect-v8-coverage@npm:^1.0.2": +"collect-v8-coverage@npm:^1.0.0": version: 1.0.3 resolution: "collect-v8-coverage@npm:1.0.3" checksum: 10/656443261fb7b79cf79e89cba4b55622b07c1d4976c630829d7c5c585c73cda1c2ff101f316bfb19bb9e2c58d724c7db1f70a21e213dcd14099227c5e6019860 @@ -9474,7 +9199,7 @@ __metadata: languageName: node linkType: hard -"dedent@npm:^1.0.0, dedent@npm:^1.6.0, dedent@npm:^1.7.2": +"dedent@npm:^1.0.0, dedent@npm:^1.7.2": version: 1.7.2 resolution: "dedent@npm:1.7.2" peerDependencies: @@ -9602,7 +9327,7 @@ __metadata: languageName: node linkType: hard -"detect-newline@npm:^3.0.0, detect-newline@npm:^3.1.0": +"detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" checksum: 10/ae6cd429c41ad01b164c59ea36f264a2c479598e61cba7c99da24175a7ab80ddf066420f2bec9a1c57a6bead411b4655ff15ad7d281c000a89791f48cbe939e7 @@ -10661,7 +10386,7 @@ __metadata: languageName: node linkType: hard -"execa@npm:^5.0.0, execa@npm:^5.1.1": +"execa@npm:^5.0.0": version: 5.1.1 resolution: "execa@npm:5.1.1" dependencies: @@ -10678,13 +10403,6 @@ __metadata: languageName: node linkType: hard -"exit-x@npm:^0.2.2": - version: 0.2.2 - resolution: "exit-x@npm:0.2.2" - checksum: 10/ee043053e6c1e237adf5ad9c4faf9f085b606f64a4ff859e2b138fab63fe642711d00c9af452a9134c4c92c55f752e818bfabab78c24d345022db163f3137027 - languageName: node - linkType: hard - "exit@npm:^0.1.2": version: 0.1.2 resolution: "exit@npm:0.1.2" @@ -10699,20 +10417,6 @@ __metadata: languageName: node linkType: hard -"expect@npm:30.4.1, expect@npm:^30.0.0": - version: 30.4.1 - resolution: "expect@npm:30.4.1" - dependencies: - "@jest/expect-utils": "npm:30.4.1" - "@jest/get-type": "npm:30.1.0" - jest-matcher-utils: "npm:30.4.1" - jest-message-util: "npm:30.4.1" - jest-mock: "npm:30.4.1" - jest-util: "npm:30.4.1" - checksum: 10/f25051e5073c55369199ec3108ac01c60074bd09dad0b5a6c9fe40596438051cb52607e0e97505126422535b8d0dacab13aa29bb14e9fac71630bc710201a3f1 - languageName: node - linkType: hard - "expect@npm:^29.7.0": version: 29.7.0 resolution: "expect@npm:29.7.0" @@ -10726,6 +10430,20 @@ __metadata: languageName: node linkType: hard +"expect@npm:^30.0.0": + version: 30.4.1 + resolution: "expect@npm:30.4.1" + dependencies: + "@jest/expect-utils": "npm:30.4.1" + "@jest/get-type": "npm:30.1.0" + jest-matcher-utils: "npm:30.4.1" + jest-message-util: "npm:30.4.1" + jest-mock: "npm:30.4.1" + jest-util: "npm:30.4.1" + checksum: 10/f25051e5073c55369199ec3108ac01c60074bd09dad0b5a6c9fe40596438051cb52607e0e97505126422535b8d0dacab13aa29bb14e9fac71630bc710201a3f1 + languageName: node + linkType: hard + "expo-asset@npm:~12.0.13": version: 12.0.13 resolution: "expo-asset@npm:12.0.13" @@ -11672,7 +11390,7 @@ __metadata: languageName: node linkType: hard -"fb-watchman@npm:^2.0.0, fb-watchman@npm:^2.0.2": +"fb-watchman@npm:^2.0.0": version: 2.0.2 resolution: "fb-watchman@npm:2.0.2" dependencies: @@ -11917,7 +11635,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2, fsevents@npm:^2.3.3, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": +"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -11927,7 +11645,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A^2.3.3#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": +"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -12767,7 +12485,7 @@ __metadata: languageName: node linkType: hard -"import-local@npm:^3.0.2, import-local@npm:^3.2.0": +"import-local@npm:^3.0.2": version: 3.2.0 resolution: "import-local@npm:3.2.0" dependencies: @@ -13060,7 +12778,7 @@ __metadata: languageName: node linkType: hard -"is-generator-fn@npm:^2.0.0, is-generator-fn@npm:^2.1.0": +"is-generator-fn@npm:^2.0.0": version: 2.1.0 resolution: "is-generator-fn@npm:2.1.0" checksum: 10/a6ad5492cf9d1746f73b6744e0c43c0020510b59d56ddcb78a91cbc173f09b5e6beff53d75c9c5a29feb618bfef2bf458e025ecf3a57ad2268e2fb2569f56215 @@ -13392,7 +13110,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-instrument@npm:^6.0.0, istanbul-lib-instrument@npm:^6.0.2": +"istanbul-lib-instrument@npm:^6.0.0": version: 6.0.3 resolution: "istanbul-lib-instrument@npm:6.0.3" dependencies: @@ -13427,17 +13145,6 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-source-maps@npm:^5.0.0": - version: 5.0.6 - resolution: "istanbul-lib-source-maps@npm:5.0.6" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.23" - debug: "npm:^4.1.1" - istanbul-lib-coverage: "npm:^3.0.0" - checksum: 10/569dd0a392ee3464b1fe1accbaef5cc26de3479eacb5b91d8c67ebb7b425d39fd02247d85649c3a0e9c29b600809fa60b5af5a281a75a89c01f385b1e24823a2 - languageName: node - linkType: hard - "istanbul-reports@npm:^3.1.3, istanbul-reports@npm:^3.2.0": version: 3.2.0 resolution: "istanbul-reports@npm:3.2.0" @@ -13462,17 +13169,6 @@ __metadata: languageName: node linkType: hard -"jest-changed-files@npm:30.4.1": - version: 30.4.1 - resolution: "jest-changed-files@npm:30.4.1" - dependencies: - execa: "npm:^5.1.1" - jest-util: "npm:30.4.1" - p-limit: "npm:^3.1.0" - checksum: 10/e566af0d6c53115edf34fd1d9bda3b857fcc6626bd032516a480b60ec208d515558eda1e693e76ef992633d71828a4c38a3e91a236142459855483cbd03ff4c4 - languageName: node - linkType: hard - "jest-changed-files@npm:^29.7.0": version: 29.7.0 resolution: "jest-changed-files@npm:29.7.0" @@ -13484,34 +13180,6 @@ __metadata: languageName: node linkType: hard -"jest-circus@npm:30.4.2": - version: 30.4.2 - resolution: "jest-circus@npm:30.4.2" - dependencies: - "@jest/environment": "npm:30.4.1" - "@jest/expect": "npm:30.4.1" - "@jest/test-result": "npm:30.4.1" - "@jest/types": "npm:30.4.1" - "@types/node": "npm:*" - chalk: "npm:^4.1.2" - co: "npm:^4.6.0" - dedent: "npm:^1.6.0" - is-generator-fn: "npm:^2.1.0" - jest-each: "npm:30.4.1" - jest-matcher-utils: "npm:30.4.1" - jest-message-util: "npm:30.4.1" - jest-runtime: "npm:30.4.2" - jest-snapshot: "npm:30.4.1" - jest-util: "npm:30.4.1" - p-limit: "npm:^3.1.0" - pretty-format: "npm:30.4.1" - pure-rand: "npm:^7.0.0" - slash: "npm:^3.0.0" - stack-utils: "npm:^2.0.6" - checksum: 10/b210db2cd3ab595c6053deee4c11e7eb5ea293b9af16fc87021288125dd42e8d13fdc77be21eca71f1636c6fe104edc26e32d6e707168763e97b0d1718c11203 - languageName: node - linkType: hard - "jest-circus@npm:^29.7.0": version: 29.7.0 resolution: "jest-circus@npm:29.7.0" @@ -13540,31 +13208,6 @@ __metadata: languageName: node linkType: hard -"jest-cli@npm:30.4.2": - version: 30.4.2 - resolution: "jest-cli@npm:30.4.2" - dependencies: - "@jest/core": "npm:30.4.2" - "@jest/test-result": "npm:30.4.1" - "@jest/types": "npm:30.4.1" - chalk: "npm:^4.1.2" - exit-x: "npm:^0.2.2" - import-local: "npm:^3.2.0" - jest-config: "npm:30.4.2" - jest-util: "npm:30.4.1" - jest-validate: "npm:30.4.1" - yargs: "npm:^17.7.2" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: ./bin/jest.js - checksum: 10/dd33f8ee6500298639d5ec4d5f641306d9876fa182042ee40e9c63c59bdf9a82dc46da5bf38fae0783f6ac874df7f7f099006b263022954cf494f8468dfe583c - languageName: node - linkType: hard - "jest-cli@npm:^29.7.0": version: 29.7.0 resolution: "jest-cli@npm:29.7.0" @@ -13591,48 +13234,6 @@ __metadata: languageName: node linkType: hard -"jest-config@npm:30.4.2": - version: 30.4.2 - resolution: "jest-config@npm:30.4.2" - dependencies: - "@babel/core": "npm:^7.27.4" - "@jest/get-type": "npm:30.1.0" - "@jest/pattern": "npm:30.4.0" - "@jest/test-sequencer": "npm:30.4.1" - "@jest/types": "npm:30.4.1" - babel-jest: "npm:30.4.1" - chalk: "npm:^4.1.2" - ci-info: "npm:^4.2.0" - deepmerge: "npm:^4.3.1" - glob: "npm:^10.5.0" - graceful-fs: "npm:^4.2.11" - jest-circus: "npm:30.4.2" - jest-docblock: "npm:30.4.0" - jest-environment-node: "npm:30.4.1" - jest-regex-util: "npm:30.4.0" - jest-resolve: "npm:30.4.1" - jest-runner: "npm:30.4.2" - jest-util: "npm:30.4.1" - jest-validate: "npm:30.4.1" - parse-json: "npm:^5.2.0" - pretty-format: "npm:30.4.1" - slash: "npm:^3.0.0" - strip-json-comments: "npm:^3.1.1" - peerDependencies: - "@types/node": "*" - esbuild-register: ">=3.4.0" - ts-node: ">=9.0.0" - peerDependenciesMeta: - "@types/node": - optional: true - esbuild-register: - optional: true - ts-node: - optional: true - checksum: 10/d37d923a5b3e815b73bbefe09c2f7fb092d6933f5f4ec0555fd9cacf97c58e8adb73fc4780a99e6a49e798444b1bb0097c9d5232feb1b8ffa31af589f9c02d9a - languageName: node - linkType: hard - "jest-config@npm:^29.7.0": version: 29.7.0 resolution: "jest-config@npm:29.7.0" @@ -13695,15 +13296,6 @@ __metadata: languageName: node linkType: hard -"jest-docblock@npm:30.4.0": - version: 30.4.0 - resolution: "jest-docblock@npm:30.4.0" - dependencies: - detect-newline: "npm:^3.1.0" - checksum: 10/0ee25351ef941e832e53d10e74f34b38941b8f5fe750584661f6c5a115771818b081b8e39830c49d152fd361af81c7800c2d3a3c3a0e2dc742f7bfdbb6b1baaa - languageName: node - linkType: hard - "jest-docblock@npm:^29.7.0": version: 29.7.0 resolution: "jest-docblock@npm:29.7.0" @@ -13713,19 +13305,6 @@ __metadata: languageName: node linkType: hard -"jest-each@npm:30.4.1": - version: 30.4.1 - resolution: "jest-each@npm:30.4.1" - dependencies: - "@jest/get-type": "npm:30.1.0" - "@jest/types": "npm:30.4.1" - chalk: "npm:^4.1.2" - jest-util: "npm:30.4.1" - pretty-format: "npm:30.4.1" - checksum: 10/077365c3fd0dc0d74aaa180fe4e3728533685413db58e7a30c8502d19a60a0b08259825d8aa36c569c8175a9d0cf901dd69c0a4eb63567c22c07bd0b566ddf89 - languageName: node - linkType: hard - "jest-each@npm:^29.7.0": version: 29.7.0 resolution: "jest-each@npm:29.7.0" @@ -13760,21 +13339,6 @@ __metadata: languageName: node linkType: hard -"jest-environment-node@npm:30.4.1": - version: 30.4.1 - resolution: "jest-environment-node@npm:30.4.1" - dependencies: - "@jest/environment": "npm:30.4.1" - "@jest/fake-timers": "npm:30.4.1" - "@jest/types": "npm:30.4.1" - "@types/node": "npm:*" - jest-mock: "npm:30.4.1" - jest-util: "npm:30.4.1" - jest-validate: "npm:30.4.1" - checksum: 10/b93157061c6fa4b62808741bdda5fbc0372a9d2a3db844f0ffb819ed104b3b5c6ff73375d9f57c0d8485a0ad6aed07d4cfbb98aca985c38e1a29f64096b940bc - languageName: node - linkType: hard - "jest-environment-node@npm:^29.7.0": version: 29.7.0 resolution: "jest-environment-node@npm:29.7.0" @@ -13858,28 +13422,6 @@ __metadata: languageName: node linkType: hard -"jest-haste-map@npm:30.4.1": - version: 30.4.1 - resolution: "jest-haste-map@npm:30.4.1" - dependencies: - "@jest/types": "npm:30.4.1" - "@types/node": "npm:*" - anymatch: "npm:^3.1.3" - fb-watchman: "npm:^2.0.2" - fsevents: "npm:^2.3.3" - graceful-fs: "npm:^4.2.11" - jest-regex-util: "npm:30.4.0" - jest-util: "npm:30.4.1" - jest-worker: "npm:30.4.1" - picomatch: "npm:^4.0.3" - walker: "npm:^1.0.8" - dependenciesMeta: - fsevents: - optional: true - checksum: 10/d26404c7258d03fa423604191bca39707438ca1e62a9a471c92fcd468fa386cbdce2c50b3834fb830b25836e3eee34e3070d22b016b42f0ab626c157f5726eeb - languageName: node - linkType: hard - "jest-haste-map@npm:^29.7.0": version: 29.7.0 resolution: "jest-haste-map@npm:29.7.0" @@ -13903,16 +13445,6 @@ __metadata: languageName: node linkType: hard -"jest-leak-detector@npm:30.4.1": - version: 30.4.1 - resolution: "jest-leak-detector@npm:30.4.1" - dependencies: - "@jest/get-type": "npm:30.1.0" - pretty-format: "npm:30.4.1" - checksum: 10/8c0945d1c73f6a2abde8660f7fc5693b344cd1f5fd66153c0c2d13007f8429486eb99ecf15ac68d3d4410534fd0fad1ed430c32a641cdac66e021dbd33204c9a - languageName: node - linkType: hard - "jest-leak-detector@npm:^29.7.0": version: 29.7.0 resolution: "jest-leak-detector@npm:29.7.0" @@ -14004,7 +13536,7 @@ __metadata: languageName: node linkType: hard -"jest-pnp-resolver@npm:^1.2.2, jest-pnp-resolver@npm:^1.2.3": +"jest-pnp-resolver@npm:^1.2.2": version: 1.2.3 resolution: "jest-pnp-resolver@npm:1.2.3" peerDependencies: @@ -14030,16 +13562,6 @@ __metadata: languageName: node linkType: hard -"jest-resolve-dependencies@npm:30.4.2": - version: 30.4.2 - resolution: "jest-resolve-dependencies@npm:30.4.2" - dependencies: - jest-regex-util: "npm:30.4.0" - jest-snapshot: "npm:30.4.1" - checksum: 10/ec7e27d1abf67dfe9ec1a2887b5fa883e1e6ca38eb45506a82f93e29d8df62c18cb40ec07af43fe0fa65d568051a878b6649745f6c032d8962a8dad6323763ad - languageName: node - linkType: hard - "jest-resolve-dependencies@npm:^29.7.0": version: 29.7.0 resolution: "jest-resolve-dependencies@npm:29.7.0" @@ -14050,22 +13572,6 @@ __metadata: languageName: node linkType: hard -"jest-resolve@npm:30.4.1": - version: 30.4.1 - resolution: "jest-resolve@npm:30.4.1" - dependencies: - chalk: "npm:^4.1.2" - graceful-fs: "npm:^4.2.11" - jest-haste-map: "npm:30.4.1" - jest-pnp-resolver: "npm:^1.2.3" - jest-util: "npm:30.4.1" - jest-validate: "npm:30.4.1" - slash: "npm:^3.0.0" - unrs-resolver: "npm:^1.7.11" - checksum: 10/197ca741df92c1006c2367142b5e44827d995f062e94a923f574e87ce04f966634851bb31f54ea377ca163a8362613947cd2311abf8a5712fe879b1ac15f662f - languageName: node - linkType: hard - "jest-resolve@npm:^29.7.0": version: 29.7.0 resolution: "jest-resolve@npm:29.7.0" @@ -14083,36 +13589,6 @@ __metadata: languageName: node linkType: hard -"jest-runner@npm:30.4.2": - version: 30.4.2 - resolution: "jest-runner@npm:30.4.2" - dependencies: - "@jest/console": "npm:30.4.1" - "@jest/environment": "npm:30.4.1" - "@jest/test-result": "npm:30.4.1" - "@jest/transform": "npm:30.4.1" - "@jest/types": "npm:30.4.1" - "@types/node": "npm:*" - chalk: "npm:^4.1.2" - emittery: "npm:^0.13.1" - exit-x: "npm:^0.2.2" - graceful-fs: "npm:^4.2.11" - jest-docblock: "npm:30.4.0" - jest-environment-node: "npm:30.4.1" - jest-haste-map: "npm:30.4.1" - jest-leak-detector: "npm:30.4.1" - jest-message-util: "npm:30.4.1" - jest-resolve: "npm:30.4.1" - jest-runtime: "npm:30.4.2" - jest-util: "npm:30.4.1" - jest-watcher: "npm:30.4.1" - jest-worker: "npm:30.4.1" - p-limit: "npm:^3.1.0" - source-map-support: "npm:0.5.13" - checksum: 10/3ed8ee70019f1f5a63faaf07a15e522ec878601dc6eccbde7eb4d0529e4d1a7314e7041160075458257e3103f41d6e9bbb2df8698806805ae2768a7e90228103 - languageName: node - linkType: hard - "jest-runner@npm:^29.7.0": version: 29.7.0 resolution: "jest-runner@npm:29.7.0" @@ -14142,36 +13618,6 @@ __metadata: languageName: node linkType: hard -"jest-runtime@npm:30.4.2": - version: 30.4.2 - resolution: "jest-runtime@npm:30.4.2" - dependencies: - "@jest/environment": "npm:30.4.1" - "@jest/fake-timers": "npm:30.4.1" - "@jest/globals": "npm:30.4.1" - "@jest/source-map": "npm:30.0.1" - "@jest/test-result": "npm:30.4.1" - "@jest/transform": "npm:30.4.1" - "@jest/types": "npm:30.4.1" - "@types/node": "npm:*" - chalk: "npm:^4.1.2" - cjs-module-lexer: "npm:^2.1.0" - collect-v8-coverage: "npm:^1.0.2" - glob: "npm:^10.5.0" - graceful-fs: "npm:^4.2.11" - jest-haste-map: "npm:30.4.1" - jest-message-util: "npm:30.4.1" - jest-mock: "npm:30.4.1" - jest-regex-util: "npm:30.4.0" - jest-resolve: "npm:30.4.1" - jest-snapshot: "npm:30.4.1" - jest-util: "npm:30.4.1" - slash: "npm:^3.0.0" - strip-bom: "npm:^4.0.0" - checksum: 10/bc2612a17650e7187d2c778aa66fc07926f828eeb3a445e47ffa757f65a4fb29628a43c6e792196b0a3a06d099b0405b6654a2c314fc5092013690d01483fd75 - languageName: node - linkType: hard - "jest-runtime@npm:^29.7.0": version: 29.7.0 resolution: "jest-runtime@npm:29.7.0" @@ -14202,35 +13648,6 @@ __metadata: languageName: node linkType: hard -"jest-snapshot@npm:30.4.1": - version: 30.4.1 - resolution: "jest-snapshot@npm:30.4.1" - dependencies: - "@babel/core": "npm:^7.27.4" - "@babel/generator": "npm:^7.27.5" - "@babel/plugin-syntax-jsx": "npm:^7.27.1" - "@babel/plugin-syntax-typescript": "npm:^7.27.1" - "@babel/types": "npm:^7.27.3" - "@jest/expect-utils": "npm:30.4.1" - "@jest/get-type": "npm:30.1.0" - "@jest/snapshot-utils": "npm:30.4.1" - "@jest/transform": "npm:30.4.1" - "@jest/types": "npm:30.4.1" - babel-preset-current-node-syntax: "npm:^1.2.0" - chalk: "npm:^4.1.2" - expect: "npm:30.4.1" - graceful-fs: "npm:^4.2.11" - jest-diff: "npm:30.4.1" - jest-matcher-utils: "npm:30.4.1" - jest-message-util: "npm:30.4.1" - jest-util: "npm:30.4.1" - pretty-format: "npm:30.4.1" - semver: "npm:^7.7.2" - synckit: "npm:^0.11.8" - checksum: 10/6135108d3e0e9fb93ed10fd9ad91d8dbe56f90a9ea84c32a0b551518f8c71f363299dcc301717f3ed82cfe2a276d7993d2b3ccfabea3e8020d49ae8b0f9b6cd8 - languageName: node - linkType: hard - "jest-snapshot@npm:^29.2.1, jest-snapshot@npm:^29.7.0": version: 29.7.0 resolution: "jest-snapshot@npm:29.7.0" @@ -14287,20 +13704,6 @@ __metadata: languageName: node linkType: hard -"jest-validate@npm:30.4.1": - version: 30.4.1 - resolution: "jest-validate@npm:30.4.1" - dependencies: - "@jest/get-type": "npm:30.1.0" - "@jest/types": "npm:30.4.1" - camelcase: "npm:^6.3.0" - chalk: "npm:^4.1.2" - leven: "npm:^3.1.0" - pretty-format: "npm:30.4.1" - checksum: 10/527fe8ad02df9a4f7f467ecc4e3ac2a37a27b7b30345e7bc3cb9c2ead33fbc8ed1290c0827baa06471281012c38abb96cb268af274a0a2350548e50db20a434f - languageName: node - linkType: hard - "jest-validate@npm:^29.7.0": version: 29.7.0 resolution: "jest-validate@npm:29.7.0" @@ -14343,22 +13746,6 @@ __metadata: languageName: node linkType: hard -"jest-watcher@npm:30.4.1": - version: 30.4.1 - resolution: "jest-watcher@npm:30.4.1" - dependencies: - "@jest/test-result": "npm:30.4.1" - "@jest/types": "npm:30.4.1" - "@types/node": "npm:*" - ansi-escapes: "npm:^4.3.2" - chalk: "npm:^4.1.2" - emittery: "npm:^0.13.1" - jest-util: "npm:30.4.1" - string-length: "npm:^4.0.2" - checksum: 10/05350ed3d5643e87e22cc5faee14f912dfc06ba63d56944006d9837f2070ed509a1d124c7e7be3e3a9a6a382bd31d491146da6fda4483acd4b8292091888e9bd - languageName: node - linkType: hard - "jest-watcher@npm:^29.0.0, jest-watcher@npm:^29.7.0": version: 29.7.0 resolution: "jest-watcher@npm:29.7.0" @@ -14375,19 +13762,6 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:30.4.1": - version: 30.4.1 - resolution: "jest-worker@npm:30.4.1" - dependencies: - "@types/node": "npm:*" - "@ungap/structured-clone": "npm:^1.3.0" - jest-util: "npm:30.4.1" - merge-stream: "npm:^2.0.0" - supports-color: "npm:^8.1.1" - checksum: 10/ff6af73c9097fc07e90490d3e1e354c702390ef66f7f40054a15dd6d56809a25634179969ff80bde782a6c645f49fa48bf3aacfe7d05af7315c48020f9b2b1cd - languageName: node - linkType: hard - "jest-worker@npm:^29.7.0": version: 29.7.0 resolution: "jest-worker@npm:29.7.0" @@ -14419,25 +13793,6 @@ __metadata: languageName: node linkType: hard -"jest@npm:^30.3.0": - version: 30.4.2 - resolution: "jest@npm:30.4.2" - dependencies: - "@jest/core": "npm:30.4.2" - "@jest/types": "npm:30.4.1" - import-local: "npm:^3.2.0" - jest-cli: "npm:30.4.2" - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: ./bin/jest.js - checksum: 10/3690f4009a46781b480fbd4c8c60dd910a3cf8af76626f29971003c28eb17dfa322e86f3203e3da168edcc9f7ba973f3b1fbf15ca12393cc5f86bc61f3289fef - languageName: node - linkType: hard - "jimp-compact@npm:0.16.1": version: 0.16.1 resolution: "jimp-compact@npm:0.16.1" @@ -17588,7 +16943,7 @@ __metadata: languageName: node linkType: hard -"pirates@npm:^4.0.1, pirates@npm:^4.0.4, pirates@npm:^4.0.7": +"pirates@npm:^4.0.1, pirates@npm:^4.0.4": version: 4.0.7 resolution: "pirates@npm:4.0.7" checksum: 10/2427f371366081ae42feb58214f04805d6b41d6b84d74480ebcc9e0ddbd7105a139f7c653daeaf83ad8a1a77214cf07f64178e76de048128fec501eab3305a96 @@ -17868,13 +17223,6 @@ __metadata: languageName: node linkType: hard -"pure-rand@npm:^7.0.0": - version: 7.0.1 - resolution: "pure-rand@npm:7.0.1" - checksum: 10/c61a576fda5032ec9763ecb000da4a8f19263b9e2f9ae9aa2759c8fbd9dc6b192b2ce78391ebd41abb394a5fedb7bcc4b03c9e6141ac8ab20882dd5717698b80 - languageName: node - linkType: hard - "qrcode-terminal@npm:0.11.0": version: 0.11.0 resolution: "qrcode-terminal@npm:0.11.0" @@ -19994,7 +19342,7 @@ __metadata: languageName: node linkType: hard -"string-length@npm:^4.0.1, string-length@npm:^4.0.2": +"string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2" dependencies: @@ -20284,7 +19632,7 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^8.0.0, supports-color@npm:^8.1.1": +"supports-color@npm:^8.0.0": version: 8.1.1 resolution: "supports-color@npm:8.1.1" dependencies: @@ -20317,7 +19665,7 @@ __metadata: languageName: node linkType: hard -"synckit@npm:^0.11.12, synckit@npm:^0.11.8": +"synckit@npm:^0.11.12": version: 0.11.12 resolution: "synckit@npm:0.11.12" dependencies: @@ -21042,7 +20390,7 @@ __metadata: languageName: node linkType: hard -"unrs-resolver@npm:^1.6.2, unrs-resolver@npm:^1.7.11": +"unrs-resolver@npm:^1.6.2": version: 1.11.1 resolution: "unrs-resolver@npm:1.11.1" dependencies: @@ -21730,16 +21078,6 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:^5.0.1": - version: 5.0.1 - resolution: "write-file-atomic@npm:5.0.1" - dependencies: - imurmurhash: "npm:^0.1.4" - signal-exit: "npm:^4.0.1" - checksum: 10/648efddba54d478d0e4330ab6f239976df3b9752b123db5dc9405d9b5af768fa9d70ce60c52fdbe61d1200d24350bc4fbcbaf09288496c2be050de126bd95b7e - languageName: node - linkType: hard - "ws@npm:^6.2.3": version: 6.2.3 resolution: "ws@npm:6.2.3" @@ -21914,7 +21252,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.0.0, yargs@npm:^17.1.1, yargs@npm:^17.3.1, yargs@npm:^17.6.2, yargs@npm:^17.7.2": +"yargs@npm:^17.0.0, yargs@npm:^17.1.1, yargs@npm:^17.3.1, yargs@npm:^17.6.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: From 17361105b9f87bd28583496900c6bab80bb404f8 Mon Sep 17 00:00:00 2001 From: artus9033 Date: Fri, 15 May 2026 12:02:51 +0200 Subject: [PATCH 25/26] ci: rename AppleApp jobs --- .github/actions/appleapp-road-test/action.yml | 2 +- .github/workflows/ci.yml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/actions/appleapp-road-test/action.yml b/.github/actions/appleapp-road-test/action.yml index b4bf7b4c..7c128092 100644 --- a/.github/actions/appleapp-road-test/action.yml +++ b/.github/actions/appleapp-road-test/action.yml @@ -38,7 +38,7 @@ runs: run: echo "$(brew --prefix)/opt/ccache/libexec" >> $GITHUB_PATH shell: bash - - name: Restore RNApp & AppleApp ccache + - name: Restore AppleApp ccache uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5 with: path: | diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 95e3bb7e..ad531ab8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,7 +54,7 @@ jobs: yarn workspace @callstack/react-native-brownfield brownfield --version android-androidapp-expo: - name: Android road test (RNApp & AndroidApp - Expo ${{ matrix.version }}) + name: Android road test (AndroidApp - Expo ${{ matrix.version }}) runs-on: ubuntu-latest needs: build-lint strategy: @@ -75,7 +75,7 @@ jobs: rn-project-maven-path: com/callstack/rnbrownfield/demo/expoapp${{ matrix.version }}/brownfieldlib android-androidapp-vanilla: - name: Android road test (RNApp & AndroidApp - Vanilla) + name: Android road test (AndroidApp - Vanilla) runs-on: ubuntu-latest needs: build-lint @@ -91,7 +91,7 @@ jobs: rn-project-maven-path: com/rnapp/brownfieldlib ios-appleapp-vanilla: - name: iOS road test (RNApp & AppleApp - Vanilla) + name: iOS road test (AppleApp - Vanilla) runs-on: macos-26 needs: build-lint @@ -106,7 +106,7 @@ jobs: rn-project-path: apps/RNApp ios-appleapp-expo: - name: iOS road test (RNApp & AppleApp - Expo ${{ matrix.version }}) + name: iOS road test (AppleApp - Expo ${{ matrix.version }}) runs-on: macos-26 needs: build-lint strategy: From 78e6dfc427a3aceac95e0c556df2bdc29caf5a50 Mon Sep 17 00:00:00 2001 From: artus9033 Date: Fri, 15 May 2026 12:27:58 +0200 Subject: [PATCH 26/26] chore: reorganize AppleApp project to accomodate prebuilt & non-prebuilt scenarios --- CONTRIBUTING.md | 25 +- .../project.pbxproj | 613 +++++++++++++++++- .../Brownfield Apple App Expo.xcscheme | 78 --- .../Brownfield Apple App Vanilla.xcscheme | 78 --- apps/AppleApp/package.json | 4 +- apps/README.md | 9 +- 6 files changed, 629 insertions(+), 178 deletions(-) delete mode 100644 apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo.xcscheme delete mode 100644 apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Vanilla.xcscheme diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e3f1bc2f..3586ec83 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,9 +30,10 @@ We use [changesets](https://github.com/changesets/changesets) to make it easier - `build:example:android-consumer:expo55` - builds the example native Android consumer (`apps/AndroidApp`) app's flavor consuming the Expo 55 RN app (`apps/ExpoApp55`) artifact - `build:example:android-consumer:expo54` - builds the example native Android consumer (`apps/AndroidApp`) app's flavor consuming the Expo 54 RN app (`apps/ExpoApp54`) artifact - `build:example:android-consumer:vanilla` - builds the example native Android consumer (`apps/AndroidApp`) app's flavor consuming the vanilla RN app (`apps/RNApp`) artifact -- `build:example:ios-consumer:expo55` - builds the example native iOS consumer app (`apps/AppleApp`) consuming the Expo 55 RN app (`apps/ExpoApp55`) artifact -- `build:example:ios-consumer:expo54` - builds the example native iOS consumer app (`apps/AppleApp`) consuming the Expo 54 RN app (`apps/ExpoApp54`) artifact -- `build:example:ios-consumer:vanilla` - builds the example native iOS consumer (`apps/AppleApp`) app's flavor consuming the vanilla RN app (`apps/RNApp`) artifact +- `build:example:ios-consumer:expo` - alias for `build:example:ios-consumer:expo55` +- `build:example:ios-consumer:expo55` - builds the `Brownfield Apple App (ExpoApp55)` target via scheme **Brownfield Apple App Expo 55** (`Release`) +- `build:example:ios-consumer:expo54` - builds the `Brownfield Apple App (ExpoApp54)` target via scheme **Brownfield Apple App Expo 54** (`Release`) +- `build:example:ios-consumer:vanilla` - builds the `Brownfield Apple App (RNApp)` target via scheme **Brownfield Apple App Vanilla** (`Release Vanilla`) ## Running demo apps @@ -57,15 +58,21 @@ There are 2 brownfield host apps. - `build:example:android-consumer:expo54` - consumes Expo 54 - `build:example:android-consumer:expo55` - consumes Expo 55 - `build:example:android-consumer:vanilla` - consumes the vanilla `RNApp` -- `apps/AppleApp` - for Apple - - `build:example:ios-consumer:expo54` - consumes Expo 54 - - `build:example:ios-consumer:expo55` - consumes Expo 55 - - `build:example:ios-consumer:vanilla` - consumes the vanilla `RNApp` +- `apps/AppleApp` - for Apple (three Xcode targets, each with its own shared scheme) + - `build:example:ios-consumer:expo54` — target `Brownfield Apple App (ExpoApp54)`, scheme **Brownfield Apple App Expo 54** + - `build:example:ios-consumer:expo55` (or `expo`) — target `Brownfield Apple App (ExpoApp55)`, scheme **Brownfield Apple App Expo 55** + - `build:example:ios-consumer:vanilla` — target `Brownfield Apple App (RNApp)`, scheme **Brownfield Apple App Vanilla** -For iOS, the scripts use the previously packaged artifacts from the respective directory `apps/{RNApp,Expo55,Expo54}` and invoke `prepareXCFrameworks.js` to copy over the XCFrameworks to the `apps/AppleApp/package` directory, from which the XCode project consumes well-known XCFramework files. +For iOS, each script uses the previously packaged artifacts from the respective directory (`apps/RNApp`, `apps/ExpoApp54`, or `apps/ExpoApp55`), invokes `prepareXCFrameworks.js` to copy XCFrameworks into `apps/AppleApp/package`, then runs `xcodebuild` against the matching scheme. The Xcode project reads fixed paths under `package/` (for example `package/BrownfieldLib.xcframework`). + +| Yarn script | RN app | Xcode target | Scheme | Configuration | +| --- | --- | --- | --- | --- | +| `build:example:ios-consumer:vanilla` | `RNApp` | `Brownfield Apple App (RNApp)` | Brownfield Apple App Vanilla | `Release Vanilla` | +| `build:example:ios-consumer:expo54` | `ExpoApp54` | `Brownfield Apple App (ExpoApp54)` | Brownfield Apple App Expo 54 | `Release` | +| `build:example:ios-consumer:expo55` | `ExpoApp55` | `Brownfield Apple App (ExpoApp55)` | Brownfield Apple App Expo 55 | `Release` | > [!IMPORTANT] -> You can build & run the `AppleApp` directly from XCode GUI, but before running it, after changing the scheme between Expo / Vanilla or making any changes & re-packaging the RN app, you need to re-run the `build:example:ios-consumer:...` script once again for the built artifacts to be available in the `apps/AppleApp/package` directory. Otherwise, you will still be building with the old artifacts. +> You can build and run `AppleApp` from the Xcode GUI by selecting the scheme for the variant you want. Before running, after switching schemes or re-packaging an RN app, run the matching `build:example:ios-consumer:...` script so fresh artifacts are present in `apps/AppleApp/package`. Otherwise Xcode will still link against the previous XCFrameworks. ## Tests diff --git a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj index a91c4fb0..7b9e9c19 100644 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj +++ b/apps/AppleApp/Brownfield Apple App.xcodeproj/project.pbxproj @@ -21,6 +21,30 @@ 7953277C2FB4A909008398F3 /* ReactBrownfield.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 7953277D2FB4A90A008398F3 /* ReactNativeDependencies.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; }; 7953277E2FB4A90A008398F3 /* ReactNativeDependencies.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BE6B2FB7270E00B94C6F /* Brownie.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; }; + 79B8BE6C2FB7270E00B94C6F /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; }; + 79B8BE6E2FB7270E00B94C6F /* hermesvm.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */; }; + 79B8BE6F2FB7270E00B94C6F /* ReactBrownfield.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; }; + 79B8BE702FB7270E00B94C6F /* BrownfieldLib.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; }; + 79B8BE742FB7270E00B94C6F /* Brownie.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BE752FB7270E00B94C6F /* ReactBrownfield.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BE772FB7270E00B94C6F /* BrownfieldNavigation.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BE782FB7270E00B94C6F /* hermesvm.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BE792FB7270E00B94C6F /* BrownfieldLib.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BE862FB7273600B94C6F /* Brownie.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; }; + 79B8BE872FB7273600B94C6F /* BrownfieldNavigation.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; }; + 79B8BE882FB7273600B94C6F /* ReactNativeDependencies.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; }; + 79B8BE892FB7273600B94C6F /* hermesvm.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */; }; + 79B8BE8A2FB7273600B94C6F /* ReactBrownfield.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; }; + 79B8BE8B2FB7273600B94C6F /* BrownfieldLib.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; }; + 79B8BE8C2FB7273600B94C6F /* React.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99D2FB4A61400A5F42B /* React.xcframework */; }; + 79B8BE8F2FB7273600B94C6F /* Brownie.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BE902FB7273600B94C6F /* ReactBrownfield.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BE912FB7273600B94C6F /* ReactNativeDependencies.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BE922FB7273600B94C6F /* BrownfieldNavigation.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BE932FB7273600B94C6F /* hermesvm.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99C2FB4A61400A5F42B /* hermesvm.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BE942FB7273600B94C6F /* BrownfieldLib.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 79B8BE952FB7273600B94C6F /* React.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79B1D99D2FB4A61400A5F42B /* React.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -41,10 +65,42 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + 79B8BE732FB7270E00B94C6F /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 79B8BE742FB7270E00B94C6F /* Brownie.xcframework in Embed Frameworks */, + 79B8BE752FB7270E00B94C6F /* ReactBrownfield.xcframework in Embed Frameworks */, + 79B8BE772FB7270E00B94C6F /* BrownfieldNavigation.xcframework in Embed Frameworks */, + 79B8BE782FB7270E00B94C6F /* hermesvm.xcframework in Embed Frameworks */, + 79B8BE792FB7270E00B94C6F /* BrownfieldLib.xcframework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 79B8BE8E2FB7273600B94C6F /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 79B8BE8F2FB7273600B94C6F /* Brownie.xcframework in Embed Frameworks */, + 79B8BE902FB7273600B94C6F /* ReactBrownfield.xcframework in Embed Frameworks */, + 79B8BE912FB7273600B94C6F /* ReactNativeDependencies.xcframework in Embed Frameworks */, + 79B8BE922FB7273600B94C6F /* BrownfieldNavigation.xcframework in Embed Frameworks */, + 79B8BE932FB7273600B94C6F /* hermesvm.xcframework in Embed Frameworks */, + 79B8BE942FB7273600B94C6F /* BrownfieldLib.xcframework in Embed Frameworks */, + 79B8BE952FB7273600B94C6F /* React.xcframework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 793C76A72EEBF938008A2A34 /* Brownfield Apple App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Brownfield Apple App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 793C76A72EEBF938008A2A34 /* Brownfield Apple App (RNApp).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Brownfield Apple App (RNApp).app"; sourceTree = BUILT_PRODUCTS_DIR; }; 79B1D9992FB4A61400A5F42B /* BrownfieldLib.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = BrownfieldLib.xcframework; path = package/BrownfieldLib.xcframework; sourceTree = ""; }; 79B1D99A2FB4A61400A5F42B /* BrownfieldNavigation.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = BrownfieldNavigation.xcframework; path = package/BrownfieldNavigation.xcframework; sourceTree = ""; }; 79B1D99B2FB4A61400A5F42B /* Brownie.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Brownie.xcframework; path = package/Brownie.xcframework; sourceTree = ""; }; @@ -52,11 +108,50 @@ 79B1D99D2FB4A61400A5F42B /* React.xcframework */ = {isa = PBXFileReference; expectedSignature = "SelfSigned:BEEAE960B121B398BB228BD547298BD461DFFFD862BD3AD794A38F6D426F6741"; lastKnownFileType = wrapper.xcframework; name = React.xcframework; path = package/React.xcframework; sourceTree = ""; }; 79B1D99E2FB4A61400A5F42B /* ReactBrownfield.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = ReactBrownfield.xcframework; path = package/ReactBrownfield.xcframework; sourceTree = ""; }; 79B1D99F2FB4A61400A5F42B /* ReactNativeDependencies.xcframework */ = {isa = PBXFileReference; expectedSignature = "SelfSigned:BEEAE960B121B398BB228BD547298BD461DFFFD862BD3AD794A38F6D426F6741"; lastKnownFileType = wrapper.xcframework; name = ReactNativeDependencies.xcframework; path = package/ReactNativeDependencies.xcframework; sourceTree = ""; }; + 79B8BE802FB7270E00B94C6F /* Brownfield Apple App (ExpoApp54).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Brownfield Apple App (ExpoApp54).app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 79B8BE9B2FB7273600B94C6F /* Brownfield Apple App (ExpoApp55).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Brownfield Apple App (ExpoApp55).app"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 79B8BE822FB7270F00B94C6F /* Exceptions for "Brownfield Apple App" folder in "Brownfield Apple App (ExpoApp54)" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Assets.xcassets, + BrownfieldAppleApp.swift, + components/ContentView.swift, + components/GreetingCard.swift, + components/MaterialCard.swift, + components/MessagesView.swift, + components/ReferralsScreen.swift, + components/SettingsScreen.swift, + components/Toast.swift, + ); + target = 79B8BE682FB7270E00B94C6F /* Brownfield Apple App (ExpoApp54) */; + }; + 79B8BE9C2FB7273600B94C6F /* Exceptions for "Brownfield Apple App" folder in "Brownfield Apple App (ExpoApp55)" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Assets.xcassets, + BrownfieldAppleApp.swift, + components/ContentView.swift, + components/GreetingCard.swift, + components/MaterialCard.swift, + components/MessagesView.swift, + components/ReferralsScreen.swift, + components/SettingsScreen.swift, + components/Toast.swift, + ); + target = 79B8BE832FB7273600B94C6F /* Brownfield Apple App (ExpoApp55) */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + /* Begin PBXFileSystemSynchronizedRootGroup section */ 793C76A92EEBF938008A2A34 /* Brownfield Apple App */ = { isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 79B8BE822FB7270F00B94C6F /* Exceptions for "Brownfield Apple App" folder in "Brownfield Apple App (ExpoApp54)" target */, + 79B8BE9C2FB7273600B94C6F /* Exceptions for "Brownfield Apple App" folder in "Brownfield Apple App (ExpoApp55)" target */, + ); path = "Brownfield Apple App"; sourceTree = ""; }; @@ -77,6 +172,32 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 79B8BE6A2FB7270E00B94C6F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 79B8BE6B2FB7270E00B94C6F /* Brownie.xcframework in Frameworks */, + 79B8BE6C2FB7270E00B94C6F /* BrownfieldNavigation.xcframework in Frameworks */, + 79B8BE6E2FB7270E00B94C6F /* hermesvm.xcframework in Frameworks */, + 79B8BE6F2FB7270E00B94C6F /* ReactBrownfield.xcframework in Frameworks */, + 79B8BE702FB7270E00B94C6F /* BrownfieldLib.xcframework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 79B8BE852FB7273600B94C6F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 79B8BE862FB7273600B94C6F /* Brownie.xcframework in Frameworks */, + 79B8BE872FB7273600B94C6F /* BrownfieldNavigation.xcframework in Frameworks */, + 79B8BE882FB7273600B94C6F /* ReactNativeDependencies.xcframework in Frameworks */, + 79B8BE892FB7273600B94C6F /* hermesvm.xcframework in Frameworks */, + 79B8BE8A2FB7273600B94C6F /* ReactBrownfield.xcframework in Frameworks */, + 79B8BE8B2FB7273600B94C6F /* BrownfieldLib.xcframework in Frameworks */, + 79B8BE8C2FB7273600B94C6F /* React.xcframework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -106,7 +227,9 @@ 793C76A82EEBF938008A2A34 /* Products */ = { isa = PBXGroup; children = ( - 793C76A72EEBF938008A2A34 /* Brownfield Apple App.app */, + 793C76A72EEBF938008A2A34 /* Brownfield Apple App (RNApp).app */, + 79B8BE802FB7270E00B94C6F /* Brownfield Apple App (ExpoApp54).app */, + 79B8BE9B2FB7273600B94C6F /* Brownfield Apple App (ExpoApp55).app */, ); name = Products; sourceTree = ""; @@ -114,9 +237,9 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 793C76A62EEBF938008A2A34 /* Brownfield Apple App */ = { + 793C76A62EEBF938008A2A34 /* Brownfield Apple App (RNApp) */ = { isa = PBXNativeTarget; - buildConfigurationList = 793C76B22EEBF939008A2A34 /* Build configuration list for PBXNativeTarget "Brownfield Apple App" */; + buildConfigurationList = 793C76B22EEBF939008A2A34 /* Build configuration list for PBXNativeTarget "Brownfield Apple App (RNApp)" */; buildPhases = ( 793C76A32EEBF938008A2A34 /* Sources */, 793C76A42EEBF938008A2A34 /* Frameworks */, @@ -130,11 +253,57 @@ fileSystemSynchronizedGroups = ( 793C76A92EEBF938008A2A34 /* Brownfield Apple App */, ); - name = "Brownfield Apple App"; + name = "Brownfield Apple App (RNApp)"; + packageProductDependencies = ( + ); + productName = "Brownfield Apple App"; + productReference = 793C76A72EEBF938008A2A34 /* Brownfield Apple App (RNApp).app */; + productType = "com.apple.product-type.application"; + }; + 79B8BE682FB7270E00B94C6F /* Brownfield Apple App (ExpoApp54) */ = { + isa = PBXNativeTarget; + buildConfigurationList = 79B8BE7B2FB7270E00B94C6F /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoApp54)" */; + buildPhases = ( + 79B8BE692FB7270E00B94C6F /* Sources */, + 79B8BE6A2FB7270E00B94C6F /* Frameworks */, + 79B8BE722FB7270E00B94C6F /* Resources */, + 79B8BE732FB7270E00B94C6F /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 793C76A92EEBF938008A2A34 /* Brownfield Apple App */, + ); + name = "Brownfield Apple App (ExpoApp54)"; + packageProductDependencies = ( + ); + productName = "Brownfield Apple App"; + productReference = 79B8BE802FB7270E00B94C6F /* Brownfield Apple App (ExpoApp54).app */; + productType = "com.apple.product-type.application"; + }; + 79B8BE832FB7273600B94C6F /* Brownfield Apple App (ExpoApp55) */ = { + isa = PBXNativeTarget; + buildConfigurationList = 79B8BE962FB7273600B94C6F /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoApp55)" */; + buildPhases = ( + 79B8BE842FB7273600B94C6F /* Sources */, + 79B8BE852FB7273600B94C6F /* Frameworks */, + 79B8BE8D2FB7273600B94C6F /* Resources */, + 79B8BE8E2FB7273600B94C6F /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 793C76A92EEBF938008A2A34 /* Brownfield Apple App */, + ); + name = "Brownfield Apple App (ExpoApp55)"; packageProductDependencies = ( ); productName = "Brownfield Apple App"; - productReference = 793C76A72EEBF938008A2A34 /* Brownfield Apple App.app */; + productReference = 79B8BE9B2FB7273600B94C6F /* Brownfield Apple App (ExpoApp55).app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -166,7 +335,9 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 793C76A62EEBF938008A2A34 /* Brownfield Apple App */, + 793C76A62EEBF938008A2A34 /* Brownfield Apple App (RNApp) */, + 79B8BE682FB7270E00B94C6F /* Brownfield Apple App (ExpoApp54) */, + 79B8BE832FB7273600B94C6F /* Brownfield Apple App (ExpoApp55) */, ); }; /* End PBXProject section */ @@ -179,6 +350,20 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 79B8BE722FB7270E00B94C6F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 79B8BE8D2FB7273600B94C6F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -189,6 +374,20 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 79B8BE692FB7270E00B94C6F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 79B8BE842FB7273600B94C6F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ @@ -404,6 +603,382 @@ }; name = "Release Expo"; }; + 79B8BE7C2FB7270E00B94C6F /* Debug Expo */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + ENABLE_APP_SANDBOX = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SELECTED_FILES = readonly; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Brownfield-Apple-App-Info.plist"; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UIViewControllerBasedStatusBarAppearance = "$(USE_EXPO_HOST_STATUS_BAR_APPEARANCE)"; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.callstack.brownfield.ios.example.Brownfield-iOS-App"; + PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) USE_EXPO_HOST"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + USE_EXPO_HOST_STATUS_BAR_APPEARANCE = NO; + XROS_DEPLOYMENT_TARGET = 2.0; + }; + name = "Debug Expo"; + }; + 79B8BE7D2FB7270E00B94C6F /* Release Expo */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + ENABLE_APP_SANDBOX = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SELECTED_FILES = readonly; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Brownfield-Apple-App-Info.plist"; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UIViewControllerBasedStatusBarAppearance = "$(USE_EXPO_HOST_STATUS_BAR_APPEARANCE)"; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.callstack.brownfield.ios.example.Brownfield-iOS-App"; + PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) USE_EXPO_HOST"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + USE_EXPO_HOST_STATUS_BAR_APPEARANCE = NO; + XROS_DEPLOYMENT_TARGET = 2.0; + }; + name = "Release Expo"; + }; + 79B8BE7E2FB7270E00B94C6F /* Debug Vanilla */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + ENABLE_APP_SANDBOX = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SELECTED_FILES = readonly; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Brownfield-Apple-App-Info.plist"; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UIViewControllerBasedStatusBarAppearance = "$(USE_EXPO_HOST_STATUS_BAR_APPEARANCE)"; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.callstack.brownfield.ios.example.Brownfield-iOS-App"; + PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + USE_EXPO_HOST_STATUS_BAR_APPEARANCE = YES; + XROS_DEPLOYMENT_TARGET = 2.0; + }; + name = "Debug Vanilla"; + }; + 79B8BE7F2FB7270E00B94C6F /* Release Vanilla */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + ENABLE_APP_SANDBOX = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SELECTED_FILES = readonly; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Brownfield-Apple-App-Info.plist"; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UIViewControllerBasedStatusBarAppearance = "$(USE_EXPO_HOST_STATUS_BAR_APPEARANCE)"; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.callstack.brownfield.ios.example.Brownfield-iOS-App"; + PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + USE_EXPO_HOST_STATUS_BAR_APPEARANCE = YES; + XROS_DEPLOYMENT_TARGET = 2.0; + }; + name = "Release Vanilla"; + }; + 79B8BE972FB7273600B94C6F /* Debug Expo */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + ENABLE_APP_SANDBOX = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SELECTED_FILES = readonly; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Brownfield-Apple-App-Info.plist"; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UIViewControllerBasedStatusBarAppearance = "$(USE_EXPO_HOST_STATUS_BAR_APPEARANCE)"; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.callstack.brownfield.ios.example.Brownfield-iOS-App"; + PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) USE_EXPO_HOST"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + USE_EXPO_HOST_STATUS_BAR_APPEARANCE = NO; + XROS_DEPLOYMENT_TARGET = 2.0; + }; + name = "Debug Expo"; + }; + 79B8BE982FB7273600B94C6F /* Release Expo */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + ENABLE_APP_SANDBOX = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SELECTED_FILES = readonly; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Brownfield-Apple-App-Info.plist"; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UIViewControllerBasedStatusBarAppearance = "$(USE_EXPO_HOST_STATUS_BAR_APPEARANCE)"; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.callstack.brownfield.ios.example.Brownfield-iOS-App"; + PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) USE_EXPO_HOST"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + USE_EXPO_HOST_STATUS_BAR_APPEARANCE = NO; + XROS_DEPLOYMENT_TARGET = 2.0; + }; + name = "Release Expo"; + }; + 79B8BE992FB7273600B94C6F /* Debug Vanilla */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + ENABLE_APP_SANDBOX = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SELECTED_FILES = readonly; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Brownfield-Apple-App-Info.plist"; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UIViewControllerBasedStatusBarAppearance = "$(USE_EXPO_HOST_STATUS_BAR_APPEARANCE)"; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.callstack.brownfield.ios.example.Brownfield-iOS-App"; + PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + USE_EXPO_HOST_STATUS_BAR_APPEARANCE = YES; + XROS_DEPLOYMENT_TARGET = 2.0; + }; + name = "Debug Vanilla"; + }; + 79B8BE9A2FB7273600B94C6F /* Release Vanilla */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + ENABLE_APP_SANDBOX = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SELECTED_FILES = readonly; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Brownfield-Apple-App-Info.plist"; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UIViewControllerBasedStatusBarAppearance = "$(USE_EXPO_HOST_STATUS_BAR_APPEARANCE)"; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.callstack.brownfield.ios.example.Brownfield-iOS-App"; + PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,7"; + USE_EXPO_HOST_STATUS_BAR_APPEARANCE = YES; + XROS_DEPLOYMENT_TARGET = 2.0; + }; + name = "Release Vanilla"; + }; 7A1B2C3D4E5F60718293A401 /* Debug Vanilla */ = { isa = XCBuildConfiguration; buildSettings = { @@ -630,7 +1205,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = "Release Expo"; }; - 793C76B22EEBF939008A2A34 /* Build configuration list for PBXNativeTarget "Brownfield Apple App" */ = { + 793C76B22EEBF939008A2A34 /* Build configuration list for PBXNativeTarget "Brownfield Apple App (RNApp)" */ = { isa = XCConfigurationList; buildConfigurations = ( 793C76B32EEBF939008A2A34 /* Debug Expo */, @@ -641,6 +1216,28 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = "Release Expo"; }; + 79B8BE7B2FB7270E00B94C6F /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoApp54)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 79B8BE7C2FB7270E00B94C6F /* Debug Expo */, + 79B8BE7D2FB7270E00B94C6F /* Release Expo */, + 79B8BE7E2FB7270E00B94C6F /* Debug Vanilla */, + 79B8BE7F2FB7270E00B94C6F /* Release Vanilla */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = "Release Expo"; + }; + 79B8BE962FB7273600B94C6F /* Build configuration list for PBXNativeTarget "Brownfield Apple App (ExpoApp55)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 79B8BE972FB7273600B94C6F /* Debug Expo */, + 79B8BE982FB7273600B94C6F /* Release Expo */, + 79B8BE992FB7273600B94C6F /* Debug Vanilla */, + 79B8BE9A2FB7273600B94C6F /* Release Vanilla */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = "Release Expo"; + }; /* End XCConfigurationList section */ }; rootObject = 793C769F2EEBF938008A2A34 /* Project object */; diff --git a/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo.xcscheme b/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo.xcscheme deleted file mode 100644 index b491f3bb..00000000 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Expo.xcscheme +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Vanilla.xcscheme b/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Vanilla.xcscheme deleted file mode 100644 index c1968f23..00000000 --- a/apps/AppleApp/Brownfield Apple App.xcodeproj/xcshareddata/xcschemes/Brownfield Apple App Vanilla.xcscheme +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/AppleApp/package.json b/apps/AppleApp/package.json index 3eb1817f..832bdbee 100644 --- a/apps/AppleApp/package.json +++ b/apps/AppleApp/package.json @@ -5,8 +5,8 @@ "type": "module", "scripts": { "build:example:ios-consumer:expo": "yarn build:example:ios-consumer:expo55", - "build:example:ios-consumer:expo54": "node prepareXCFrameworks.js --appName ExpoApp54 && yarn internal::build::common -scheme \"Brownfield Apple App Expo\" -configuration Release", - "build:example:ios-consumer:expo55": "node prepareXCFrameworks.js --appName ExpoApp55 && yarn internal::build::common -scheme \"Brownfield Apple App Expo\" -configuration Release", + "build:example:ios-consumer:expo54": "node prepareXCFrameworks.js --appName ExpoApp54 && yarn internal::build::common -scheme \"Brownfield Apple App Expo 54\" -configuration Release", + "build:example:ios-consumer:expo55": "node prepareXCFrameworks.js --appName ExpoApp55 && yarn internal::build::common -scheme \"Brownfield Apple App Expo 55\" -configuration Release", "build:example:ios-consumer:vanilla": "node prepareXCFrameworks.js --appName RNApp && yarn internal::build::common -scheme \"Brownfield Apple App Vanilla\" -configuration \"Release Vanilla\"", "internal::build::common": "xcodebuild -project \"Brownfield Apple App.xcodeproj\" -sdk iphonesimulator build CODE_SIGNING_ALLOWED=NO -derivedDataPath ./build" }, diff --git a/apps/README.md b/apps/README.md index 200728ee..27c77191 100644 --- a/apps/README.md +++ b/apps/README.md @@ -8,9 +8,12 @@ This directory contains demo projects showcasing the usage of the `react-native- - `AndroidApp` - the native Android application that integrates the RNApp AAR package (a "consumer" of the RNApp library); it comes in two flavors: - `expo` - which uses the artifact produced from `ExpoApp` - `vanilla` - which uses the artifact produced from `RNApp` -- `AppleApp` - the native iOS application that integrates the RNApp XCFramework package (a "consumer" of the RNApp library); it comes in two configurations: - - `expo` - which uses the artifact produced from `ExpoApp` - - `vanilla` - which uses the artifact produced from `RNApp` +- `AppleApp` - the native iOS application that integrates packaged XCFrameworks (a "consumer" of the RN apps); the Xcode project defines one target per consumed RN app: + - `Brownfield Apple App (RNApp)` — vanilla; uses the artifact from `RNApp` (scheme **Brownfield Apple App Vanilla**, configuration `Release Vanilla`) + - `Brownfield Apple App (ExpoApp54)` — uses the artifact from `ExpoApp54` (scheme **Brownfield Apple App Expo 54**, configuration `Release`) + - `Brownfield Apple App (ExpoApp55)` — uses the artifact from `ExpoApp55` (scheme **Brownfield Apple App Expo 55**, configuration `Release`) + + From `apps/AppleApp`, run `yarn build:example:ios-consumer:vanilla`, `yarn build:example:ios-consumer:expo54`, or `yarn build:example:ios-consumer:expo55` to copy XCFrameworks into `package/` and build the matching target. ## Additional notes