From b3737b76c21a20ad050abd2f269f2ec8efefbdf3 Mon Sep 17 00:00:00 2001 From: Thiago Brezinski Date: Sun, 6 Sep 2026 21:00:16 +0200 Subject: [PATCH 1/6] feat(ios): add SwiftPM integration support --- .changeset/native-tabs-swift-package.md | 5 ++ .../docs/docs/getting-started/quick-start.mdx | 29 ++++++++ .../react-native-bottom-tabs/Package.swift | 71 +++++++++++++++++++ .../ios/RCTBottomAccessoryComponentView.h | 2 +- .../ios/RCTBottomAccessoryComponentView.mm | 8 ++- .../ios/RCTTabViewComponentView.h | 2 +- .../ios/RCTTabViewComponentView.mm | 12 +++- .../ios/include/module.modulemap | 6 ++ .../react-native-bottom-tabs/package.json | 1 + .../react-native.config.js | 10 +++ 10 files changed, 140 insertions(+), 6 deletions(-) create mode 100644 .changeset/native-tabs-swift-package.md create mode 100644 packages/react-native-bottom-tabs/Package.swift create mode 100644 packages/react-native-bottom-tabs/ios/include/module.modulemap create mode 100644 packages/react-native-bottom-tabs/react-native.config.js diff --git a/.changeset/native-tabs-swift-package.md b/.changeset/native-tabs-swift-package.md new file mode 100644 index 00000000..75482b90 --- /dev/null +++ b/.changeset/native-tabs-swift-package.md @@ -0,0 +1,5 @@ +--- +'react-native-bottom-tabs': minor +--- + +Add iOS Swift Package Manager support through React Native's SwiftPM autolinking, including SwiftUIIntrospect and the native Fabric components. diff --git a/docs/docs/docs/getting-started/quick-start.mdx b/docs/docs/docs/getting-started/quick-start.mdx index aa937730..d8235989 100644 --- a/docs/docs/docs/getting-started/quick-start.mdx +++ b/docs/docs/docs/getting-started/quick-start.mdx @@ -55,6 +55,35 @@ Edit `android/app/src/main/res/values/styles.xml` to inherit from provided theme Here you can read more about [Android Native Styling](/docs/guides/android-native-styling). +### iOS with Swift Package Manager + +The library ships a `Package.swift` for React Native's SwiftPM autolinking flow, +alongside its CocoaPods podspec. This requires a React Native installation that +provides the `react-native spm` command, the New Architecture, and Swift tools 6.0 +or newer. The app must meet React Native's iOS deployment target as well as the +package's iOS 15 minimum. The repository's React Native 0.81 example still uses +CocoaPods. + +After installing the npm package, run this from an app already using SwiftPM: + +```sh +npx react-native spm +``` + +To migrate an existing CocoaPods app, follow the +[React Native SwiftPM setup guide](https://github.com/react/react-native/blob/main/packages/react-native/scripts/spm/__docs__/spm-scripts.md). +The migration command is: + +```sh +npx react-native spm add --deintegrate +``` + +React Native runs Codegen, prepares its native dependencies, and autolinks this +library. SwiftPM resolves SwiftUIIntrospect automatically. The manifest is intended +for this app-generated package graph; adding the GitHub repository directly in +Xcode does not provide the required React Native and Codegen packages. Other native +dependencies in your app also need SwiftPM support. + ## Example usage Please follow the guides below to integrate the library with your navigation library: diff --git a/packages/react-native-bottom-tabs/Package.swift b/packages/react-native-bottom-tabs/Package.swift new file mode 100644 index 00000000..bcd614c3 --- /dev/null +++ b/packages/react-native-bottom-tabs/Package.swift @@ -0,0 +1,71 @@ +// swift-tools-version: 6.0 + +import PackageDescription + +let reactHeaders: [Target.Dependency] = [ + .product(name: "ReactHeaders", package: "ReactNative"), + .product(name: "ReactNativeHeaders", package: "ReactNative"), + .product(name: "ReactNativeDependenciesHeaders", package: "ReactNative"), +] + +let package = Package( + name: "react_native_bottom_tabs", + platforms: [.iOS(.v15)], + products: [ + .library( + name: "react_native_bottom_tabs", + type: .dynamic, + targets: ["react_native_bottom_tabs"] + ), + ], + dependencies: [ + // React Native references this package through + // build/generated/autolinking/libs/react_native_bottom_tabs. + // SwiftPM resolves these paths relative to that alias, including in monorepos. + .package(name: "ReactNative", path: "../../../../xcframeworks"), + .package(name: "React-GeneratedCode", path: "../../../ios"), + .package(url: "https://github.com/siteline/swiftui-introspect.git", "1.0.0"..<"2.0.0"), + ], + targets: [ + .target( + name: "BottomTabsSwift", + dependencies: reactHeaders + [ + .product(name: "SwiftUIIntrospect", package: "swiftui-introspect"), + ], + path: "ios", + exclude: [ + "RCTTabViewComponentView.h", + "RCTTabViewComponentView.mm", + "RCTBottomAccessoryComponentView.h", + "RCTBottomAccessoryComponentView.mm", + "react-native-bottom-tabs-Bridging-Header.h", + "SVG", + "include", + ] + ), + .target( + name: "react_native_bottom_tabs", + dependencies: reactHeaders + [ + "BottomTabsSwift", + .product(name: "ReactAppHeaders", package: "React-GeneratedCode"), + ], + path: ".", + sources: [ + "ios/RCTTabViewComponentView.mm", + "ios/RCTBottomAccessoryComponentView.mm", + "ios/SVG", + "common/cpp", + ], + publicHeadersPath: "ios/include", + cxxSettings: [ + .headerSearchPath("common/cpp"), + .define("RCT_NEW_ARCH_ENABLED", to: "1"), + // Fabric's C++ layout must match the selected React framework. + .define("DEBUG", .when(configuration: .debug)), + .define("NDEBUG", .when(configuration: .release)), + ] + ), + ], + swiftLanguageModes: [.v5], + cxxLanguageStandard: .cxx20 +) diff --git a/packages/react-native-bottom-tabs/ios/RCTBottomAccessoryComponentView.h b/packages/react-native-bottom-tabs/ios/RCTBottomAccessoryComponentView.h index a7122759..11e8e99d 100644 --- a/packages/react-native-bottom-tabs/ios/RCTBottomAccessoryComponentView.h +++ b/packages/react-native-bottom-tabs/ios/RCTBottomAccessoryComponentView.h @@ -1,4 +1,4 @@ -#ifdef RCT_NEW_ARCH_ENABLED +#if defined(RCT_NEW_ARCH_ENABLED) || defined(SWIFT_PACKAGE) #import #if TARGET_OS_OSX #import diff --git a/packages/react-native-bottom-tabs/ios/RCTBottomAccessoryComponentView.mm b/packages/react-native-bottom-tabs/ios/RCTBottomAccessoryComponentView.mm index 62d95956..3063f4ed 100644 --- a/packages/react-native-bottom-tabs/ios/RCTBottomAccessoryComponentView.mm +++ b/packages/react-native-bottom-tabs/ios/RCTBottomAccessoryComponentView.mm @@ -8,7 +8,13 @@ #import -#if __has_include("react_native_bottom_tabs/react_native_bottom_tabs-Swift.h") +#if SWIFT_PACKAGE +#if __has_include() +#import +#else +#import "BottomTabsSwift-Swift.h" +#endif +#elif __has_include("react_native_bottom_tabs/react_native_bottom_tabs-Swift.h") #import "react_native_bottom_tabs/react_native_bottom_tabs-Swift.h" #else #import "react_native_bottom_tabs-Swift.h" diff --git a/packages/react-native-bottom-tabs/ios/RCTTabViewComponentView.h b/packages/react-native-bottom-tabs/ios/RCTTabViewComponentView.h index 0530a172..5332c869 100644 --- a/packages/react-native-bottom-tabs/ios/RCTTabViewComponentView.h +++ b/packages/react-native-bottom-tabs/ios/RCTTabViewComponentView.h @@ -1,4 +1,4 @@ -#ifdef RCT_NEW_ARCH_ENABLED +#if defined(RCT_NEW_ARCH_ENABLED) || defined(SWIFT_PACKAGE) #import #if TARGET_OS_OSX #import diff --git a/packages/react-native-bottom-tabs/ios/RCTTabViewComponentView.mm b/packages/react-native-bottom-tabs/ios/RCTTabViewComponentView.mm index 09ab604b..aacc6809 100644 --- a/packages/react-native-bottom-tabs/ios/RCTTabViewComponentView.mm +++ b/packages/react-native-bottom-tabs/ios/RCTTabViewComponentView.mm @@ -8,7 +8,13 @@ #import -#if __has_include("react_native_bottom_tabs/react_native_bottom_tabs-Swift.h") +#if SWIFT_PACKAGE +#if __has_include() +#import +#else +#import "BottomTabsSwift-Swift.h" +#endif +#elif __has_include("react_native_bottom_tabs/react_native_bottom_tabs-Swift.h") #import "react_native_bottom_tabs/react_native_bottom_tabs-Swift.h" #else #import "react_native_bottom_tabs-Swift.h" @@ -17,8 +23,8 @@ #import #import #import -#import "RCTImagePrimitivesConversions.h" -#import "RCTConversions.h" +#import +#import #import #if TARGET_OS_OSX diff --git a/packages/react-native-bottom-tabs/ios/include/module.modulemap b/packages/react-native-bottom-tabs/ios/include/module.modulemap new file mode 100644 index 00000000..52fb1992 --- /dev/null +++ b/packages/react-native-bottom-tabs/ios/include/module.modulemap @@ -0,0 +1,6 @@ +module react_native_bottom_tabs { + header "../RCTTabViewComponentView.h" + header "../RCTBottomAccessoryComponentView.h" + header "../SVG/SvgDecoder.h" + export * +} diff --git a/packages/react-native-bottom-tabs/package.json b/packages/react-native-bottom-tabs/package.json index 683e719f..bb49981c 100644 --- a/packages/react-native-bottom-tabs/package.json +++ b/packages/react-native-bottom-tabs/package.json @@ -22,6 +22,7 @@ "ios", "cpp", "common", + "Package.swift", "react-native.config.js", "app.plugin.js", "*.podspec", diff --git a/packages/react-native-bottom-tabs/react-native.config.js b/packages/react-native-bottom-tabs/react-native.config.js new file mode 100644 index 00000000..1bb29d0e --- /dev/null +++ b/packages/react-native-bottom-tabs/react-native.config.js @@ -0,0 +1,10 @@ +module.exports = { + dependency: { + platforms: { + ios: {}, + }, + }, + spm: { + name: 'react_native_bottom_tabs', + }, +}; From 476188412f38ba93cff7ef207e4a6e0f92a1ffb7 Mon Sep 17 00:00:00 2001 From: Thiago Brezinski Date: Tue, 8 Sep 2026 17:55:05 +0100 Subject: [PATCH 2/6] feat(iOS): add SwiftPM support --- .github/workflows/ci.yml | 28 + .gitignore | 1 + ...gesture-handler-npm-3.2.1-73a74f5c79.patch | 127 ++ ...fe-area-context-npm-5.9.1-b51fb9c5f7.patch | 95 + ...native-screens-npm-4.27.0-78335f53c6.patch | 269 +++ ...e-vector-icons-npm-10.2.0-e1aad1f85c.patch | 65 + ...ative-worklets-npm-0.12.1-aa8a1b2670.patch | 151 ++ apps/example-swiftpm/.bundle/config | 2 + apps/example-swiftpm/.eslintrc.js | 4 + apps/example-swiftpm/.gitignore | 62 + apps/example-swiftpm/.prettierrc.js | 5 + apps/example-swiftpm/.watchmanconfig | 1 + apps/example-swiftpm/Gemfile | 17 + apps/example-swiftpm/README.md | 88 + apps/example-swiftpm/app.json | 4 + apps/example-swiftpm/babel.config.js | 1 + apps/example-swiftpm/index.js | 5 + apps/example-swiftpm/ios/.gitignore | 6 + apps/example-swiftpm/ios/.xcode.env | 11 + .../.spm-injected.json | 189 ++ .../ExampleSwiftPM.xcodeproj/project.pbxproj | 658 +++++++ .../xcschemes/ExampleSwiftPM.xcscheme | 294 +++ .../ios/ExampleSwiftPM/AppDelegate.swift | 48 + .../AppIcon.appiconset/Contents.json | 53 + .../Images.xcassets/Contents.json | 6 + .../ios/ExampleSwiftPM/Info.plist | 62 + .../ExampleSwiftPM/LaunchScreen.storyboard | 47 + .../ios/ExampleSwiftPM/PrivacyInfo.xcprivacy | 37 + apps/example-swiftpm/ios/Podfile | 3 + apps/example-swiftpm/metro.config.js | 43 + apps/example-swiftpm/package.json | 59 + apps/example-swiftpm/react-native.config.js | 3 + apps/example-swiftpm/tsconfig.json | 15 + apps/example/babel.config.js | 45 +- apps/example/index.js | 2 +- apps/example/metro.config.js | 15 + apps/example/package.json | 5 +- .../docs/docs/getting-started/quick-start.mdx | 5 +- packages/example-shared/README.md | 55 + .../example-shared}/assets/album-art-01.jpg | Bin .../example-shared}/assets/album-art-02.jpg | Bin .../example-shared}/assets/album-art-03.jpg | Bin .../example-shared}/assets/album-art-04.jpg | Bin .../example-shared}/assets/album-art-05.jpg | Bin .../example-shared}/assets/album-art-06.jpg | Bin .../example-shared}/assets/album-art-07.jpg | Bin .../example-shared}/assets/album-art-08.jpg | Bin .../example-shared}/assets/album-art-09.jpg | Bin .../example-shared}/assets/album-art-10.jpg | Bin .../example-shared}/assets/album-art-11.jpg | Bin .../example-shared}/assets/album-art-12.jpg | Bin .../example-shared}/assets/album-art-13.jpg | Bin .../example-shared}/assets/album-art-14.jpg | Bin .../example-shared}/assets/album-art-15.jpg | Bin .../example-shared}/assets/album-art-16.jpg | Bin .../example-shared}/assets/album-art-17.jpg | Bin .../example-shared}/assets/album-art-18.jpg | Bin .../example-shared}/assets/album-art-19.jpg | Bin .../example-shared}/assets/album-art-20.jpg | Bin .../example-shared}/assets/album-art-21.jpg | Bin .../example-shared}/assets/album-art-22.jpg | Bin .../example-shared}/assets/album-art-23.jpg | Bin .../example-shared}/assets/album-art-24.jpg | Bin .../example-shared}/assets/avatar-1.png | Bin .../example-shared}/assets/avatar-2.png | Bin .../example-shared}/assets/avatar-3.png | Bin .../example-shared}/assets/avatar-4.png | Bin .../example-shared}/assets/book.jpg | Bin .../assets/icons/article_dark.png | Bin .../assets/icons/book-image.svg | 0 .../assets/icons/chat_dark.png | Bin .../assets/icons/grid_dark.png | Bin .../assets/icons/message-circle-code.svg | 0 .../assets/icons/newspaper.svg | 0 .../assets/icons/person_dark.png | Bin .../assets/icons/user-round-search.svg | 0 .../assets/icons/user-round.svg | 0 packages/example-shared/babel.config.js | 44 + .../e2e/native-tabs-test-id.yaml | 2 +- packages/example-shared/package.json | 40 + .../example-shared}/src/App.tsx | 0 .../src/Components/MusicControl.tsx | 0 .../src/Examples/BottomAccessoryView.tsx | 0 .../src/Examples/CustomTabBar.tsx | 0 .../example-shared}/src/Examples/FiveTabs.tsx | 0 .../example-shared}/src/Examples/FourTabs.tsx | 0 .../src/Examples/FourTabsRTL.tsx | 0 .../src/Examples/JSBottomTabs.tsx | 0 .../example-shared}/src/Examples/Labeled.tsx | 0 .../example-shared}/src/Examples/LazyTabs.tsx | 0 .../src/Examples/MaterialBottomTabs.tsx | 0 .../src/Examples/NativeBottomTabs.tsx | 0 .../Examples/NativeBottomTabsCustomTabBar.tsx | 0 .../NativeBottomTabsEmbeddedStacks.tsx | 0 .../Examples/NativeBottomTabsFreezeOnBlur.tsx | 0 .../src/Examples/NativeBottomTabsLazy.tsx | 0 .../NativeBottomTabsOriginalIcons.tsx | 0 .../Examples/NativeBottomTabsRemoteIcons.tsx | 0 .../src/Examples/NativeBottomTabsSVGs.tsx | 0 .../Examples/NativeBottomTabsScreenLayout.tsx | 0 .../Examples/NativeBottomTabsTabBarHidden.tsx | 0 .../Examples/NativeBottomTabsUnmounting.tsx | 0 .../src/Examples/OriginalIconColors.tsx | 0 .../src/Examples/SFSymbols.tsx | 0 .../example-shared}/src/Examples/SixTabs.tsx | 0 .../src/Examples/TabBarHidden.tsx | 0 .../src/Examples/ThreeTabs.tsx | 0 .../src/Examples/TintColors.tsx | 0 .../example-shared}/src/Screens/Albums.tsx | 0 .../example-shared}/src/Screens/Article.tsx | 0 .../example-shared}/src/Screens/Chat.tsx | 0 .../example-shared}/src/Screens/Contacts.tsx | 0 packages/example-shared/tsconfig.json | 15 + .../react-native-bottom-tabs/Package.swift | 11 +- .../ios/Bridge/BottomTabsBridge.h | 62 + .../ios/Bridge/BottomTabsBridge.m | 31 + .../ios/RCTBottomAccessoryComponentView.mm | 18 +- .../ios/RCTTabViewComponentView.mm | 27 +- yarn.config.cjs | 58 + yarn.lock | 1625 ++++++++++++++++- 120 files changed, 4419 insertions(+), 100 deletions(-) create mode 100644 .yarn/patches/react-native-gesture-handler-npm-3.2.1-73a74f5c79.patch create mode 100644 .yarn/patches/react-native-safe-area-context-npm-5.9.1-b51fb9c5f7.patch create mode 100644 .yarn/patches/react-native-screens-npm-4.27.0-78335f53c6.patch create mode 100644 .yarn/patches/react-native-vector-icons-npm-10.2.0-e1aad1f85c.patch create mode 100644 .yarn/patches/react-native-worklets-npm-0.12.1-aa8a1b2670.patch create mode 100644 apps/example-swiftpm/.bundle/config create mode 100644 apps/example-swiftpm/.eslintrc.js create mode 100644 apps/example-swiftpm/.gitignore create mode 100644 apps/example-swiftpm/.prettierrc.js create mode 100644 apps/example-swiftpm/.watchmanconfig create mode 100644 apps/example-swiftpm/Gemfile create mode 100644 apps/example-swiftpm/README.md create mode 100644 apps/example-swiftpm/app.json create mode 100644 apps/example-swiftpm/babel.config.js create mode 100644 apps/example-swiftpm/index.js create mode 100644 apps/example-swiftpm/ios/.gitignore create mode 100644 apps/example-swiftpm/ios/.xcode.env create mode 100644 apps/example-swiftpm/ios/ExampleSwiftPM.xcodeproj/.spm-injected.json create mode 100644 apps/example-swiftpm/ios/ExampleSwiftPM.xcodeproj/project.pbxproj create mode 100644 apps/example-swiftpm/ios/ExampleSwiftPM.xcodeproj/xcshareddata/xcschemes/ExampleSwiftPM.xcscheme create mode 100644 apps/example-swiftpm/ios/ExampleSwiftPM/AppDelegate.swift create mode 100644 apps/example-swiftpm/ios/ExampleSwiftPM/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 apps/example-swiftpm/ios/ExampleSwiftPM/Images.xcassets/Contents.json create mode 100644 apps/example-swiftpm/ios/ExampleSwiftPM/Info.plist create mode 100644 apps/example-swiftpm/ios/ExampleSwiftPM/LaunchScreen.storyboard create mode 100644 apps/example-swiftpm/ios/ExampleSwiftPM/PrivacyInfo.xcprivacy create mode 100644 apps/example-swiftpm/ios/Podfile create mode 100644 apps/example-swiftpm/metro.config.js create mode 100644 apps/example-swiftpm/package.json create mode 100644 apps/example-swiftpm/react-native.config.js create mode 100644 apps/example-swiftpm/tsconfig.json create mode 100644 packages/example-shared/README.md rename {apps/example => packages/example-shared}/assets/album-art-01.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-02.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-03.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-04.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-05.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-06.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-07.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-08.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-09.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-10.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-11.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-12.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-13.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-14.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-15.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-16.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-17.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-18.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-19.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-20.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-21.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-22.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-23.jpg (100%) rename {apps/example => packages/example-shared}/assets/album-art-24.jpg (100%) rename {apps/example => packages/example-shared}/assets/avatar-1.png (100%) rename {apps/example => packages/example-shared}/assets/avatar-2.png (100%) rename {apps/example => packages/example-shared}/assets/avatar-3.png (100%) rename {apps/example => packages/example-shared}/assets/avatar-4.png (100%) rename {apps/example => packages/example-shared}/assets/book.jpg (100%) rename {apps/example => packages/example-shared}/assets/icons/article_dark.png (100%) rename {apps/example => packages/example-shared}/assets/icons/book-image.svg (100%) rename {apps/example => packages/example-shared}/assets/icons/chat_dark.png (100%) rename {apps/example => packages/example-shared}/assets/icons/grid_dark.png (100%) rename {apps/example => packages/example-shared}/assets/icons/message-circle-code.svg (100%) rename {apps/example => packages/example-shared}/assets/icons/newspaper.svg (100%) rename {apps/example => packages/example-shared}/assets/icons/person_dark.png (100%) rename {apps/example => packages/example-shared}/assets/icons/user-round-search.svg (100%) rename {apps/example => packages/example-shared}/assets/icons/user-round.svg (100%) create mode 100644 packages/example-shared/babel.config.js rename {apps/example => packages/example-shared}/e2e/native-tabs-test-id.yaml (93%) create mode 100644 packages/example-shared/package.json rename {apps/example => packages/example-shared}/src/App.tsx (100%) rename {apps/example => packages/example-shared}/src/Components/MusicControl.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/BottomAccessoryView.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/CustomTabBar.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/FiveTabs.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/FourTabs.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/FourTabsRTL.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/JSBottomTabs.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/Labeled.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/LazyTabs.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/MaterialBottomTabs.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/NativeBottomTabs.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/NativeBottomTabsCustomTabBar.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/NativeBottomTabsEmbeddedStacks.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/NativeBottomTabsFreezeOnBlur.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/NativeBottomTabsLazy.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/NativeBottomTabsOriginalIcons.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/NativeBottomTabsRemoteIcons.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/NativeBottomTabsSVGs.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/NativeBottomTabsScreenLayout.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/NativeBottomTabsTabBarHidden.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/NativeBottomTabsUnmounting.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/OriginalIconColors.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/SFSymbols.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/SixTabs.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/TabBarHidden.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/ThreeTabs.tsx (100%) rename {apps/example => packages/example-shared}/src/Examples/TintColors.tsx (100%) rename {apps/example => packages/example-shared}/src/Screens/Albums.tsx (100%) rename {apps/example => packages/example-shared}/src/Screens/Article.tsx (100%) rename {apps/example => packages/example-shared}/src/Screens/Chat.tsx (100%) rename {apps/example => packages/example-shared}/src/Screens/Contacts.tsx (100%) create mode 100644 packages/example-shared/tsconfig.json create mode 100644 packages/react-native-bottom-tabs/ios/Bridge/BottomTabsBridge.h create mode 100644 packages/react-native-bottom-tabs/ios/Bridge/BottomTabsBridge.m create mode 100644 yarn.config.cjs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 204cd8d3..39d921cb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,6 +21,9 @@ jobs: - name: Setup uses: ./.github/actions/setup + - name: Check example dependency constraints + run: yarn constraints + - name: Lint files run: yarn lint @@ -153,3 +156,28 @@ jobs: run: | yarn turbo run build:ios --cache-dir="${{ env.TURBO_CACHE_DIR }}" + build-ios-swiftpm: + runs-on: macos-26 + timeout-minutes: 45 + steps: + - name: Checkout + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + + - name: Setup + uses: ./.github/actions/setup + + - name: Set up SwiftPM integration + run: yarn workspace example-swiftpm spm --yes + + - name: Build SwiftPM example for iOS + run: | + xcodebuild \ + -project apps/example-swiftpm/ios/ExampleSwiftPM.xcodeproj \ + -scheme ExampleSwiftPM \ + -configuration Release \ + -sdk iphonesimulator \ + -destination 'generic/platform=iOS Simulator' \ + -derivedDataPath "$RUNNER_TEMP/example-swiftpm-build" \ + ARCHS=arm64 \ + CODE_SIGNING_ALLOWED=NO \ + build diff --git a/.gitignore b/.gitignore index ab7f80ce..7ef635f9 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ jsconfig.json # Xcode # build/ +.build/ *.pbxuser !default.pbxuser *.mode1v3 diff --git a/.yarn/patches/react-native-gesture-handler-npm-3.2.1-73a74f5c79.patch b/.yarn/patches/react-native-gesture-handler-npm-3.2.1-73a74f5c79.patch new file mode 100644 index 00000000..a81ca5b2 --- /dev/null +++ b/.yarn/patches/react-native-gesture-handler-npm-3.2.1-73a74f5c79.patch @@ -0,0 +1,127 @@ +diff --git a/Package.swift b/Package.swift +new file mode 100644 +index 0000000000000000000000000000000000000000..9655f2e5f4212edb4e93f746087f2897836ec09f +--- /dev/null ++++ b/Package.swift +@@ -0,0 +1,105 @@ ++// swift-tools-version: 6.0 ++// AUTO-SCAFFOLDED by react-native spm scaffold — safe to edit & commit via patch-package. ++// AUTO-SCAFFOLDED-VERSION: 19 ++// Cache slot: 0.87.1/dual-flavor ++// Edit the contents below if needed and re-run `npx patch-package ` ++// to persist across `npm install`. To regenerate from the podspec, remove ++// this file (or just this marker) and re-run `npx react-native spm scaffold`. ++// ++// Package references are plain relative paths, computed when this file was ++// scaffolded. They stay correct because the file is re-scaffolded per app ++// and cache slot, and any node_modules relayout reinstalls this package ++// (dropping the file) anyway. ++ ++import PackageDescription ++ ++let package = Package( ++ name: "ReactNativeGestureHandler", ++ platforms: [.iOS(.v15)], ++ products: [ ++ .library(name: "ReactNativeGestureHandler", targets: ["ReactNativeGestureHandler"]), ++ ], ++ dependencies: [ ++ .package(name: "ReactNative", path: "../../../../xcframeworks"), ++ .package(name: "React-GeneratedCode", path: "../../../ios"), ++ .package(name: "ReactNativeWorklets", path: "../ReactNativeWorklets"), ++ ], ++ targets: [ ++ .target( ++ name: "ReactNativeGestureHandler", ++ dependencies: [.product(name: "ReactHeaders", package: "ReactNative"), .product(name: "ReactNativeHeaders", package: "ReactNative"), .product(name: "ReactNativeDependenciesHeaders", package: "ReactNative"), .product(name: "ReactAppHeaders", package: "React-GeneratedCode"), .product(name: "ReactNativeWorklets", package: "ReactNativeWorklets")], ++ path: ".", ++ sources: [ ++ "apple/Handlers/RNFlingHandler.h", ++ "apple/Handlers/RNFlingHandler.m", ++ "apple/Handlers/RNForceTouchHandler.h", ++ "apple/Handlers/RNForceTouchHandler.m", ++ "apple/Handlers/RNHoverHandler.h", ++ "apple/Handlers/RNHoverHandler.m", ++ "apple/Handlers/RNLongPressHandler.h", ++ "apple/Handlers/RNLongPressHandler.m", ++ "apple/Handlers/RNManualHandler.h", ++ "apple/Handlers/RNManualHandler.m", ++ "apple/Handlers/RNNativeViewHandler.h", ++ "apple/Handlers/RNNativeViewHandler.mm", ++ "apple/Handlers/RNPanHandler.h", ++ "apple/Handlers/RNPanHandler.m", ++ "apple/Handlers/RNPinchHandler.h", ++ "apple/Handlers/RNPinchHandler.m", ++ "apple/Handlers/RNRotationHandler.h", ++ "apple/Handlers/RNRotationHandler.m", ++ "apple/Handlers/RNTapHandler.h", ++ "apple/Handlers/RNTapHandler.m", ++ "apple/RNGHStylusData.h", ++ "apple/RNGHStylusData.m", ++ "apple/RNGHTouchEventType.h", ++ "apple/RNGHUIKit.h", ++ "apple/RNGHVector.h", ++ "apple/RNGHVector.m", ++ "apple/RNGestureHandler.h", ++ "apple/RNGestureHandler.mm", ++ "apple/RNGestureHandlerActionType.h", ++ "apple/RNGestureHandlerButton.h", ++ "apple/RNGestureHandlerButton.mm", ++ "apple/RNGestureHandlerButtonComponentView.h", ++ "apple/RNGestureHandlerButtonComponentView.mm", ++ "apple/RNGestureHandlerDetector.h", ++ "apple/RNGestureHandlerDetector.mm", ++ "apple/RNGestureHandlerDirection.h", ++ "apple/RNGestureHandlerEventHandlerType.h", ++ "apple/RNGestureHandlerEvents.h", ++ "apple/RNGestureHandlerEvents.mm", ++ "apple/RNGestureHandlerManager.h", ++ "apple/RNGestureHandlerManager.mm", ++ "apple/RNGestureHandlerModule.h", ++ "apple/RNGestureHandlerModule.mm", ++ "apple/RNGestureHandlerNativeEventUtils.h", ++ "apple/RNGestureHandlerNativeEventUtils.mm", ++ "apple/RNGestureHandlerPointerEvents.h", ++ "apple/RNGestureHandlerPointerTracker.h", ++ "apple/RNGestureHandlerPointerTracker.mm", ++ "apple/RNGestureHandlerPointerType.h", ++ "apple/RNGestureHandlerRegistry.h", ++ "apple/RNGestureHandlerRegistry.m", ++ "apple/RNGestureHandlerRootViewComponentView.mm", ++ "apple/RNGestureHandlerState.h", ++ "apple/RNManualActivationRecognizer.h", ++ "apple/RNManualActivationRecognizer.m", ++ "apple/RNRootViewGestureRecognizer.h", ++ "apple/RNRootViewGestureRecognizer.m", ++ "shared/runtime/RNGHRuntimeDecorator.cpp", ++ "shared/runtime/RNGHRuntimeDecorator.h", ++ "shared/shadowNodes/react/renderer/components/rngesturehandler_codegen/ComponentDescriptors.h", ++ "shared/shadowNodes/react/renderer/components/rngesturehandler_codegen/RNGestureHandlerDetectorComponentDescriptor.h", ++ "shared/shadowNodes/react/renderer/components/rngesturehandler_codegen/RNGestureHandlerDetectorShadowNode.cpp", ++ "shared/shadowNodes/react/renderer/components/rngesturehandler_codegen/RNGestureHandlerDetectorShadowNode.h", ++ "shared/shadowNodes/react/renderer/components/rngesturehandler_codegen/RNGestureHandlerDetectorState.h", ++ ], ++ publicHeadersPath: "apple", ++ cSettings: [.define("REACT_NATIVE_MINOR_VERSION", to: "87"), .define("RNGH_USE_WORKLETS", to: "1"), .headerSearchPath("apple/Handlers"), .headerSearchPath("apple"), .headerSearchPath("shared/runtime"), .headerSearchPath("shared/shadowNodes/react/renderer/components/rngesturehandler_codegen"), .headerSearchPath("."), .unsafeFlags(["-include", "react-native-spm-prefix.h"])], ++ cxxSettings: [.define("REACT_NATIVE_MINOR_VERSION", to: "87"), .define("RNGH_USE_WORKLETS", to: "1"), .headerSearchPath("apple/Handlers"), .headerSearchPath("apple"), .headerSearchPath("shared/runtime"), .headerSearchPath("shared/shadowNodes/react/renderer/components/rngesturehandler_codegen"), .headerSearchPath("."), .unsafeFlags(["-include", "react-native-spm-prefix.h"]), .define("DEBUG", .when(configuration: .debug)), .define("NDEBUG", .when(configuration: .release))], ++ linkerSettings: [.linkedFramework("UIKit"), .linkedFramework("Foundation"), .linkedFramework("CoreGraphics")] ++ ), ++ ], ++ cxxLanguageStandard: .cxx20 ++) +diff --git a/react-native-spm-prefix.h b/react-native-spm-prefix.h +new file mode 100644 +index 0000000000000000000000000000000000000000..af5cea0557f2f4aa957419f0fc3f250fd55dbaf5 +--- /dev/null ++++ b/react-native-spm-prefix.h +@@ -0,0 +1,10 @@ ++// AUTO-SCAFFOLDED by react-native spm scaffold — mirrors CocoaPods' default ++// prefix header so ObjC sources that rely on an implicit Foundation/UIKit ++// import compile under SPM (which has no prefix-header mechanism). Safe to ++// delete + regenerate via `npx react-native spm scaffold`. ++#ifdef __OBJC__ ++#import ++#if __has_include() ++#import ++#endif ++#endif diff --git a/.yarn/patches/react-native-safe-area-context-npm-5.9.1-b51fb9c5f7.patch b/.yarn/patches/react-native-safe-area-context-npm-5.9.1-b51fb9c5f7.patch new file mode 100644 index 00000000..16f8c268 --- /dev/null +++ b/.yarn/patches/react-native-safe-area-context-npm-5.9.1-b51fb9c5f7.patch @@ -0,0 +1,95 @@ +diff --git a/Package.swift b/Package.swift +new file mode 100644 +index 0000000000000000000000000000000000000000..7434fc7054313966b52f6ed808eab20544fb87fe +--- /dev/null ++++ b/Package.swift +@@ -0,0 +1,73 @@ ++// swift-tools-version: 6.0 ++// AUTO-SCAFFOLDED by react-native spm scaffold — safe to edit & commit via patch-package. ++// AUTO-SCAFFOLDED-VERSION: 19 ++// Cache slot: 0.87.1/dual-flavor ++// Edit the contents below if needed and re-run `npx patch-package ` ++// to persist across `npm install`. To regenerate from the podspec, remove ++// this file (or just this marker) and re-run `npx react-native spm scaffold`. ++// ++// Package references are plain relative paths, computed when this file was ++// scaffolded. They stay correct because the file is re-scaffolded per app ++// and cache slot, and any node_modules relayout reinstalls this package ++// (dropping the file) anyway. ++ ++import PackageDescription ++ ++let package = Package( ++ name: "ReactNativeSafeAreaContext", ++ platforms: [.iOS(.v15)], ++ products: [ ++ .library(name: "ReactNativeSafeAreaContext", targets: ["ReactNativeSafeAreaContext"]), ++ ], ++ dependencies: [ ++ .package(name: "ReactNative", path: "../../../../xcframeworks"), ++ .package(name: "React-GeneratedCode", path: "../../../ios"), ++ ], ++ targets: [ ++ .target( ++ name: "ReactNativeSafeAreaContext", ++ dependencies: [.product(name: "ReactHeaders", package: "ReactNative"), .product(name: "ReactNativeHeaders", package: "ReactNative"), .product(name: "ReactNativeDependenciesHeaders", package: "ReactNative"), .product(name: "ReactAppHeaders", package: "React-GeneratedCode")], ++ path: ".", ++ sources: [ ++ "common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewComponentDescriptor.h", ++ "common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewShadowNode.cpp", ++ "common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewShadowNode.h", ++ "common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewState.cpp", ++ "common/cpp/react/renderer/components/safeareacontext/RNCSafeAreaViewState.h", ++ "ios/Fabric/RNCSafeAreaProviderComponentView.h", ++ "ios/Fabric/RNCSafeAreaProviderComponentView.mm", ++ "ios/Fabric/RNCSafeAreaViewComponentView.h", ++ "ios/Fabric/RNCSafeAreaViewComponentView.mm", ++ "ios/RNCOnInsetsChangeEvent.h", ++ "ios/RNCOnInsetsChangeEvent.m", ++ "ios/RNCSafeAreaContext.h", ++ "ios/RNCSafeAreaContext.mm", ++ "ios/RNCSafeAreaProvider.h", ++ "ios/RNCSafeAreaProvider.m", ++ "ios/RNCSafeAreaProviderManager.h", ++ "ios/RNCSafeAreaProviderManager.m", ++ "ios/RNCSafeAreaShadowView.h", ++ "ios/RNCSafeAreaShadowView.m", ++ "ios/RNCSafeAreaUtils.h", ++ "ios/RNCSafeAreaUtils.m", ++ "ios/RNCSafeAreaView.h", ++ "ios/RNCSafeAreaView.m", ++ "ios/RNCSafeAreaViewEdgeMode.h", ++ "ios/RNCSafeAreaViewEdgeMode.m", ++ "ios/RNCSafeAreaViewEdges.h", ++ "ios/RNCSafeAreaViewEdges.m", ++ "ios/RNCSafeAreaViewLocalData.h", ++ "ios/RNCSafeAreaViewLocalData.m", ++ "ios/RNCSafeAreaViewManager.h", ++ "ios/RNCSafeAreaViewManager.m", ++ "ios/RNCSafeAreaViewMode.h", ++ "ios/RNCSafeAreaViewMode.m", ++ ], ++ publicHeadersPath: "ios", ++ cSettings: [.headerSearchPath("common/cpp"), .headerSearchPath("common/cpp/react/renderer/components/safeareacontext"), .headerSearchPath("ios/Fabric"), .headerSearchPath("ios"), .headerSearchPath("."), .unsafeFlags(["-include", "react-native-spm-prefix.h"])], ++ cxxSettings: [.headerSearchPath("common/cpp"), .headerSearchPath("common/cpp/react/renderer/components/safeareacontext"), .headerSearchPath("ios/Fabric"), .headerSearchPath("ios"), .headerSearchPath("."), .unsafeFlags(["-include", "react-native-spm-prefix.h"]), .define("DEBUG", .when(configuration: .debug)), .define("NDEBUG", .when(configuration: .release))], ++ linkerSettings: [.linkedFramework("UIKit"), .linkedFramework("Foundation"), .linkedFramework("CoreGraphics")] ++ ), ++ ], ++ cxxLanguageStandard: .cxx20 ++) +diff --git a/react-native-spm-prefix.h b/react-native-spm-prefix.h +new file mode 100644 +index 0000000000000000000000000000000000000000..af5cea0557f2f4aa957419f0fc3f250fd55dbaf5 +--- /dev/null ++++ b/react-native-spm-prefix.h +@@ -0,0 +1,10 @@ ++// AUTO-SCAFFOLDED by react-native spm scaffold — mirrors CocoaPods' default ++// prefix header so ObjC sources that rely on an implicit Foundation/UIKit ++// import compile under SPM (which has no prefix-header mechanism). Safe to ++// delete + regenerate via `npx react-native spm scaffold`. ++#ifdef __OBJC__ ++#import ++#if __has_include() ++#import ++#endif ++#endif diff --git a/.yarn/patches/react-native-screens-npm-4.27.0-78335f53c6.patch b/.yarn/patches/react-native-screens-npm-4.27.0-78335f53c6.patch new file mode 100644 index 00000000..b00766f9 --- /dev/null +++ b/.yarn/patches/react-native-screens-npm-4.27.0-78335f53c6.patch @@ -0,0 +1,269 @@ +diff --git a/Package.swift b/Package.swift +new file mode 100644 +index 0000000000000000000000000000000000000000..3f96ce583188f388a4dd13984f107716c1a10e2c +--- /dev/null ++++ b/Package.swift +@@ -0,0 +1,247 @@ ++// swift-tools-version: 6.0 ++// AUTO-SCAFFOLDED by react-native spm scaffold — safe to edit & commit via patch-package. ++// AUTO-SCAFFOLDED-VERSION: 19 ++// Cache slot: 0.87.1/dual-flavor ++// Edit the contents below if needed and re-run `npx patch-package ` ++// to persist across `npm install`. To regenerate from the podspec, remove ++// this file (or just this marker) and re-run `npx react-native spm scaffold`. ++// ++// Package references are plain relative paths, computed when this file was ++// scaffolded. They stay correct because the file is re-scaffolded per app ++// and cache slot, and any node_modules relayout reinstalls this package ++// (dropping the file) anyway. ++ ++import PackageDescription ++ ++let package = Package( ++ name: "ReactNativeScreens", ++ platforms: [.iOS(.v15)], ++ products: [ ++ .library(name: "ReactNativeScreens", targets: ["ReactNativeScreens"]), ++ ], ++ dependencies: [ ++ .package(name: "ReactNative", path: "../../../../xcframeworks"), ++ .package(name: "React-GeneratedCode", path: "../../../ios"), ++ ], ++ targets: [ ++ .target( ++ name: "ReactNativeScreens", ++ dependencies: [.product(name: "ReactHeaders", package: "ReactNative"), .product(name: "ReactNativeHeaders", package: "ReactNative"), .product(name: "ReactNativeDependenciesHeaders", package: "ReactNative"), .product(name: "ReactAppHeaders", package: "React-GeneratedCode")], ++ path: ".", ++ sources: [ ++ "common/cpp/react/renderer/components/rnscreens/FrameCorrectionModes.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSFormSheetHostComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSFormSheetHostShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSFormSheetHostShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSFormSheetHostState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSFormSheetHostState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSFullWindowOverlayComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSFullWindowOverlayShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSFullWindowOverlayShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSFullWindowOverlayState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSModalScreenComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSSafeAreaViewComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSSafeAreaViewShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSSafeAreaViewShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSSafeAreaViewState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSSafeAreaViewState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNodeCommitHook.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNodeCommitHook.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSSplitScreenComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSSplitScreenShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSSplitScreenShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSSplitScreenState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderConfigComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderConfigShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderConfigShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderConfigState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderConfigState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderItemComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderItemShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderItemShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderItemState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderItemState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderSubviewComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderSubviewShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderSubviewShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderSubviewState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderSubviewState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackScreenComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackScreenShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackScreenShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackScreenState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackScreenState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSTabsBottomAccessoryComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSTabsBottomAccessoryShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSTabsBottomAccessoryShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSTabsBottomAccessoryState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSTabsHostComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSTabsHostShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSTabsHostShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSTabsHostState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSTabsHostState.h", ++ "common/cpp/react/renderer/components/rnscreens/utils/RectUtil.h", ++ "cpp/RNSScreenRemovalListener.cpp", ++ "cpp/RNSScreenRemovalListener.h", ++ "cpp/RNScreensTurboModule.cpp", ++ "cpp/RNScreensTurboModule.h", ++ "ios/RCTImageComponentView+RNSScreenStackHeaderConfig.h", ++ "ios/RCTImageComponentView+RNSScreenStackHeaderConfig.mm", ++ "ios/RNSBarButtonItem.h", ++ "ios/RNSBarButtonItem.mm", ++ "ios/RNSConvert.h", ++ "ios/RNSConvert.mm", ++ "ios/RNSEnums.h", ++ "ios/RNSFullWindowOverlay.h", ++ "ios/RNSFullWindowOverlay.mm", ++ "ios/RNSModalScreen.h", ++ "ios/RNSModalScreen.mm", ++ "ios/RNSModule.h", ++ "ios/RNSModule.mm", ++ "ios/RNSOrientationProviding.h", ++ "ios/RNSPercentDrivenInteractiveTransition.h", ++ "ios/RNSPercentDrivenInteractiveTransition.mm", ++ "ios/RNSReactMountingTransactionObserving.h", ++ "ios/RNSScreen.h", ++ "ios/RNSScreen.mm", ++ "ios/RNSScreenContainer.h", ++ "ios/RNSScreenContainer.mm", ++ "ios/RNSScreenContentWrapper.h", ++ "ios/RNSScreenContentWrapper.mm", ++ "ios/RNSScreenFooter.h", ++ "ios/RNSScreenFooter.mm", ++ "ios/RNSScreenNavigationContainer.h", ++ "ios/RNSScreenNavigationContainer.mm", ++ "ios/RNSScreenStack.h", ++ "ios/RNSScreenStack.mm", ++ "ios/RNSScreenStackAnimator.h", ++ "ios/RNSScreenStackAnimator.mm", ++ "ios/RNSScreenStackHeaderConfig.h", ++ "ios/RNSScreenStackHeaderConfig.mm", ++ "ios/RNSScreenStackHeaderSubview.h", ++ "ios/RNSScreenStackHeaderSubview.mm", ++ "ios/RNSScreenWindowTraits.h", ++ "ios/RNSScreenWindowTraits.mm", ++ "ios/RNSScrollViewBehaviorOverriding.h", ++ "ios/RNSSearchBar.h", ++ "ios/RNSSearchBar.mm", ++ "ios/RNScreens-Bridging-Header.h", ++ "ios/UIScrollView+RNScreens.h", ++ "ios/UIScrollView+RNScreens.mm", ++ "ios/UIViewController+RNScreens.h", ++ "ios/UIViewController+RNScreens.mm", ++ "ios/UIWindow+RNScreens.h", ++ "ios/UIWindow+RNScreens.mm", ++ "ios/bridging/RNSReactBaseView.h", ++ "ios/bridging/RNSReactBaseView.mm", ++ "ios/conversion/RNSConversions-Fabric.mm", ++ "ios/conversion/RNSConversions-ScrollViewMarker.h", ++ "ios/conversion/RNSConversions-ScrollViewMarker.mm", ++ "ios/conversion/RNSConversions-SplitView.mm", ++ "ios/conversion/RNSConversions-Stack.h", ++ "ios/conversion/RNSConversions-Stack.mm", ++ "ios/conversion/RNSConversions-Tabs.mm", ++ "ios/conversion/RNSConversions.h", ++ "ios/conversion/RNSConversions.mm", ++ "ios/conversion/always_false.h", ++ "ios/events/RNSHeaderHeightChangeEvent.h", ++ "ios/events/RNSHeaderHeightChangeEvent.mm", ++ "ios/events/RNSScreenViewEvent.h", ++ "ios/events/RNSScreenViewEvent.mm", ++ "ios/helpers/container/RNSContainer.h", ++ "ios/helpers/container/RNSContainerHelpers.h", ++ "ios/helpers/container/RNSContainerHelpers.mm", ++ "ios/helpers/container/RNSContainerItem.h", ++ "ios/helpers/container/RNSContainerItemSupport.h", ++ "ios/helpers/container/RNSContainerItemSupport.mm", ++ "ios/helpers/container/RNSParentContainerItemRegistry.h", ++ "ios/helpers/container/RNSParentContainerItemRegistry.mm", ++ "ios/helpers/image/RNSImageLoading.h", ++ "ios/helpers/image/RNSImageLoadingHelper.h", ++ "ios/helpers/image/RNSImageLoadingHelper.mm", ++ "ios/helpers/scroll-view/RNSContentScrollViewProviding.h", ++ "ios/helpers/scroll-view/RNSScrollEdgeEffectApplicator.h", ++ "ios/helpers/scroll-view/RNSScrollEdgeEffectApplicator.mm", ++ "ios/helpers/scroll-view/RNSScrollViewFinder.h", ++ "ios/helpers/scroll-view/RNSScrollViewFinder.mm", ++ "ios/helpers/scroll-view/RNSScrollViewHelper.h", ++ "ios/helpers/scroll-view/RNSScrollViewHelper.mm", ++ "ios/integrations/RNSDismissibleModalProtocol.h", ++ "ios/safe-area/RNSSafeAreaProviding.h", ++ "ios/safe-area/RNSSafeAreaViewComponentView.h", ++ "ios/safe-area/RNSSafeAreaViewComponentView.mm", ++ "ios/safe-area/RNSSafeAreaViewNotifications.h", ++ "ios/stubs/RNSGammaStubs.h", ++ "ios/stubs/RNSGammaStubs.mm", ++ "ios/tabs/RCTConvert+RNSTabs.h", ++ "ios/tabs/RCTConvert+RNSTabs.mm", ++ "ios/tabs/RNSTabBarAppearanceCoordinator.h", ++ "ios/tabs/RNSTabBarAppearanceCoordinator.mm", ++ "ios/tabs/RNSTabsSpecialEffectsSupporting.h", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.h", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.mm", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryContentComponentView.h", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryContentComponentView.mm", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryEventEmitter.h", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryEventEmitter.mm", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryHelper.h", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryHelper.mm", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryShadowStateProxy.h", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryShadowStateProxy.mm", ++ "ios/tabs/extensions/RNSTabsHostComponentView+RNSImageLoader.h", ++ "ios/tabs/extensions/RNSTabsHostComponentView+RNSImageLoader.mm", ++ "ios/tabs/host/RNSTabBarController.h", ++ "ios/tabs/host/RNSTabBarController.mm", ++ "ios/tabs/host/RNSTabsHostComponentView.h", ++ "ios/tabs/host/RNSTabsHostComponentView.mm", ++ "ios/tabs/host/RNSTabsHostEventEmitter.h", ++ "ios/tabs/host/RNSTabsHostEventEmitter.mm", ++ "ios/tabs/host/RNSTabsNavigationState.h", ++ "ios/tabs/host/RNSTabsNavigationState.mm", ++ "ios/tabs/host/RNSTabsNavigationStateObserverRegistry.h", ++ "ios/tabs/host/RNSTabsNavigationStateObserverRegistry.mm", ++ "ios/tabs/screen/RNSTabsScreenComponentView.h", ++ "ios/tabs/screen/RNSTabsScreenComponentView.mm", ++ "ios/tabs/screen/RNSTabsScreenEventEmitter.h", ++ "ios/tabs/screen/RNSTabsScreenEventEmitter.mm", ++ "ios/tabs/screen/RNSTabsScreenViewController.h", ++ "ios/tabs/screen/RNSTabsScreenViewController.mm", ++ "ios/utils/NSString+RNSUtility.h", ++ "ios/utils/NSString+RNSUtility.mm", ++ "ios/utils/RCTSurfaceTouchHandler+RNSUtility.h", ++ "ios/utils/RCTSurfaceTouchHandler+RNSUtility.mm", ++ "ios/utils/RNSBackBarButtonItem.h", ++ "ios/utils/RNSBackBarButtonItem.mm", ++ "ios/utils/RNSDefines.h", ++ "ios/utils/RNSLog.h", ++ "ios/utils/UINavigationBar+RNSUtility.h", ++ "ios/utils/UINavigationBar+RNSUtility.mm", ++ "ios/utils/UIView+RNSUtility.h", ++ "ios/utils/UIView+RNSUtility.mm", ++ "ios/utils/extensions/RCTImageSource+AccessHiddenMembers.h", ++ ], ++ publicHeadersPath: "ios", ++ cSettings: [.headerSearchPath("common/cpp"), .headerSearchPath("common/cpp/react/renderer/components"), .headerSearchPath("common/cpp/react/renderer/components/rnscreens"), .headerSearchPath("common/cpp/react/renderer/components/rnscreens/utils"), .headerSearchPath("cpp"), .headerSearchPath("ios"), .headerSearchPath("ios/bridging"), .headerSearchPath("ios/conversion"), .headerSearchPath("ios/events"), .headerSearchPath("ios/helpers/container"), .headerSearchPath("ios/helpers/image"), .headerSearchPath("ios/helpers/scroll-view"), .headerSearchPath("ios/integrations"), .headerSearchPath("ios/safe-area"), .headerSearchPath("ios/stubs"), .headerSearchPath("ios/tabs"), .headerSearchPath("ios/tabs/bottom-accessory"), .headerSearchPath("ios/tabs/extensions"), .headerSearchPath("ios/tabs/host"), .headerSearchPath("ios/tabs/screen"), .headerSearchPath("ios/utils"), .headerSearchPath("ios/utils/extensions"), .headerSearchPath("."), .unsafeFlags(["-include", "react-native-spm-prefix.h"])], ++ cxxSettings: [.headerSearchPath("common/cpp"), .headerSearchPath("common/cpp/react/renderer/components"), .headerSearchPath("common/cpp/react/renderer/components/rnscreens"), .headerSearchPath("common/cpp/react/renderer/components/rnscreens/utils"), .headerSearchPath("cpp"), .headerSearchPath("ios"), .headerSearchPath("ios/bridging"), .headerSearchPath("ios/conversion"), .headerSearchPath("ios/events"), .headerSearchPath("ios/helpers/container"), .headerSearchPath("ios/helpers/image"), .headerSearchPath("ios/helpers/scroll-view"), .headerSearchPath("ios/integrations"), .headerSearchPath("ios/safe-area"), .headerSearchPath("ios/stubs"), .headerSearchPath("ios/tabs"), .headerSearchPath("ios/tabs/bottom-accessory"), .headerSearchPath("ios/tabs/extensions"), .headerSearchPath("ios/tabs/host"), .headerSearchPath("ios/tabs/screen"), .headerSearchPath("ios/utils"), .headerSearchPath("ios/utils/extensions"), .headerSearchPath("."), .unsafeFlags(["-include", "react-native-spm-prefix.h"]), .define("DEBUG", .when(configuration: .debug)), .define("NDEBUG", .when(configuration: .release))], ++ linkerSettings: [.linkedFramework("UIKit"), .linkedFramework("Foundation"), .linkedFramework("CoreGraphics")] ++ ), ++ ], ++ cxxLanguageStandard: .cxx20 ++) +diff --git a/react-native-spm-prefix.h b/react-native-spm-prefix.h +new file mode 100644 +index 0000000000000000000000000000000000000000..af5cea0557f2f4aa957419f0fc3f250fd55dbaf5 +--- /dev/null ++++ b/react-native-spm-prefix.h +@@ -0,0 +1,10 @@ ++// AUTO-SCAFFOLDED by react-native spm scaffold — mirrors CocoaPods' default ++// prefix header so ObjC sources that rely on an implicit Foundation/UIKit ++// import compile under SPM (which has no prefix-header mechanism). Safe to ++// delete + regenerate via `npx react-native spm scaffold`. ++#ifdef __OBJC__ ++#import ++#if __has_include() ++#import ++#endif ++#endif diff --git a/.yarn/patches/react-native-vector-icons-npm-10.2.0-e1aad1f85c.patch b/.yarn/patches/react-native-vector-icons-npm-10.2.0-e1aad1f85c.patch new file mode 100644 index 00000000..91e8008a --- /dev/null +++ b/.yarn/patches/react-native-vector-icons-npm-10.2.0-e1aad1f85c.patch @@ -0,0 +1,65 @@ +diff --git a/Package.swift b/Package.swift +new file mode 100644 +index 0000000000000000000000000000000000000000..3fe6c32adad0325af2590d668ffd0ca58d21da1f +--- /dev/null ++++ b/Package.swift +@@ -0,0 +1,43 @@ ++// swift-tools-version: 6.0 ++// AUTO-SCAFFOLDED by react-native spm scaffold — safe to edit & commit via patch-package. ++// AUTO-SCAFFOLDED-VERSION: 19 ++// Cache slot: 0.87.1/dual-flavor ++// Edit the contents below if needed and re-run `npx patch-package ` ++// to persist across `npm install`. To regenerate from the podspec, remove ++// this file (or just this marker) and re-run `npx react-native spm scaffold`. ++// ++// Package references are plain relative paths, computed when this file was ++// scaffolded. They stay correct because the file is re-scaffolded per app ++// and cache slot, and any node_modules relayout reinstalls this package ++// (dropping the file) anyway. ++ ++import PackageDescription ++ ++let package = Package( ++ name: "ReactNativeVectorIcons", ++ platforms: [.iOS(.v15)], ++ products: [ ++ .library(name: "ReactNativeVectorIcons", targets: ["ReactNativeVectorIcons"]), ++ ], ++ dependencies: [ ++ .package(name: "ReactNative", path: "../../../../xcframeworks"), ++ .package(name: "React-GeneratedCode", path: "../../../ios"), ++ ], ++ targets: [ ++ .target( ++ name: "ReactNativeVectorIcons", ++ dependencies: [.product(name: "ReactHeaders", package: "ReactNative"), .product(name: "ReactNativeHeaders", package: "ReactNative"), .product(name: "ReactNativeDependenciesHeaders", package: "ReactNative"), .product(name: "ReactAppHeaders", package: "React-GeneratedCode")], ++ path: ".", ++ sources: [ ++ "RNVectorIconsManager/RNVectorIconsManager.h", ++ "RNVectorIconsManager/RNVectorIconsManager.mm", ++ ], ++ resources: [.copy("Fonts")], ++ publicHeadersPath: "RNVectorIconsManager", ++ cSettings: [.headerSearchPath("RNVectorIconsManager"), .headerSearchPath("."), .unsafeFlags(["-include", "react-native-spm-prefix.h"])], ++ cxxSettings: [.headerSearchPath("RNVectorIconsManager"), .headerSearchPath("."), .unsafeFlags(["-include", "react-native-spm-prefix.h"]), .define("DEBUG", .when(configuration: .debug)), .define("NDEBUG", .when(configuration: .release))], ++ linkerSettings: [.linkedFramework("UIKit"), .linkedFramework("Foundation"), .linkedFramework("CoreGraphics")] ++ ), ++ ], ++ cxxLanguageStandard: .cxx20 ++) +diff --git a/react-native-spm-prefix.h b/react-native-spm-prefix.h +new file mode 100644 +index 0000000000000000000000000000000000000000..af5cea0557f2f4aa957419f0fc3f250fd55dbaf5 +--- /dev/null ++++ b/react-native-spm-prefix.h +@@ -0,0 +1,10 @@ ++// AUTO-SCAFFOLDED by react-native spm scaffold — mirrors CocoaPods' default ++// prefix header so ObjC sources that rely on an implicit Foundation/UIKit ++// import compile under SPM (which has no prefix-header mechanism). Safe to ++// delete + regenerate via `npx react-native spm scaffold`. ++#ifdef __OBJC__ ++#import ++#if __has_include() ++#import ++#endif ++#endif diff --git a/.yarn/patches/react-native-worklets-npm-0.12.1-aa8a1b2670.patch b/.yarn/patches/react-native-worklets-npm-0.12.1-aa8a1b2670.patch new file mode 100644 index 00000000..6db35519 --- /dev/null +++ b/.yarn/patches/react-native-worklets-npm-0.12.1-aa8a1b2670.patch @@ -0,0 +1,151 @@ +diff --git a/Package.swift b/Package.swift +new file mode 100644 +index 0000000000000000000000000000000000000000..3d4fb3881c86a51f791688a88b34d4c8f5c3b9df +--- /dev/null ++++ b/Package.swift +@@ -0,0 +1,129 @@ ++// swift-tools-version: 6.0 ++// AUTO-SCAFFOLDED by react-native spm scaffold — safe to edit & commit via patch-package. ++// AUTO-SCAFFOLDED-VERSION: 19 ++// Cache slot: 0.87.1/dual-flavor ++// Edit the contents below if needed and re-run `npx patch-package ` ++// to persist across `npm install`. To regenerate from the podspec, remove ++// this file (or just this marker) and re-run `npx react-native spm scaffold`. ++// ++// Package references are plain relative paths, computed when this file was ++// scaffolded. They stay correct because the file is re-scaffolded per app ++// and cache slot, and any node_modules relayout reinstalls this package ++// (dropping the file) anyway. ++ ++import PackageDescription ++ ++let package = Package( ++ name: "ReactNativeWorklets", ++ platforms: [.iOS(.v15)], ++ products: [ ++ .library(name: "ReactNativeWorklets", targets: ["ReactNativeWorklets"]), ++ ], ++ dependencies: [ ++ .package(name: "ReactNative", path: "../../../../xcframeworks"), ++ .package(name: "React-GeneratedCode", path: "../../../ios"), ++ ], ++ targets: [ ++ .target( ++ name: "ReactNativeWorklets", ++ dependencies: [.product(name: "ReactHeaders", package: "ReactNative"), .product(name: "ReactNativeHeaders", package: "ReactNative"), .product(name: "ReactNativeDependenciesHeaders", package: "ReactNative"), .product(name: "ReactAppHeaders", package: "React-GeneratedCode")], ++ path: ".", ++ sources: [ ++ "Common/cpp/worklets/AnimationFrameQueue/AnimationFrameBatchinator.cpp", ++ "Common/cpp/worklets/AnimationFrameQueue/AnimationFrameBatchinator.h", ++ "Common/cpp/worklets/Compat/Holders.h", ++ "Common/cpp/worklets/Compat/StableApi.cpp", ++ "Common/cpp/worklets/Compat/StableApi.h", ++ "Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.cpp", ++ "Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.h", ++ "Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp", ++ "Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h", ++ "Common/cpp/worklets/Registries/WorkletRuntimeRegistry.cpp", ++ "Common/cpp/worklets/Registries/WorkletRuntimeRegistry.h", ++ "Common/cpp/worklets/RunLoop/AsyncQueue.h", ++ "Common/cpp/worklets/RunLoop/AsyncQueueImpl.cpp", ++ "Common/cpp/worklets/RunLoop/AsyncQueueImpl.h", ++ "Common/cpp/worklets/RunLoop/EventLoop.cpp", ++ "Common/cpp/worklets/RunLoop/EventLoop.h", ++ "Common/cpp/worklets/SharedItems/MemoryManager.cpp", ++ "Common/cpp/worklets/SharedItems/MemoryManager.h", ++ "Common/cpp/worklets/SharedItems/Serializable.cpp", ++ "Common/cpp/worklets/SharedItems/Serializable.h", ++ "Common/cpp/worklets/SharedItems/SerializableFactory.cpp", ++ "Common/cpp/worklets/SharedItems/SerializableFactory.h", ++ "Common/cpp/worklets/SharedItems/SerializableRemoteFunction.cpp", ++ "Common/cpp/worklets/SharedItems/SerializableRemoteFunction.h", ++ "Common/cpp/worklets/SharedItems/Shareable.cpp", ++ "Common/cpp/worklets/SharedItems/Shareable.h", ++ "Common/cpp/worklets/SharedItems/Synchronizable.cpp", ++ "Common/cpp/worklets/SharedItems/Synchronizable.h", ++ "Common/cpp/worklets/SharedItems/SynchronizableAccess.cpp", ++ "Common/cpp/worklets/SharedItems/SynchronizableAccess.h", ++ "Common/cpp/worklets/SharedItems/UnpackerLoader.h", ++ "Common/cpp/worklets/Tools/FeatureFlags.cpp", ++ "Common/cpp/worklets/Tools/FeatureFlags.h", ++ "Common/cpp/worklets/Tools/JSISerializer.cpp", ++ "Common/cpp/worklets/Tools/JSISerializer.h", ++ "Common/cpp/worklets/Tools/JSLogger.cpp", ++ "Common/cpp/worklets/Tools/JSLogger.h", ++ "Common/cpp/worklets/Tools/JSScheduler.cpp", ++ "Common/cpp/worklets/Tools/JSScheduler.h", ++ "Common/cpp/worklets/Tools/PlatformLogger.h", ++ "Common/cpp/worklets/Tools/RNRuntimeStatus.h", ++ "Common/cpp/worklets/Tools/ScriptBuffer.h", ++ "Common/cpp/worklets/Tools/SingleInstanceChecker.h", ++ "Common/cpp/worklets/Tools/ThreadSafeQueue.h", ++ "Common/cpp/worklets/Tools/UIScheduler.cpp", ++ "Common/cpp/worklets/Tools/UIScheduler.h", ++ "Common/cpp/worklets/Tools/VersionUtils.cpp", ++ "Common/cpp/worklets/Tools/VersionUtils.h", ++ "Common/cpp/worklets/Tools/WorkletsJSIUtils.cpp", ++ "Common/cpp/worklets/Tools/WorkletsJSIUtils.h", ++ "Common/cpp/worklets/Tools/WorkletsSystraceSection.h", ++ "Common/cpp/worklets/Tools/WorkletsVersion.cpp", ++ "Common/cpp/worklets/Tools/WorkletsVersion.h", ++ "Common/cpp/worklets/WorkletRuntime/BundleModeConfig.h", ++ "Common/cpp/worklets/WorkletRuntime/HermesProfiling.cpp", ++ "Common/cpp/worklets/WorkletRuntime/HermesProfiling.h", ++ "Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.cpp", ++ "Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.h", ++ "Common/cpp/worklets/WorkletRuntime/RuntimeBindings.h", ++ "Common/cpp/worklets/WorkletRuntime/RuntimeData.h", ++ "Common/cpp/worklets/WorkletRuntime/RuntimeHolder.h", ++ "Common/cpp/worklets/WorkletRuntime/RuntimeManager.cpp", ++ "Common/cpp/worklets/WorkletRuntime/RuntimeManager.h", ++ "Common/cpp/worklets/WorkletRuntime/ScriptLoader.h", ++ "Common/cpp/worklets/WorkletRuntime/UIRuntimeDecorator.cpp", ++ "Common/cpp/worklets/WorkletRuntime/UIRuntimeDecorator.h", ++ "Common/cpp/worklets/WorkletRuntime/WorkletHermesRuntime.cpp", ++ "Common/cpp/worklets/WorkletRuntime/WorkletHermesRuntime.h", ++ "Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp", ++ "Common/cpp/worklets/WorkletRuntime/WorkletRuntime.h", ++ "Common/cpp/worklets/WorkletRuntime/WorkletRuntimeCollector.h", ++ "Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.cpp", ++ "Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.h", ++ "apple/worklets/apple/AnimationFrameQueue.h", ++ "apple/worklets/apple/AnimationFrameQueue.mm", ++ "apple/worklets/apple/AssertJavaScriptQueue.h", ++ "apple/worklets/apple/AssertTurboModuleManagerQueue.h", ++ "apple/worklets/apple/IOSUIScheduler.h", ++ "apple/worklets/apple/IOSUIScheduler.mm", ++ "apple/worklets/apple/Networking/WorkletsNetworking.h", ++ "apple/worklets/apple/Networking/WorkletsNetworking.mm", ++ "apple/worklets/apple/PlatformLogger.mm", ++ "apple/worklets/apple/ScriptLoader.h", ++ "apple/worklets/apple/ScriptLoader.mm", ++ "apple/worklets/apple/SlowAnimations.h", ++ "apple/worklets/apple/SlowAnimations.mm", ++ "apple/worklets/apple/WorkletsDisplayLink.h", ++ "apple/worklets/apple/WorkletsModule.h", ++ "apple/worklets/apple/WorkletsModule.mm", ++ ], ++ publicHeadersPath: "Common/cpp", ++ cSettings: [.define("HERMES_ENABLE_DEBUGGER", to: "1", .when(configuration: .debug)), .define("WORKLETS_FEATURE_FLAGS", to: "\"[RUNTIME_TEST_FLAG:false][FETCH_PREVIEW_ENABLED:false][IOS_DYNAMIC_FRAMERATE_ENABLED:true][ENABLE_CROSS_RUNTIME_STACK_TRACES:true]\""), .define("WORKLETS_VERSION", to: "0.12.1"), .headerSearchPath("ReactCommon"), .headerSearchPath("."), .headerSearchPath("Common/cpp"), .headerSearchPath("apple"), .headerSearchPath("Common/cpp/worklets/AnimationFrameQueue"), .headerSearchPath("Common/cpp/worklets/Compat"), .headerSearchPath("Common/cpp/worklets/NativeModules"), .headerSearchPath("Common/cpp/worklets/Registries"), .headerSearchPath("Common/cpp/worklets/RunLoop"), .headerSearchPath("Common/cpp/worklets/SharedItems"), .headerSearchPath("Common/cpp/worklets/Tools"), .headerSearchPath("Common/cpp/worklets/WorkletRuntime"), .headerSearchPath("apple/worklets/apple"), .headerSearchPath("apple/worklets/apple/Networking"), .unsafeFlags(["-include", "react-native-spm-prefix.h"])], ++ cxxSettings: [.define("HERMES_ENABLE_DEBUGGER", to: "1", .when(configuration: .debug)), .define("WORKLETS_FEATURE_FLAGS", to: "\"[RUNTIME_TEST_FLAG:false][FETCH_PREVIEW_ENABLED:false][IOS_DYNAMIC_FRAMERATE_ENABLED:true][ENABLE_CROSS_RUNTIME_STACK_TRACES:true]\""), .define("WORKLETS_VERSION", to: "0.12.1"), .headerSearchPath("ReactCommon"), .headerSearchPath("."), .headerSearchPath("Common/cpp"), .headerSearchPath("apple"), .headerSearchPath("Common/cpp/worklets/AnimationFrameQueue"), .headerSearchPath("Common/cpp/worklets/Compat"), .headerSearchPath("Common/cpp/worklets/NativeModules"), .headerSearchPath("Common/cpp/worklets/Registries"), .headerSearchPath("Common/cpp/worklets/RunLoop"), .headerSearchPath("Common/cpp/worklets/SharedItems"), .headerSearchPath("Common/cpp/worklets/Tools"), .headerSearchPath("Common/cpp/worklets/WorkletRuntime"), .headerSearchPath("apple/worklets/apple"), .headerSearchPath("apple/worklets/apple/Networking"), .unsafeFlags(["-include", "react-native-spm-prefix.h"]), .define("DEBUG", .when(configuration: .debug)), .define("NDEBUG", .when(configuration: .release))], ++ linkerSettings: [.linkedFramework("UIKit"), .linkedFramework("Foundation"), .linkedFramework("CoreGraphics")] ++ ), ++ ], ++ cxxLanguageStandard: .cxx20 ++) +diff --git a/react-native-spm-prefix.h b/react-native-spm-prefix.h +new file mode 100644 +index 0000000000000000000000000000000000000000..af5cea0557f2f4aa957419f0fc3f250fd55dbaf5 +--- /dev/null ++++ b/react-native-spm-prefix.h +@@ -0,0 +1,10 @@ ++// AUTO-SCAFFOLDED by react-native spm scaffold — mirrors CocoaPods' default ++// prefix header so ObjC sources that rely on an implicit Foundation/UIKit ++// import compile under SPM (which has no prefix-header mechanism). Safe to ++// delete + regenerate via `npx react-native spm scaffold`. ++#ifdef __OBJC__ ++#import ++#if __has_include() ++#import ++#endif ++#endif diff --git a/apps/example-swiftpm/.bundle/config b/apps/example-swiftpm/.bundle/config new file mode 100644 index 00000000..848943bb --- /dev/null +++ b/apps/example-swiftpm/.bundle/config @@ -0,0 +1,2 @@ +BUNDLE_PATH: "vendor/bundle" +BUNDLE_FORCE_RUBY_PLATFORM: 1 diff --git a/apps/example-swiftpm/.eslintrc.js b/apps/example-swiftpm/.eslintrc.js new file mode 100644 index 00000000..187894b6 --- /dev/null +++ b/apps/example-swiftpm/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: '@react-native', +}; diff --git a/apps/example-swiftpm/.gitignore b/apps/example-swiftpm/.gitignore new file mode 100644 index 00000000..154b85f2 --- /dev/null +++ b/apps/example-swiftpm/.gitignore @@ -0,0 +1,62 @@ +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +**/.xcode.env.local + +# node.js +# +node_modules/ +npm-debug.log +yarn-error.log + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/ + +**/fastlane/report.xml +**/fastlane/Preview.html +**/fastlane/screenshots +**/fastlane/test_output + +# Bundle artifact +*.jsbundle + +# Ruby / CocoaPods +**/Pods/ +/vendor/bundle/ + +# Temporary files created by Metro to check the health of the file watcher +.metro-health-check* + +# testing +/coverage + +# Yarn +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions diff --git a/apps/example-swiftpm/.prettierrc.js b/apps/example-swiftpm/.prettierrc.js new file mode 100644 index 00000000..06860c8d --- /dev/null +++ b/apps/example-swiftpm/.prettierrc.js @@ -0,0 +1,5 @@ +module.exports = { + arrowParens: 'avoid', + singleQuote: true, + trailingComma: 'all', +}; diff --git a/apps/example-swiftpm/.watchmanconfig b/apps/example-swiftpm/.watchmanconfig new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/apps/example-swiftpm/.watchmanconfig @@ -0,0 +1 @@ +{} diff --git a/apps/example-swiftpm/Gemfile b/apps/example-swiftpm/Gemfile new file mode 100644 index 00000000..51515233 --- /dev/null +++ b/apps/example-swiftpm/Gemfile @@ -0,0 +1,17 @@ +source 'https://rubygems.org' + +# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version +ruby ">= 2.6.10" + +# Exclude problematic versions of cocoapods and activesupport that causes build failures. +gem 'cocoapods', '>= 1.13', '!= 1.15.0', '!= 1.15.1' +gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0' +gem 'xcodeproj', '< 1.26.0' +gem 'concurrent-ruby', '< 1.3.4' + +# Ruby 3.4.0 has removed some libraries from the standard library. +gem 'bigdecimal' +gem 'logger' +gem 'benchmark' +gem 'mutex_m' +gem 'nkf' diff --git a/apps/example-swiftpm/README.md b/apps/example-swiftpm/README.md new file mode 100644 index 00000000..01c82c9b --- /dev/null +++ b/apps/example-swiftpm/README.md @@ -0,0 +1,88 @@ +# SwiftPM example + +An iOS-only React Native 0.87.1 Community CLI shell using SwiftPM for the shared +bottom-tabs example app. +All screens, components, assets, and test flows live in +[`packages/example-shared`](../../packages/example-shared). The CocoaPods shell +remains in `apps/example`. + +## Run on iOS + +From the repository root: + +```sh +yarn install --immutable +yarn workspace example-swiftpm spm +yarn workspace example-swiftpm start +``` + +In another terminal: + +```sh +yarn workspace example-swiftpm ios +``` + +Use a separate Metro port when running both shells at once, for example +`start --port 8083` and `ios --port 8083`. + +The app's Metro configuration includes the workspace root and resolves shared +code against this shell's dependencies. It also maps shared asset URLs back to +Metro's asset handler. These settings are needed because the CLI template assumes +an app whose source and dependencies are contained within its own directory. +Restart Metro after changing this configuration. + +SwiftPM setup is required on fresh checkouts and CI: generated Codegen packages +and React Native XCFrameworks are not committed. Open +`ios/ExampleSwiftPM.xcodeproj` when building through Xcode. Do not run `pod install` +for this shell. + +## How this shell was created + +```sh +npx @react-native-community/cli@20.2.0 init ExampleSwiftPM \ + --directory apps/example-swiftpm --title example-swiftpm \ + --package-name bottomtabs.exampleswiftpm --version 0.87.1 \ + --skip-install --skip-git-init --install-pods false +``` + +The generated Android project and Android-specific scripts and CLI dependency +were removed; this shell targets iOS only. + +After installing dependencies, the native project was migrated with +`react-native spm add --deintegrate`. Dependencies without manifests were prepared +with `react-native spm scaffold`. Their manifests and required compatibility fixes +are preserved using Yarn patches in the repository's `.yarn/patches` directory. + +The template's Podfile is retained only as a note: the app has no CocoaPods +integration. Its bundle ID is `bottomtabs.exampleswiftpm`. + +## Tests + +```sh +yarn workspace @bottom-tabs/example-shared typecheck +yarn workspace example-swiftpm e2e:ios +``` + +The shared Maestro flows use the shell's bundle ID through `APP_ID`. + +`yarn workspace example-swiftpm spm` invokes React Native's standard SwiftPM CLI +directly. Run it after checkout to prepare the generated dependencies for your +machine. The five dependency patches are scoped to this shell; +the CocoaPods shell keeps its ordinary npm dependencies. + +## Validation + +Validated on September 8, 2026 with Xcode 26.5: + +- Debug and Release simulator builds succeeded (arm64). +- In Debug and Release, using agent-device, opened the shared examples list, + selected **Three Tabs**, + and switched Albums → Article → Contacts on iOS **18.6** (iPhone 16 Pro) and + **26.0** (iPhone 17 Pro). The article and contact content, tab icons, and album + artwork rendered correctly. +- Yarn patches survived installation, and subsequent SwiftPM setup succeeded. +- The remaining example screens were not exercised in this pass. + +The repository's existing Jest test is only a TODO; its current Babel/Flow setup +fails before that placeholder can run. This is separate from the device and asset +checks above. diff --git a/apps/example-swiftpm/app.json b/apps/example-swiftpm/app.json new file mode 100644 index 00000000..fbf4bf41 --- /dev/null +++ b/apps/example-swiftpm/app.json @@ -0,0 +1,4 @@ +{ + "name": "ExampleSwiftPM", + "displayName": "ExampleSwiftPM" +} diff --git a/apps/example-swiftpm/babel.config.js b/apps/example-swiftpm/babel.config.js new file mode 100644 index 00000000..07ba1de9 --- /dev/null +++ b/apps/example-swiftpm/babel.config.js @@ -0,0 +1 @@ +module.exports = require('@bottom-tabs/example-shared/babel'); diff --git a/apps/example-swiftpm/index.js b/apps/example-swiftpm/index.js new file mode 100644 index 00000000..9240982b --- /dev/null +++ b/apps/example-swiftpm/index.js @@ -0,0 +1,5 @@ +import { AppRegistry } from 'react-native'; +import App from '@bottom-tabs/example-shared'; +import { name as appName } from './app.json'; + +AppRegistry.registerComponent(appName, () => App); diff --git a/apps/example-swiftpm/ios/.gitignore b/apps/example-swiftpm/ios/.gitignore new file mode 100644 index 00000000..c1e540af --- /dev/null +++ b/apps/example-swiftpm/ios/.gitignore @@ -0,0 +1,6 @@ + +# SPM – auto-generated at build time (do not commit) +Package.resolved +build/generated/ +build/xcframeworks/ +.build/ diff --git a/apps/example-swiftpm/ios/.xcode.env b/apps/example-swiftpm/ios/.xcode.env new file mode 100644 index 00000000..3d5782c7 --- /dev/null +++ b/apps/example-swiftpm/ios/.xcode.env @@ -0,0 +1,11 @@ +# This `.xcode.env` file is versioned and is used to source the environment +# used when running script phases inside Xcode. +# To customize your local environment, you can create an `.xcode.env.local` +# file that is not versioned. + +# NODE_BINARY variable contains the PATH to the node executable. +# +# Customize the NODE_BINARY variable here. +# For example, to use nvm with brew, add the following line +# . "$(brew --prefix nvm)/nvm.sh" --no-use +export NODE_BINARY=$(command -v node) diff --git a/apps/example-swiftpm/ios/ExampleSwiftPM.xcodeproj/.spm-injected.json b/apps/example-swiftpm/ios/ExampleSwiftPM.xcodeproj/.spm-injected.json new file mode 100644 index 00000000..dcc6052e --- /dev/null +++ b/apps/example-swiftpm/ios/ExampleSwiftPM.xcodeproj/.spm-injected.json @@ -0,0 +1,189 @@ +{ + "rootUuid": "83CBB9F71A601CBA00E9B192", + "target": "ExampleSwiftPM", + "targetUuid": "13B07F861A680F5B00A75B9A", + "injectedUuids": [ + "17CA21E30A8FFCB9D0FC1E35", + "27BDE9D743CB351F53154525", + "3AFDEFB917B01458307FDE0A", + "3F1E298E4A2D7CA403A328B5", + "50A8621D202A6CFB97E2C1B5", + "512EBECF5434FD7A6AF7C967", + "658A88AFBFD620F8BC6F91BA", + "69A7AB74931112BD2779B631", + "8332BE36B9C49BD2E49347C1", + "920F69A9DF98D37C8308D020", + "947DD5EF3BE079FB7F5AFF87", + "94F7C9B714A718310DA6BE9C", + "A700952B9A737913514EB28F", + "B174F870C259554596A4373B", + "C2FECF1430FDAAE3BF355839", + "D6BD17EA9023C9F39246B71F", + "F3857EDDA38AFC0011322D6D" + ], + "createdArrayFields": [ + { + "container": "project", + "key": "packageReferences" + }, + { + "container": "target", + "key": "packageProductDependencies" + } + ], + "buildSettingChanges": [ + { + "configUuid": "13B07F941A680F5B00A75B9A", + "createdArrayKeys": [ + "HEADER_SEARCH_PATHS", + "SWIFT_ACTIVE_COMPILATION_CONDITIONS", + "FRAMEWORK_SEARCH_PATHS" + ], + "appendedArrayValues": { + "OTHER_LDFLAGS": [ + "\"$(RN_SPM_REACT_BINARY)\"", + "\"$(RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY)\"", + "\"$(RN_SPM_HERMES_BINARY)\"" + ] + }, + "createdScalars": [ + "CLANG_CXX_LANGUAGE_STANDARD", + "REACT_NATIVE_PATH", + "HERMES_CLI_PATH", + "RN_SPM_FLAVOR", + "\"RN_SPM_REACT_FRAMEWORK[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_BINARY[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_SEARCH_PATH[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_FRAMEWORK[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_BINARY[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_SEARCH_PATH[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_FRAMEWORK[sdk=macosx*]\"", + "\"RN_SPM_REACT_BINARY[sdk=macosx*]\"", + "\"RN_SPM_REACT_SEARCH_PATH[sdk=macosx*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=appletvos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=appletvos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=appletvos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=appletvsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=appletvsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=appletvsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=macosx*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=macosx*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=macosx*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=xros*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=xros*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=xros*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=xrsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=xrsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=xrsimulator*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=appletvos*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=appletvos*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=appletvos*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=appletvsimulator*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=appletvsimulator*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=appletvsimulator*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=iphoneos*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=iphoneos*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=iphoneos*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=iphonesimulator*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=iphonesimulator*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=iphonesimulator*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=macosx*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=macosx*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=macosx*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=xros*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=xros*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=xros*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=xrsimulator*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=xrsimulator*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=xrsimulator*]\"" + ], + "replacedScalars": {} + }, + { + "configUuid": "13B07F951A680F5B00A75B9A", + "createdArrayKeys": [ + "HEADER_SEARCH_PATHS", + "FRAMEWORK_SEARCH_PATHS" + ], + "appendedArrayValues": { + "OTHER_LDFLAGS": [ + "\"$(RN_SPM_REACT_BINARY)\"", + "\"$(RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY)\"", + "\"$(RN_SPM_HERMES_BINARY)\"" + ] + }, + "createdScalars": [ + "CLANG_CXX_LANGUAGE_STANDARD", + "REACT_NATIVE_PATH", + "HERMES_CLI_PATH", + "RN_SPM_FLAVOR", + "\"RN_SPM_REACT_FRAMEWORK[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_BINARY[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_SEARCH_PATH[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_FRAMEWORK[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_BINARY[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_SEARCH_PATH[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_FRAMEWORK[sdk=macosx*]\"", + "\"RN_SPM_REACT_BINARY[sdk=macosx*]\"", + "\"RN_SPM_REACT_SEARCH_PATH[sdk=macosx*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=appletvos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=appletvos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=appletvos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=appletvsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=appletvsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=appletvsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=macosx*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=macosx*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=macosx*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=xros*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=xros*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=xros*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=xrsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=xrsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=xrsimulator*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=appletvos*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=appletvos*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=appletvos*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=appletvsimulator*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=appletvsimulator*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=appletvsimulator*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=iphoneos*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=iphoneos*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=iphoneos*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=iphonesimulator*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=iphonesimulator*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=iphonesimulator*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=macosx*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=macosx*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=macosx*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=xros*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=xros*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=xros*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=xrsimulator*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=xrsimulator*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=xrsimulator*]\"" + ], + "replacedScalars": {} + } + ], + "generatedSources": {}, + "scriptPhases": {}, + "artifactsVersionOverride": null, + "configCommand": null, + "scheme": { + "file": "ExampleSwiftPM.xcscheme", + "created": false + } +} diff --git a/apps/example-swiftpm/ios/ExampleSwiftPM.xcodeproj/project.pbxproj b/apps/example-swiftpm/ios/ExampleSwiftPM.xcodeproj/project.pbxproj new file mode 100644 index 00000000..67aebc5d --- /dev/null +++ b/apps/example-swiftpm/ios/ExampleSwiftPM.xcodeproj/project.pbxproj @@ -0,0 +1,658 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 17CA21E30A8FFCB9D0FC1E35 /* ReactNativeHeaders in Frameworks */ = {isa = PBXBuildFile; productRef = 920F69A9DF98D37C8308D020 /* ReactNativeHeaders */; }; + 3F1E298E4A2D7CA403A328B5 /* ReactCodegen in Frameworks */ = {isa = PBXBuildFile; productRef = 947DD5EF3BE079FB7F5AFF87 /* ReactCodegen */; }; + 50A8621D202A6CFB97E2C1B5 /* ReactAppDependencyProvider in Frameworks */ = {isa = PBXBuildFile; productRef = F3857EDDA38AFC0011322D6D /* ReactAppDependencyProvider */; }; + 69A7AB74931112BD2779B631 /* ReactNativeDependenciesHeaders in Frameworks */ = {isa = PBXBuildFile; productRef = 8332BE36B9C49BD2E49347C1 /* ReactNativeDependenciesHeaders */; }; + 761780ED2CA45674006654EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761780EC2CA45674006654EE /* AppDelegate.swift */; }; + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; + 94F7C9B714A718310DA6BE9C /* ReactHeaders in Frameworks */ = {isa = PBXBuildFile; productRef = 512EBECF5434FD7A6AF7C967 /* ReactHeaders */; }; + D6BD17EA9023C9F39246B71F /* Autolinked in Frameworks */ = {isa = PBXBuildFile; productRef = 3AFDEFB917B01458307FDE0A /* Autolinked */; }; + E57BE5D2E07BB11FFECFFF6A /* MaterialCommunityIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 54319E7B7EC565F584A13121 /* MaterialCommunityIcons.ttf */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 13B07F961A680F5B00A75B9A /* ExampleSwiftPM.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ExampleSwiftPM.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ExampleSwiftPM/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = ExampleSwiftPM/Info.plist; sourceTree = ""; }; + 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = ExampleSwiftPM/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 54319E7B7EC565F584A13121 /* MaterialCommunityIcons.ttf */ = {isa = PBXFileReference; includeInIndex = 1; name = MaterialCommunityIcons.ttf; path = "../../../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf"; sourceTree = ""; }; + 761780EC2CA45674006654EE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = ExampleSwiftPM/AppDelegate.swift; sourceTree = ""; }; + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = ExampleSwiftPM/LaunchScreen.storyboard; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 94F7C9B714A718310DA6BE9C /* ReactHeaders in Frameworks */, + 17CA21E30A8FFCB9D0FC1E35 /* ReactNativeHeaders in Frameworks */, + 69A7AB74931112BD2779B631 /* ReactNativeDependenciesHeaders in Frameworks */, + D6BD17EA9023C9F39246B71F /* Autolinked in Frameworks */, + 3F1E298E4A2D7CA403A328B5 /* ReactCodegen in Frameworks */, + 50A8621D202A6CFB97E2C1B5 /* ReactAppDependencyProvider in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 13B07FAE1A68108700A75B9A /* ExampleSwiftPM */ = { + isa = PBXGroup; + children = ( + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 761780EC2CA45674006654EE /* AppDelegate.swift */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, + 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */, + ); + name = ExampleSwiftPM; + sourceTree = ""; + }; + 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + ); + name = Libraries; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 13B07FAE1A68108700A75B9A /* ExampleSwiftPM */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 83CBBA001A601CBA00E9B192 /* Products */, + 2D16E6871FA4F8E400B85C8A /* Frameworks */, + 54319E7B7EC565F584A13121 /* MaterialCommunityIcons.ttf */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + usesTabs = 0; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* ExampleSwiftPM.app */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 13B07F861A680F5B00A75B9A /* ExampleSwiftPM */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ExampleSwiftPM" */; + buildPhases = ( + 658A88AFBFD620F8BC6F91BA /* Sync SPM Autolinking */, + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + B174F870C259554596A4373B /* Embed React Native Flavored Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ExampleSwiftPM; + packageProductDependencies = ( + 512EBECF5434FD7A6AF7C967 /* ReactHeaders */, + 920F69A9DF98D37C8308D020 /* ReactNativeHeaders */, + 8332BE36B9C49BD2E49347C1 /* ReactNativeDependenciesHeaders */, + 3AFDEFB917B01458307FDE0A /* Autolinked */, + 947DD5EF3BE079FB7F5AFF87 /* ReactCodegen */, + F3857EDDA38AFC0011322D6D /* ReactAppDependencyProvider */, + ); + productName = ExampleSwiftPM; + productReference = 13B07F961A680F5B00A75B9A /* ExampleSwiftPM.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1210; + TargetAttributes = { + 13B07F861A680F5B00A75B9A = { + LastSwiftMigration = 1120; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "ExampleSwiftPM" */; + compatibilityVersion = "Xcode 12.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + packageReferences = ( + 27BDE9D743CB351F53154525 /* XCLocalSwiftPackageReference "xcframeworks" */, + C2FECF1430FDAAE3BF355839 /* XCLocalSwiftPackageReference "autolinking" */, + A700952B9A737913514EB28F /* XCLocalSwiftPackageReference "ios" */, + ); + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* ExampleSwiftPM */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + E57BE5D2E07BB11FFECFFF6A /* MaterialCommunityIcons.ttf in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "$(SRCROOT)/.xcode.env.local", + "$(SRCROOT)/.xcode.env", + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -e\n\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"\\\"$WITH_ENVIRONMENT\\\" \\\"$REACT_NATIVE_XCODE\\\"\"\n"; + }; + 658A88AFBFD620F8BC6F91BA /* Sync SPM Autolinking */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Sync SPM Autolinking"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -euo pipefail\n\n# ---------------------------------------------------------------------------\n# Resolve a node binary and the react-native package dir at BUILD TIME.\n# ---------------------------------------------------------------------------\nNODE_BINARY=\"${NODE_BINARY:-}\"\nif [ -z \"$NODE_BINARY\" ]; then\n # Source RN's standard app-local node-path files. They reference vars that\n # may be unset and may return non-zero, so relax nounset AND errexit while\n # sourcing — a buggy user .xcode.env must degrade to PATH-based node\n # resolution below, not silently abort every build.\n set +eu\n if [ -f \"$SRCROOT/.xcode.env\" ]; then\n . \"$SRCROOT/.xcode.env\"\n fi\n if [ -f \"$SRCROOT/.xcode.env.local\" ]; then\n . \"$SRCROOT/.xcode.env.local\"\n fi\n set -eu\n NODE_BINARY=\"${NODE_BINARY:-}\"\nfi\nif [ -z \"$NODE_BINARY\" ]; then\n NODE_BINARY=\"$(command -v node 2>/dev/null || true)\"\nfi\n\n# Resolve react-native's dir FROM THE APP (require.resolve), not a\n# generation-time baked path — the baked path goes stale in pnpm / hoisted\n# stores. Fall back to the baked path if resolution fails or the resolved dir\n# has no setup-apple-spm.js.\nRN_DIR=\"\"\nif [ -n \"$NODE_BINARY\" ]; then\n RN_DIR=\"$(cd \"$SRCROOT\" && \"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json'))\" 2>/dev/null || true)\"\nfi\nif [ -z \"$RN_DIR\" ] || [ ! -f \"$RN_DIR/scripts/setup-apple-spm.js\" ]; then\n RN_DIR=\"../node_modules/react-native\"\nfi\n\nSTAMP=\"$SRCROOT/build/generated/autolinking/.spm-sync-stamp\"\nSTALE=0\n\n# Find project root (where package.json lives — may be an ancestor of SRCROOT)\nPROJECT_ROOT=\"$SRCROOT\"\nwhile [ \"$PROJECT_ROOT\" != \"/\" ] && [ ! -f \"$PROJECT_ROOT/package.json\" ]; do\n PROJECT_ROOT=\"$(dirname \"$PROJECT_ROOT\")\"\ndone\nif [ ! -f \"$PROJECT_ROOT/package.json\" ]; then\n PROJECT_ROOT=\"$SRCROOT\"\nfi\n\n# Check 1: dependency inputs (covers app projects after any package manager install)\nfor INPUT in \\\n \"$PROJECT_ROOT/package.json\" \\\n \"$PROJECT_ROOT/react-native.config.js\"; do\n if [ -f \"$INPUT\" ] && [ \"$INPUT\" -nt \"$STAMP\" ]; then\n STALE=1\n break\n fi\ndone\n\n# Check workspace lockfiles and package-manager metadata. These cover package\n# managers that do not reliably bump node_modules mtimes, and Yarn PnP projects\n# that do not have node_modules at all.\nif [ \"$STALE\" -eq 0 ]; then\n DIR=\"$PROJECT_ROOT\"\n while [ \"$DIR\" != \"/\" ]; do\n for INPUT in \\\n \"$DIR/package-lock.json\" \\\n \"$DIR/npm-shrinkwrap.json\" \\\n \"$DIR/yarn.lock\" \\\n \"$DIR/pnpm-lock.yaml\" \\\n \"$DIR/bun.lock\" \\\n \"$DIR/bun.lockb\" \\\n \"$DIR/.pnp.cjs\" \\\n \"$DIR/.pnp.loader.mjs\"; do\n if [ -f \"$INPUT\" ] && [ \"$INPUT\" -nt \"$STAMP\" ]; then\n STALE=1\n break\n fi\n done\n if [ \"$STALE\" -eq 1 ]; then\n break\n fi\n DIR=\"$(dirname \"$DIR\")\"\n done\nfi\n\n# Check node_modules mtime. In monorepos, node_modules may be hoisted to any\n# ancestor between the app package and the workspace root.\nif [ \"$STALE\" -eq 0 ]; then\n DIR=\"$PROJECT_ROOT\"\n while [ \"$DIR\" != \"/\" ]; do\n NM_DIR=\"$DIR/node_modules\"\n if [ -d \"$NM_DIR\" ] && [ \"$NM_DIR\" -nt \"$STAMP\" ]; then\n STALE=1\n break\n fi\n DIR=\"$(dirname \"$DIR\")\"\n done\nfi\n\n# Also check the app root directly when SRCROOT is not the package root.\nif [ \"$STALE\" -eq 0 ] && [ \"$SRCROOT\" != \"$PROJECT_ROOT\" ]; then\n if [ -d \"$SRCROOT/node_modules\" ] && [ \"$SRCROOT/node_modules\" -nt \"$STAMP\" ]; then\n STALE=1\n fi\nfi\n\n# Check 1.5: watched paths (mixed dirs AND files). Dirs catch add/remove of\n# source files in spm.modules and autolinked deps (dir mtime updates on both);\n# files catch edits to a dep's checked-in Package.swift / plugin manifests that\n# would not bump any parent dir mtime. A path that has VANISHED (renamed/moved\n# module root) forces a re-sync so the autolinker surfaces the real, actionable\n# config error rather than the build failing later on dangling-symlink noise.\nWATCH_FILE=\"$SRCROOT/build/generated/autolinking/.spm-sync-watch-paths\"\nif [ \"$STALE\" -eq 0 ] && [ -f \"$WATCH_FILE\" ]; then\n while IFS= read -r P; do\n [ -z \"$P\" ] && continue\n if [ -d \"$P\" ]; then\n if [ -n \"$(find \"$P\" -newer \"$STAMP\" -print -quit 2>/dev/null)\" ]; then\n STALE=1\n break\n fi\n elif [ -f \"$P\" ]; then\n if [ \"$P\" -nt \"$STAMP\" ]; then\n STALE=1\n break\n fi\n else\n STALE=1\n break\n fi\n done < \"$WATCH_FILE\"\nfi\n\n# Check 2: codegen spec files changed via git (covers monorepo after git pull)\nif [ \"$STALE\" -eq 0 ] && [ -f \"$STAMP\" ]; then\n STAMP_TIME=$(stat -f %m \"$STAMP\" 2>/dev/null || stat -c %Y \"$STAMP\" 2>/dev/null || echo 0)\n LATEST_SPEC_COMMIT=$(git -C \"$SRCROOT\" log -1 --format=%ct -- '*.js' '*.ts' 2>/dev/null || echo 0)\n if [ \"$LATEST_SPEC_COMMIT\" -gt \"$STAMP_TIME\" ]; then\n STALE=1\n fi\nfi\n\nif [ ! -f \"$STAMP\" ]; then\n STALE=1\nfi\n\n# Re-sync codegen + autolinking when a dependency input changed. Runtime\n# framework slots and Xcode linker settings are only changed by spm update.\nif [ \"$STALE\" -eq 1 ]; then\n echo \"SPM sync inputs changed — re-syncing (codegen + autolinking)...\"\n\n WITH_ENVIRONMENT=\"$RN_DIR/scripts/xcode/with-environment.sh\"\n\n if [ -f \"$WITH_ENVIRONMENT\" ]; then\n # with-environment.sh references PODS_ROOT and $1, which may be unset.\n # Temporarily disable nounset to avoid failures when sourcing.\n export PODS_ROOT=\"${PODS_ROOT:-$SRCROOT}\"\n set +u\n . \"$WITH_ENVIRONMENT\"\n set -u\n fi\n\n cd \"$SRCROOT\"\n # `|| RC=$?` so a non-zero exit is CAPTURED rather than aborting the phase\n # under `set -e` — the whole point is to branch on the code below (2 = fail\n # the build with a scaffold hint; other non-zero = warn but don't break).\n RC=0\n if [ -n \"$NODE_BINARY\" ] && [ -f \"$RN_DIR/scripts/setup-apple-spm.js\" ]; then\n # Direct, dependency-free dispatch (no `npx react-native`, which needs\n # @react-native-community/cli).\n \"$NODE_BINARY\" \"$RN_DIR/scripts/setup-apple-spm.js\" sync || RC=$?\n elif command -v npx >/dev/null 2>&1; then\n npx react-native spm sync || RC=$?\n else\n echo \"warning: node/npx not found — skipping SPM sync\"\n fi\n if [ \"$RC\" -eq 2 ]; then\n # Exit 2 = an autolinked community dependency has no Package.swift. The\n # autolinker already printed an `error:` line per dep (so Xcode shows them\n # and the fix). Fail the build — the developer must run\n # `npx react-native spm scaffold` from a terminal to generate the manifest.\n exit 1\n elif [ \"$RC\" -ne 0 ]; then\n echo \"warning: SPM sync failed — build may use stale codegen/autolinking\"\n fi\nfi\n\n"; + }; + B174F870C259554596A4373B /* Embed React Native Flavored Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(SRCROOT)/build/xcframeworks/.artifact-stamp", + "$(RN_SPM_REACT_FRAMEWORK)", + "$(RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK)", + "$(RN_SPM_HERMES_FRAMEWORK)", + ); + name = "Embed React Native Flavored Frameworks"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(TARGET_BUILD_DIR)/$(FRAMEWORKS_FOLDER_PATH)/React.framework", + "$(TARGET_BUILD_DIR)/$(FRAMEWORKS_FOLDER_PATH)/ReactNativeDependencies.framework", + "$(TARGET_BUILD_DIR)/$(FRAMEWORKS_FOLDER_PATH)/hermesvm.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -euo pipefail\n\ndestination=\"$TARGET_BUILD_DIR/$FRAMEWORKS_FOLDER_PATH\"\nmkdir -p \"$destination\"\n\nvalidate_framework() {\n source=\"$1\"\n name=\"$2\"\n if [ -z \"$source\" ] || [ ! -d \"$source\" ]; then\n echo \"error: React Native SwiftPM framework '$name' is unavailable for configuration '$CONFIGURATION' and SDK '$SDK_NAME': $source\"\n exit 1\n fi\n binary=\"${name%.framework}\"\n if [ ! -e \"$source/$binary\" ] && [ ! -e \"$source/Versions/Current/$binary\" ]; then\n echo \"error: React Native SwiftPM framework '$name' is invalid for configuration '$CONFIGURATION': expected $source/$binary or $source/Versions/Current/$binary\"\n exit 1\n fi\n}\n\ncopy_and_sign() {\n source=\"$1\"\n name=\"$2\"\n /usr/bin/rsync -a --delete \"$source/\" \"$destination/$name/\"\n if [ \"${CODE_SIGNING_ALLOWED:-YES}\" != \"NO\" ]; then\n identity=\"${EXPANDED_CODE_SIGN_IDENTITY:--}\"\n if [ \"$identity\" = \"-\" ]; then\n /usr/bin/codesign --force --sign - --timestamp=none --preserve-metadata=identifier,entitlements,flags \"$destination/$name\"\n else\n /usr/bin/codesign --force --sign \"$identity\" --preserve-metadata=identifier,entitlements,flags \"$destination/$name\"\n fi\n fi\n}\n\nvalidate_framework \"${RN_SPM_REACT_FRAMEWORK:-}\" \"React.framework\"\nvalidate_framework \"${RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK:-}\" \"ReactNativeDependencies.framework\"\nvalidate_framework \"${RN_SPM_HERMES_FRAMEWORK:-}\" \"hermesvm.framework\"\ncopy_and_sign \"${RN_SPM_REACT_FRAMEWORK:-}\" \"React.framework\"\ncopy_and_sign \"${RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK:-}\" \"ReactNativeDependencies.framework\"\ncopy_and_sign \"${RN_SPM_HERMES_FRAMEWORK:-}\" \"hermesvm.framework\"\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 761780ED2CA45674006654EE /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + "RN_SPM_HERMES_SEARCH_PATH[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64_x86_64-simulator"; + "RN_SPM_HERMES_BINARY[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64_x86_64-simulator/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64_x86_64-simulator/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64"; + "RN_SPM_HERMES_BINARY[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-maccatalyst"; + "RN_SPM_HERMES_BINARY[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-maccatalyst/hermesvm.framework/Versions/1/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-maccatalyst/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-simulator"; + "RN_SPM_HERMES_BINARY[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-simulator/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-simulator/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64"; + "RN_SPM_HERMES_BINARY[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64_x86_64-simulator"; + "RN_SPM_HERMES_BINARY[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64_x86_64-simulator/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64_x86_64-simulator/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64"; + "RN_SPM_HERMES_BINARY[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64/hermesvm.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64_x86_64-simulator"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64_x86_64-simulator/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64_x86_64-simulator/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-maccatalyst"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-maccatalyst/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-maccatalyst/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-simulator"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-simulator/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-simulator/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64_x86_64-simulator"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64_x86_64-simulator/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64_x86_64-simulator/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64/ReactNativeDependencies.framework"; + "RN_SPM_REACT_SEARCH_PATH[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-maccatalyst"; + "RN_SPM_REACT_BINARY[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-maccatalyst/React.framework/React"; + "RN_SPM_REACT_FRAMEWORK[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-maccatalyst/React.framework"; + "RN_SPM_REACT_SEARCH_PATH[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-simulator"; + "RN_SPM_REACT_BINARY[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-simulator/React.framework/React"; + "RN_SPM_REACT_FRAMEWORK[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-simulator/React.framework"; + "RN_SPM_REACT_SEARCH_PATH[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64"; + "RN_SPM_REACT_BINARY[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64/React.framework/React"; + "RN_SPM_REACT_FRAMEWORK[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64/React.framework"; + RN_SPM_FLAVOR = debug; + HERMES_CLI_PATH = "/Users/thiagobrez/Repos/react-native-bottom-tabs/node_modules/hermes-compiler/hermesc/osx-bin/hermesc"; + REACT_NATIVE_PATH = "../node_modules/react-native"; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(RN_SPM_REACT_SEARCH_PATH)", + "$(RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH)", + "$(RN_SPM_HERMES_SEARCH_PATH)", + ); + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/build/generated/autolinking/headers", + ); + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = 1; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = ExampleSwiftPM/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + "$(RN_SPM_REACT_BINARY)", + "$(RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY)", + "$(RN_SPM_HERMES_BINARY)", + ); + PRODUCT_BUNDLE_IDENTIFIER = bottomtabs.exampleswiftpm; + PRODUCT_NAME = ExampleSwiftPM; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + "RN_SPM_HERMES_SEARCH_PATH[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64_x86_64-simulator"; + "RN_SPM_HERMES_BINARY[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64_x86_64-simulator/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64_x86_64-simulator/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64"; + "RN_SPM_HERMES_BINARY[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-maccatalyst"; + "RN_SPM_HERMES_BINARY[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-maccatalyst/hermesvm.framework/Versions/1/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-maccatalyst/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-simulator"; + "RN_SPM_HERMES_BINARY[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-simulator/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-simulator/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64"; + "RN_SPM_HERMES_BINARY[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64_x86_64-simulator"; + "RN_SPM_HERMES_BINARY[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64_x86_64-simulator/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64_x86_64-simulator/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64"; + "RN_SPM_HERMES_BINARY[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64/hermesvm.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64_x86_64-simulator"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64_x86_64-simulator/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64_x86_64-simulator/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-maccatalyst"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-maccatalyst/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-maccatalyst/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-simulator"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-simulator/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-simulator/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64_x86_64-simulator"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64_x86_64-simulator/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64_x86_64-simulator/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64/ReactNativeDependencies.framework"; + "RN_SPM_REACT_SEARCH_PATH[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-maccatalyst"; + "RN_SPM_REACT_BINARY[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-maccatalyst/React.framework/React"; + "RN_SPM_REACT_FRAMEWORK[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-maccatalyst/React.framework"; + "RN_SPM_REACT_SEARCH_PATH[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-simulator"; + "RN_SPM_REACT_BINARY[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-simulator/React.framework/React"; + "RN_SPM_REACT_FRAMEWORK[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-simulator/React.framework"; + "RN_SPM_REACT_SEARCH_PATH[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64"; + "RN_SPM_REACT_BINARY[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64/React.framework/React"; + "RN_SPM_REACT_FRAMEWORK[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64/React.framework"; + RN_SPM_FLAVOR = release; + HERMES_CLI_PATH = "/Users/thiagobrez/Repos/react-native-bottom-tabs/node_modules/hermes-compiler/hermesc/osx-bin/hermesc"; + REACT_NATIVE_PATH = "../node_modules/react-native"; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(RN_SPM_REACT_SEARCH_PATH)", + "$(RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH)", + "$(RN_SPM_HERMES_SEARCH_PATH)", + ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/build/generated/autolinking/headers", + ); + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = 1; + INFOPLIST_FILE = ExampleSwiftPM/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + "$(RN_SPM_REACT_BINARY)", + "$(RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY)", + "$(RN_SPM_HERMES_BINARY)", + ); + PRODUCT_BUNDLE_IDENTIFIER = bottomtabs.exampleswiftpm; + PRODUCT_NAME = ExampleSwiftPM; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + "-DFOLLY_CFG_NO_COROUTINES=1", + "-DFOLLY_HAVE_CLOCK_GETTIME=1", + ); + SDKROOT = iphoneos; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + "-DFOLLY_CFG_NO_COROUTINES=1", + "-DFOLLY_HAVE_CLOCK_GETTIME=1", + ); + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ExampleSwiftPM" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "ExampleSwiftPM" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 27BDE9D743CB351F53154525 /* XCLocalSwiftPackageReference "xcframeworks" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = build/xcframeworks; + }; + A700952B9A737913514EB28F /* XCLocalSwiftPackageReference "ios" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = build/generated/ios; + }; + C2FECF1430FDAAE3BF355839 /* XCLocalSwiftPackageReference "autolinking" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = build/generated/autolinking; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 3AFDEFB917B01458307FDE0A /* Autolinked */ = { + isa = XCSwiftPackageProductDependency; + package = C2FECF1430FDAAE3BF355839 /* XCLocalSwiftPackageReference "autolinking" */; + productName = Autolinked; + }; + 512EBECF5434FD7A6AF7C967 /* ReactHeaders */ = { + isa = XCSwiftPackageProductDependency; + package = 27BDE9D743CB351F53154525 /* XCLocalSwiftPackageReference "xcframeworks" */; + productName = ReactHeaders; + }; + 8332BE36B9C49BD2E49347C1 /* ReactNativeDependenciesHeaders */ = { + isa = XCSwiftPackageProductDependency; + package = 27BDE9D743CB351F53154525 /* XCLocalSwiftPackageReference "xcframeworks" */; + productName = ReactNativeDependenciesHeaders; + }; + 920F69A9DF98D37C8308D020 /* ReactNativeHeaders */ = { + isa = XCSwiftPackageProductDependency; + package = 27BDE9D743CB351F53154525 /* XCLocalSwiftPackageReference "xcframeworks" */; + productName = ReactNativeHeaders; + }; + 947DD5EF3BE079FB7F5AFF87 /* ReactCodegen */ = { + isa = XCSwiftPackageProductDependency; + package = A700952B9A737913514EB28F /* XCLocalSwiftPackageReference "ios" */; + productName = ReactCodegen; + }; + F3857EDDA38AFC0011322D6D /* ReactAppDependencyProvider */ = { + isa = XCSwiftPackageProductDependency; + package = A700952B9A737913514EB28F /* XCLocalSwiftPackageReference "ios" */; + productName = ReactAppDependencyProvider; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/apps/example-swiftpm/ios/ExampleSwiftPM.xcodeproj/xcshareddata/xcschemes/ExampleSwiftPM.xcscheme b/apps/example-swiftpm/ios/ExampleSwiftPM.xcodeproj/xcshareddata/xcschemes/ExampleSwiftPM.xcscheme new file mode 100644 index 00000000..5f492971 --- /dev/null +++ b/apps/example-swiftpm/ios/ExampleSwiftPM.xcodeproj/xcshareddata/xcschemes/ExampleSwiftPM.xcscheme @@ -0,0 +1,294 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/example-swiftpm/ios/ExampleSwiftPM/AppDelegate.swift b/apps/example-swiftpm/ios/ExampleSwiftPM/AppDelegate.swift new file mode 100644 index 00000000..8abe7ee9 --- /dev/null +++ b/apps/example-swiftpm/ios/ExampleSwiftPM/AppDelegate.swift @@ -0,0 +1,48 @@ +import UIKit +import React +import React_RCTAppDelegate +import ReactAppDependencyProvider + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + var reactNativeDelegate: ReactNativeDelegate? + var reactNativeFactory: RCTReactNativeFactory? + + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + let delegate = ReactNativeDelegate() + let factory = RCTReactNativeFactory(delegate: delegate) + delegate.dependencyProvider = RCTAppDependencyProvider() + + reactNativeDelegate = delegate + reactNativeFactory = factory + + window = UIWindow(frame: UIScreen.main.bounds) + + factory.startReactNative( + withModuleName: "ExampleSwiftPM", + in: window, + launchOptions: launchOptions + ) + + return true + } +} + +class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate { + override func sourceURL(for bridge: RCTBridge) -> URL? { + self.bundleURL() + } + + override func bundleURL() -> URL? { +#if DEBUG + RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index") +#else + Bundle.main.url(forResource: "main", withExtension: "jsbundle") +#endif + } +} diff --git a/apps/example-swiftpm/ios/ExampleSwiftPM/Images.xcassets/AppIcon.appiconset/Contents.json b/apps/example-swiftpm/ios/ExampleSwiftPM/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..81213230 --- /dev/null +++ b/apps/example-swiftpm/ios/ExampleSwiftPM/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,53 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/example-swiftpm/ios/ExampleSwiftPM/Images.xcassets/Contents.json b/apps/example-swiftpm/ios/ExampleSwiftPM/Images.xcassets/Contents.json new file mode 100644 index 00000000..2d92bd53 --- /dev/null +++ b/apps/example-swiftpm/ios/ExampleSwiftPM/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/apps/example-swiftpm/ios/ExampleSwiftPM/Info.plist b/apps/example-swiftpm/ios/ExampleSwiftPM/Info.plist new file mode 100644 index 00000000..c053a015 --- /dev/null +++ b/apps/example-swiftpm/ios/ExampleSwiftPM/Info.plist @@ -0,0 +1,62 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + example-swiftpm + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSAllowsLocalNetworking + + + NSLocationWhenInUseUsageDescription + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + UIViewControllerBasedStatusBarAppearance + + UIAppFonts + + MaterialCommunityIcons.ttf + + + diff --git a/apps/example-swiftpm/ios/ExampleSwiftPM/LaunchScreen.storyboard b/apps/example-swiftpm/ios/ExampleSwiftPM/LaunchScreen.storyboard new file mode 100644 index 00000000..a7e82605 --- /dev/null +++ b/apps/example-swiftpm/ios/ExampleSwiftPM/LaunchScreen.storyboard @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/example-swiftpm/ios/ExampleSwiftPM/PrivacyInfo.xcprivacy b/apps/example-swiftpm/ios/ExampleSwiftPM/PrivacyInfo.xcprivacy new file mode 100644 index 00000000..41b8317f --- /dev/null +++ b/apps/example-swiftpm/ios/ExampleSwiftPM/PrivacyInfo.xcprivacy @@ -0,0 +1,37 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/apps/example-swiftpm/ios/Podfile b/apps/example-swiftpm/ios/Podfile new file mode 100644 index 00000000..d2f4e466 --- /dev/null +++ b/apps/example-swiftpm/ios/Podfile @@ -0,0 +1,3 @@ +# This app uses SwiftPM. Run `yarn spm` from apps/example-swiftpm. +# The CLI-generated CocoaPods project was migrated with: +# yarn react-native spm add --deintegrate diff --git a/apps/example-swiftpm/metro.config.js b/apps/example-swiftpm/metro.config.js new file mode 100644 index 00000000..8cd344aa --- /dev/null +++ b/apps/example-swiftpm/metro.config.js @@ -0,0 +1,43 @@ +const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); +const path = require('path'); + +/** + * Metro configuration + * https://reactnative.dev/docs/metro + * + * @type {import('@react-native/metro-config').MetroConfig} + */ +const workspaceRoot = path.resolve(__dirname, '../..'); +const appPath = path.relative(workspaceRoot, __dirname); + +const config = { + // Shared source and hoisted dependencies must be visible to Metro. + watchFolders: [workspaceRoot], + transformer: { + // Keep shared assets beneath /assets even when ../ segments normalize. + publicPath: `/assets/${appPath}`, + }, + server: { + rewriteRequestUrl(requestUrl) { + const url = new URL(requestUrl, 'http://localhost'); + if (!url.pathname.startsWith('/assets/')) return requestUrl; + + // Metro reads asset paths relative to this app's project root. + url.searchParams.set( + 'unstable_path', + path.relative(appPath, url.pathname.slice('/assets/'.length)) + ); + return `/assets?${url.searchParams}`; + }, + }, + resolver: { + // Use this shell's React Native and patched native modules for shared code. + nodeModulesPaths: [ + path.join(__dirname, 'node_modules'), + path.join(workspaceRoot, 'node_modules'), + ], + disableHierarchicalLookup: true, + }, +}; + +module.exports = mergeConfig(getDefaultConfig(__dirname), config); diff --git a/apps/example-swiftpm/package.json b/apps/example-swiftpm/package.json new file mode 100644 index 00000000..9f4ee7f3 --- /dev/null +++ b/apps/example-swiftpm/package.json @@ -0,0 +1,59 @@ +{ + "name": "example-swiftpm", + "version": "0.0.1", + "private": true, + "scripts": { + "ios": "react-native run-ios", + "lint": "eslint .", + "start": "react-native start", + "typecheck": "tsc --noEmit", + "spm": "react-native spm", + "e2e:ios": "maestro test --platform=ios --env APP_ID=bottomtabs.exampleswiftpm ../../packages/example-shared/e2e" + }, + "dependencies": { + "@bottom-tabs/example-shared": "workspace:*", + "@bottom-tabs/react-navigation": "*", + "@react-navigation/bottom-tabs": "^7.15.9", + "@react-navigation/devtools": "^7.0.44", + "@react-navigation/native": "^7.3.0", + "@react-navigation/native-stack": "^7.14.11", + "@react-navigation/stack": "^7.8.10", + "color": "^5.0.0", + "react": "^19.2.3", + "react-native": "^0.87.1", + "react-native-bottom-tabs": "*", + "react-native-edge-to-edge": "^1.7.0", + "react-native-gesture-handler": "patch:react-native-gesture-handler@npm%3A3.2.1#~/.yarn/patches/react-native-gesture-handler-npm-3.2.1-73a74f5c79.patch", + "react-native-paper": "^5.14.5", + "react-native-safe-area-context": "patch:react-native-safe-area-context@npm%3A5.9.1#~/.yarn/patches/react-native-safe-area-context-npm-5.9.1-b51fb9c5f7.patch", + "react-native-screens": "patch:react-native-screens@npm%3A4.27.0#~/.yarn/patches/react-native-screens-npm-4.27.0-78335f53c6.patch", + "react-native-vector-icons": "patch:react-native-vector-icons@npm%3A10.2.0#~/.yarn/patches/react-native-vector-icons-npm-10.2.0-e1aad1f85c.patch", + "react-native-worklets": "patch:react-native-worklets@npm%3A0.12.1#~/.yarn/patches/react-native-worklets-npm-0.12.1-aa8a1b2670.patch" + }, + "devDependencies": { + "@babel/core": "^7.25.2", + "@babel/preset-env": "^7.25.3", + "@babel/runtime": "^7.25.0", + "@react-native-community/cli": "20.2.0", + "@react-native-community/cli-platform-ios": "20.2.0", + "@react-native/babel-preset": "0.87.1", + "@react-native/eslint-config": "0.87.1", + "@react-native/jest-preset": "0.87.1", + "@react-native/metro-config": "0.87.1", + "@react-native/typescript-config": "0.87.1", + "@rnx-kit/metro-config": "^2.2.4", + "@types/jest": "^29.5.13", + "@types/react": "^19.2.0", + "@types/react-native-vector-icons": "^6.4.18", + "@types/react-test-renderer": "^19.1.0", + "babel-plugin-module-resolver": "^5.0.2", + "eslint": "^8.19.0", + "jest": "^29.6.3", + "prettier": "^3.0.0", + "react-test-renderer": "19.2.3", + "typescript": "^5.9.2" + }, + "engines": { + "node": ">= 22.11.0" + } +} diff --git a/apps/example-swiftpm/react-native.config.js b/apps/example-swiftpm/react-native.config.js new file mode 100644 index 00000000..e0bb3791 --- /dev/null +++ b/apps/example-swiftpm/react-native.config.js @@ -0,0 +1,3 @@ +module.exports = { + project: { ios: { automaticPodsInstallation: false } }, +}; diff --git a/apps/example-swiftpm/tsconfig.json b/apps/example-swiftpm/tsconfig.json new file mode 100644 index 00000000..12497647 --- /dev/null +++ b/apps/example-swiftpm/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig", + "references": [ + { "path": "../../packages/react-native-bottom-tabs" }, + { "path": "../../packages/react-navigation" }, + ], + "compilerOptions": { + "rootDir": ".", + "paths": {}, + "composite": false, + "moduleResolution": "bundler", + "customConditions": ["react-native"], + "noEmit": true + } +} diff --git a/apps/example/babel.config.js b/apps/example/babel.config.js index 6164f23b..07ba1de9 100644 --- a/apps/example/babel.config.js +++ b/apps/example/babel.config.js @@ -1,44 +1 @@ -const path = require('path'); -const fs = require('fs'); - -const packages = path.resolve(__dirname, '..', '..', 'packages'); - -/** @type {import('@babel/core').TransformOptions} */ -module.exports = function (api) { - api.cache(true); - - const alias = Object.fromEntries( - fs - .readdirSync(packages) - .filter((name) => !name.startsWith('.')) - .map((name) => { - const pak = require(`../../packages/${name}/package.json`); - - if (pak.source == null) { - return null; - } - - return [pak.name, path.resolve(packages, name, pak.source)]; - }) - .filter(Boolean) - ); - - return { - presets: ['module:@react-native/babel-preset'], - plugins: ['react-native-worklets/plugin'], - overrides: [ - { - exclude: /\/node_modules\//, - plugins: [ - [ - 'module-resolver', - { - extensions: ['.tsx', '.ts', '.js', '.json'], - alias, - }, - ], - ], - }, - ], - }; -}; +module.exports = require('@bottom-tabs/example-shared/babel'); diff --git a/apps/example/index.js b/apps/example/index.js index 117ddcae..9240982b 100644 --- a/apps/example/index.js +++ b/apps/example/index.js @@ -1,5 +1,5 @@ import { AppRegistry } from 'react-native'; -import App from './src/App'; +import App from '@bottom-tabs/example-shared'; import { name as appName } from './app.json'; AppRegistry.registerComponent(appName, () => App); diff --git a/apps/example/metro.config.js b/apps/example/metro.config.js index 02786b7e..7878d28c 100644 --- a/apps/example/metro.config.js +++ b/apps/example/metro.config.js @@ -25,5 +25,20 @@ const extraConfig = { }; const metroConfig = makeMetroConfig(extraConfig); +const rewriteRequestUrl = metroConfig.server.rewriteRequestUrl; + +metroConfig.server.rewriteRequestUrl = (requestUrl) => { + const rewrittenUrl = rewriteRequestUrl(requestUrl); + if (!rewrittenUrl.startsWith('/assets/')) return rewrittenUrl; + + // rnx-kit restores @@ to ../ for assets outside this app. Keep those paths + // in Metro's asset query so URL normalization cannot escape /assets/. + const [assetPath, query = ''] = rewrittenUrl.slice('/assets/'.length).split('?'); + if (!assetPath.split('/').includes('..')) return rewrittenUrl; + + const params = new URLSearchParams(query); + params.set('unstable_path', assetPath); + return `/assets?${params}`; +}; module.exports = metroConfig; diff --git a/apps/example/package.json b/apps/example/package.json index 698366db..662bf88e 100644 --- a/apps/example/package.json +++ b/apps/example/package.json @@ -7,13 +7,14 @@ "build:android": "npm run mkdist && react-native bundle --entry-file index.js --platform android --dev true --bundle-output dist/main.android.jsbundle --assets-dest dist && react-native build-android --extra-params \"--no-daemon --console=plain -PreactNativeArchitectures=arm64-v8a -PnewArchEnabled=true\"", "build:ios": "npm run mkdist && react-native bundle --entry-file index.js --platform ios --dev true --bundle-output dist/main.ios.jsbundle --assets-dest dist", "ios": "react-native run-ios", - "e2e:ios": "maestro test --platform=ios e2e", - "e2e:android": "maestro test --platform=android e2e", + "e2e:ios": "maestro test --platform=ios --env APP_ID=bottomtabs.example ../../packages/example-shared/e2e", + "e2e:android": "maestro test --platform=android --env APP_ID=bottomtabs.example ../../packages/example-shared/e2e", "mkdist": "node -e \"require('node:fs').mkdirSync('dist', { recursive: true, mode: 0o755 })\"", "start": "react-native start", "typecheck": "tsc --noEmit" }, "dependencies": { + "@bottom-tabs/example-shared": "workspace:*", "@bottom-tabs/react-navigation": "*", "@react-navigation/bottom-tabs": "^7.15.9", "@react-navigation/devtools": "^7.0.44", diff --git a/docs/docs/docs/getting-started/quick-start.mdx b/docs/docs/docs/getting-started/quick-start.mdx index d8235989..b4302459 100644 --- a/docs/docs/docs/getting-started/quick-start.mdx +++ b/docs/docs/docs/getting-started/quick-start.mdx @@ -61,8 +61,9 @@ The library ships a `Package.swift` for React Native's SwiftPM autolinking flow, alongside its CocoaPods podspec. This requires a React Native installation that provides the `react-native spm` command, the New Architecture, and Swift tools 6.0 or newer. The app must meet React Native's iOS deployment target as well as the -package's iOS 15 minimum. The repository's React Native 0.81 example still uses -CocoaPods. +package's iOS 15 minimum. The repository includes a CocoaPods example in +`apps/example` and a SwiftPM example in `apps/example-swiftpm`, both using the +same shared screens. After installing the npm package, run this from an app already using SwiftPM: diff --git a/packages/example-shared/README.md b/packages/example-shared/README.md new file mode 100644 index 00000000..dd8d8bb3 --- /dev/null +++ b/packages/example-shared/README.md @@ -0,0 +1,55 @@ +# Shared example app + +This private workspace contains the example UI, assets, and Maestro flows. Both +`apps/example` (CocoaPods / React Native Test App) and `apps/example-swiftpm` +(Community CLI / SwiftPM) register its default `App` export. + +Add or edit screens in `src/` and assets in `assets/`; every example shell sees +those changes through Metro without copying files or publishing this package. +`babel.config.js` resolves workspace libraries to source. Each shell owns its +Metro configuration: the existing example uses rnx-kit, and the SwiftPM example +extends the Community CLI defaults for workspace dependency resolution and +shared asset URLs. + +## Adding another shell + +1. Scaffold the native app under `apps/`. +2. Add `@bottom-tabs/example-shared: workspace:*` and the shared app's runtime + dependencies to the shell's `package.json`. Native dependencies must be direct + shell dependencies so React Native autolinking discovers them. +3. Register the default export from `@bottom-tabs/example-shared` in the shell's + `index.js`, using its own `app.json` registration name. +4. Reuse `@bottom-tabs/example-shared/babel` and keep the shell's own Metro + configuration. +5. Configure native resources and integration for that shell. The examples use + React Native Paper's MaterialCommunityIcons font; include it in the native app. +6. Run the flows in `e2e/` with `APP_ID` set to the shell's bundle/application ID. + +Keep native app delegates, project files, dependency-manager setup, permissions, +and registration names in the shells. Feature code belongs here. + +From the repository root: + +```sh +yarn workspace @bottom-tabs/example-shared typecheck +yarn workspace react-native-bottom-tabs-example e2e:ios +yarn workspace example-swiftpm e2e:ios +``` + +## Updating dependencies + +Shared runtime dependency versions are maintained in the root `yarn.config.cjs`. +All three example workspaces keep explicit dependency declarations; Yarn +constraints synchronize them. The SwiftPM shell has explicit overrides for its +patched native dependencies. Tooling dependencies remain workspace-specific. + +After editing the central versions (and checking any affected SwiftPM patches): + +```sh +yarn constraints --fix +yarn install +``` + +CI runs `yarn constraints` to reject missing or mismatched declarations. When +adding another example shell, add its workspace path to the `examples` set in +`yarn.config.cjs` and run the same commands. diff --git a/apps/example/assets/album-art-01.jpg b/packages/example-shared/assets/album-art-01.jpg similarity index 100% rename from apps/example/assets/album-art-01.jpg rename to packages/example-shared/assets/album-art-01.jpg diff --git a/apps/example/assets/album-art-02.jpg b/packages/example-shared/assets/album-art-02.jpg similarity index 100% rename from apps/example/assets/album-art-02.jpg rename to packages/example-shared/assets/album-art-02.jpg diff --git a/apps/example/assets/album-art-03.jpg b/packages/example-shared/assets/album-art-03.jpg similarity index 100% rename from apps/example/assets/album-art-03.jpg rename to packages/example-shared/assets/album-art-03.jpg diff --git a/apps/example/assets/album-art-04.jpg b/packages/example-shared/assets/album-art-04.jpg similarity index 100% rename from apps/example/assets/album-art-04.jpg rename to packages/example-shared/assets/album-art-04.jpg diff --git a/apps/example/assets/album-art-05.jpg b/packages/example-shared/assets/album-art-05.jpg similarity index 100% rename from apps/example/assets/album-art-05.jpg rename to packages/example-shared/assets/album-art-05.jpg diff --git a/apps/example/assets/album-art-06.jpg b/packages/example-shared/assets/album-art-06.jpg similarity index 100% rename from apps/example/assets/album-art-06.jpg rename to packages/example-shared/assets/album-art-06.jpg diff --git a/apps/example/assets/album-art-07.jpg b/packages/example-shared/assets/album-art-07.jpg similarity index 100% rename from apps/example/assets/album-art-07.jpg rename to packages/example-shared/assets/album-art-07.jpg diff --git a/apps/example/assets/album-art-08.jpg b/packages/example-shared/assets/album-art-08.jpg similarity index 100% rename from apps/example/assets/album-art-08.jpg rename to packages/example-shared/assets/album-art-08.jpg diff --git a/apps/example/assets/album-art-09.jpg b/packages/example-shared/assets/album-art-09.jpg similarity index 100% rename from apps/example/assets/album-art-09.jpg rename to packages/example-shared/assets/album-art-09.jpg diff --git a/apps/example/assets/album-art-10.jpg b/packages/example-shared/assets/album-art-10.jpg similarity index 100% rename from apps/example/assets/album-art-10.jpg rename to packages/example-shared/assets/album-art-10.jpg diff --git a/apps/example/assets/album-art-11.jpg b/packages/example-shared/assets/album-art-11.jpg similarity index 100% rename from apps/example/assets/album-art-11.jpg rename to packages/example-shared/assets/album-art-11.jpg diff --git a/apps/example/assets/album-art-12.jpg b/packages/example-shared/assets/album-art-12.jpg similarity index 100% rename from apps/example/assets/album-art-12.jpg rename to packages/example-shared/assets/album-art-12.jpg diff --git a/apps/example/assets/album-art-13.jpg b/packages/example-shared/assets/album-art-13.jpg similarity index 100% rename from apps/example/assets/album-art-13.jpg rename to packages/example-shared/assets/album-art-13.jpg diff --git a/apps/example/assets/album-art-14.jpg b/packages/example-shared/assets/album-art-14.jpg similarity index 100% rename from apps/example/assets/album-art-14.jpg rename to packages/example-shared/assets/album-art-14.jpg diff --git a/apps/example/assets/album-art-15.jpg b/packages/example-shared/assets/album-art-15.jpg similarity index 100% rename from apps/example/assets/album-art-15.jpg rename to packages/example-shared/assets/album-art-15.jpg diff --git a/apps/example/assets/album-art-16.jpg b/packages/example-shared/assets/album-art-16.jpg similarity index 100% rename from apps/example/assets/album-art-16.jpg rename to packages/example-shared/assets/album-art-16.jpg diff --git a/apps/example/assets/album-art-17.jpg b/packages/example-shared/assets/album-art-17.jpg similarity index 100% rename from apps/example/assets/album-art-17.jpg rename to packages/example-shared/assets/album-art-17.jpg diff --git a/apps/example/assets/album-art-18.jpg b/packages/example-shared/assets/album-art-18.jpg similarity index 100% rename from apps/example/assets/album-art-18.jpg rename to packages/example-shared/assets/album-art-18.jpg diff --git a/apps/example/assets/album-art-19.jpg b/packages/example-shared/assets/album-art-19.jpg similarity index 100% rename from apps/example/assets/album-art-19.jpg rename to packages/example-shared/assets/album-art-19.jpg diff --git a/apps/example/assets/album-art-20.jpg b/packages/example-shared/assets/album-art-20.jpg similarity index 100% rename from apps/example/assets/album-art-20.jpg rename to packages/example-shared/assets/album-art-20.jpg diff --git a/apps/example/assets/album-art-21.jpg b/packages/example-shared/assets/album-art-21.jpg similarity index 100% rename from apps/example/assets/album-art-21.jpg rename to packages/example-shared/assets/album-art-21.jpg diff --git a/apps/example/assets/album-art-22.jpg b/packages/example-shared/assets/album-art-22.jpg similarity index 100% rename from apps/example/assets/album-art-22.jpg rename to packages/example-shared/assets/album-art-22.jpg diff --git a/apps/example/assets/album-art-23.jpg b/packages/example-shared/assets/album-art-23.jpg similarity index 100% rename from apps/example/assets/album-art-23.jpg rename to packages/example-shared/assets/album-art-23.jpg diff --git a/apps/example/assets/album-art-24.jpg b/packages/example-shared/assets/album-art-24.jpg similarity index 100% rename from apps/example/assets/album-art-24.jpg rename to packages/example-shared/assets/album-art-24.jpg diff --git a/apps/example/assets/avatar-1.png b/packages/example-shared/assets/avatar-1.png similarity index 100% rename from apps/example/assets/avatar-1.png rename to packages/example-shared/assets/avatar-1.png diff --git a/apps/example/assets/avatar-2.png b/packages/example-shared/assets/avatar-2.png similarity index 100% rename from apps/example/assets/avatar-2.png rename to packages/example-shared/assets/avatar-2.png diff --git a/apps/example/assets/avatar-3.png b/packages/example-shared/assets/avatar-3.png similarity index 100% rename from apps/example/assets/avatar-3.png rename to packages/example-shared/assets/avatar-3.png diff --git a/apps/example/assets/avatar-4.png b/packages/example-shared/assets/avatar-4.png similarity index 100% rename from apps/example/assets/avatar-4.png rename to packages/example-shared/assets/avatar-4.png diff --git a/apps/example/assets/book.jpg b/packages/example-shared/assets/book.jpg similarity index 100% rename from apps/example/assets/book.jpg rename to packages/example-shared/assets/book.jpg diff --git a/apps/example/assets/icons/article_dark.png b/packages/example-shared/assets/icons/article_dark.png similarity index 100% rename from apps/example/assets/icons/article_dark.png rename to packages/example-shared/assets/icons/article_dark.png diff --git a/apps/example/assets/icons/book-image.svg b/packages/example-shared/assets/icons/book-image.svg similarity index 100% rename from apps/example/assets/icons/book-image.svg rename to packages/example-shared/assets/icons/book-image.svg diff --git a/apps/example/assets/icons/chat_dark.png b/packages/example-shared/assets/icons/chat_dark.png similarity index 100% rename from apps/example/assets/icons/chat_dark.png rename to packages/example-shared/assets/icons/chat_dark.png diff --git a/apps/example/assets/icons/grid_dark.png b/packages/example-shared/assets/icons/grid_dark.png similarity index 100% rename from apps/example/assets/icons/grid_dark.png rename to packages/example-shared/assets/icons/grid_dark.png diff --git a/apps/example/assets/icons/message-circle-code.svg b/packages/example-shared/assets/icons/message-circle-code.svg similarity index 100% rename from apps/example/assets/icons/message-circle-code.svg rename to packages/example-shared/assets/icons/message-circle-code.svg diff --git a/apps/example/assets/icons/newspaper.svg b/packages/example-shared/assets/icons/newspaper.svg similarity index 100% rename from apps/example/assets/icons/newspaper.svg rename to packages/example-shared/assets/icons/newspaper.svg diff --git a/apps/example/assets/icons/person_dark.png b/packages/example-shared/assets/icons/person_dark.png similarity index 100% rename from apps/example/assets/icons/person_dark.png rename to packages/example-shared/assets/icons/person_dark.png diff --git a/apps/example/assets/icons/user-round-search.svg b/packages/example-shared/assets/icons/user-round-search.svg similarity index 100% rename from apps/example/assets/icons/user-round-search.svg rename to packages/example-shared/assets/icons/user-round-search.svg diff --git a/apps/example/assets/icons/user-round.svg b/packages/example-shared/assets/icons/user-round.svg similarity index 100% rename from apps/example/assets/icons/user-round.svg rename to packages/example-shared/assets/icons/user-round.svg diff --git a/packages/example-shared/babel.config.js b/packages/example-shared/babel.config.js new file mode 100644 index 00000000..6164f23b --- /dev/null +++ b/packages/example-shared/babel.config.js @@ -0,0 +1,44 @@ +const path = require('path'); +const fs = require('fs'); + +const packages = path.resolve(__dirname, '..', '..', 'packages'); + +/** @type {import('@babel/core').TransformOptions} */ +module.exports = function (api) { + api.cache(true); + + const alias = Object.fromEntries( + fs + .readdirSync(packages) + .filter((name) => !name.startsWith('.')) + .map((name) => { + const pak = require(`../../packages/${name}/package.json`); + + if (pak.source == null) { + return null; + } + + return [pak.name, path.resolve(packages, name, pak.source)]; + }) + .filter(Boolean) + ); + + return { + presets: ['module:@react-native/babel-preset'], + plugins: ['react-native-worklets/plugin'], + overrides: [ + { + exclude: /\/node_modules\//, + plugins: [ + [ + 'module-resolver', + { + extensions: ['.tsx', '.ts', '.js', '.json'], + alias, + }, + ], + ], + }, + ], + }; +}; diff --git a/apps/example/e2e/native-tabs-test-id.yaml b/packages/example-shared/e2e/native-tabs-test-id.yaml similarity index 93% rename from apps/example/e2e/native-tabs-test-id.yaml rename to packages/example-shared/e2e/native-tabs-test-id.yaml index 2f34fc3e..8431ac2c 100644 --- a/apps/example/e2e/native-tabs-test-id.yaml +++ b/packages/example-shared/e2e/native-tabs-test-id.yaml @@ -1,4 +1,4 @@ -appId: bottomtabs.example +appId: ${APP_ID} name: Navigate tabs via testIDs --- - launchApp diff --git a/packages/example-shared/package.json b/packages/example-shared/package.json new file mode 100644 index 00000000..c5b00530 --- /dev/null +++ b/packages/example-shared/package.json @@ -0,0 +1,40 @@ +{ + "name": "@bottom-tabs/example-shared", + "version": "0.0.0", + "private": true, + "source": "./src/App.tsx", + "main": "./src/App.tsx", + "exports": { + ".": "./src/App.tsx", + "./babel": "./babel.config.js" + }, + "scripts": { + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@bottom-tabs/react-navigation": "*", + "@react-navigation/bottom-tabs": "^7.15.9", + "@react-navigation/devtools": "^7.0.44", + "@react-navigation/native": "^7.3.0", + "@react-navigation/native-stack": "^7.14.11", + "@react-navigation/stack": "^7.8.10", + "color": "^5.0.0", + "react": "^19.2.3", + "react-native": "^0.87.1", + "react-native-bottom-tabs": "*", + "react-native-edge-to-edge": "^1.7.0", + "react-native-gesture-handler": "^3.2.1", + "react-native-paper": "^5.14.5", + "react-native-safe-area-context": "^5.9.1", + "react-native-screens": "^4.27.0", + "react-native-vector-icons": "^10.2.0", + "react-native-worklets": "^0.12.1" + }, + "devDependencies": { + "@react-native/babel-preset": "0.87.1", + "@react-native/metro-config": "0.87.1", + "@types/react-native-vector-icons": "^6.4.18", + "babel-plugin-module-resolver": "^5.0.2", + "typescript": "^5.9.2" + } +} diff --git a/apps/example/src/App.tsx b/packages/example-shared/src/App.tsx similarity index 100% rename from apps/example/src/App.tsx rename to packages/example-shared/src/App.tsx diff --git a/apps/example/src/Components/MusicControl.tsx b/packages/example-shared/src/Components/MusicControl.tsx similarity index 100% rename from apps/example/src/Components/MusicControl.tsx rename to packages/example-shared/src/Components/MusicControl.tsx diff --git a/apps/example/src/Examples/BottomAccessoryView.tsx b/packages/example-shared/src/Examples/BottomAccessoryView.tsx similarity index 100% rename from apps/example/src/Examples/BottomAccessoryView.tsx rename to packages/example-shared/src/Examples/BottomAccessoryView.tsx diff --git a/apps/example/src/Examples/CustomTabBar.tsx b/packages/example-shared/src/Examples/CustomTabBar.tsx similarity index 100% rename from apps/example/src/Examples/CustomTabBar.tsx rename to packages/example-shared/src/Examples/CustomTabBar.tsx diff --git a/apps/example/src/Examples/FiveTabs.tsx b/packages/example-shared/src/Examples/FiveTabs.tsx similarity index 100% rename from apps/example/src/Examples/FiveTabs.tsx rename to packages/example-shared/src/Examples/FiveTabs.tsx diff --git a/apps/example/src/Examples/FourTabs.tsx b/packages/example-shared/src/Examples/FourTabs.tsx similarity index 100% rename from apps/example/src/Examples/FourTabs.tsx rename to packages/example-shared/src/Examples/FourTabs.tsx diff --git a/apps/example/src/Examples/FourTabsRTL.tsx b/packages/example-shared/src/Examples/FourTabsRTL.tsx similarity index 100% rename from apps/example/src/Examples/FourTabsRTL.tsx rename to packages/example-shared/src/Examples/FourTabsRTL.tsx diff --git a/apps/example/src/Examples/JSBottomTabs.tsx b/packages/example-shared/src/Examples/JSBottomTabs.tsx similarity index 100% rename from apps/example/src/Examples/JSBottomTabs.tsx rename to packages/example-shared/src/Examples/JSBottomTabs.tsx diff --git a/apps/example/src/Examples/Labeled.tsx b/packages/example-shared/src/Examples/Labeled.tsx similarity index 100% rename from apps/example/src/Examples/Labeled.tsx rename to packages/example-shared/src/Examples/Labeled.tsx diff --git a/apps/example/src/Examples/LazyTabs.tsx b/packages/example-shared/src/Examples/LazyTabs.tsx similarity index 100% rename from apps/example/src/Examples/LazyTabs.tsx rename to packages/example-shared/src/Examples/LazyTabs.tsx diff --git a/apps/example/src/Examples/MaterialBottomTabs.tsx b/packages/example-shared/src/Examples/MaterialBottomTabs.tsx similarity index 100% rename from apps/example/src/Examples/MaterialBottomTabs.tsx rename to packages/example-shared/src/Examples/MaterialBottomTabs.tsx diff --git a/apps/example/src/Examples/NativeBottomTabs.tsx b/packages/example-shared/src/Examples/NativeBottomTabs.tsx similarity index 100% rename from apps/example/src/Examples/NativeBottomTabs.tsx rename to packages/example-shared/src/Examples/NativeBottomTabs.tsx diff --git a/apps/example/src/Examples/NativeBottomTabsCustomTabBar.tsx b/packages/example-shared/src/Examples/NativeBottomTabsCustomTabBar.tsx similarity index 100% rename from apps/example/src/Examples/NativeBottomTabsCustomTabBar.tsx rename to packages/example-shared/src/Examples/NativeBottomTabsCustomTabBar.tsx diff --git a/apps/example/src/Examples/NativeBottomTabsEmbeddedStacks.tsx b/packages/example-shared/src/Examples/NativeBottomTabsEmbeddedStacks.tsx similarity index 100% rename from apps/example/src/Examples/NativeBottomTabsEmbeddedStacks.tsx rename to packages/example-shared/src/Examples/NativeBottomTabsEmbeddedStacks.tsx diff --git a/apps/example/src/Examples/NativeBottomTabsFreezeOnBlur.tsx b/packages/example-shared/src/Examples/NativeBottomTabsFreezeOnBlur.tsx similarity index 100% rename from apps/example/src/Examples/NativeBottomTabsFreezeOnBlur.tsx rename to packages/example-shared/src/Examples/NativeBottomTabsFreezeOnBlur.tsx diff --git a/apps/example/src/Examples/NativeBottomTabsLazy.tsx b/packages/example-shared/src/Examples/NativeBottomTabsLazy.tsx similarity index 100% rename from apps/example/src/Examples/NativeBottomTabsLazy.tsx rename to packages/example-shared/src/Examples/NativeBottomTabsLazy.tsx diff --git a/apps/example/src/Examples/NativeBottomTabsOriginalIcons.tsx b/packages/example-shared/src/Examples/NativeBottomTabsOriginalIcons.tsx similarity index 100% rename from apps/example/src/Examples/NativeBottomTabsOriginalIcons.tsx rename to packages/example-shared/src/Examples/NativeBottomTabsOriginalIcons.tsx diff --git a/apps/example/src/Examples/NativeBottomTabsRemoteIcons.tsx b/packages/example-shared/src/Examples/NativeBottomTabsRemoteIcons.tsx similarity index 100% rename from apps/example/src/Examples/NativeBottomTabsRemoteIcons.tsx rename to packages/example-shared/src/Examples/NativeBottomTabsRemoteIcons.tsx diff --git a/apps/example/src/Examples/NativeBottomTabsSVGs.tsx b/packages/example-shared/src/Examples/NativeBottomTabsSVGs.tsx similarity index 100% rename from apps/example/src/Examples/NativeBottomTabsSVGs.tsx rename to packages/example-shared/src/Examples/NativeBottomTabsSVGs.tsx diff --git a/apps/example/src/Examples/NativeBottomTabsScreenLayout.tsx b/packages/example-shared/src/Examples/NativeBottomTabsScreenLayout.tsx similarity index 100% rename from apps/example/src/Examples/NativeBottomTabsScreenLayout.tsx rename to packages/example-shared/src/Examples/NativeBottomTabsScreenLayout.tsx diff --git a/apps/example/src/Examples/NativeBottomTabsTabBarHidden.tsx b/packages/example-shared/src/Examples/NativeBottomTabsTabBarHidden.tsx similarity index 100% rename from apps/example/src/Examples/NativeBottomTabsTabBarHidden.tsx rename to packages/example-shared/src/Examples/NativeBottomTabsTabBarHidden.tsx diff --git a/apps/example/src/Examples/NativeBottomTabsUnmounting.tsx b/packages/example-shared/src/Examples/NativeBottomTabsUnmounting.tsx similarity index 100% rename from apps/example/src/Examples/NativeBottomTabsUnmounting.tsx rename to packages/example-shared/src/Examples/NativeBottomTabsUnmounting.tsx diff --git a/apps/example/src/Examples/OriginalIconColors.tsx b/packages/example-shared/src/Examples/OriginalIconColors.tsx similarity index 100% rename from apps/example/src/Examples/OriginalIconColors.tsx rename to packages/example-shared/src/Examples/OriginalIconColors.tsx diff --git a/apps/example/src/Examples/SFSymbols.tsx b/packages/example-shared/src/Examples/SFSymbols.tsx similarity index 100% rename from apps/example/src/Examples/SFSymbols.tsx rename to packages/example-shared/src/Examples/SFSymbols.tsx diff --git a/apps/example/src/Examples/SixTabs.tsx b/packages/example-shared/src/Examples/SixTabs.tsx similarity index 100% rename from apps/example/src/Examples/SixTabs.tsx rename to packages/example-shared/src/Examples/SixTabs.tsx diff --git a/apps/example/src/Examples/TabBarHidden.tsx b/packages/example-shared/src/Examples/TabBarHidden.tsx similarity index 100% rename from apps/example/src/Examples/TabBarHidden.tsx rename to packages/example-shared/src/Examples/TabBarHidden.tsx diff --git a/apps/example/src/Examples/ThreeTabs.tsx b/packages/example-shared/src/Examples/ThreeTabs.tsx similarity index 100% rename from apps/example/src/Examples/ThreeTabs.tsx rename to packages/example-shared/src/Examples/ThreeTabs.tsx diff --git a/apps/example/src/Examples/TintColors.tsx b/packages/example-shared/src/Examples/TintColors.tsx similarity index 100% rename from apps/example/src/Examples/TintColors.tsx rename to packages/example-shared/src/Examples/TintColors.tsx diff --git a/apps/example/src/Screens/Albums.tsx b/packages/example-shared/src/Screens/Albums.tsx similarity index 100% rename from apps/example/src/Screens/Albums.tsx rename to packages/example-shared/src/Screens/Albums.tsx diff --git a/apps/example/src/Screens/Article.tsx b/packages/example-shared/src/Screens/Article.tsx similarity index 100% rename from apps/example/src/Screens/Article.tsx rename to packages/example-shared/src/Screens/Article.tsx diff --git a/apps/example/src/Screens/Chat.tsx b/packages/example-shared/src/Screens/Chat.tsx similarity index 100% rename from apps/example/src/Screens/Chat.tsx rename to packages/example-shared/src/Screens/Chat.tsx diff --git a/apps/example/src/Screens/Contacts.tsx b/packages/example-shared/src/Screens/Contacts.tsx similarity index 100% rename from apps/example/src/Screens/Contacts.tsx rename to packages/example-shared/src/Screens/Contacts.tsx diff --git a/packages/example-shared/tsconfig.json b/packages/example-shared/tsconfig.json new file mode 100644 index 00000000..313174df --- /dev/null +++ b/packages/example-shared/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig", + "references": [ + { "path": "../../packages/react-native-bottom-tabs" }, + { "path": "../../packages/react-navigation" } + ], + "compilerOptions": { + "rootDir": ".", + "paths": {}, + "composite": false, + "moduleResolution": "bundler", + "customConditions": ["react-native"], + "noEmit": true + } +} diff --git a/packages/react-native-bottom-tabs/Package.swift b/packages/react-native-bottom-tabs/Package.swift index bcd614c3..70720fff 100644 --- a/packages/react-native-bottom-tabs/Package.swift +++ b/packages/react-native-bottom-tabs/Package.swift @@ -14,7 +14,6 @@ let package = Package( products: [ .library( name: "react_native_bottom_tabs", - type: .dynamic, targets: ["react_native_bottom_tabs"] ), ], @@ -41,15 +40,23 @@ let package = Package( "react-native-bottom-tabs-Bridging-Header.h", "SVG", "include", + "Bridge", ] ), + .target( + name: "BottomTabsBridge", + dependencies: reactHeaders + ["BottomTabsSwift"], + path: "ios/Bridge", + publicHeadersPath: "." + ), .target( name: "react_native_bottom_tabs", dependencies: reactHeaders + [ - "BottomTabsSwift", + "BottomTabsBridge", .product(name: "ReactAppHeaders", package: "React-GeneratedCode"), ], path: ".", + exclude: ["node_modules", "android", "lib", "src"], sources: [ "ios/RCTTabViewComponentView.mm", "ios/RCTBottomAccessoryComponentView.mm", diff --git a/packages/react-native-bottom-tabs/ios/Bridge/BottomTabsBridge.h b/packages/react-native-bottom-tabs/ios/Bridge/BottomTabsBridge.h new file mode 100644 index 00000000..798e2cf0 --- /dev/null +++ b/packages/react-native-bottom-tabs/ios/Bridge/BottomTabsBridge.h @@ -0,0 +1,62 @@ +#ifdef SWIFT_PACKAGE +#pragma once +#import +#import + +// The Objective-C++ Fabric target talks to Swift through this Objective-C-only +// boundary. Xcode can import the Swift module in .m files without enabling C++ +// modules for React Native's textual C++ headers. +@protocol RNCTabViewProviderDelegate +- (void)onPageSelectedWithKey:(NSString *)key reactTag:(NSNumber *)reactTag; +- (void)onLongPressWithKey:(NSString *)key reactTag:(NSNumber *)reactTag; +- (void)onTabBarMeasuredWithHeight:(NSInteger)height reactTag:(NSNumber *)reactTag; +- (void)onLayoutWithSize:(CGSize)size reactTag:(NSNumber *)reactTag; +@end + +@protocol RNCBottomAccessoryProviderDelegate +- (void)onPlacementChangedWithPlacement:(NSString *)placement; +@end + +@protocol RNCTabViewProvider +@property(nonatomic, copy) NSArray *icons; +@property(nonatomic, copy) NSArray *focusedIcons; +@property(nonatomic) BOOL sidebarAdaptable; +@property(nonatomic) BOOL disablePageAnimations; +@property(nonatomic) BOOL labeled; +@property(nonatomic, copy) NSString *selectedPage; +@property(nonatomic) BOOL hapticFeedbackEnabled; +@property(nonatomic, copy) NSString *layoutDirection; +@property(nonatomic, copy) NSString *scrollEdgeAppearance; +@property(nonatomic, copy) NSString *minimizeBehavior; +@property(nonatomic) BOOL translucent; +@property(nonatomic, strong) UIColor *barTintColor; +@property(nonatomic, strong) UIColor *activeTintColor; +@property(nonatomic, strong) UIColor *inactiveTintColor; +@property(nonatomic) BOOL experimentalBakedTintColors; +@property(nonatomic, copy) NSString *fontFamily; +@property(nonatomic, copy) NSString *fontWeight; +@property(nonatomic, strong) NSNumber *fontSize; +@property(nonatomic) BOOL tabBarHidden; +@property(nonatomic, copy) NSArray *itemsData; +- (void)setImageLoader:(RCTImageLoader *)imageLoader; +- (void)insertChild:(UIView *)child atIndex:(NSInteger)index; +- (void)removeChildAtIndex:(NSInteger)index; +@end + +FOUNDATION_EXPORT UIView *RNCCreateTabViewProvider(id delegate); +FOUNDATION_EXPORT NSObject *RNCCreateBottomAccessoryProvider(id delegate); + +@interface RNCTabInfo : NSObject ++ (NSObject *)createWithKey:(NSString *)key + title:(NSString *)title + badge:(NSString *)badge + sfSymbol:(NSString *)sfSymbol + focusedSfSymbol:(NSString *)focusedSfSymbol + activeTintColor:(UIColor *)activeTintColor + iconRenderingMode:(NSString *)iconRenderingMode + hidden:(BOOL)hidden + testID:(NSString *)testID + role:(NSString *)role + preventsDefault:(BOOL)preventsDefault; +@end +#endif diff --git a/packages/react-native-bottom-tabs/ios/Bridge/BottomTabsBridge.m b/packages/react-native-bottom-tabs/ios/Bridge/BottomTabsBridge.m new file mode 100644 index 00000000..b0b27b2c --- /dev/null +++ b/packages/react-native-bottom-tabs/ios/Bridge/BottomTabsBridge.m @@ -0,0 +1,31 @@ +#ifdef SWIFT_PACKAGE +#import "BottomTabsBridge.h" +@import BottomTabsSwift; + +UIView *RNCCreateTabViewProvider(id delegate) { + return (UIView *)[[TabViewProvider alloc] initWithDelegate:(id)delegate]; +} + +NSObject *RNCCreateBottomAccessoryProvider(id delegate) { + return [[BottomAccessoryProvider alloc] initWithDelegate:(id)delegate]; +} + +@implementation RNCTabInfo ++ (NSObject *)createWithKey:(NSString *)key + title:(NSString *)title + badge:(NSString *)badge + sfSymbol:(NSString *)sfSymbol + focusedSfSymbol:(NSString *)focusedSfSymbol + activeTintColor:(UIColor *)activeTintColor + iconRenderingMode:(NSString *)iconRenderingMode + hidden:(BOOL)hidden + testID:(NSString *)testID + role:(NSString *)role + preventsDefault:(BOOL)preventsDefault { + return [[TabInfo alloc] initWithKey:key title:title badge:badge sfSymbol:sfSymbol + focusedSfSymbol:focusedSfSymbol activeTintColor:activeTintColor + iconRenderingMode:iconRenderingMode hidden:hidden testID:testID + role:role preventsDefault:preventsDefault]; +} +@end +#endif diff --git a/packages/react-native-bottom-tabs/ios/RCTBottomAccessoryComponentView.mm b/packages/react-native-bottom-tabs/ios/RCTBottomAccessoryComponentView.mm index 3063f4ed..1dd9543d 100644 --- a/packages/react-native-bottom-tabs/ios/RCTBottomAccessoryComponentView.mm +++ b/packages/react-native-bottom-tabs/ios/RCTBottomAccessoryComponentView.mm @@ -9,11 +9,7 @@ #import #if SWIFT_PACKAGE -#if __has_include() -#import -#else -#import "BottomTabsSwift-Swift.h" -#endif +#import "BottomTabsBridge.h" #elif __has_include("react_native_bottom_tabs/react_native_bottom_tabs-Swift.h") #import "react_native_bottom_tabs/react_native_bottom_tabs-Swift.h" #else @@ -22,7 +18,13 @@ using namespace facebook::react; -@interface RCTBottomAccessoryComponentView () { +#if SWIFT_PACKAGE +typedef NSObject BottomAccessoryProvider; +@interface RCTBottomAccessoryComponentView () +#else +@interface RCTBottomAccessoryComponentView () +#endif +{ BottomAccessoryProvider* bottomAccessoryProvider; } @end @@ -39,7 +41,11 @@ - (instancetype)initWithFrame:(CGRect)frame if (self = [super initWithFrame:frame]) { static const auto defaultProps = std::make_shared(); if (@available(iOS 26.0, *)) { +#if SWIFT_PACKAGE + bottomAccessoryProvider = RNCCreateBottomAccessoryProvider(self); +#else bottomAccessoryProvider = [[BottomAccessoryProvider alloc] initWithDelegate:self]; +#endif } } diff --git a/packages/react-native-bottom-tabs/ios/RCTTabViewComponentView.mm b/packages/react-native-bottom-tabs/ios/RCTTabViewComponentView.mm index fd68902b..8e9cae58 100644 --- a/packages/react-native-bottom-tabs/ios/RCTTabViewComponentView.mm +++ b/packages/react-native-bottom-tabs/ios/RCTTabViewComponentView.mm @@ -9,11 +9,7 @@ #import #if SWIFT_PACKAGE -#if __has_include() -#import -#else -#import "BottomTabsSwift-Swift.h" -#endif +#import "BottomTabsBridge.h" #elif __has_include("react_native_bottom_tabs/react_native_bottom_tabs-Swift.h") #import "react_native_bottom_tabs/react_native_bottom_tabs-Swift.h" #else @@ -23,7 +19,9 @@ #import #import #import -#if __has_include() +#if SWIFT_PACKAGE +#import +#elif __has_include() #import #else #import "RCTImagePrimitivesConversions.h" @@ -68,7 +66,14 @@ using namespace facebook::react; -@interface RCTTabViewComponentView () { +#if SWIFT_PACKAGE +typedef UIView TabViewProvider; +typedef NSObject TabInfo; +@interface RCTTabViewComponentView () +#else +@interface RCTTabViewComponentView () +#endif +{ } @end @@ -86,7 +91,11 @@ - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { static const auto defaultProps = std::make_shared(); +#if SWIFT_PACKAGE + _tabViewProvider = RNCCreateTabViewProvider(self); +#else _tabViewProvider = [[TabViewProvider alloc] initWithDelegate:self]; +#endif self.contentView = _tabViewProvider; _props = defaultProps; } @@ -218,7 +227,11 @@ - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const & NSMutableArray *result = [NSMutableArray array]; for (const auto& item : items) { +#if SWIFT_PACKAGE + auto tabInfo = [RNCTabInfo createWithKey:RCTNSStringFromString(item.key) +#else auto tabInfo = [[TabInfo alloc] initWithKey:RCTNSStringFromString(item.key) +#endif title:RCTNSStringFromString(item.title) badge:RCTNSStringFromStringNilIfEmpty(item.badge) sfSymbol:RCTNSStringFromStringNilIfEmpty(item.sfSymbol) diff --git a/yarn.config.cjs b/yarn.config.cjs new file mode 100644 index 00000000..f751f9e4 --- /dev/null +++ b/yarn.config.cjs @@ -0,0 +1,58 @@ +// Shared runtime dependencies stay explicit in each example's package.json. +// Edit versions here, then run yarn constraints --fix and yarn install. +const versions = { + '@bottom-tabs/react-navigation': '*', + '@react-navigation/bottom-tabs': '^7.15.9', + '@react-navigation/devtools': '^7.0.44', + '@react-navigation/native': '^7.3.0', + '@react-navigation/native-stack': '^7.14.11', + '@react-navigation/stack': '^7.8.10', + 'color': '^5.0.0', + 'react': '^19.2.3', + 'react-native': '^0.87.1', + 'react-native-bottom-tabs': '*', + 'react-native-edge-to-edge': '^1.7.0', + 'react-native-gesture-handler': '^3.2.1', + 'react-native-paper': '^5.14.5', + 'react-native-safe-area-context': '^5.9.1', + 'react-native-screens': '^4.27.0', + 'react-native-vector-icons': '^10.2.0', + 'react-native-worklets': '^0.12.1', +}; + +// Patch updates must be checked against the corresponding upstream release. +const swiftpmOverrides = { + 'react-native-gesture-handler': + 'patch:react-native-gesture-handler@npm%3A3.2.1#~/.yarn/patches/react-native-gesture-handler-npm-3.2.1-73a74f5c79.patch', + 'react-native-safe-area-context': + 'patch:react-native-safe-area-context@npm%3A5.9.1#~/.yarn/patches/react-native-safe-area-context-npm-5.9.1-b51fb9c5f7.patch', + 'react-native-screens': + 'patch:react-native-screens@npm%3A4.27.0#~/.yarn/patches/react-native-screens-npm-4.27.0-78335f53c6.patch', + 'react-native-vector-icons': + 'patch:react-native-vector-icons@npm%3A10.2.0#~/.yarn/patches/react-native-vector-icons-npm-10.2.0-e1aad1f85c.patch', + 'react-native-worklets': + 'patch:react-native-worklets@npm%3A0.12.1#~/.yarn/patches/react-native-worklets-npm-0.12.1-aa8a1b2670.patch', +}; + +const examples = new Set([ + 'apps/example', + 'apps/example-swiftpm', + 'packages/example-shared', +]); + +module.exports = { + async constraints({ Yarn }) { + for (const workspace of Yarn.workspaces()) { + if (!examples.has(workspace.cwd)) continue; + + const dependencies = { + ...versions, + ...(workspace.cwd === 'apps/example-swiftpm' ? swiftpmOverrides : {}), + }; + + for (const [name, version] of Object.entries(dependencies)) { + workspace.set(['dependencies', name], version); + } + } + }, +}; diff --git a/yarn.lock b/yarn.lock index 43f9c4ce..02cf712d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -99,7 +99,7 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.29.7": +"@babel/compat-data@npm:^7.28.6, @babel/compat-data@npm:^7.29.7": version: 7.29.7 resolution: "@babel/compat-data@npm:7.29.7" checksum: 10/ad2272714087f68970977f6e2b53597a8503fc9c3028c4a91686474bd77a707dd00903cdde4b73788972016d1bad4dc3fa4e5ff38e1ed8f1c3bde1095352973a @@ -129,6 +129,29 @@ __metadata: languageName: node linkType: hard +"@babel/core@npm:^7.24.4": + version: 7.29.7 + resolution: "@babel/core@npm:7.29.7" + dependencies: + "@babel/code-frame": "npm:^7.29.7" + "@babel/generator": "npm:^7.29.7" + "@babel/helper-compilation-targets": "npm:^7.29.7" + "@babel/helper-module-transforms": "npm:^7.29.7" + "@babel/helpers": "npm:^7.29.7" + "@babel/parser": "npm:^7.29.7" + "@babel/template": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + "@jridgewell/remapping": "npm:^2.3.5" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10/38e71cf81db790b0bb2a3a0c8140c2b1c87576b61dc6be676de4fab8c3be871af590a739e8c489fe8e8f9a8e5899fa11e35e59e9e09d40b259c6a675f2f98928 + languageName: node + linkType: hard + "@babel/core@npm:^7.28.4": version: 7.28.4 resolution: "@babel/core@npm:7.28.4" @@ -271,7 +294,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.29.7": +"@babel/helper-compilation-targets@npm:^7.28.6, @babel/helper-compilation-targets@npm:^7.29.7": version: 7.29.7 resolution: "@babel/helper-compilation-targets@npm:7.29.7" dependencies: @@ -361,6 +384,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-regexp-features-plugin@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.29.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.29.7" + regexpu-core: "npm:^6.3.1" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/bf79ffc671d824d00b43a018555cb9fb3f2bc8be8d8ed8c901131e4cd072cc83e610a2cbb580f5f84b60d70bf4c7a7a8c5a629b7b325e1a27dca86d96d2668e0 + languageName: node + linkType: hard + "@babel/helper-define-polyfill-provider@npm:^0.6.2, @babel/helper-define-polyfill-provider@npm:^0.6.3": version: 0.6.3 resolution: "@babel/helper-define-polyfill-provider@npm:0.6.3" @@ -391,6 +427,21 @@ __metadata: languageName: node linkType: hard +"@babel/helper-define-polyfill-provider@npm:^0.6.8": + version: 0.6.8 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.8" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + debug: "npm:^4.4.3" + lodash.debounce: "npm:^4.0.8" + resolve: "npm:^1.22.11" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10/a6f9fbb82578464da35eec88c7f3e70bdd95237bfc1d3ebb9cf4536a86a577b7c6e587f9a6797b01ee08629599ee2bc6fdab39e99de505751a30d9b4877202ab + languageName: node + linkType: hard + "@babel/helper-globals@npm:^7.28.0": version: 7.28.0 resolution: "@babel/helper-globals@npm:7.28.0" @@ -545,7 +596,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.29.7": +"@babel/helper-plugin-utils@npm:^7.28.6, @babel/helper-plugin-utils@npm:^7.29.7": version: 7.29.7 resolution: "@babel/helper-plugin-utils@npm:7.29.7" checksum: 10/6d16929fe5c792bbc8e4d67e18d7c1be69d2f18992deaa3d94dc26541fec662e83cbeeaf7553c6867d068eb7aed4e0d5e3e137c1dd4d5bcfa286f8d772f1f457 @@ -578,6 +629,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-remap-async-to-generator@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-remap-async-to-generator@npm:7.29.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.29.7" + "@babel/helper-wrap-function": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/98338ad6e34ebb4be2dc23f8d9199d28d6d8ac6a2ce8b90fe9efdf3595b39748321528d9f2540ec0586a6e45f7c84f5f623fbf980c5efa7fa9ba7ce837ea4b20 + languageName: node + linkType: hard + "@babel/helper-replace-supers@npm:^7.25.9, @babel/helper-replace-supers@npm:^7.26.5": version: 7.26.5 resolution: "@babel/helper-replace-supers@npm:7.26.5" @@ -732,6 +796,17 @@ __metadata: languageName: node linkType: hard +"@babel/helper-wrap-function@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-wrap-function@npm:7.29.7" + dependencies: + "@babel/template": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + checksum: 10/fc37b53a93c0814e5443c344fcd42b343c75856d865547ca0d50ddad73e96c27f6a677330d115232644e143066758188e4eb47ce5207124c095312b9e49599ed + languageName: node + linkType: hard + "@babel/helpers@npm:^7.26.9": version: 7.26.9 resolution: "@babel/helpers@npm:7.26.9" @@ -752,6 +827,16 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helpers@npm:7.29.7" + dependencies: + "@babel/template": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + checksum: 10/b4d1ef12c19e896585c009ba29677839097ff04f8b11a2430d335c3fb6bd667b4f9e96a3b185a083fdde6b1137eabbbf2600c32425cb69cefc81d81d5cfe425d + languageName: node + linkType: hard + "@babel/highlight@npm:^7.10.4": version: 7.25.9 resolution: "@babel/highlight@npm:7.25.9" @@ -775,25 +860,25 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.3, @babel/parser@npm:^7.28.4": - version: 7.28.4 - resolution: "@babel/parser@npm:7.28.4" +"@babel/parser@npm:^7.24.4, @babel/parser@npm:^7.29.0, @babel/parser@npm:^7.29.8": + version: 7.29.8 + resolution: "@babel/parser@npm:7.29.8" dependencies: - "@babel/types": "npm:^7.28.4" + "@babel/types": "npm:^7.29.8" bin: parser: ./bin/babel-parser.js - checksum: 10/f54c46213ef180b149f6a17ea765bf40acc1aebe2009f594e2a283aec69a190c6dda1fdf24c61a258dbeb903abb8ffb7a28f1a378f8ab5d333846ce7b7e23bf1 + checksum: 10/dbd14ebbba0fa3019acd2712b0db3ffd594d0850d4fc487667287b5702893f54a7911570ea842f0cff4dc492a2412e3287dfabfe00c6b78efa7becb1255f3f86 languageName: node linkType: hard -"@babel/parser@npm:^7.29.0, @babel/parser@npm:^7.29.8": - version: 7.29.8 - resolution: "@babel/parser@npm:7.29.8" +"@babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.3, @babel/parser@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/parser@npm:7.28.4" dependencies: - "@babel/types": "npm:^7.29.8" + "@babel/types": "npm:^7.28.4" bin: parser: ./bin/babel-parser.js - checksum: 10/dbd14ebbba0fa3019acd2712b0db3ffd594d0850d4fc487667287b5702893f54a7911570ea842f0cff4dc492a2412e3287dfabfe00c6b78efa7becb1255f3f86 + checksum: 10/f54c46213ef180b149f6a17ea765bf40acc1aebe2009f594e2a283aec69a190c6dda1fdf24c61a258dbeb903abb8ffb7a28f1a378f8ab5d333846ce7b7e23bf1 languageName: node linkType: hard @@ -832,6 +917,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/c0e85e9b4bf8706f23b58c1794ad398e41b69a639416578fd4c0ef5a5472365a8d1d7a533f94137daf3660e4f710a8b7e10bc8a53a91a41773ec92bf1725af98 + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.9" @@ -854,6 +951,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/ad06de66ccfb19f0f04e6124d144f3fef72fa5191861b1d04bc32cab87ce43958810d9632eac5881ef991a78b33e68588e3d90e76a63d917bd5a7ff4c96618f8 + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.9" @@ -876,6 +984,29 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/2189a2a648948107c59ad3bf028e5b71a85b28c840facfead769a33c5f63ae4ec0f147e6a2e664a91a506d4405f5a8972d2ca628f3b64d03edd7620d770761fb + languageName: node + linkType: hard + +"@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/a9bd13c2600bdfcb5b35590e210bcb30f009fda9bd1556567757ea4fcb8ca247750331d6d10774d68127cae4e529bc79abd86a28fe5e2a1cc2cc00e75964ac52 + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.25.9" @@ -902,6 +1033,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.29.7" + "@babel/plugin-transform-optional-chaining": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.13.0 + checksum: 10/76a494ec4f52a127b0208c4574a6da36f6ff5f30484306921762db549fa7d9d9183c837759eb68c0c9e5a56013aa247e6e02e02263384d2a103240353ae0ceb6 + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.9" @@ -926,6 +1070,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/73125174671241b3eb1fa7c7f53ed0894d3853f2afb280684492a707cf3e4a9c498537acb511c014d364018117e181bb265dbbb975ea0b1a61a6de60bae8f07e + languageName: node + linkType: hard + "@babel/plugin-proposal-decorators@npm:^7.12.9": version: 7.25.9 resolution: "@babel/plugin-proposal-decorators@npm:7.25.9" @@ -1080,6 +1236,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-assertions@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/a7f24858e7e833c2ee25779a355b5eff46e4bc93c98b06bda7ea0fd12faf99c4954e0f71074485512045920432790e0269aa562dd4d2085c3f8660ed1cfde8a1 + languageName: node + linkType: hard + "@babel/plugin-syntax-import-attributes@npm:^7.24.7, @babel/plugin-syntax-import-attributes@npm:^7.26.0": version: 7.26.0 resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0" @@ -1102,6 +1269,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-attributes@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/9f47345d09aae16b7ab52ecaf541cde3e3ae1e57e3eb2d4088e062b29dfbd67db55d42d529840557583d66121e2a98788df7a455401cc6d635c8b7700a02efc9 + languageName: node + linkType: hard + "@babel/plugin-syntax-import-meta@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" @@ -1290,6 +1468,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-arrow-functions@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/0037fd7563c7c91cddb8ce104e270bc260190d29c7a297df65e4306471010b4343366de13fab4602cf8ee6c672d3b313b34a01b62f27a333cad16908c83368d8 + languageName: node + linkType: hard + "@babel/plugin-transform-async-generator-functions@npm:^7.25.4, @babel/plugin-transform-async-generator-functions@npm:^7.26.8": version: 7.26.8 resolution: "@babel/plugin-transform-async-generator-functions@npm:7.26.8" @@ -1316,6 +1505,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-generator-functions@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + "@babel/helper-remap-async-to-generator": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/0abb8d8bb21e7293b3eda5a743051678478ab7c0392310a4a9e0417125a2bb8536a0a5f41a8062211d995479339afa7ffab6b0141f0839af8fbba367dd6a99c5 + languageName: node + linkType: hard + "@babel/plugin-transform-async-to-generator@npm:^7.24.7, @babel/plugin-transform-async-to-generator@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-async-to-generator@npm:7.25.9" @@ -1342,6 +1544,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-to-generator@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.29.7" + dependencies: + "@babel/helper-module-imports": "npm:^7.29.7" + "@babel/helper-plugin-utils": "npm:^7.29.7" + "@babel/helper-remap-async-to-generator": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/e24db9c4c69121daab25883f9a96e6849fa664c78c6bbcfb77fe0a0c6ab29b81ba39e8497985367463d3a88deac3b5bbe15dd1c5d0e5dd492cfccf8efdd27452 + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoped-functions@npm:^7.26.5": version: 7.26.5 resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.26.5" @@ -1364,6 +1579,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoped-functions@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/24f9712ade98061cd22088709b86b8e3e19ea416dbe5a69ad504fc3f8f2179af5bdeb32fcb9c24fc861bef515e41ae5ef72cd909e0e42bb0cf15838c4e737149 + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoping@npm:^7.25.0, @babel/plugin-transform-block-scoping@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-block-scoping@npm:7.25.9" @@ -1386,6 +1612,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoping@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-block-scoping@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/9c3cbbdda288b2eff7355ab94fc7b4b18f408d8e7145c2d6bd34e70eef03f200c699f527318ac11d9cd6e99124b5e8d6aeeba4421346ee5cdc224d06175d984f + languageName: node + linkType: hard + "@babel/plugin-transform-class-properties@npm:^7.25.4, @babel/plugin-transform-class-properties@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-class-properties@npm:7.25.9" @@ -1410,7 +1647,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.28.6": +"@babel/plugin-transform-class-properties@npm:^7.28.6, @babel/plugin-transform-class-properties@npm:^7.29.7": version: 7.29.7 resolution: "@babel/plugin-transform-class-properties@npm:7.29.7" dependencies: @@ -1446,6 +1683,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-class-static-block@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-class-static-block@npm:7.29.7" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.29.7" + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.12.0 + checksum: 10/9e7112dafb0e7791de3858cb721a76147e8cfc9b6ba370dd0267bdc193abdbe8a8f78db8d70e0f860d03497d861f0ac7e8cd3e8caf2639c59b57fc74eb3b95d0 + languageName: node + linkType: hard + "@babel/plugin-transform-classes@npm:^7.25.4, @babel/plugin-transform-classes@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-classes@npm:7.25.9" @@ -1478,7 +1727,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.28.4, @babel/plugin-transform-classes@npm:^7.28.6": +"@babel/plugin-transform-classes@npm:^7.28.4, @babel/plugin-transform-classes@npm:^7.28.6, @babel/plugin-transform-classes@npm:^7.29.7": version: 7.29.7 resolution: "@babel/plugin-transform-classes@npm:7.29.7" dependencies: @@ -1518,6 +1767,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-computed-properties@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-computed-properties@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + "@babel/template": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/c982355904fc113334ba108282c8a617e3159c6960de717bbe7c5fa86ff777baea04c117edc692fb4de22b01460bfedc62af3c6a9d0ecd81511f5eb8357d8bab + languageName: node + linkType: hard + "@babel/plugin-transform-destructuring@npm:^7.24.8, @babel/plugin-transform-destructuring@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-destructuring@npm:7.25.9" @@ -1541,6 +1802,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-destructuring@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-destructuring@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/e53caad0c2d523367724aefcc6b8c8df24fcb1a3f53e9899cb4bb5dc39ccf61e30df0a761d74485a895d9bcaaad49644879cbd3a9fc20c90501a5e831caaac5b + languageName: node + linkType: hard + "@babel/plugin-transform-dotall-regex@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-dotall-regex@npm:7.25.9" @@ -1565,6 +1838,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-dotall-regex@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.29.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.29.7" + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/537df0fb915a420df715a2f4da16ab6c08ce2370521edef9a8a59af23a533314109f6abd836c5e127c8cea4a46bc4a05692670cf7ad64868c286075fa2d7848c + languageName: node + linkType: hard + "@babel/plugin-transform-duplicate-keys@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-duplicate-keys@npm:7.25.9" @@ -1587,6 +1872,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-duplicate-keys@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/f0e7ad459dd9c78514c07a576fa509478aa9c7e90c1d7cf3b1d142579f8dadd609878c10b044dd2a3a2b08adbdb51b108fcb261d9a78443e13494a7985f9c2a7 + languageName: node + linkType: hard + "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.9" @@ -1611,6 +1907,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.29.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.29.7" + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/fa7fcdbede10dbc06fe4f861e90286f7f599d3f3c43e69445e63c3f48422fd34db0b0dd9bbebccd1dbd04a50fca4ab22fd82d28e7bc8fe9b6d5790c9e694d380 + languageName: node + linkType: hard + "@babel/plugin-transform-dynamic-import@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-dynamic-import@npm:7.25.9" @@ -1633,6 +1941,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-dynamic-import@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/58c035e6b9103c225f3d181671d9b3dec140351c3ecf12bc3a66b8653be41161f20135ada00a703244c2bfc9dd57b62fc54f77f2f6fe43df6c598358f377e6fa + languageName: node + linkType: hard + "@babel/plugin-transform-explicit-resource-management@npm:^7.28.0": version: 7.28.0 resolution: "@babel/plugin-transform-explicit-resource-management@npm:7.28.0" @@ -1645,6 +1964,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-explicit-resource-management@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-explicit-resource-management@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + "@babel/plugin-transform-destructuring": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/a4ea28a18161a7e8c8f33731cb3dfc6981cb089b9a6b57abfa7ff7579a0ca76a4c19c29ebaf775b037ff31503c74c6cf3687ce86cdaa246d1c60afb5abd820df + languageName: node + linkType: hard + "@babel/plugin-transform-exponentiation-operator@npm:^7.26.3": version: 7.26.3 resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.26.3" @@ -1667,6 +1998,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-exponentiation-operator@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/bf0366d77d318d4b6eae6880217e3fdfcb6e5f7913f658583de9537fd4fca1f05f9ac4083d8f946a84eaefec068cbba948be90f4a39484c85bc69082def3162d + languageName: node + linkType: hard + "@babel/plugin-transform-export-namespace-from@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-export-namespace-from@npm:7.25.9" @@ -1689,6 +2031,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-export-namespace-from@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/d157d62b144d1626b801e557dcede914db33e78f3f4230f487e5709c21efd40648f7f3a47a44a7fce694ad9cd117d2ac3ed796da0102275fd02b4fdb317d906b + languageName: node + linkType: hard + "@babel/plugin-transform-flow-strip-types@npm:^7.25.2": version: 7.26.5 resolution: "@babel/plugin-transform-flow-strip-types@npm:7.26.5" @@ -1737,6 +2090,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-for-of@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-for-of@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/af79d2859f7330c4b47fefc49a7849fb651ef062532beafdba5500fc13a46b9dfe1a853a27b73257a092d7e65a7b9956a8df9971c9908825d2f3b86b00c35c38 + languageName: node + linkType: hard + "@babel/plugin-transform-function-name@npm:^7.25.1, @babel/plugin-transform-function-name@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-function-name@npm:7.25.9" @@ -1763,6 +2128,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-function-name@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-function-name@npm:7.29.7" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.29.7" + "@babel/helper-plugin-utils": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/87a6329442ef8085fbc160e659f64562f0f5b63be65403b8bbb8e18c67dd7d03b82fb2e1371fdde734e2f05b13a72f88ed8d8cb03807150063954b9604d082cf + languageName: node + linkType: hard + "@babel/plugin-transform-json-strings@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-json-strings@npm:7.25.9" @@ -1785,6 +2163,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-json-strings@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-json-strings@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/3af97e144e0d986522f01803ffa0f90741530d1610952ac6a92511c356ecbf5616092ab1d21401d25bc7cb8ac90d73c2c7ff35e41766df2708c29d7e588cfa7f + languageName: node + linkType: hard + "@babel/plugin-transform-literals@npm:^7.25.2, @babel/plugin-transform-literals@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-literals@npm:7.25.9" @@ -1807,6 +2196,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-literals@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-literals@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/aadb2b3fe85186c274a07d5486aeef9496ce374e534fbc7b54f77985c75513422d9acec4c532f67b027e939644d93a69c00505b8909e259184c3ee5c5c62c46b + languageName: node + linkType: hard + "@babel/plugin-transform-logical-assignment-operators@npm:^7.24.7, @babel/plugin-transform-logical-assignment-operators@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.25.9" @@ -1829,6 +2229,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-logical-assignment-operators@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/374d83dfbb2de5e339d2966487c0f0d766cd67422addbd0172104ff2788b60317858172a7ab2cb6ee7d5bffad72ce07120fec009a2ef3b35551013fce4908686 + languageName: node + linkType: hard + "@babel/plugin-transform-member-expression-literals@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-member-expression-literals@npm:7.25.9" @@ -1851,6 +2262,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-member-expression-literals@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/698cbc9500e8caea1d36b48248112d60e023cea9d0772ac1ecf1639b38b662d9352043747dbe617fe1f6f17709bc17601534f7bf2f22c791fb86f7e2ab43e39f + languageName: node + linkType: hard + "@babel/plugin-transform-modules-amd@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-modules-amd@npm:7.25.9" @@ -1875,6 +2297,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-amd@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-modules-amd@npm:7.29.7" + dependencies: + "@babel/helper-module-transforms": "npm:^7.29.7" + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/a25cfc84db14a943cee1717030114e052152487af8784c015762a4fc11ee7b45127036c074044636b10c7251eb310c172904028a6f36abcae816e0cc685553b8 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-commonjs@npm:^7.24.8, @babel/plugin-transform-modules-commonjs@npm:^7.25.9, @babel/plugin-transform-modules-commonjs@npm:^7.26.3": version: 7.26.3 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.26.3" @@ -1939,6 +2373,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-systemjs@npm:^7.29.7": + version: 7.29.8 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.29.8" + dependencies: + "@babel/helper-module-transforms": "npm:^7.29.7" + "@babel/helper-plugin-utils": "npm:^7.29.7" + "@babel/helper-validator-identifier": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.8" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/926dcc428282f4a29e4b650e8f25131891f675cd9c9430587828f9453f9847077ae7d87d71abacfbb1ec5a9c7f97835f57bd84b834134541184c185b21e0e96e + languageName: node + linkType: hard + "@babel/plugin-transform-modules-umd@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-modules-umd@npm:7.25.9" @@ -1963,6 +2411,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-umd@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-modules-umd@npm:7.29.7" + dependencies: + "@babel/helper-module-transforms": "npm:^7.29.7" + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/74024ae1ecb702a766af6b3131a44be8b50d3614860ba857f8bb1e29c38acbecb14f66e2847082ccc5e188547aaa9678d9bbd67c20cef6f2e597f977a81f34dd + languageName: node + linkType: hard + "@babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.7, @babel/plugin-transform-named-capturing-groups-regex@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.25.9" @@ -1987,6 +2447,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.29.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.29.7" + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/3a481be133e9ca5d25570b5ed62daae323a51663bacf30fed0d1980e912047ebd34d6326533182db625fc0bbd086d1a23ed68ebb6108e7a68a8650c228afc084 + languageName: node + linkType: hard + "@babel/plugin-transform-new-target@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-new-target@npm:7.25.9" @@ -2009,6 +2481,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-new-target@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-new-target@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/6ef505da7107e46afe170a7c3dc69a2afb2a58276c172189cbba86ed669e64bf2884a16deb007257af399fcc3c2381c688b8bbed612c986ded82ac9fa43ab5b1 + languageName: node + linkType: hard + "@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.26.6": version: 7.26.6 resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.26.6" @@ -2031,7 +2514,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.28.6": +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.28.6, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.29.7": version: 7.29.7 resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.29.7" dependencies: @@ -2064,6 +2547,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-numeric-separator@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/6177df9e1a8a190bf4a360f8cbcfa614b70ededba61201bd0a38929770b6d00a8a54a19f8fda82cf60688d9bab938427a9fe5dae0a9e8cd8ed79c88a3b2dbcd7 + languageName: node + linkType: hard + "@babel/plugin-transform-object-rest-spread@npm:^7.24.7, @babel/plugin-transform-object-rest-spread@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-object-rest-spread@npm:7.25.9" @@ -2092,6 +2586,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-rest-spread@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.29.7" + dependencies: + "@babel/helper-compilation-targets": "npm:^7.29.7" + "@babel/helper-plugin-utils": "npm:^7.29.7" + "@babel/plugin-transform-destructuring": "npm:^7.29.7" + "@babel/plugin-transform-parameters": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/36b906179d21a2a3287fac5283b25584bd7b79eb2707c62fa8e75ab79b21b4e11b2670e6b2eafb99fb448495153587dc5cdeec1d8433ba175060e5c8101292b0 + languageName: node + linkType: hard + "@babel/plugin-transform-object-super@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-object-super@npm:7.25.9" @@ -2116,6 +2625,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-super@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-object-super@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + "@babel/helper-replace-supers": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/65ed8719563572c4917f19b32c476c9a9062fccf89bfd44a418bb734cd866034d66049499cace58e2bb4589da779983f534078bd989333f36268b9da08d4b33c + languageName: node + linkType: hard + "@babel/plugin-transform-optional-catch-binding@npm:^7.24.7, @babel/plugin-transform-optional-catch-binding@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.25.9" @@ -2138,6 +2659,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-optional-catch-binding@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/4b6e41e1dc5dbd02cfe0b96214130cca5fd3bd879551fc82188bb3d9a2782af9bab50f2140af9ff946a8ee23b9478ee42810641fb99aa3e033884d7c6103d138 + languageName: node + linkType: hard + "@babel/plugin-transform-optional-chaining@npm:^7.24.8, @babel/plugin-transform-optional-chaining@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-optional-chaining@npm:7.25.9" @@ -2162,7 +2694,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.28.6": +"@babel/plugin-transform-optional-chaining@npm:^7.28.6, @babel/plugin-transform-optional-chaining@npm:^7.29.7": version: 7.29.7 resolution: "@babel/plugin-transform-optional-chaining@npm:7.29.7" dependencies: @@ -2196,6 +2728,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-parameters@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-parameters@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/05faa7bbe1ae81eda6ab9bfca35476d7e55049b1ad182471a6e5a45a888ef1208977a0cbe0ee23b6920d4754d2386cd94026d705e32acff7a036b9db4110b566 + languageName: node + linkType: hard + "@babel/plugin-transform-private-methods@npm:^7.24.7, @babel/plugin-transform-private-methods@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-private-methods@npm:7.25.9" @@ -2220,6 +2763,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-private-methods@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-private-methods@npm:7.29.7" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.29.7" + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/5055af2b86a95acbf6bd1a14256edf439ba4f214707f6aa9f6a29d1168c882e5709853c4ff225f55575f88d3a58effbed952d25c5cd70f93785106541f992cdd + languageName: node + linkType: hard + "@babel/plugin-transform-private-property-in-object@npm:^7.24.7, @babel/plugin-transform-private-property-in-object@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-private-property-in-object@npm:7.25.9" @@ -2246,6 +2801,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-private-property-in-object@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.29.7" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.29.7" + "@babel/helper-create-class-features-plugin": "npm:^7.29.7" + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/72464fe21457daa2002b8fb8ab222dfc4a5fa4df33b99a371ca5594a28c933491d4373349cbff95caff33d8b5506d0350b1b7b0f4fde04ebd1defcdd5d7d9751 + languageName: node + linkType: hard + "@babel/plugin-transform-property-literals@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-property-literals@npm:7.25.9" @@ -2268,6 +2836,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-property-literals@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-property-literals@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/7e7a557df8feb50cd6913158c6d12df0e8a9da58e3f73e7cbfc08af399055b03e77a22b12c73d5bf6bb49239617d6189ccb6021ab03f0225bc54f9c74a880b62 + languageName: node + linkType: hard + "@babel/plugin-transform-react-display-name@npm:^7.24.7, @babel/plugin-transform-react-display-name@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-react-display-name@npm:7.25.9" @@ -2362,6 +2941,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-regenerator@npm:^7.29.7": + version: 7.29.8 + resolution: "@babel/plugin-transform-regenerator@npm:7.29.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/4dd85d21b9483ef84aea3292aa618ec468fb75178a45f651e2c9d540201580ed9d0c491a160b45d2c220e0a2d91d7f8284a70a9ae721ac5fc4c0aa68b23235fa + languageName: node + linkType: hard + "@babel/plugin-transform-regexp-modifiers@npm:^7.26.0": version: 7.26.0 resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.26.0" @@ -2386,6 +2976,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-regexp-modifiers@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.29.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.29.7" + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/bfbc6b898ace99b8412eb6e902b90856188c692e69672d42d48c5e22a5bf9b0d15d35424fda8501bfb06ba0504acc5f1b9e13eacaba232aa58af74472d6068dc + languageName: node + linkType: hard + "@babel/plugin-transform-reserved-words@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-reserved-words@npm:7.25.9" @@ -2408,6 +3010,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-reserved-words@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-reserved-words@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/ffd7f86ddce36c6ded2dd9218f81be8cbae35b1ed01100ac0a98623bd0a76c059188b70953ab5accae8f8430451e8ed4779d533ac5e35c523f5004a981208b7c + languageName: node + linkType: hard + "@babel/plugin-transform-runtime@npm:^7.24.7": version: 7.26.9 resolution: "@babel/plugin-transform-runtime@npm:7.26.9" @@ -2446,6 +3059,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-shorthand-properties@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/c57ef27853f334a6147da9aa00f8a8f4c3a1c217eb2efa73cba2e118edda10754fa23cec2c0c7f7408279ad28fef92c1f663dfec137a7503813331569c3e02f9 + languageName: node + linkType: hard + "@babel/plugin-transform-spread@npm:^7.24.7, @babel/plugin-transform-spread@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-spread@npm:7.25.9" @@ -2470,6 +3094,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-spread@npm:^7.29.7": + version: 7.29.8 + resolution: "@babel/plugin-transform-spread@npm:7.29.8" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/bcb0d92a87a534ff2ea46bfc9bd3190ca6f18cf7791ca291f7cfa856a9d74d8f4d930e53bd4a44c1d40e513039d133b08082233e9373b51b9e07406bc1d7720f + languageName: node + linkType: hard + "@babel/plugin-transform-sticky-regex@npm:^7.24.7, @babel/plugin-transform-sticky-regex@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-sticky-regex@npm:7.25.9" @@ -2492,6 +3128,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-sticky-regex@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/16b570c0270a59c2a29b2118c00e463882e9dda49b51a17dde3ae6b2886995d49f4bf2161a4c743ad1bca39d2aeb3ac963400e095682e105c7f751e6a2156c28 + languageName: node + linkType: hard + "@babel/plugin-transform-strict-mode@npm:^7.24.7": version: 7.25.9 resolution: "@babel/plugin-transform-strict-mode@npm:7.25.9" @@ -2521,7 +3168,18 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/93aad782503b691faef7c0893372d5243df3219b07f1f22cfc32c104af6a2e7acd6102c128439eab15336d048f1b214ca134b87b0630d8cd568bf447f78b25ce + checksum: 10/93aad782503b691faef7c0893372d5243df3219b07f1f22cfc32c104af6a2e7acd6102c128439eab15336d048f1b214ca134b87b0630d8cd568bf447f78b25ce + languageName: node + linkType: hard + +"@babel/plugin-transform-template-literals@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-template-literals@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/d1014dab020f0f802089de17bba82d929eda6ac87fde5f58fb9763885b8d645ce63fc1df97055c06a12d95a8788334a93b559fcaf1da6d7777a191e5f9c5646e languageName: node linkType: hard @@ -2547,6 +3205,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typeof-symbol@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/a22bbe6c46cc4b5dda7aeb907d0263f3c3f93763c0ea6f5cac3c511673ec0be3fc6d9f3d9e65450b14e231cb4ae1cdead29ca9e6b4a94d30485baeab50513f85 + languageName: node + linkType: hard + "@babel/plugin-transform-typescript@npm:^7.25.2, @babel/plugin-transform-typescript@npm:^7.25.9": version: 7.26.8 resolution: "@babel/plugin-transform-typescript@npm:7.26.8" @@ -2599,6 +3268,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-escapes@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.29.7" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/69ae159d4c7b5518c8009e96e406c5110c8238412d5f120b382c6f4fa2ff1226c3951d3fdc835461b81b29af78fe9131da51100b8fd47ef7eefe27d7d6d18b29 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-property-regex@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.25.9" @@ -2623,6 +3303,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-property-regex@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.29.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.29.7" + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/03ee0b5d27eee08ba71bc09e919eb648094123985b7adc7dc875e4172100596a47ab68337abf6814cbd3140c6552cf1044135eb0ec1ec78345e1270e5e6aabba + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-regex@npm:^7.24.7, @babel/plugin-transform-unicode-regex@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-unicode-regex@npm:7.25.9" @@ -2647,6 +3339,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-regex@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.29.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.29.7" + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/1ade0672ae5bbbf2ec1ea0a8de1b5d804ae414283215620097ab21cf7f05dae8916f5b0548a18c6f080ec17135018f5edd2d38f8fa9ca052af570cab5c712786 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-sets-regex@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.9" @@ -2671,6 +3375,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-sets-regex@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.29.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.29.7" + "@babel/helper-plugin-utils": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/680c22e2a63bffbf6798b0c2f599b06beb7ea4d29ee37a56c9192014143d396c479b12783d9c343e107fa491aeeb65b1ca774fd76825ffb306eef7fb5e7b4b2c + languageName: node + linkType: hard + "@babel/preset-env@npm:^7.25.2": version: 7.26.9 resolution: "@babel/preset-env@npm:7.26.9" @@ -2750,6 +3466,87 @@ __metadata: languageName: node linkType: hard +"@babel/preset-env@npm:^7.25.3": + version: 7.29.7 + resolution: "@babel/preset-env@npm:7.29.7" + dependencies: + "@babel/compat-data": "npm:^7.29.7" + "@babel/helper-compilation-targets": "npm:^7.29.7" + "@babel/helper-plugin-utils": "npm:^7.29.7" + "@babel/helper-validator-option": "npm:^7.29.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.29.7" + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.29.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.29.7" + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "npm:^7.29.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.29.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.29.7" + "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions": "npm:^7.29.7" + "@babel/plugin-syntax-import-attributes": "npm:^7.29.7" + "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" + "@babel/plugin-transform-arrow-functions": "npm:^7.29.7" + "@babel/plugin-transform-async-generator-functions": "npm:^7.29.7" + "@babel/plugin-transform-async-to-generator": "npm:^7.29.7" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.29.7" + "@babel/plugin-transform-block-scoping": "npm:^7.29.7" + "@babel/plugin-transform-class-properties": "npm:^7.29.7" + "@babel/plugin-transform-class-static-block": "npm:^7.29.7" + "@babel/plugin-transform-classes": "npm:^7.29.7" + "@babel/plugin-transform-computed-properties": "npm:^7.29.7" + "@babel/plugin-transform-destructuring": "npm:^7.29.7" + "@babel/plugin-transform-dotall-regex": "npm:^7.29.7" + "@babel/plugin-transform-duplicate-keys": "npm:^7.29.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.29.7" + "@babel/plugin-transform-dynamic-import": "npm:^7.29.7" + "@babel/plugin-transform-explicit-resource-management": "npm:^7.29.7" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.29.7" + "@babel/plugin-transform-export-namespace-from": "npm:^7.29.7" + "@babel/plugin-transform-for-of": "npm:^7.29.7" + "@babel/plugin-transform-function-name": "npm:^7.29.7" + "@babel/plugin-transform-json-strings": "npm:^7.29.7" + "@babel/plugin-transform-literals": "npm:^7.29.7" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.29.7" + "@babel/plugin-transform-member-expression-literals": "npm:^7.29.7" + "@babel/plugin-transform-modules-amd": "npm:^7.29.7" + "@babel/plugin-transform-modules-commonjs": "npm:^7.29.7" + "@babel/plugin-transform-modules-systemjs": "npm:^7.29.7" + "@babel/plugin-transform-modules-umd": "npm:^7.29.7" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.29.7" + "@babel/plugin-transform-new-target": "npm:^7.29.7" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.29.7" + "@babel/plugin-transform-numeric-separator": "npm:^7.29.7" + "@babel/plugin-transform-object-rest-spread": "npm:^7.29.7" + "@babel/plugin-transform-object-super": "npm:^7.29.7" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.29.7" + "@babel/plugin-transform-optional-chaining": "npm:^7.29.7" + "@babel/plugin-transform-parameters": "npm:^7.29.7" + "@babel/plugin-transform-private-methods": "npm:^7.29.7" + "@babel/plugin-transform-private-property-in-object": "npm:^7.29.7" + "@babel/plugin-transform-property-literals": "npm:^7.29.7" + "@babel/plugin-transform-regenerator": "npm:^7.29.7" + "@babel/plugin-transform-regexp-modifiers": "npm:^7.29.7" + "@babel/plugin-transform-reserved-words": "npm:^7.29.7" + "@babel/plugin-transform-shorthand-properties": "npm:^7.29.7" + "@babel/plugin-transform-spread": "npm:^7.29.7" + "@babel/plugin-transform-sticky-regex": "npm:^7.29.7" + "@babel/plugin-transform-template-literals": "npm:^7.29.7" + "@babel/plugin-transform-typeof-symbol": "npm:^7.29.7" + "@babel/plugin-transform-unicode-escapes": "npm:^7.29.7" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.29.7" + "@babel/plugin-transform-unicode-regex": "npm:^7.29.7" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.29.7" + "@babel/preset-modules": "npm:0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2: "npm:^0.4.15" + babel-plugin-polyfill-corejs3: "npm:^0.14.0" + babel-plugin-polyfill-regenerator: "npm:^0.6.6" + core-js-compat: "npm:^3.48.0" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/08df2b7dc47108cdd66f807bc6390caa20e54cc4780a320cf5a8049c37af49f3c03889e10bc7911a51bfd854360e120b9443fa039b51356a805784215b81b451 + languageName: node + linkType: hard + "@babel/preset-env@npm:^7.28.3": version: 7.28.3 resolution: "@babel/preset-env@npm:7.28.3" @@ -2968,7 +3765,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.29.0": +"@babel/traverse@npm:^7.29.0, @babel/traverse@npm:^7.29.8": version: 7.29.8 resolution: "@babel/traverse@npm:7.29.8" dependencies: @@ -3045,6 +3842,35 @@ __metadata: languageName: node linkType: hard +"@bottom-tabs/example-shared@workspace:*, @bottom-tabs/example-shared@workspace:packages/example-shared": + version: 0.0.0-use.local + resolution: "@bottom-tabs/example-shared@workspace:packages/example-shared" + dependencies: + "@bottom-tabs/react-navigation": "npm:*" + "@react-native/babel-preset": "npm:0.87.1" + "@react-native/metro-config": "npm:0.87.1" + "@react-navigation/bottom-tabs": "npm:^7.15.9" + "@react-navigation/devtools": "npm:^7.0.44" + "@react-navigation/native": "npm:^7.3.0" + "@react-navigation/native-stack": "npm:^7.14.11" + "@react-navigation/stack": "npm:^7.8.10" + "@types/react-native-vector-icons": "npm:^6.4.18" + babel-plugin-module-resolver: "npm:^5.0.2" + color: "npm:^5.0.0" + react: "npm:^19.2.3" + react-native: "npm:^0.87.1" + react-native-bottom-tabs: "npm:*" + react-native-edge-to-edge: "npm:^1.7.0" + react-native-gesture-handler: "npm:^3.2.1" + react-native-paper: "npm:^5.14.5" + react-native-safe-area-context: "npm:^5.9.1" + react-native-screens: "npm:^4.27.0" + react-native-vector-icons: "npm:^10.2.0" + react-native-worklets: "npm:^0.12.1" + typescript: "npm:^5.9.2" + languageName: unknown + linkType: soft + "@bottom-tabs/expo-template@workspace:packages/expo-template": version: 0.0.0-use.local resolution: "@bottom-tabs/expo-template@workspace:packages/expo-template" @@ -3674,6 +4500,17 @@ __metadata: languageName: node linkType: hard +"@eslint-community/eslint-utils@npm:^4.9.1": + version: 4.10.1 + resolution: "@eslint-community/eslint-utils@npm:4.10.1" + dependencies: + eslint-visitor-keys: "npm:^3.4.3" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10/61059b9f0192df5a86c441c03e0eedbda8c3810bb788775839afe4c5ec6bbdaa6433ac18001046b319390552435da3f6b8f5e18cca255993b3df37fe97a42b90 + languageName: node + linkType: hard + "@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": version: 4.12.1 resolution: "@eslint-community/regexpp@npm:4.12.1" @@ -3681,6 +4518,13 @@ __metadata: languageName: node linkType: hard +"@eslint-community/regexpp@npm:^4.12.2": + version: 4.12.2 + resolution: "@eslint-community/regexpp@npm:4.12.2" + checksum: 10/049b280fddf71dd325514e0a520024969431dc3a8b02fa77476e6820e9122f28ab4c9168c11821f91a27982d2453bcd7a66193356ea84e84fb7c8d793be1ba0c + languageName: node + linkType: hard + "@eslint/eslintrc@npm:^2.1.4": version: 2.1.4 resolution: "@eslint/eslintrc@npm:2.1.4" @@ -5422,7 +6266,7 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli@npm:^20.2.0": +"@react-native-community/cli@npm:20.2.0, @react-native-community/cli@npm:^20.2.0": version: 20.2.0 resolution: "@react-native-community/cli@npm:20.2.0" dependencies: @@ -5828,6 +6672,29 @@ __metadata: languageName: node linkType: hard +"@react-native/eslint-config@npm:0.87.1": + version: 0.87.1 + resolution: "@react-native/eslint-config@npm:0.87.1" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/eslint-parser": "npm:^7.25.1" + "@react-native/eslint-plugin": "npm:0.87.1" + "@typescript-eslint/eslint-plugin": "npm:^8.59.2" + "@typescript-eslint/parser": "npm:^8.59.2" + eslint-config-prettier: "npm:^8.5.0" + eslint-plugin-eslint-comments: "npm:^3.2.0" + eslint-plugin-ft-flow: "npm:^2.0.1" + eslint-plugin-jest: "npm:^29.0.1" + eslint-plugin-react: "npm:^7.37.5" + eslint-plugin-react-hooks: "npm:^7.0.1" + eslint-plugin-react-native: "npm:^5.0.0" + peerDependencies: + eslint: ^8.0.0 || ^9.0.0 + prettier: ">=2" + checksum: 10/c24e78c560da6acaaa16fcf946f722c00f163e477d379a3688517c6246b20ff0d47ce26aa921929f41e28f268e36e46654a7a25bd4405116e08b806a1f136cee + languageName: node + linkType: hard + "@react-native/eslint-plugin@npm:0.81.1": version: 0.81.1 resolution: "@react-native/eslint-plugin@npm:0.81.1" @@ -5835,6 +6702,13 @@ __metadata: languageName: node linkType: hard +"@react-native/eslint-plugin@npm:0.87.1": + version: 0.87.1 + resolution: "@react-native/eslint-plugin@npm:0.87.1" + checksum: 10/09726c0439793a63ff03dedcb4a1a08a546a5f4c89f3913e0cce02ce26364a442046bc3dcc24413c0614c5ede4cf926ddbead5eb1c4c54a581f923681c92398c + languageName: node + linkType: hard + "@react-native/gradle-plugin@npm:0.81.1": version: 0.81.1 resolution: "@react-native/gradle-plugin@npm:0.81.1" @@ -5856,6 +6730,21 @@ __metadata: languageName: node linkType: hard +"@react-native/jest-preset@npm:0.87.1": + version: 0.87.1 + resolution: "@react-native/jest-preset@npm:0.87.1" + dependencies: + "@jest/create-cache-key-function": "npm:^29.7.0" + "@react-native/js-polyfills": "npm:0.87.1" + babel-jest: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + regenerator-runtime: "npm:^0.13.2" + peerDependencies: + react: ^19.2.3 + checksum: 10/8beb5659d70aa58be56b75f3ddf74d8e9f358ab9cf0e69eb0f8cdd91a34516470ef666268d148534a7a3c0a1b44df7446f66a6f4c4e378b51f6327037e57f6f9 + languageName: node + linkType: hard + "@react-native/js-polyfills@npm:0.81.1": version: 0.81.1 resolution: "@react-native/js-polyfills@npm:0.81.1" @@ -7127,7 +8016,7 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:^29.5.12, @types/jest@npm:^29.5.5": +"@types/jest@npm:^29.5.12, @types/jest@npm:^29.5.13, @types/jest@npm:^29.5.5": version: 29.5.14 resolution: "@types/jest@npm:29.5.14" dependencies: @@ -7343,6 +8232,26 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/eslint-plugin@npm:^8.59.2": + version: 8.69.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.69.0" + dependencies: + "@eslint-community/regexpp": "npm:^4.12.2" + "@typescript-eslint/scope-manager": "npm:8.69.0" + "@typescript-eslint/type-utils": "npm:8.69.0" + "@typescript-eslint/utils": "npm:8.69.0" + "@typescript-eslint/visitor-keys": "npm:8.69.0" + ignore: "npm:^7.0.5" + natural-compare: "npm:^1.4.0" + ts-api-utils: "npm:^2.5.0" + peerDependencies: + "@typescript-eslint/parser": ^8.69.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10/3d020557de0cddb276d513800150934cfadffc507c4f808b753e1b7fe42a864b8f14c35063483867518108b71cb718ead22d17943513e72f2d0d4cf0fa2f558c + languageName: node + linkType: hard + "@typescript-eslint/parser@npm:^7.1.1": version: 7.18.0 resolution: "@typescript-eslint/parser@npm:7.18.0" @@ -7361,6 +8270,35 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/parser@npm:^8.59.2": + version: 8.69.0 + resolution: "@typescript-eslint/parser@npm:8.69.0" + dependencies: + "@typescript-eslint/scope-manager": "npm:8.69.0" + "@typescript-eslint/types": "npm:8.69.0" + "@typescript-eslint/typescript-estree": "npm:8.69.0" + "@typescript-eslint/visitor-keys": "npm:8.69.0" + debug: "npm:^4.4.3" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10/3266e512700dc0d55d0c41a5aab08a8f8ef36ef8e9bc94e6de6ab35205ec7259105914ed8d2464afedde24b0c70e3af6b5e46a1c96bdc31c1c307f4a8bab823d + languageName: node + linkType: hard + +"@typescript-eslint/project-service@npm:8.69.0": + version: 8.69.0 + resolution: "@typescript-eslint/project-service@npm:8.69.0" + dependencies: + "@typescript-eslint/tsconfig-utils": "npm:^8.69.0" + "@typescript-eslint/types": "npm:^8.69.0" + debug: "npm:^4.4.3" + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + checksum: 10/55a07db29e9b5fac47c437913c5fad1857abbaa3204446abba0754eb0ab8515f74dda8358ba1f9a1a7d7ee3af9af328f7ac709ecba7b64e3476b5c7d90529309 + languageName: node + linkType: hard + "@typescript-eslint/scope-manager@npm:5.62.0": version: 5.62.0 resolution: "@typescript-eslint/scope-manager@npm:5.62.0" @@ -7381,6 +8319,25 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:8.69.0": + version: 8.69.0 + resolution: "@typescript-eslint/scope-manager@npm:8.69.0" + dependencies: + "@typescript-eslint/types": "npm:8.69.0" + "@typescript-eslint/visitor-keys": "npm:8.69.0" + checksum: 10/6eafb382ad54848a796fe6ba6e29ff0f5db246d459a5c30a04a2144e3005d0ed0ee08e83abf2b943614ef02cc7f78358a722f028c87fbbee3a736a099b5b8bf1 + languageName: node + linkType: hard + +"@typescript-eslint/tsconfig-utils@npm:8.69.0, @typescript-eslint/tsconfig-utils@npm:^8.69.0": + version: 8.69.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.69.0" + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + checksum: 10/e180d2c88ae043f2099fc0ef0cbb4ab3b839b24df33d1f30c473aaccadec367584762ba6553e41377beb2df7504c4e2b82c97e9b00f013b066c835de80d5e66d + languageName: node + linkType: hard + "@typescript-eslint/type-utils@npm:7.18.0": version: 7.18.0 resolution: "@typescript-eslint/type-utils@npm:7.18.0" @@ -7398,6 +8355,22 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/type-utils@npm:8.69.0": + version: 8.69.0 + resolution: "@typescript-eslint/type-utils@npm:8.69.0" + dependencies: + "@typescript-eslint/types": "npm:8.69.0" + "@typescript-eslint/typescript-estree": "npm:8.69.0" + "@typescript-eslint/utils": "npm:8.69.0" + debug: "npm:^4.4.3" + ts-api-utils: "npm:^2.5.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10/3ae37edb88006fafe51339c1b7a232c5078188517b752472c9c8a8e3e682cfebec1bd594aaf5336092d078c7af7aaaaf4fb4cad9cdf6e1e4885ddd93acd673f4 + languageName: node + linkType: hard + "@typescript-eslint/types@npm:5.62.0": version: 5.62.0 resolution: "@typescript-eslint/types@npm:5.62.0" @@ -7412,6 +8385,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:8.69.0, @typescript-eslint/types@npm:^8.69.0": + version: 8.69.0 + resolution: "@typescript-eslint/types@npm:8.69.0" + checksum: 10/5a2c44249c8973b83e3cebfd6e968f545e1507e1b0dbf9f3bd672e6bad2f1d58167fa3d9af03fdd2df986cd19ad1aa9ce9fccc9504d25e068080d6e2b7471145 + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:5.62.0": version: 5.62.0 resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" @@ -7449,6 +8429,25 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:8.69.0": + version: 8.69.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.69.0" + dependencies: + "@typescript-eslint/project-service": "npm:8.69.0" + "@typescript-eslint/tsconfig-utils": "npm:8.69.0" + "@typescript-eslint/types": "npm:8.69.0" + "@typescript-eslint/visitor-keys": "npm:8.69.0" + debug: "npm:^4.4.3" + minimatch: "npm:^10.2.2" + semver: "npm:^7.7.3" + tinyglobby: "npm:^0.2.15" + ts-api-utils: "npm:^2.5.0" + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + checksum: 10/5859a19c78abb689265fbb9a435def29ec6e50777b75729164fd3a65a668999d6708dfd5e27c871773ba33a405f820654c9dfda16f485a89413db059d048a2d7 + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:7.18.0": version: 7.18.0 resolution: "@typescript-eslint/utils@npm:7.18.0" @@ -7463,6 +8462,21 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/utils@npm:8.69.0, @typescript-eslint/utils@npm:^8.0.0": + version: 8.69.0 + resolution: "@typescript-eslint/utils@npm:8.69.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.9.1" + "@typescript-eslint/scope-manager": "npm:8.69.0" + "@typescript-eslint/types": "npm:8.69.0" + "@typescript-eslint/typescript-estree": "npm:8.69.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10/6724b25b933dfd90437eb2747aae9448e312caabe949b7b7a9cfbee8b1554fef3e2db20162667f9379903bcc2faab5d77c7a0efa3eab9a5d857b76ae67a6b88f + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:^5.10.0": version: 5.62.0 resolution: "@typescript-eslint/utils@npm:5.62.0" @@ -7501,6 +8515,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:8.69.0": + version: 8.69.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.69.0" + dependencies: + "@typescript-eslint/types": "npm:8.69.0" + eslint-visitor-keys: "npm:^5.0.0" + checksum: 10/15096ea595db6c7571f2a2d6e20e55ff82409cd046af51bb7b9f9ac9fe74dba2fccc707c7a34040a028e126afc65ab3ee77f964a7cd4a0ffa26e9ceb17851b28 + languageName: node + linkType: hard + "@ungap/structured-clone@npm:^1.0.0, @ungap/structured-clone@npm:^1.2.0, @ungap/structured-clone@npm:^1.3.0": version: 1.3.0 resolution: "@ungap/structured-clone@npm:1.3.0" @@ -8049,6 +9073,13 @@ __metadata: languageName: node linkType: hard +"async-generator-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-generator-function@npm:1.0.0" + checksum: 10/3d49e7acbeee9e84537f4cb0e0f91893df8eba976759875ae8ee9e3d3c82f6ecdebdb347c2fad9926b92596d93cdfc78ecc988bcdf407e40433e8e8e6fe5d78e + languageName: node + linkType: hard + "async-limiter@npm:~1.0.0": version: 1.0.1 resolution: "async-limiter@npm:1.0.1" @@ -8153,6 +9184,19 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-corejs2@npm:^0.4.15": + version: 0.4.17 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.17" + dependencies: + "@babel/compat-data": "npm:^7.28.6" + "@babel/helper-define-polyfill-provider": "npm:^0.6.8" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10/35796b7f960d2e90ae78e9eb60491550976b839bbb4ce4c060df822cce191e4b5d93f13f0e64c2ba3ffc6ab3d32d3ced3f84ec567cc141088a11fa5a1628265d + languageName: node + linkType: hard + "babel-plugin-polyfill-corejs3@npm:^0.10.6": version: 0.10.6 resolution: "babel-plugin-polyfill-corejs3@npm:0.10.6" @@ -8189,6 +9233,18 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-corejs3@npm:^0.14.0": + version: 0.14.2 + resolution: "babel-plugin-polyfill-corejs3@npm:0.14.2" + dependencies: + "@babel/helper-define-polyfill-provider": "npm:^0.6.8" + core-js-compat: "npm:^3.48.0" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10/bb500bfec712eb5e8c9058dc299677a5325af7e09ebd725c89719f2f555eca3f2b1a8644137c8e67d7fc83d7be48a7189a1a385b61ed2cf63dbb64e79461b9ee + languageName: node + linkType: hard + "babel-plugin-polyfill-regenerator@npm:^0.6.1": version: 0.6.3 resolution: "babel-plugin-polyfill-regenerator@npm:0.6.3" @@ -8211,6 +9267,17 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-regenerator@npm:^0.6.6": + version: 0.6.8 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.8" + dependencies: + "@babel/helper-define-polyfill-provider": "npm:^0.6.8" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10/974464353d6f974e97673385aff616a913c0b76039eab8c5317a2d07c661e080f3dcc213e86f3eae40010172a27ab793cda7a290a8a899716f9a22df9b1d92d2 + languageName: node + linkType: hard + "babel-plugin-react-compiler@npm:^1.0.0": version: 1.0.0 resolution: "babel-plugin-react-compiler@npm:1.0.0" @@ -8367,6 +9434,15 @@ __metadata: languageName: node linkType: hard +"baseline-browser-mapping@npm:^2.11.20": + version: 2.11.21 + resolution: "baseline-browser-mapping@npm:2.11.21" + bin: + baseline-browser-mapping: dist/cli.cjs + checksum: 10/b4d223df8dbb8deeaa3dae3b9b60ad48b24c57a5473827b5a6ee1c21917e7c37af2185224c5366f2932654ec5fb1a9fee4f95fe7213cc29f4347550f25e4234b + languageName: node + linkType: hard + "better-opn@npm:~3.0.2": version: 3.0.2 resolution: "better-opn@npm:3.0.2" @@ -8526,6 +9602,21 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.28.7": + version: 4.28.9 + resolution: "browserslist@npm:4.28.9" + dependencies: + baseline-browser-mapping: "npm:^2.11.20" + caniuse-lite: "npm:^1.0.30001810" + electron-to-chromium: "npm:^1.5.420" + node-releases: "npm:^2.0.54" + update-browserslist-db: "npm:^1.3.2" + bin: + browserslist: cli.js + checksum: 10/493e5e3c11d4bdd34ce8cb7ed5edc98bc5948457e6a3cc1268b253d0ff9a616033b10980515e0e6faeddae745fb9c330cd4510189d681ad86f9ce0b2da3c840e + languageName: node + linkType: hard + "bser@npm:2.1.1": version: 2.1.1 resolution: "bser@npm:2.1.1" @@ -8618,6 +9709,16 @@ __metadata: languageName: node linkType: hard +"call-bound@npm:^1.0.4": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + get-intrinsic: "npm:^1.3.0" + checksum: 10/ef2b96e126ec0e58a7ff694db43f4d0d44f80e641370c21549ed911fecbdbc2df3ebc9bddad918d6bbdefeafb60bb3337902006d5176d72bcd2da74820991af7 + languageName: node + linkType: hard + "caller-callsite@npm:^2.0.0": version: 2.0.0 resolution: "caller-callsite@npm:2.0.0" @@ -8689,6 +9790,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001810": + version: 1.0.30001810 + resolution: "caniuse-lite@npm:1.0.30001810" + checksum: 10/47d7db627c3f3d1a10e06eef9efbb84295c6ef9d959b585b64032cc293637ca7b9b6af7e5d5752972b3e690d9561f14b9561db03890fbc6e38dc1aaa54e51d97 + languageName: node + linkType: hard + "ccount@npm:^2.0.0": version: 2.0.1 resolution: "ccount@npm:2.0.1" @@ -9264,6 +10372,15 @@ __metadata: languageName: node linkType: hard +"core-js-compat@npm:^3.48.0": + version: 3.50.0 + resolution: "core-js-compat@npm:3.50.0" + dependencies: + browserslist: "npm:^4.28.7" + checksum: 10/491d522653c8e606b9548f030e247fb84c9374f897dd56703691206501d30c51e08f77c69f9a60ec36fc4a9d31495c6bcd5433ac03af5c62c69fe467ebb84b1e + languageName: node + linkType: hard + "core-js@npm:~3.45.1": version: 3.45.1 resolution: "core-js@npm:3.45.1" @@ -9902,6 +11019,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.5.420": + version: 1.5.422 + resolution: "electron-to-chromium@npm:1.5.422" + checksum: 10/a4cc1bd7204bdb3da063f1ad8103f9990e03da3d0dae0aaf75e1669f2c36a9ae807498c5b27eed61fa98d6b10baf7fe05ff6038a99a4a85a0285e623825253d6 + languageName: node + linkType: hard + "electron-to-chromium@npm:^1.5.73": version: 1.5.109 resolution: "electron-to-chromium@npm:1.5.109" @@ -10347,6 +11471,27 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-jest@npm:^29.0.1": + version: 29.16.6 + resolution: "eslint-plugin-jest@npm:29.16.6" + dependencies: + "@typescript-eslint/utils": "npm:^8.0.0" + peerDependencies: + "@typescript-eslint/eslint-plugin": ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + jest: "*" + typescript: ">=4.8.4 <8.0.0" + peerDependenciesMeta: + "@typescript-eslint/eslint-plugin": + optional: true + jest: + optional: true + typescript: + optional: true + checksum: 10/080eb1b22e583c06ac881963f7cf8aa52448ef015d743fd7fe519853ff7a6ebac05d55001f64e4d7298af006d5d7e636186e83a6850695b3f901d7e62acfe77b + languageName: node + linkType: hard + "eslint-plugin-prettier@npm:^5.0.1": version: 5.2.3 resolution: "eslint-plugin-prettier@npm:5.2.3" @@ -10376,6 +11521,21 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-react-hooks@npm:^7.0.1": + version: 7.1.1 + resolution: "eslint-plugin-react-hooks@npm:7.1.1" + dependencies: + "@babel/core": "npm:^7.24.4" + "@babel/parser": "npm:^7.24.4" + hermes-parser: "npm:^0.25.1" + zod: "npm:^3.25.0 || ^4.0.0" + zod-validation-error: "npm:^3.5.0 || ^4.0.0" + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 + checksum: 10/9dfe543af9813343f7cc7c5079b02da94a3b4c15df5cefdeef731f220120df26471d0db24c943222d2d9c6b43c3b78faea47ada9acc9dfd9c28492153cbc6902 + languageName: node + linkType: hard + "eslint-plugin-react-native-globals@npm:^0.1.1": version: 0.1.2 resolution: "eslint-plugin-react-native-globals@npm:0.1.2" @@ -10383,14 +11543,25 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react-native@npm:^4.0.0": - version: 4.1.0 - resolution: "eslint-plugin-react-native@npm:4.1.0" +"eslint-plugin-react-native@npm:^4.0.0": + version: 4.1.0 + resolution: "eslint-plugin-react-native@npm:4.1.0" + dependencies: + eslint-plugin-react-native-globals: "npm:^0.1.1" + peerDependencies: + eslint: ^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8 + checksum: 10/fb2d65a3faca9bf775a0fa430eb7e86b7c27d0b256916d4f79a94def9ad353c8a10605f1f0dc9a5fb10e446b003341d53af9d8cbca4dd7ba394350355efa30c6 + languageName: node + linkType: hard + +"eslint-plugin-react-native@npm:^5.0.0": + version: 5.0.0 + resolution: "eslint-plugin-react-native@npm:5.0.0" dependencies: eslint-plugin-react-native-globals: "npm:^0.1.1" peerDependencies: - eslint: ^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 10/fb2d65a3faca9bf775a0fa430eb7e86b7c27d0b256916d4f79a94def9ad353c8a10605f1f0dc9a5fb10e446b003341d53af9d8cbca4dd7ba394350355efa30c6 + eslint: ^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + checksum: 10/41e84d806b74e3b4906c5541cad0caf1c79e30031130a1f3e92f9c030fb12e9ee4b193ea7b6ed5c425f2d83795e7f3ca51ab357e7e8f1f3d89c12fd4613343be languageName: node linkType: hard @@ -10422,6 +11593,34 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-react@npm:^7.37.5": + version: 7.37.5 + resolution: "eslint-plugin-react@npm:7.37.5" + dependencies: + array-includes: "npm:^3.1.8" + array.prototype.findlast: "npm:^1.2.5" + array.prototype.flatmap: "npm:^1.3.3" + array.prototype.tosorted: "npm:^1.1.4" + doctrine: "npm:^2.1.0" + es-iterator-helpers: "npm:^1.2.1" + estraverse: "npm:^5.3.0" + hasown: "npm:^2.0.2" + jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" + minimatch: "npm:^3.1.2" + object.entries: "npm:^1.1.9" + object.fromentries: "npm:^2.0.8" + object.values: "npm:^1.2.1" + prop-types: "npm:^15.8.1" + resolve: "npm:^2.0.0-next.5" + semver: "npm:^6.3.1" + string.prototype.matchall: "npm:^4.0.12" + string.prototype.repeat: "npm:^1.0.0" + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + checksum: 10/ee1bd4e0ec64f29109d5a625bb703d179c82e0159c86c3f1b52fc1209d2994625a137dae303c333fb308a2e38315e44066d5204998177e31974382f9fda25d5c + languageName: node + linkType: hard + "eslint-scope@npm:5.1.1, eslint-scope@npm:^5.1.1": version: 5.1.1 resolution: "eslint-scope@npm:5.1.1" @@ -10456,7 +11655,14 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8.51.0": +"eslint-visitor-keys@npm:^5.0.0": + version: 5.0.1 + resolution: "eslint-visitor-keys@npm:5.0.1" + checksum: 10/f9cc1a57b75e0ef949545cac33d01e8367e302de4c1483266ed4d8646ee5c306376660196bbb38b004e767b7043d1e661cb4336b49eff634a1bbe75c1db709ec + languageName: node + linkType: hard + +"eslint@npm:^8.19.0, eslint@npm:^8.51.0": version: 8.57.1 resolution: "eslint@npm:8.57.1" dependencies: @@ -10646,6 +11852,52 @@ __metadata: languageName: node linkType: hard +"example-swiftpm@workspace:apps/example-swiftpm": + version: 0.0.0-use.local + resolution: "example-swiftpm@workspace:apps/example-swiftpm" + dependencies: + "@babel/core": "npm:^7.25.2" + "@babel/preset-env": "npm:^7.25.3" + "@babel/runtime": "npm:^7.25.0" + "@bottom-tabs/example-shared": "workspace:*" + "@bottom-tabs/react-navigation": "npm:*" + "@react-native-community/cli": "npm:20.2.0" + "@react-native-community/cli-platform-ios": "npm:20.2.0" + "@react-native/babel-preset": "npm:0.87.1" + "@react-native/eslint-config": "npm:0.87.1" + "@react-native/jest-preset": "npm:0.87.1" + "@react-native/metro-config": "npm:0.87.1" + "@react-native/typescript-config": "npm:0.87.1" + "@react-navigation/bottom-tabs": "npm:^7.15.9" + "@react-navigation/devtools": "npm:^7.0.44" + "@react-navigation/native": "npm:^7.3.0" + "@react-navigation/native-stack": "npm:^7.14.11" + "@react-navigation/stack": "npm:^7.8.10" + "@rnx-kit/metro-config": "npm:^2.2.4" + "@types/jest": "npm:^29.5.13" + "@types/react": "npm:^19.2.0" + "@types/react-native-vector-icons": "npm:^6.4.18" + "@types/react-test-renderer": "npm:^19.1.0" + babel-plugin-module-resolver: "npm:^5.0.2" + color: "npm:^5.0.0" + eslint: "npm:^8.19.0" + jest: "npm:^29.6.3" + prettier: "npm:^3.0.0" + react: "npm:^19.2.3" + react-native: "npm:^0.87.1" + react-native-bottom-tabs: "npm:*" + react-native-edge-to-edge: "npm:^1.7.0" + react-native-gesture-handler: "patch:react-native-gesture-handler@npm%3A3.2.1#~/.yarn/patches/react-native-gesture-handler-npm-3.2.1-73a74f5c79.patch" + react-native-paper: "npm:^5.14.5" + react-native-safe-area-context: "patch:react-native-safe-area-context@npm%3A5.9.1#~/.yarn/patches/react-native-safe-area-context-npm-5.9.1-b51fb9c5f7.patch" + react-native-screens: "patch:react-native-screens@npm%3A4.27.0#~/.yarn/patches/react-native-screens-npm-4.27.0-78335f53c6.patch" + react-native-vector-icons: "patch:react-native-vector-icons@npm%3A10.2.0#~/.yarn/patches/react-native-vector-icons-npm-10.2.0-e1aad1f85c.patch" + react-native-worklets: "patch:react-native-worklets@npm%3A0.12.1#~/.yarn/patches/react-native-worklets-npm-0.12.1-aa8a1b2670.patch" + react-test-renderer: "npm:19.2.3" + typescript: "npm:^5.9.2" + languageName: unknown + linkType: soft + "execa@npm:^4.0.3": version: 4.1.0 resolution: "execa@npm:4.1.0" @@ -11443,6 +12695,13 @@ __metadata: languageName: node linkType: hard +"generator-function@npm:^2.0.0": + version: 2.0.1 + resolution: "generator-function@npm:2.0.1" + checksum: 10/eb7e7eb896c5433f3d40982b2ccacdb3dd990dd3499f14040e002b5d54572476513be8a2e6f9609f6e41ab29f2c4469307611ddbfc37ff4e46b765c326663805 + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -11475,6 +12734,27 @@ __metadata: languageName: node linkType: hard +"get-intrinsic@npm:^1.3.0": + version: 1.3.1 + resolution: "get-intrinsic@npm:1.3.1" + dependencies: + async-function: "npm:^1.0.0" + async-generator-function: "npm:^1.0.0" + call-bind-apply-helpers: "npm:^1.0.2" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + function-bind: "npm:^1.1.2" + generator-function: "npm:^2.0.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + math-intrinsics: "npm:^1.1.0" + checksum: 10/bb579dda84caa4a3a41611bdd483dade7f00f246f2a7992eb143c5861155290df3fdb48a8406efa3dfb0b434e2c8fafa4eebd469e409d0439247f85fc3fa2cc1 + languageName: node + linkType: hard + "get-nonce@npm:^1.0.0": version: 1.0.1 resolution: "get-nonce@npm:1.0.1" @@ -11813,6 +13093,15 @@ __metadata: languageName: node linkType: hard +"hasown@npm:^2.0.3": + version: 2.0.4 + resolution: "hasown@npm:2.0.4" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10/13823863ae48161068b4c51606a3128451c66f14545a5169d667fe9fca168dcd38c27570c7a299e32ef844b8da3d55def7fe88602f8970d4311fb543ee88001a + languageName: node + linkType: hard + "hast-util-from-parse5@npm:^8.0.0": version: 8.0.3 resolution: "hast-util-from-parse5@npm:8.0.3" @@ -11996,6 +13285,13 @@ __metadata: languageName: node linkType: hard +"hermes-estree@npm:0.25.1": + version: 0.25.1 + resolution: "hermes-estree@npm:0.25.1" + checksum: 10/7b1eca98b264a25632064cffa5771360d30cf452e77db1e191f9913ee45cf78c292b2dbca707e92fb71b0870abb97e94b506a5ab80abd96ba237fee169b601fe + languageName: node + linkType: hard + "hermes-estree@npm:0.28.1": version: 0.28.1 resolution: "hermes-estree@npm:0.28.1" @@ -12060,6 +13356,15 @@ __metadata: languageName: node linkType: hard +"hermes-parser@npm:^0.25.1": + version: 0.25.1 + resolution: "hermes-parser@npm:0.25.1" + dependencies: + hermes-estree: "npm:0.25.1" + checksum: 10/805efc05691420f236654349872c70731121791fa54de521c7ee51059eae34f84dd19f22ee846741dcb60372f8fb5335719b96b4ecb010d2aed7d872f2eff9cc + languageName: node + linkType: hard + "hoist-non-react-statics@npm:^3.3.0": version: 3.3.2 resolution: "hoist-non-react-statics@npm:3.3.2" @@ -12301,6 +13606,13 @@ __metadata: languageName: node linkType: hard +"ignore@npm:^7.0.5": + version: 7.0.8 + resolution: "ignore@npm:7.0.8" + checksum: 10/100573dc4ab73ffe0f2231194850a45c6687ac74deb3dce1050add0f849e42d5e530acf59d5612c959afdb83149dec92cfcaf8b44f02d7b57b03fb46fbe9cbc3 + languageName: node + linkType: hard + "image-size@npm:^1.0.2": version: 1.2.0 resolution: "image-size@npm:1.2.0" @@ -12544,6 +13856,15 @@ __metadata: languageName: node linkType: hard +"is-core-module@npm:^2.16.1": + version: 2.16.2 + resolution: "is-core-module@npm:2.16.2" + dependencies: + hasown: "npm:^2.0.3" + checksum: 10/6ee7535d82bbe457685799c5f145daf4b7c6be3afbd8e90788429d557f663d6dee72a8e4b9a45d0d756c243fcb5028095999243df090e5f04c02b153786bc8c6 + languageName: node + linkType: hard + "is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": version: 1.0.2 resolution: "is-data-view@npm:1.0.2" @@ -13530,7 +14851,7 @@ __metadata: languageName: node linkType: hard -"jest@npm:^29.2.1, jest@npm:^29.7.0": +"jest@npm:^29.2.1, jest@npm:^29.6.3, jest@npm:^29.7.0": version: 29.7.0 resolution: "jest@npm:29.7.0" dependencies: @@ -13672,7 +14993,7 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^3.0.2": +"jsesc@npm:^3.0.2, jsesc@npm:~3.1.0": version: 3.1.0 resolution: "jsesc@npm:3.1.0" bin: @@ -16089,6 +17410,13 @@ __metadata: languageName: node linkType: hard +"node-releases@npm:^2.0.54": + version: 2.0.54 + resolution: "node-releases@npm:2.0.54" + checksum: 10/36380abbe4ce6f5bfec7dab13fa8174e67d2c316a9cbedcd01196bd37dbec99ca7214caf7a91f05d27ae17657d5cb55f39c53db216a7992fd9a2e29966ebd2ba + languageName: node + linkType: hard + "node-stream-zip@npm:^1.9.1": version: 1.15.0 resolution: "node-stream-zip@npm:1.15.0" @@ -16253,6 +17581,18 @@ __metadata: languageName: node linkType: hard +"object.entries@npm:^1.1.9": + version: 1.1.9 + resolution: "object.entries@npm:1.1.9" + dependencies: + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" + define-properties: "npm:^1.2.1" + es-object-atoms: "npm:^1.1.1" + checksum: 10/24163ab1e1e013796693fc5f5d349e8b3ac0b6a34a7edb6c17d3dd45c6a8854145780c57d302a82512c1582f63720f4b4779d6c1cfba12cbb1420b978802d8a3 + languageName: node + linkType: hard + "object.fromentries@npm:^2.0.8": version: 2.0.8 resolution: "object.fromentries@npm:2.0.8" @@ -16825,6 +18165,15 @@ __metadata: languageName: node linkType: hard +"prettier@npm:^3.0.0": + version: 3.9.6 + resolution: "prettier@npm:3.9.6" + bin: + prettier: bin/prettier.cjs + checksum: 10/1dd1a1e0e40ec3b91cda9d294c4a95022aef61880ca3f441aad99b1252279f58a766c4cece81132c01550dcff1fd445efbd8812ea4a2374313e7fc6c8136f11f + languageName: node + linkType: hard + "prettier@npm:^3.0.3": version: 3.5.3 resolution: "prettier@npm:3.5.3" @@ -17139,6 +18488,13 @@ __metadata: languageName: node linkType: hard +"react-is@npm:^19.2.3": + version: 19.2.8 + resolution: "react-is@npm:19.2.8" + checksum: 10/09d053ff36e0ba4d47164baf9eab1c7772791f0371aa92281f0e547e0f6a5a5c8a1eb939aadd1a08b3c565958dd63ee59c746b6ac0d5ccb14ad742ac0314ab15 + languageName: node + linkType: hard + "react-lazy-with-preload@npm:^2.2.1": version: 2.2.1 resolution: "react-lazy-with-preload@npm:2.2.1" @@ -17163,6 +18519,7 @@ __metadata: "@babel/core": "npm:^7.28.4" "@babel/preset-env": "npm:^7.28.3" "@babel/runtime": "npm:^7.28.4" + "@bottom-tabs/example-shared": "workspace:*" "@bottom-tabs/react-navigation": "npm:*" "@react-native-community/cli": "npm:^20.2.0" "@react-native/babel-preset": "npm:0.87.1" @@ -17257,7 +18614,7 @@ __metadata: languageName: node linkType: hard -"react-native-gesture-handler@npm:^3.2.1": +"react-native-gesture-handler@npm:3.2.1, react-native-gesture-handler@npm:^3.2.1": version: 3.2.1 resolution: "react-native-gesture-handler@npm:3.2.1" dependencies: @@ -17284,6 +18641,19 @@ __metadata: languageName: node linkType: hard +"react-native-gesture-handler@patch:react-native-gesture-handler@npm%3A3.2.1#~/.yarn/patches/react-native-gesture-handler-npm-3.2.1-73a74f5c79.patch": + version: 3.2.1 + resolution: "react-native-gesture-handler@patch:react-native-gesture-handler@npm%3A3.2.1#~/.yarn/patches/react-native-gesture-handler-npm-3.2.1-73a74f5c79.patch::version=3.2.1&hash=290fa5" + dependencies: + "@types/react-test-renderer": "npm:^19.1.0" + invariant: "npm:^2.2.4" + peerDependencies: + react: "*" + react-native: "*" + checksum: 10/06419053f1e41618c117df0afda89c8f9f1d4b6aa2deb3f8a66a8b5bdcc46fb0b6ea4284b48bb155c11733ae3c8b0f847d9c0193aa9e5554e2e7b698a377001c + languageName: node + linkType: hard + "react-native-is-edge-to-edge@npm:^1.1.6": version: 1.1.6 resolution: "react-native-is-edge-to-edge@npm:1.1.6" @@ -17353,7 +18723,7 @@ __metadata: languageName: node linkType: hard -"react-native-safe-area-context@npm:^5.9.1": +"react-native-safe-area-context@npm:5.9.1, react-native-safe-area-context@npm:^5.9.1": version: 5.9.1 resolution: "react-native-safe-area-context@npm:5.9.1" peerDependencies: @@ -17373,7 +18743,17 @@ __metadata: languageName: node linkType: hard -"react-native-screens@npm:^4.27.0": +"react-native-safe-area-context@patch:react-native-safe-area-context@npm%3A5.9.1#~/.yarn/patches/react-native-safe-area-context-npm-5.9.1-b51fb9c5f7.patch": + version: 5.9.1 + resolution: "react-native-safe-area-context@patch:react-native-safe-area-context@npm%3A5.9.1#~/.yarn/patches/react-native-safe-area-context-npm-5.9.1-b51fb9c5f7.patch::version=5.9.1&hash=1fdb4c" + peerDependencies: + react: "*" + react-native: "*" + checksum: 10/b9385d78eeba67b98184834915dd872442383ada8f024befb79b51723c4c6844fdd7d4ebdf96f96aa0314a8c17d08eaf772b876c90fa22441d9e8b7498ca70b9 + languageName: node + linkType: hard + +"react-native-screens@npm:4.27.0, react-native-screens@npm:^4.27.0": version: 4.27.0 resolution: "react-native-screens@npm:4.27.0" dependencies: @@ -17400,6 +18780,19 @@ __metadata: languageName: node linkType: hard +"react-native-screens@patch:react-native-screens@npm%3A4.27.0#~/.yarn/patches/react-native-screens-npm-4.27.0-78335f53c6.patch": + version: 4.27.0 + resolution: "react-native-screens@patch:react-native-screens@npm%3A4.27.0#~/.yarn/patches/react-native-screens-npm-4.27.0-78335f53c6.patch::version=4.27.0&hash=8b4662" + dependencies: + react-freeze: "npm:^1.0.0" + warn-once: "npm:^0.1.0" + peerDependencies: + react: "*" + react-native: "*" + checksum: 10/d9c42117ccdbddde27d07353d7a902ab6de989adab1068fbce0577db6179979e2e4a78cb82f9be0bdc8638f424675f2645f201cf95300695a6a4aaceea1000f4 + languageName: node + linkType: hard + "react-native-test-app@npm:^5.4.9": version: 5.4.9 resolution: "react-native-test-app@npm:5.4.9" @@ -17436,7 +18829,7 @@ __metadata: languageName: node linkType: hard -"react-native-vector-icons@npm:^10.2.0": +"react-native-vector-icons@npm:10.2.0, react-native-vector-icons@npm:^10.2.0": version: 10.2.0 resolution: "react-native-vector-icons@npm:10.2.0" dependencies: @@ -17451,6 +18844,21 @@ __metadata: languageName: node linkType: hard +"react-native-vector-icons@patch:react-native-vector-icons@npm%3A10.2.0#~/.yarn/patches/react-native-vector-icons-npm-10.2.0-e1aad1f85c.patch": + version: 10.2.0 + resolution: "react-native-vector-icons@patch:react-native-vector-icons@npm%3A10.2.0#~/.yarn/patches/react-native-vector-icons-npm-10.2.0-e1aad1f85c.patch::version=10.2.0&hash=213537" + dependencies: + prop-types: "npm:^15.7.2" + yargs: "npm:^16.1.1" + bin: + fa-upgrade.sh: bin/fa-upgrade.sh + fa5-upgrade: bin/fa5-upgrade.sh + fa6-upgrade: bin/fa6-upgrade.sh + generate-icon: bin/generate-icon.js + checksum: 10/7a16a5792218a58789f22847c2695a4d16067246b8b6f256ad4ea8467e0e1514e89ef2b74314be1ba7bde29c3b5800abf5825d52567b79890d86c7dbaeda5a95 + languageName: node + linkType: hard + "react-native-web@npm:~0.21.0": version: 0.21.2 resolution: "react-native-web@npm:0.21.2" @@ -17483,7 +18891,7 @@ __metadata: languageName: node linkType: hard -"react-native-worklets@npm:^0.12.1": +"react-native-worklets@npm:0.12.1, react-native-worklets@npm:^0.12.1": version: 0.12.1 resolution: "react-native-worklets@npm:0.12.1" dependencies: @@ -17534,6 +18942,33 @@ __metadata: languageName: node linkType: hard +"react-native-worklets@patch:react-native-worklets@npm%3A0.12.1#~/.yarn/patches/react-native-worklets-npm-0.12.1-aa8a1b2670.patch": + version: 0.12.1 + resolution: "react-native-worklets@patch:react-native-worklets@npm%3A0.12.1#~/.yarn/patches/react-native-worklets-npm-0.12.1-aa8a1b2670.patch::version=0.12.1&hash=f1f0d0" + dependencies: + "@babel/generator": "npm:^7.27.1" + "@babel/plugin-transform-arrow-functions": "npm:^7.27.1" + "@babel/plugin-transform-class-properties": "npm:^7.28.6" + "@babel/plugin-transform-classes": "npm:^7.28.6" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.28.6" + "@babel/plugin-transform-optional-chaining": "npm:^7.28.6" + "@babel/plugin-transform-shorthand-properties": "npm:^7.27.1" + "@babel/plugin-transform-template-literals": "npm:^7.27.1" + "@babel/plugin-transform-unicode-regex": "npm:^7.27.1" + "@babel/preset-typescript": "npm:^7.28.5" + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + convert-source-map: "npm:^2.0.0" + semver: "npm:^7.7.4" + peerDependencies: + "@babel/core": "*" + "@react-native/metro-config": "*" + react: "*" + react-native: 0.83 - 0.87 + checksum: 10/f26ed0bf3b1e1354c510d519fc1ce820b429225f65db2bd939df6c2864d3b240afb71c3f19b0c99166b09854b6ba7e0d837be40cf88caa78c0bf2fcb861ab56d + languageName: node + linkType: hard + "react-native@npm:0.81.1": version: 0.81.1 resolution: "react-native@npm:0.81.1" @@ -17781,6 +19216,18 @@ __metadata: languageName: node linkType: hard +"react-test-renderer@npm:19.2.3": + version: 19.2.3 + resolution: "react-test-renderer@npm:19.2.3" + dependencies: + react-is: "npm:^19.2.3" + scheduler: "npm:^0.27.0" + peerDependencies: + react: ^19.2.3 + checksum: 10/a9de4d869b1555a54c02e8701be262dfa669eb366ff5cdb43ba49fa516beae439cbec2c3e5606c909e773c232328993e231b393af5eef25e87a845d4c7fb00dc + languageName: node + linkType: hard + "react@npm:19.1.0, react@npm:^19.1.0": version: 19.1.0 resolution: "react@npm:19.1.0" @@ -17950,6 +19397,15 @@ __metadata: languageName: node linkType: hard +"regenerate-unicode-properties@npm:^10.2.2": + version: 10.2.2 + resolution: "regenerate-unicode-properties@npm:10.2.2" + dependencies: + regenerate: "npm:^1.4.2" + checksum: 10/5041ee31185c4700de9dd76783fab9def51c412751190d523d621db5b8e35a6c2d91f1642c12247e7d94f84b8ae388d044baac1e88fc2ba0ac215ca8dc7bed38 + languageName: node + linkType: hard + "regenerate@npm:^1.4.2": version: 1.4.2 resolution: "regenerate@npm:1.4.2" @@ -18033,6 +19489,20 @@ __metadata: languageName: node linkType: hard +"regexpu-core@npm:^6.3.1": + version: 6.4.0 + resolution: "regexpu-core@npm:6.4.0" + dependencies: + regenerate: "npm:^1.4.2" + regenerate-unicode-properties: "npm:^10.2.2" + regjsgen: "npm:^0.8.0" + regjsparser: "npm:^0.13.0" + unicode-match-property-ecmascript: "npm:^2.0.0" + unicode-match-property-value-ecmascript: "npm:^2.2.1" + checksum: 10/bf5f85a502a17f127a1f922270e2ecc1f0dd071ff76a3ec9afcd6b1c2bf7eae1486d1e3b1a6d621aee8960c8b15139e6b5058a84a68e518e1a92b52e9322faf9 + languageName: node + linkType: hard + "regjsgen@npm:^0.8.0": version: 0.8.0 resolution: "regjsgen@npm:0.8.0" @@ -18051,6 +19521,17 @@ __metadata: languageName: node linkType: hard +"regjsparser@npm:^0.13.0": + version: 0.13.2 + resolution: "regjsparser@npm:0.13.2" + dependencies: + jsesc: "npm:~3.1.0" + bin: + regjsparser: bin/parser + checksum: 10/291aecbd47371cee347a96c47ccaae729ba50b7b2cb2a5de7e088e2ab835fe133569422f06ae28f5ff0830ac03f3196a35ba493f23ecda086d82e3e326f14074 + languageName: node + linkType: hard + "rehype-external-links@npm:^3.0.0": version: 3.0.0 resolution: "rehype-external-links@npm:3.0.0" @@ -18269,6 +19750,20 @@ __metadata: languageName: node linkType: hard +"resolve@npm:^1.22.11": + version: 1.22.12 + resolution: "resolve@npm:1.22.12" + dependencies: + es-errors: "npm:^1.3.0" + is-core-module: "npm:^2.16.1" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/1d2a081e4b7198e2a70abd7bbbf8aea5380c2d074b6c870035aab50ebfb7312b6492b3588e752faef83a75147862a3d3e09b222bc9afd536804181fd3a515ef9 + languageName: node + linkType: hard + "resolve@npm:^2.0.0-next.5": version: 2.0.0-next.5 resolution: "resolve@npm:2.0.0-next.5" @@ -18304,6 +19799,20 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@npm%3A^1.22.11#optional!builtin": + version: 1.22.12 + resolution: "resolve@patch:resolve@npm%3A1.22.12#optional!builtin::version=1.22.12&hash=c3c19d" + dependencies: + es-errors: "npm:^1.3.0" + is-core-module: "npm:^2.16.1" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/f80ad2c2b6820331cbe079198a184ffce322cfeca140065118066276bc08b03d5fa2c1ce652aeb584ec74050d1f656f46f034cc0dd9300452c5ab7866907f8c0 + languageName: node + linkType: hard + "resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin": version: 2.0.0-next.5 resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d" @@ -18474,7 +19983,7 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:0.27.0": +"scheduler@npm:0.27.0, scheduler@npm:^0.27.0": version: 0.27.0 resolution: "scheduler@npm:0.27.0" checksum: 10/eab3c3a8373195173e59c147224fc30dabe6dd453f248f5e610e8458512a5a2ee3a06465dc400ebfe6d35c9f5b7f3bb6b2e41c88c86fd177c25a73e7286a1e06 @@ -19746,6 +21255,15 @@ __metadata: languageName: node linkType: hard +"ts-api-utils@npm:^2.5.0": + version: 2.5.0 + resolution: "ts-api-utils@npm:2.5.0" + peerDependencies: + typescript: ">=4.8.4" + checksum: 10/d5f1936f5618c6ab6942a97b78802217540ced00e7501862ae1f578d9a3aa189fc06050e64cb8951d21f7088e5fd35f53d2bf0d0370a883861c7b05e993ebc44 + languageName: node + linkType: hard + "ts-interface-checker@npm:1.0.0": version: 1.0.0 resolution: "ts-interface-checker@npm:1.0.0" @@ -20138,6 +21656,13 @@ __metadata: languageName: node linkType: hard +"unicode-match-property-value-ecmascript@npm:^2.2.1": + version: 2.2.1 + resolution: "unicode-match-property-value-ecmascript@npm:2.2.1" + checksum: 10/a42bebebab4c82ea6d8363e487b1fb862f82d1b54af1b67eb3fef43672939b685780f092c4f235266b90225863afa1258d57e7be3578d8986a08d8fc309aabe1 + languageName: node + linkType: hard + "unicode-property-aliases-ecmascript@npm:^2.0.0": version: 2.1.0 resolution: "unicode-property-aliases-ecmascript@npm:2.1.0" @@ -20286,6 +21811,20 @@ __metadata: languageName: node linkType: hard +"update-browserslist-db@npm:^1.3.2": + version: 1.3.2 + resolution: "update-browserslist-db@npm:1.3.2" + dependencies: + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.1" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 10/ca883e9d0fca1b5bfb9d5e7d9468c5ddd1d66ea827566f474875171381ad33b84aa555c138094fb2c6297c680e06482ad8b4c1ad931e8bfab9a4cf36ea9cf006 + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -20998,6 +22537,15 @@ __metadata: languageName: node linkType: hard +"zod-validation-error@npm:^3.5.0 || ^4.0.0": + version: 4.0.2 + resolution: "zod-validation-error@npm:4.0.2" + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + checksum: 10/5e35ca8ebb4602dcb526e122d7e9fca695c4a479bd97535f3400a732d49160f24f7213a9ed64986fc9dc3a2e8a6c4e1241ec0c4d8a4e3e69ea91a0328ded2192 + languageName: node + linkType: hard + "zod@npm:^3.23.8": version: 3.25.76 resolution: "zod@npm:3.25.76" @@ -21005,6 +22553,13 @@ __metadata: languageName: node linkType: hard +"zod@npm:^3.25.0 || ^4.0.0": + version: 4.5.4 + resolution: "zod@npm:4.5.4" + checksum: 10/b2fd4aaf358359650a1f27f303a462f0f49b4e5582f517ad8894ed566fdceb9da391b59babffe3c70574c8064174883735657eb28e12db5c7021455a631866c4 + languageName: node + linkType: hard + "zwitch@npm:^2.0.0, zwitch@npm:^2.0.4": version: 2.0.4 resolution: "zwitch@npm:2.0.4" From 3553bd05a10bfebfa52a5ce27067aab254ea05f2 Mon Sep 17 00:00:00 2001 From: Thiago Brezinski Date: Tue, 8 Sep 2026 22:18:26 +0100 Subject: [PATCH 3/6] chore: improve README and docs --- .changeset/native-tabs-swift-package.md | 2 +- apps/example-swiftpm/README.md | 68 ++----------------- apps/example/package.json | 2 +- .../docs/docs/getting-started/quick-start.mdx | 19 +----- packages/example-shared/README.md | 53 ++++----------- 5 files changed, 21 insertions(+), 123 deletions(-) diff --git a/.changeset/native-tabs-swift-package.md b/.changeset/native-tabs-swift-package.md index 75482b90..c16f47a1 100644 --- a/.changeset/native-tabs-swift-package.md +++ b/.changeset/native-tabs-swift-package.md @@ -2,4 +2,4 @@ 'react-native-bottom-tabs': minor --- -Add iOS Swift Package Manager support through React Native's SwiftPM autolinking, including SwiftUIIntrospect and the native Fabric components. +Add iOS Swift Package Manager support diff --git a/apps/example-swiftpm/README.md b/apps/example-swiftpm/README.md index 01c82c9b..07c328e9 100644 --- a/apps/example-swiftpm/README.md +++ b/apps/example-swiftpm/README.md @@ -1,18 +1,16 @@ # SwiftPM example -An iOS-only React Native 0.87.1 Community CLI shell using SwiftPM for the shared -bottom-tabs example app. -All screens, components, assets, and test flows live in -[`packages/example-shared`](../../packages/example-shared). The CocoaPods shell -remains in `apps/example`. +Example app to demonstrate the SwiftPM integration for React Native Bottom Tabs. + +The source code lives in [`packages/example-shared`](../../packages/example-shared), and is shared by all example apps. ## Run on iOS From the repository root: ```sh -yarn install --immutable -yarn workspace example-swiftpm spm +yarn install +yarn workspace example-swiftpm spm # generates SwiftPM dependencies yarn workspace example-swiftpm start ``` @@ -22,39 +20,7 @@ In another terminal: yarn workspace example-swiftpm ios ``` -Use a separate Metro port when running both shells at once, for example -`start --port 8083` and `ios --port 8083`. - -The app's Metro configuration includes the workspace root and resolves shared -code against this shell's dependencies. It also maps shared asset URLs back to -Metro's asset handler. These settings are needed because the CLI template assumes -an app whose source and dependencies are contained within its own directory. -Restart Metro after changing this configuration. - -SwiftPM setup is required on fresh checkouts and CI: generated Codegen packages -and React Native XCFrameworks are not committed. Open -`ios/ExampleSwiftPM.xcodeproj` when building through Xcode. Do not run `pod install` -for this shell. - -## How this shell was created - -```sh -npx @react-native-community/cli@20.2.0 init ExampleSwiftPM \ - --directory apps/example-swiftpm --title example-swiftpm \ - --package-name bottomtabs.exampleswiftpm --version 0.87.1 \ - --skip-install --skip-git-init --install-pods false -``` - -The generated Android project and Android-specific scripts and CLI dependency -were removed; this shell targets iOS only. - -After installing dependencies, the native project was migrated with -`react-native spm add --deintegrate`. Dependencies without manifests were prepared -with `react-native spm scaffold`. Their manifests and required compatibility fixes -are preserved using Yarn patches in the repository's `.yarn/patches` directory. - -The template's Podfile is retained only as a note: the app has no CocoaPods -integration. Its bundle ID is `bottomtabs.exampleswiftpm`. +Running `pod install` is not needed since this app does not use CocoaPods. ## Tests @@ -64,25 +30,3 @@ yarn workspace example-swiftpm e2e:ios ``` The shared Maestro flows use the shell's bundle ID through `APP_ID`. - -`yarn workspace example-swiftpm spm` invokes React Native's standard SwiftPM CLI -directly. Run it after checkout to prepare the generated dependencies for your -machine. The five dependency patches are scoped to this shell; -the CocoaPods shell keeps its ordinary npm dependencies. - -## Validation - -Validated on September 8, 2026 with Xcode 26.5: - -- Debug and Release simulator builds succeeded (arm64). -- In Debug and Release, using agent-device, opened the shared examples list, - selected **Three Tabs**, - and switched Albums → Article → Contacts on iOS **18.6** (iPhone 16 Pro) and - **26.0** (iPhone 17 Pro). The article and contact content, tab icons, and album - artwork rendered correctly. -- Yarn patches survived installation, and subsequent SwiftPM setup succeeded. -- The remaining example screens were not exercised in this pass. - -The repository's existing Jest test is only a TODO; its current Babel/Flow setup -fails before that placeholder can run. This is separate from the device and asset -checks above. diff --git a/apps/example/package.json b/apps/example/package.json index 662bf88e..83cbaf0f 100644 --- a/apps/example/package.json +++ b/apps/example/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "android": "react-native run-android --appId bottomtabs.example --main-activity com.microsoft.reacttestapp.MainActivity", - "build:android": "npm run mkdist && react-native bundle --entry-file index.js --platform android --dev true --bundle-output dist/main.android.jsbundle --assets-dest dist && react-native build-android --extra-params \"--no-daemon --console=plain -PreactNativeArchitectures=arm64-v8a -PnewArchEnabled=true\"", + "build:android": "npm run mkdist && react-native bundle --entry-file index.js --platform android --dev true --bundle-output dist/main.android.jsbundle --assets-dest dist/res && react-native build-android --extra-params \"--no-daemon --console=plain -PreactNativeArchitectures=arm64-v8a -PnewArchEnabled=true\"", "build:ios": "npm run mkdist && react-native bundle --entry-file index.js --platform ios --dev true --bundle-output dist/main.ios.jsbundle --assets-dest dist", "ios": "react-native run-ios", "e2e:ios": "maestro test --platform=ios --env APP_ID=bottomtabs.example ../../packages/example-shared/e2e", diff --git a/docs/docs/docs/getting-started/quick-start.mdx b/docs/docs/docs/getting-started/quick-start.mdx index b4302459..e8de61c8 100644 --- a/docs/docs/docs/getting-started/quick-start.mdx +++ b/docs/docs/docs/getting-started/quick-start.mdx @@ -57,13 +57,7 @@ Here you can read more about [Android Native Styling](/docs/guides/android-nativ ### iOS with Swift Package Manager -The library ships a `Package.swift` for React Native's SwiftPM autolinking flow, -alongside its CocoaPods podspec. This requires a React Native installation that -provides the `react-native spm` command, the New Architecture, and Swift tools 6.0 -or newer. The app must meet React Native's iOS deployment target as well as the -package's iOS 15 minimum. The repository includes a CocoaPods example in -`apps/example` and a SwiftPM example in `apps/example-swiftpm`, both using the -same shared screens. +The library ships a `Package.swift` for React Native's SwiftPM autolinking flow. After installing the npm package, run this from an app already using SwiftPM: @@ -73,17 +67,6 @@ npx react-native spm To migrate an existing CocoaPods app, follow the [React Native SwiftPM setup guide](https://github.com/react/react-native/blob/main/packages/react-native/scripts/spm/__docs__/spm-scripts.md). -The migration command is: - -```sh -npx react-native spm add --deintegrate -``` - -React Native runs Codegen, prepares its native dependencies, and autolinks this -library. SwiftPM resolves SwiftUIIntrospect automatically. The manifest is intended -for this app-generated package graph; adding the GitHub repository directly in -Xcode does not provide the required React Native and Codegen packages. Other native -dependencies in your app also need SwiftPM support. ## Example usage diff --git a/packages/example-shared/README.md b/packages/example-shared/README.md index dd8d8bb3..5bad68e9 100644 --- a/packages/example-shared/README.md +++ b/packages/example-shared/README.md @@ -1,47 +1,18 @@ -# Shared example app - -This private workspace contains the example UI, assets, and Maestro flows. Both -`apps/example` (CocoaPods / React Native Test App) and `apps/example-swiftpm` -(Community CLI / SwiftPM) register its default `App` export. - -Add or edit screens in `src/` and assets in `assets/`; every example shell sees -those changes through Metro without copying files or publishing this package. -`babel.config.js` resolves workspace libraries to source. Each shell owns its -Metro configuration: the existing example uses rnx-kit, and the SwiftPM example -extends the Community CLI defaults for workspace dependency resolution and -shared asset URLs. - -## Adding another shell - -1. Scaffold the native app under `apps/`. -2. Add `@bottom-tabs/example-shared: workspace:*` and the shared app's runtime - dependencies to the shell's `package.json`. Native dependencies must be direct - shell dependencies so React Native autolinking discovers them. -3. Register the default export from `@bottom-tabs/example-shared` in the shell's - `index.js`, using its own `app.json` registration name. -4. Reuse `@bottom-tabs/example-shared/babel` and keep the shell's own Metro - configuration. -5. Configure native resources and integration for that shell. The examples use - React Native Paper's MaterialCommunityIcons font; include it in the native app. -6. Run the flows in `e2e/` with `APP_ID` set to the shell's bundle/application ID. - -Keep native app delegates, project files, dependency-manager setup, permissions, -and registration names in the shells. Feature code belongs here. - -From the repository root: +# Shared Source Code for the Example Apps -```sh -yarn workspace @bottom-tabs/example-shared typecheck -yarn workspace react-native-bottom-tabs-example e2e:ios -yarn workspace example-swiftpm e2e:ios -``` +This private workspace contains the example UI, assets, and Maestro flows. + +Both `apps/example` (CocoaPods / React Native Test App) and `apps/example-swiftpm` (Community CLI / SwiftPM) register its default `App` export. + +Add or edit screens in `src/` and assets in `assets/` and it will reflect in all example apps. + +Example apps need special `metro.config.js` configuration to resolve assets from outside their own package. See `apps/example/metro.config.js` and `apps/example-swiftpm/metro.config.js`. ## Updating dependencies -Shared runtime dependency versions are maintained in the root `yarn.config.cjs`. -All three example workspaces keep explicit dependency declarations; Yarn -constraints synchronize them. The SwiftPM shell has explicit overrides for its -patched native dependencies. Tooling dependencies remain workspace-specific. +Shared runtime dependency versions are maintained in the root `yarn.config.cjs`, so all example apps align on the same versions. + +The SwiftPM shell has explicit overrides for its patched native dependencies (automatically generated). After editing the central versions (and checking any affected SwiftPM patches): @@ -51,5 +22,5 @@ yarn install ``` CI runs `yarn constraints` to reject missing or mismatched declarations. When -adding another example shell, add its workspace path to the `examples` set in +adding another example app, add its workspace path to the `examples` set in `yarn.config.cjs` and run the same commands. From a8a69f90ea8626e690dd3bdb958c24e67fa02be7 Mon Sep 17 00:00:00 2001 From: Thiago Brezinski Date: Tue, 8 Sep 2026 22:53:35 +0100 Subject: [PATCH 4/6] chore: fix lint and typecheck --- apps/example-swiftpm/.eslintrc.js | 1 + apps/example-swiftpm/tsconfig.json | 6 ++++-- package.json | 1 + yarn.lock | 1 + 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/example-swiftpm/.eslintrc.js b/apps/example-swiftpm/.eslintrc.js index 187894b6..dc7ab34c 100644 --- a/apps/example-swiftpm/.eslintrc.js +++ b/apps/example-swiftpm/.eslintrc.js @@ -1,4 +1,5 @@ module.exports = { root: true, extends: '@react-native', + ignorePatterns: ['ios/build/**'], }; diff --git a/apps/example-swiftpm/tsconfig.json b/apps/example-swiftpm/tsconfig.json index 12497647..492fcc0e 100644 --- a/apps/example-swiftpm/tsconfig.json +++ b/apps/example-swiftpm/tsconfig.json @@ -5,11 +5,13 @@ { "path": "../../packages/react-navigation" }, ], "compilerOptions": { - "rootDir": ".", + "rootDir": "../..", "paths": {}, "composite": false, "moduleResolution": "bundler", "customConditions": ["react-native"], "noEmit": true - } + }, + "include": ["**/*.ts", "**/*.tsx", "../../packages/example-shared/src"], + "exclude": ["node_modules", "ios/build"] } diff --git a/package.json b/package.json index 727167c6..375f0b2e 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "packageManager": "yarn@4.6.0", "devDependencies": { "@commitlint/config-conventional": "^17.0.2", + "@react-native/eslint-config": "0.87.1", "commitlint": "^17.0.2", "devmoji": "^2.3.0", "eslint": "^8.51.0", diff --git a/yarn.lock b/yarn.lock index 02cf712d..f9cf6837 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3920,6 +3920,7 @@ __metadata: "@changesets/changelog-github": "npm:^0.6.0" "@changesets/cli": "npm:^2.30.0" "@commitlint/config-conventional": "npm:^17.0.2" + "@react-native/eslint-config": "npm:0.87.1" commitlint: "npm:^17.0.2" devmoji: "npm:^2.3.0" eslint: "npm:^8.51.0" From 2f21764b4482e5c2ad0121c95bc737e6948db6bd Mon Sep 17 00:00:00 2001 From: Thiago Brezinski Date: Tue, 8 Sep 2026 23:32:37 +0100 Subject: [PATCH 5/6] ci: fix argument list too long --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 39d921cb..afe3d690 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -76,7 +76,7 @@ jobs: - name: Check turborepo cache for Android run: | - TURBO_CACHE_STATUS=$(node -p "($(yarn turbo run build:android --cache-dir="${{ env.TURBO_CACHE_DIR }}" --dry=json)).tasks.find(t => t.task === 'build:android').cache.status") + TURBO_CACHE_STATUS=$(yarn turbo run build:android --cache-dir="${{ env.TURBO_CACHE_DIR }}" --dry=json | node -p "JSON.parse(require('fs').readFileSync(0, 'utf8')).tasks.find(t => t.taskId === 'react-native-bottom-tabs-example#build:android').cache.status") if [[ $TURBO_CACHE_STATUS == "HIT" ]]; then echo "turbo_cache_hit=1" >> $GITHUB_ENV @@ -136,7 +136,7 @@ jobs: - name: Check turborepo cache for iOS run: | - TURBO_CACHE_STATUS=$(node -p "($(yarn turbo run build:ios --cache-dir="${{ env.TURBO_CACHE_DIR }}" --dry=json)).tasks.find(t => t.task === 'build:ios').cache.status") + TURBO_CACHE_STATUS=$(yarn turbo run build:ios --cache-dir="${{ env.TURBO_CACHE_DIR }}" --dry=json | node -p "JSON.parse(require('fs').readFileSync(0, 'utf8')).tasks.find(t => t.taskId === 'react-native-bottom-tabs-example#build:ios').cache.status") if [[ $TURBO_CACHE_STATUS == "HIT" ]]; then echo "turbo_cache_hit=1" >> $GITHUB_ENV From 80e74979f9a245cfcdaa2108fb7034e5de76e05a Mon Sep 17 00:00:00 2001 From: Thiago Brezinski Date: Wed, 9 Sep 2026 13:48:30 +0100 Subject: [PATCH 6/6] fix: exclude generated library files from Jest --- packages/react-native-bottom-tabs/package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/react-native-bottom-tabs/package.json b/packages/react-native-bottom-tabs/package.json index bb49981c..b422488c 100644 --- a/packages/react-native-bottom-tabs/package.json +++ b/packages/react-native-bottom-tabs/package.json @@ -43,6 +43,10 @@ "lint": "eslint \"**/*.{js,ts,tsx}\"", "build": "bob build" }, + "jest": { + "preset": "react-native", + "modulePathIgnorePatterns": ["/lib/"] + }, "keywords": [ "react-native", "ios",