From b907f19a3c14d6c3ac1270967a9a35d5e56bd485 Mon Sep 17 00:00:00 2001 From: Juanita-Dash Date: Thu, 7 May 2026 13:38:39 -0400 Subject: [PATCH] Import React Native package into monorepo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Imports the source of github.com/Shopify/checkout-sheet-kit-react-native at commit 790dcfc (parent of the in-flight rename PR #483) under react-native/. No code changes are made — this is a verbatim snapshot. The .github/ directory is intentionally not imported; CI workflows will be re-authored at the monorepo root with rn-* prefixes (matching the existing swift-* / android-* convention) in a follow-up. Mirrors the import-then-rename pattern used by the Swift (#9 → #22) and Android subdirs. Co-Authored-By: Claude Opus 4.7 (1M context) --- react-native/.editorconfig | 15 + react-native/.gitignore | 105 + react-native/.npmrc | 2 + react-native/.ruby-version | 1 + react-native/.swiftformat | 11 + react-native/.swiftlint.yml | 39 + react-native/.vscode/extensions.json | 8 + react-native/.watchmanconfig | 1 + react-native/CONTRIBUTING.md | 170 + react-native/LICENSE | 20 + react-native/README.md | 1026 +- react-native/__mocks__/react-native-config.ts | 7 + .../react-native-encrypted-storage.ts | 21 + .../__mocks__/react-native-quick-crypto.ts | 40 + react-native/__mocks__/react-native.ts | 92 + react-native/babel.config.js | 3 + react-native/dev.yml | 83 + react-native/docs/contributing/release.md | 21 + .../documentation/media/ios_configuration.png | Bin 0 -> 112531 bytes .../settings_developer_universal_links.jpg | Bin 0 -> 43070 bytes .../media/settings_diagnostics.jpg | Bin 0 -> 43514 bytes .../media/settings_diagnostics_configured.jpg | Bin 0 -> 48133 bytes .../media/settings_search_universal_links.jpg | Bin 0 -> 41778 bytes .../documentation/universal_links_ios.md | 230 + react-native/jest.config.js | 16 + react-native/jest.setup.ts | 8 + react-native/metro.config.js | 62 + .../@shopify/checkout-sheet-kit/LICENSE | 20 + .../RNShopifyCheckoutSheetKit.podspec | 47 + .../checkout-sheet-kit/android/build.gradle | 103 + .../android/gradle.properties | 8 + .../android/proguard-rules.pro | 2 + .../android/src/main/AndroidManifest.xml | 3 + .../android/src/main/AndroidManifestNew.xml | 2 + .../CustomCheckoutEventProcessor.java | 188 + .../ShopifyCheckoutSheetKitModule.java | 349 + .../ShopifyCheckoutSheetKitPackage.java | 56 + .../checkout-sheet-kit/ios/.clang-format | 29 + ...cceleratedCheckoutButtons+Extensions.swift | 80 + .../ios/AcceleratedCheckoutButtons.swift | 449 + ...yCheckoutSheetKit+EventSerialization.swift | 175 + .../ShopifyCheckoutSheetKit+Extensions.swift | 52 + .../ShopifyCheckoutSheetKit-Bridging-Header.h | 28 + .../ios/ShopifyCheckoutSheetKit.mm | 154 + .../ios/ShopifyCheckoutSheetKit.swift | 329 + .../@shopify/checkout-sheet-kit/package.json | 79 + .../checkout-sheet-kit/package.snapshot.json | 75 + .../components/AcceleratedCheckoutButtons.tsx | 370 + .../checkout-sheet-kit/src/context.tsx | 179 + .../checkout-sheet-kit/src/errors.d.ts | 132 + .../checkout-sheet-kit/src/events.d.ts | 112 + .../checkout-sheet-kit/src/index.d.ts | 353 + .../@shopify/checkout-sheet-kit/src/index.ts | 547 + .../checkout-sheet-kit/src/pixels.d.ts | 578 + .../specs/NativeShopifyCheckoutSheetKit.ts | 101 + ...celeratedCheckoutButtonsNativeComponent.ts | 81 + .../tests/AcceleratedCheckoutButtons.test.tsx | 386 + .../checkout-sheet-kit/tests/context.test.tsx | 404 + .../checkout-sheet-kit/tests/index.test.ts | 1001 ++ .../checkout-sheet-kit/tests/linking.test.ts | 22 + .../checkout-sheet-kit/tsconfig.build.json | 27 + react-native/package.json | 87 + react-native/pnpm-lock.yaml | 10295 ++++++++++++++++ react-native/pnpm-workspace.yaml | 3 + react-native/sample/.bundle/config | 2 + react-native/sample/.env.example | 24 + react-native/sample/.eslintignore | 2 + react-native/sample/@types/env.d.ts | 20 + react-native/sample/@types/index.d.ts | 66 + react-native/sample/Gemfile | 17 + react-native/sample/Gemfile.lock | 127 + react-native/sample/android/app/build.gradle | 208 + .../sample/android/app/debug.keystore | Bin 0 -> 2257 bytes .../sample/android/app/proguard-rules.pro | 11 + .../app/src/main/AndroidManifest.template.xml | 40 + ...avigation_elements_src_assets_backicon.png | Bin 0 -> 134 bytes ...avigation_elements_src_assets_backicon.png | Bin 0 -> 100 bytes ...ation_elements_src_assets_backiconmask.png | Bin 0 -> 913 bytes ...avigation_elements_src_assets_backicon.png | Bin 0 -> 134 bytes ...avigation_elements_src_assets_backicon.png | Bin 0 -> 167 bytes ...avigation_elements_src_assets_backicon.png | Bin 0 -> 207 bytes .../app/src/main/ic_launcher-playstore.png | Bin 0 -> 209004 bytes .../checkoutkitreactnative/MainActivity.kt | 22 + .../checkoutkitreactnative/MainApplication.kt | 38 + .../res/drawable/rn_edit_text_material.xml | 36 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 6168 bytes .../mipmap-hdpi/ic_launcher_background.png | Bin 0 -> 11611 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 182 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 7854 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 3920 bytes .../mipmap-mdpi/ic_launcher_background.png | Bin 0 -> 6125 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 125 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 4609 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 8882 bytes .../mipmap-xhdpi/ic_launcher_background.png | Bin 0 -> 19170 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 261 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 11612 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 14868 bytes .../mipmap-xxhdpi/ic_launcher_background.png | Bin 0 -> 44507 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 487 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 19630 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 22146 bytes .../mipmap-xxxhdpi/ic_launcher_background.png | Bin 0 -> 86366 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 803 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 30207 bytes .../app/src/main/res/values/strings.xml | 4 + .../app/src/main/res/values/styles.xml | 9 + .../main/res/xml/network_security_config.xml | 11 + .../ShopifyCheckoutSheetKitModuleTest.java | 743 ++ react-native/sample/android/build.gradle | 38 + react-native/sample/android/gradle.properties | 44 + .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43764 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + react-native/sample/android/gradlew | 251 + react-native/sample/android/gradlew.bat | 99 + react-native/sample/android/settings.gradle | 43 + react-native/sample/app.json | 4 + react-native/sample/babel.config.js | 3 + react-native/sample/index.js | 42 + react-native/sample/ios/.xcode.env | 11 + react-native/sample/ios/AppDelegate.swift | 48 + react-native/sample/ios/Podfile | 46 + react-native/sample/ios/Podfile.lock | 3007 +++++ .../sample/ios/ReactNative-Bridging-Header.h | 24 + .../ios/ReactNative.xcodeproj/project.pbxproj | 1009 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/swiftpm/Package.resolved | 14 + .../xcschemes/ReactNative.xcscheme | 95 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../AppIcon.appiconset/1024.jpg | Bin 0 -> 261393 bytes .../AppIcon.appiconset/Contents.json | 14 + .../ReactNative/Images.xcassets/Contents.json | 6 + .../sample/ios/ReactNative/Info.plist | 74 + .../ios/ReactNative/LaunchScreen.storyboard | 47 + .../ios/ReactNative/Localizable.xcstrings | 18 + .../ios/ReactNative/PrivacyInfo.xcprivacy | 37 + .../ios/ReactNativeTests-Bridging-Header.h | 4 + .../AcceleratedCheckouts_SupportedTests.swift | 428 + ...cceleratedCheckouts_UnsupportedTests.swift | 65 + .../CheckoutDidFailTests.swift | 201 + .../EventSerializationTests.swift | 63 + .../sample/ios/ReactNativeTests/Info.plist | 24 + .../ShopifyCheckoutSheetKitTests.swift | 524 + react-native/sample/package.json | 84 + react-native/sample/react-native.config.js | 60 + react-native/sample/scripts/android | 8 + react-native/sample/scripts/android_sccache | 22 + react-native/sample/scripts/build_android | 10 + react-native/sample/scripts/build_ios | 36 + react-native/sample/scripts/release_android | 46 + react-native/sample/scripts/simulator | 32 + react-native/sample/scripts/test_android | 10 + react-native/sample/scripts/test_ios | 19 + react-native/sample/src/App.tsx | 585 + react-native/sample/src/ErrorBoundary.tsx | 33 + .../__tests__/CustomerAccountManager.test.ts | 196 + .../sample/src/auth/__tests__/PKCE.test.ts | 47 + .../sample/src/auth/customerAccountManager.ts | 326 + react-native/sample/src/auth/pkce.ts | 30 + react-native/sample/src/auth/tokenStorage.ts | 30 + react-native/sample/src/auth/types.ts | 24 + react-native/sample/src/context/Auth.tsx | 18 + react-native/sample/src/context/Cart.tsx | 278 + react-native/sample/src/context/Config.tsx | 90 + react-native/sample/src/context/Theme.tsx | 207 + .../src/hooks/useCheckoutEventHandlers.ts | 55 + react-native/sample/src/hooks/useShopify.ts | 230 + .../sample/src/screens/AccountScreen.tsx | 151 + .../sample/src/screens/CartScreen.tsx | 406 + .../sample/src/screens/CatalogScreen.tsx | 280 + .../sample/src/screens/LoginScreen.tsx | 105 + .../src/screens/ProductDetailsScreen.tsx | 233 + .../sample/src/screens/SettingsScreen.tsx | 547 + react-native/sample/src/utils.ts | 90 + react-native/scripts/check_cache | 30 + react-native/scripts/compare_snapshot | 40 + react-native/scripts/copy_license | 125 + react-native/scripts/create_snapshot | 5 + react-native/scripts/lint_swift | 89 + react-native/tsconfig.json | 25 + react-native/turbo.json | 25 + 183 files changed, 31215 insertions(+), 2 deletions(-) create mode 100644 react-native/.editorconfig create mode 100644 react-native/.gitignore create mode 100644 react-native/.npmrc create mode 100644 react-native/.ruby-version create mode 100644 react-native/.swiftformat create mode 100644 react-native/.swiftlint.yml create mode 100644 react-native/.vscode/extensions.json create mode 100644 react-native/.watchmanconfig create mode 100644 react-native/CONTRIBUTING.md create mode 100644 react-native/LICENSE create mode 100644 react-native/__mocks__/react-native-config.ts create mode 100644 react-native/__mocks__/react-native-encrypted-storage.ts create mode 100644 react-native/__mocks__/react-native-quick-crypto.ts create mode 100644 react-native/__mocks__/react-native.ts create mode 100644 react-native/babel.config.js create mode 100644 react-native/dev.yml create mode 100644 react-native/docs/contributing/release.md create mode 100644 react-native/documentation/media/ios_configuration.png create mode 100644 react-native/documentation/media/settings_developer_universal_links.jpg create mode 100644 react-native/documentation/media/settings_diagnostics.jpg create mode 100644 react-native/documentation/media/settings_diagnostics_configured.jpg create mode 100644 react-native/documentation/media/settings_search_universal_links.jpg create mode 100644 react-native/documentation/universal_links_ios.md create mode 100644 react-native/jest.config.js create mode 100644 react-native/jest.setup.ts create mode 100644 react-native/metro.config.js create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/LICENSE create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/RNShopifyCheckoutSheetKit.podspec create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/android/build.gradle create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/android/gradle.properties create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/android/proguard-rules.pro create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/android/src/main/AndroidManifest.xml create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/android/src/main/AndroidManifestNew.xml create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/android/src/main/java/com/shopify/reactnative/checkoutsheetkit/CustomCheckoutEventProcessor.java create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/android/src/main/java/com/shopify/reactnative/checkoutsheetkit/ShopifyCheckoutSheetKitModule.java create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/android/src/main/java/com/shopify/reactnative/checkoutsheetkit/ShopifyCheckoutSheetKitPackage.java create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/ios/.clang-format create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/ios/AcceleratedCheckoutButtons+Extensions.swift create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/ios/AcceleratedCheckoutButtons.swift create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit+EventSerialization.swift create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit+Extensions.swift create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit-Bridging-Header.h create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit.mm create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit.swift create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/package.json create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/package.snapshot.json create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/src/components/AcceleratedCheckoutButtons.tsx create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/src/context.tsx create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/src/errors.d.ts create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/src/events.d.ts create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/src/index.d.ts create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/src/index.ts create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/src/pixels.d.ts create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/src/specs/NativeShopifyCheckoutSheetKit.ts create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/src/specs/RCTAcceleratedCheckoutButtonsNativeComponent.ts create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/tests/AcceleratedCheckoutButtons.test.tsx create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/tests/context.test.tsx create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/tests/index.test.ts create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/tests/linking.test.ts create mode 100644 react-native/modules/@shopify/checkout-sheet-kit/tsconfig.build.json create mode 100644 react-native/package.json create mode 100644 react-native/pnpm-lock.yaml create mode 100644 react-native/pnpm-workspace.yaml create mode 100644 react-native/sample/.bundle/config create mode 100644 react-native/sample/.env.example create mode 100644 react-native/sample/.eslintignore create mode 100644 react-native/sample/@types/env.d.ts create mode 100644 react-native/sample/@types/index.d.ts create mode 100644 react-native/sample/Gemfile create mode 100644 react-native/sample/Gemfile.lock create mode 100644 react-native/sample/android/app/build.gradle create mode 100644 react-native/sample/android/app/debug.keystore create mode 100644 react-native/sample/android/app/proguard-rules.pro create mode 100644 react-native/sample/android/app/src/main/AndroidManifest.template.xml create mode 100644 react-native/sample/android/app/src/main/assets/drawable-hdpi/node_modules_reactnavigation_elements_src_assets_backicon.png create mode 100644 react-native/sample/android/app/src/main/assets/drawable-mdpi/node_modules_reactnavigation_elements_src_assets_backicon.png create mode 100644 react-native/sample/android/app/src/main/assets/drawable-mdpi/node_modules_reactnavigation_elements_src_assets_backiconmask.png create mode 100644 react-native/sample/android/app/src/main/assets/drawable-xhdpi/node_modules_reactnavigation_elements_src_assets_backicon.png create mode 100644 react-native/sample/android/app/src/main/assets/drawable-xxhdpi/node_modules_reactnavigation_elements_src_assets_backicon.png create mode 100644 react-native/sample/android/app/src/main/assets/drawable-xxxhdpi/node_modules_reactnavigation_elements_src_assets_backicon.png create mode 100644 react-native/sample/android/app/src/main/ic_launcher-playstore.png create mode 100644 react-native/sample/android/app/src/main/java/com/shopify/checkoutkitreactnative/MainActivity.kt create mode 100644 react-native/sample/android/app/src/main/java/com/shopify/checkoutkitreactnative/MainApplication.kt create mode 100644 react-native/sample/android/app/src/main/res/drawable/rn_edit_text_material.xml create mode 100644 react-native/sample/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 react-native/sample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 react-native/sample/android/app/src/main/res/values/strings.xml create mode 100644 react-native/sample/android/app/src/main/res/values/styles.xml create mode 100644 react-native/sample/android/app/src/main/res/xml/network_security_config.xml create mode 100644 react-native/sample/android/app/src/test/java/com/shopify/checkoutkitreactnative/ShopifyCheckoutSheetKitModuleTest.java create mode 100644 react-native/sample/android/build.gradle create mode 100644 react-native/sample/android/gradle.properties create mode 100644 react-native/sample/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 react-native/sample/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 react-native/sample/android/gradlew create mode 100644 react-native/sample/android/gradlew.bat create mode 100644 react-native/sample/android/settings.gradle create mode 100644 react-native/sample/app.json create mode 100644 react-native/sample/babel.config.js create mode 100644 react-native/sample/index.js create mode 100644 react-native/sample/ios/.xcode.env create mode 100644 react-native/sample/ios/AppDelegate.swift create mode 100644 react-native/sample/ios/Podfile create mode 100644 react-native/sample/ios/Podfile.lock create mode 100644 react-native/sample/ios/ReactNative-Bridging-Header.h create mode 100644 react-native/sample/ios/ReactNative.xcodeproj/project.pbxproj create mode 100644 react-native/sample/ios/ReactNative.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 react-native/sample/ios/ReactNative.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 react-native/sample/ios/ReactNative.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 react-native/sample/ios/ReactNative.xcodeproj/xcshareddata/xcschemes/ReactNative.xcscheme create mode 100644 react-native/sample/ios/ReactNative.xcworkspace/contents.xcworkspacedata create mode 100644 react-native/sample/ios/ReactNative.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 react-native/sample/ios/ReactNative/Images.xcassets/AppIcon.appiconset/1024.jpg create mode 100644 react-native/sample/ios/ReactNative/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 react-native/sample/ios/ReactNative/Images.xcassets/Contents.json create mode 100644 react-native/sample/ios/ReactNative/Info.plist create mode 100644 react-native/sample/ios/ReactNative/LaunchScreen.storyboard create mode 100644 react-native/sample/ios/ReactNative/Localizable.xcstrings create mode 100644 react-native/sample/ios/ReactNative/PrivacyInfo.xcprivacy create mode 100644 react-native/sample/ios/ReactNativeTests-Bridging-Header.h create mode 100644 react-native/sample/ios/ReactNativeTests/AcceleratedCheckouts_SupportedTests.swift create mode 100644 react-native/sample/ios/ReactNativeTests/AcceleratedCheckouts_UnsupportedTests.swift create mode 100644 react-native/sample/ios/ReactNativeTests/CheckoutDidFailTests.swift create mode 100644 react-native/sample/ios/ReactNativeTests/EventSerializationTests.swift create mode 100644 react-native/sample/ios/ReactNativeTests/Info.plist create mode 100644 react-native/sample/ios/ReactNativeTests/ShopifyCheckoutSheetKitTests.swift create mode 100644 react-native/sample/package.json create mode 100644 react-native/sample/react-native.config.js create mode 100755 react-native/sample/scripts/android create mode 100755 react-native/sample/scripts/android_sccache create mode 100755 react-native/sample/scripts/build_android create mode 100755 react-native/sample/scripts/build_ios create mode 100755 react-native/sample/scripts/release_android create mode 100644 react-native/sample/scripts/simulator create mode 100755 react-native/sample/scripts/test_android create mode 100755 react-native/sample/scripts/test_ios create mode 100644 react-native/sample/src/App.tsx create mode 100644 react-native/sample/src/ErrorBoundary.tsx create mode 100644 react-native/sample/src/auth/__tests__/CustomerAccountManager.test.ts create mode 100644 react-native/sample/src/auth/__tests__/PKCE.test.ts create mode 100644 react-native/sample/src/auth/customerAccountManager.ts create mode 100644 react-native/sample/src/auth/pkce.ts create mode 100644 react-native/sample/src/auth/tokenStorage.ts create mode 100644 react-native/sample/src/auth/types.ts create mode 100644 react-native/sample/src/context/Auth.tsx create mode 100644 react-native/sample/src/context/Cart.tsx create mode 100644 react-native/sample/src/context/Config.tsx create mode 100644 react-native/sample/src/context/Theme.tsx create mode 100644 react-native/sample/src/hooks/useCheckoutEventHandlers.ts create mode 100644 react-native/sample/src/hooks/useShopify.ts create mode 100644 react-native/sample/src/screens/AccountScreen.tsx create mode 100644 react-native/sample/src/screens/CartScreen.tsx create mode 100644 react-native/sample/src/screens/CatalogScreen.tsx create mode 100644 react-native/sample/src/screens/LoginScreen.tsx create mode 100644 react-native/sample/src/screens/ProductDetailsScreen.tsx create mode 100644 react-native/sample/src/screens/SettingsScreen.tsx create mode 100644 react-native/sample/src/utils.ts create mode 100755 react-native/scripts/check_cache create mode 100755 react-native/scripts/compare_snapshot create mode 100755 react-native/scripts/copy_license create mode 100755 react-native/scripts/create_snapshot create mode 100755 react-native/scripts/lint_swift create mode 100644 react-native/tsconfig.json create mode 100644 react-native/turbo.json diff --git a/react-native/.editorconfig b/react-native/.editorconfig new file mode 100644 index 00000000..65365be6 --- /dev/null +++ b/react-native/.editorconfig @@ -0,0 +1,15 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + +[*] + +indent_style = space +indent_size = 2 + +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/react-native/.gitignore b/react-native/.gitignore new file mode 100644 index 00000000..43318057 --- /dev/null +++ b/react-native/.gitignore @@ -0,0 +1,105 @@ +# OSX +# +.DS_Store + +# VSCode +.vscode/settings.json + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +ios/.xcode.env.local + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml +*.hprof +.cxx/ +*.keystore +!debug.keystore +upload-keystore.jks +.kotlin/ + +# node.js +# +node_modules/ +.yarn/ +npm-debug.log +yarn-error.log +pnpm-debug.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 + +# Env +.env +.env.local +.env.development.local +.env.test.local +.env.production.local +**/.xcode.env.local + +# Build +.build +lib +dist +.turbo + +# Module +modules/@shopify/checkout-sheet-kit/android/gradle/wrapper/gradle-wrapper.jar +modules/@shopify/checkout-sheet-kit/android/gradle/wrapper/gradle-wrapper.properties +modules/@shopify/checkout-sheet-kit/android/gradlew +modules/@shopify/checkout-sheet-kit/android/gradlew.bat + +# Sample bundle +**/index.android.bundle + +# Local gems +sample/vendor + +# Sample app +sample/**/AndroidManifest.xml + +.claude/ +CLAUDE.md diff --git a/react-native/.npmrc b/react-native/.npmrc new file mode 100644 index 00000000..43451e6d --- /dev/null +++ b/react-native/.npmrc @@ -0,0 +1,2 @@ +node-linker=hoisted +frozen-lockfile=true diff --git a/react-native/.ruby-version b/react-native/.ruby-version new file mode 100644 index 00000000..9c25013d --- /dev/null +++ b/react-native/.ruby-version @@ -0,0 +1 @@ +3.3.6 diff --git a/react-native/.swiftformat b/react-native/.swiftformat new file mode 100644 index 00000000..2c7479e3 --- /dev/null +++ b/react-native/.swiftformat @@ -0,0 +1,11 @@ +--indent 4 +--linebreaks lf +--wraparguments before-first +--wrapcollections before-first +--commas inline +--allman false +--semicolons inline +--trimwhitespace always +--disable redundantReturn,hoistAwait,preferKeyPath,redundantInternal,redundantPublic +--swiftversion 5.7.1 +--extensionacl on-declarations diff --git a/react-native/.swiftlint.yml b/react-native/.swiftlint.yml new file mode 100644 index 00000000..969e64a8 --- /dev/null +++ b/react-native/.swiftlint.yml @@ -0,0 +1,39 @@ +disabled_rules: + - line_length + - file_length + - non_optional_string_data_conversion + - type_body_length + - type_name + - identifier_name + - opening_brace + - function_body_length + - trailing_comma + - function_parameter_count + +opt_in_rules: + - array_init + - collection_alignment + - comma_inheritance + - convenience_type + - closure_spacing + - direct_return + - empty_count + - empty_string + - fatal_error_message + - first_where + - identical_operands + - indentation_width + - joined_default_parameter + - modifier_order + - overridden_super_call + - toggle_bool + - switch_case_alignment: + indented_cases: false + - fallthrough + - explicit_acl + +nesting: + type_level: + warning: 2 + +reporter: "xcode" diff --git a/react-native/.vscode/extensions.json b/react-native/.vscode/extensions.json new file mode 100644 index 00000000..137ee5de --- /dev/null +++ b/react-native/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "esbenp.prettier-vscode", + "editorconfig.editorconfig", + "msjsdiag.vscode-react-native", + "yzhang.markdown-all-in-one" + ] +} diff --git a/react-native/.watchmanconfig b/react-native/.watchmanconfig new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/react-native/.watchmanconfig @@ -0,0 +1 @@ +{} diff --git a/react-native/CONTRIBUTING.md b/react-native/CONTRIBUTING.md new file mode 100644 index 00000000..6f328987 --- /dev/null +++ b/react-native/CONTRIBUTING.md @@ -0,0 +1,170 @@ +# Contributing + +We welcome code contributions, feature requests, and reporting of issues. Please +see [guidelines and instructions](.github/CONTRIBUTING.md). + +--- + +This repo is subdivided into 3 parts using pnpm workspaces: + +- The base repo (workspace name = `checkout-sheet-kit-react-native`) +- The `@shopify/checkout-sheet-kit` Native Module (workspace name = `module`) +- The sample application (workspace name = `sample`) + +Each of the workspaces contains a separate `package.json` to manage tasks +specific to each workspace. + +## Getting started + +If you've cloned the repo and want to run the sample app, you will first need to: + +1. Install the NPM dependencies + + ```sh + pnpm install + ``` + +2. Install iOS dependencies. (N.b. Android dependencies are automatically installed by Gradle) + + ```sh + pnpm pod-install sample/ios + ``` + +3. Build the Native Module + + ```sh + pnpm module build + ``` + +4. Start the Metro server + + ```sh + pnpm sample start + ``` + +5. Run the sample application (in a new terminal / tab) + + ```sh + pnpm sample ios + # or + pnpm sample android + ``` + +## Optional: Speed up builds with sccache + +For faster native compilation (especially on incremental builds), you can install [sccache](https://github.com/mozilla/sccache), a shared compilation cache: + +```sh +# macOS (using Homebrew) +brew install sccache + +# Ubuntu/Debian +cargo install sccache + +# Other systems: see https://github.com/mozilla/sccache#installation +``` + +The build scripts will automatically detect and use sccache if available. On Android, React Native's CMake files look for a command named `ccache`, so the sample Android scripts put an sccache-backed compatibility command first on `PATH`. If you encounter any build issues, you can temporarily disable it: + +```sh +# Disable sccache for a single build +SCCACHE=false pnpm sample ios +SCCACHE=false pnpm sample android +``` + +## Making changes to the Native Module + +If your intentions are to modify the TS code for the Native Module under +`modules/@shopify/checkout-sheet-kit`, note that you will not need to rebuild to +observe your changes in the sample app. This is because the sample app is +importing the TS files directly from the module directory (through symlinking). + +However, if you're running the iOS/Android tests against the module, you will +first need to run `pnpm module build` each time you change the TS code. + +## Cleaning the workspaces + +There are a handful of commands to clean the individual workspaces. + +```sh +# Clear the current directory from watchman +pnpm clean + +# Removes the "sample/node_modules" directory +# Removes "ios/pods" directory +# Removes "ios/build" directory +pnpm sample clean + +# Removes the "lib" directory for the Native Module +pnpm module clean +``` + +## Linting the code + +Linting the codespaces will (1) compile the code with TypeScript and (2) run +eslint over the source code. + +```sh +# Lint the Native Module TS code +pnpm module lint + +# Lint the Sample App TS code +pnpm sample lint +``` + +## Testing + +There are 3 types of tests in this repo: Typescript, Swift and Java - each for +testing the Native Module. + +```sh +# Run Jest tests for "modules/@shopify/checkout-sheet-kit/src/**/*.tsx" +pnpm test + +# Run swift tests for the Native Module +pnpm sample test:ios + +# Run Java tests for the Native Module +pnpm sample test:android +``` + +## Running the sample app + +To run the sample app in this repo, first clone the repo and run the following +commands at the root of the project directory. + +### Install NPM dependencies + +```sh +pnpm install +``` + +### Install Cocoapods + +```sh +pnpm pod-install sample/ios +``` + +### Build the local module + +```sh +pnpm module build +``` + +### Update the dotenv file + +Replace the details in the `sample/.env.example` file and rename it to +`sample/.env` + +``` +# Storefront Details +STOREFRONT_DOMAIN="YOUR_STORE.myshopify.com" +STOREFRONT_ACCESS_TOKEN="YOUR_PUBLIC_STOREFRONT_ACCESS_TOKEN" +STOREFRONT_VERSION="2025-07" +``` + +### Start the sample app + +```sh +pnpm sample start +``` diff --git a/react-native/LICENSE b/react-native/LICENSE new file mode 100644 index 00000000..d42681cf --- /dev/null +++ b/react-native/LICENSE @@ -0,0 +1,20 @@ +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/react-native/README.md b/react-native/README.md index 3305c6bf..b09bc76b 100644 --- a/react-native/README.md +++ b/react-native/README.md @@ -1,3 +1,1025 @@ -# Checkout Kit — React Native +# Shopify Checkout Kit - React Native -Placeholder. The React Native wrapper will be folded into this directory in a follow-up. Until then, see the existing repo at `Shopify/checkout-sheet-kit-react-native`. +[![GitHub license](https://img.shields.io/badge/license-MIT-lightgrey.svg?style=flat)](https://github.com/Shopify/checkout-sheet-kit-react-native/blob/main/LICENSE) +[![GitHub Release](https://img.shields.io/github/release/shopify/checkout-sheet-kit-react-native.svg?style=flat)]() + +gradients + +**Shopify Checkout Kit** is a Native Module that enables React Native apps +to provide the world’s highest converting, customizable, one-page checkout +within the app. The presented experience is a fully-featured checkout that +preserves all of the store customizations: Checkout UI extensions, Functions, +branding, and more. It also provides platform idiomatic defaults such as support +for light and dark mode, and convenient developer APIs to embed, customize, and +follow the lifecycle of the checkout experience. + +Note: We're in the process of renaming "Checkout Sheet Kit" to "Checkout Kit." The dev docs and README already use the new name, while the package itself will be updated in an upcoming version. + +Check out our blog to +[learn how and why we built the Shopify Checkout Kit](https://www.shopify.com/partners/blog/mobile-checkout-sdks-for-ios-and-android). + +The React Native SDK is part of +[Shopify's Mobile Kit](https://shopify.dev/docs/custom-storefronts/mobile-kit) +which enables developers to delivery best-in-class iOS and Android commerce +experiences. + +- [Platform Requirements](#platform-requirements) +- [Getting Started](#getting-started) + - [1. Installation](#1-installation) + - [2. Minimum Android requirements](#2-minimum-android-requirements) + - [3. Minimum iOS requirements](#3-minimum-ios-requirements) +- [Basic Usage](#basic-usage) +- [Programmatic Usage](#programmatic-usage) +- [Usage with the Shopify Storefront API](#usage-with-the-shopify-storefront-api) +- [Configuration](#configuration) + - [Colors](#colors) + - [Localization](#localization) + - [Checkout Sheet title](#checkout-sheet-title) + - [iOS - Localization](#ios---localization) + - [Android - Localization](#android---localization) + - [Currency](#currency) + - [Language](#language) +- [Preloading](#preloading) + - [Important considerations](#important-considerations) + - [Flash Sales](#flash-sales) + - [When to preload](#when-to-preload) + - [Cache invalidation](#cache-invalidation) +- [Checkout lifecycle](#checkout-lifecycle) + - [`addEventListener(eventName, callback)`](#addeventlistenereventname-callback) + - [`removeEventListeners(eventName)`](#removeeventlistenerseventname) +- [Behavioral data - Web pixels](#behavioral-data---web-pixels) +- [Identity \& customer accounts](#identity--customer-accounts) + - [Cart: buyer bag, identity, and preferences](#cart-buyer-bag-identity-and-preferences) + - [Multipass](#multipass) + - [Shop Pay](#shop-pay) + - [Customer Account API](#customer-account-api) +- [Offsite Payments](#offsite-payments) + - [Universal Links - iOS](#universal-links---ios) +- [Pickup points / Pickup in store](#pickup-points--pickup-in-store) + - [Geolocation - iOS](#geolocation---ios) + - [Geolocation - Android](#geolocation---android) + - [Opting out of the default behavior](#opting-out-of-the-default-behavior) +- [Contributing](#contributing) +- [License](#license) + +## Platform Requirements + +- **React Native** - Minimum version `0.70` +- **iOS** - Minimum version iOS 13 +- **Android** - Minimum Java 11 & Android SDK version `23` + +## Getting Started + +Shopify Checkout Kit is an open-source NPM package. + +Use the following steps to get started with adding it to your React Native +application: + +### 1. Installation + +Install the Shopify Checkout Kit package dependency: + +```sh +pnpm add @shopify/checkout-sheet-kit + +# or using yarn +yarn add @shopify/checkout-sheet-kit + +# or using npm +npm install @shopify/checkout-sheet-kit +``` + +### 2. Minimum Android requirements + +Check the `minSdkVersion` property in your `android/build.gradle` file is at +least `23`. + +```diff +// android/build.gradle +buildscript { + ext { + buildToolsVersion = "33.0.0" +- minSdkVersion = 21 ++ minSdkVersion = 23 + compileSdkVersion = 33 + targetSdkVersion = 33 + } + // ... +} +``` + +### 3. Minimum iOS requirements + +Check the `platform :ios` property of your `ios/Podfile` to ensure that the +minimum version number is at least `13`. + +```diff +# ios/Podfile +- platform :ios, min_ios_version_supported ++ platform :ios, 13 +``` + +## Basic Usage + +Once the SDK has been added as a package dependency and the minimum platform +requirements have been checked, you can begin by importing the library in your +application code: + +```tsx +import {ShopifyCheckoutSheetProvider} from '@shopify/checkout-sheet-kit'; + +function AppWithContext() { + return ( + + + + ); +} +``` + +Doing so will now allow you to access the Native Module anywhere in your +application using React hooks: + +```tsx +import {useShopifyCheckoutSheet} from '@shopify/checkout-sheet-kit'; + +function App() { + const shopifyCheckout = useShopifyCheckoutSheet(); + + // Present the checkout + shopifyCheckout.present(checkoutUrl); +} +``` + +See [usage with the Storefront API](#usage-with-the-storefront-api) below for details on how +to obtain a checkout URL to pass to the kit. + +> [!NOTE] +> The recommended usage of the library is through a +> `ShopifyCheckoutSheetProvider` Context provider, but see +> [Programmatic usage](#programamatic-usage) below for details on how to use the +> library without React context. + +## Programmatic Usage + +To use the library without React context, import the `ShopifyCheckoutSheet` +class from the package and instantiate it. We recommend to instantiating the +class at a relatively high level in your application, and exporting it for use +throughout your app. + +```tsx +// shopify.ts +import {ShopifyCheckoutSheet} from '@shopify/checkout-sheet-kit'; + +export const shopifyCheckout = new ShopifyCheckoutSheet({ + // optional configuration +}); +``` + +Similar to the context approach, you can consume the instance as you would using +hooks. + +```tsx +import {shopifyCheckout} from './shopify.ts'; + +shopifyCheckout.present(checkoutUrl); +``` + +## Usage with the Shopify Storefront API + +To present a checkout to the buyer, your application must first obtain a +checkout URL. The most common way is to use the +[Storefront GraphQL API](https://shopify.dev/docs/api/storefront), to create a +cart, add line items, and retrieve a +[checkoutUrl](https://shopify.dev/docs/api/storefront/2023-10/objects/Cart#field-cart-checkouturl) +value. Alternatively, a [cart permalink](https://help.shopify.com/en/manual/products/details/cart-permalink) can be provided. + +You can use any GraphQL client to accomplish this - but as an example, our +[sample app](./sample) uses Apollo. + +Here's an example of how to get started with Apollo: + +```tsx +import {ApolloClient, gql, ApolloProvider} from '@apollo/client'; +import {STOREFRONT_NAME, STOREFRONT_ACCESS_TOKEN} from '@env'; + +// Create a new instance of the ApolloClient +const client = new ApolloClient({ + uri: `https://${STOREFRONT_NAME}.myshopify.com/api/2025-07/graphql.json`, + headers: { + 'X-Shopify-Storefront-Access-Token': STOREFRONT_ACCESS_TOKEN, + }, +}); + +// Create Cart Mutation +const createCartMutation = gql` + mutation CreateCart { + cartCreate { + cart { + id + checkoutUrl + } + } + } +`; + +// Add to Cart Mutation +const addToCartMutation = gql` + mutation AddToCart($cartId: ID!, $lines: [CartLineInput!]!) { + cartLinesAdd(cartId: $cartId, lines: $lines) { + cart { + id + checkoutUrl + } + } + } +`; + +function YourReactNativeApp() { + return ( + + + + ); +} +``` + +The `checkoutUrl` object is a standard web checkout URL that can be opened in +any browser. To present a native checkout sheet in your application, provide the +`checkoutUrl` alongside optional runtime configuration settings to the +`present(checkoutUrl)` function provided by the SDK: + +```tsx +function App() { + const [createCart] = useMutation(createCartMutation) + const [addToCart] = useMutation(addToCartMutation) + + return ( + // React native app code + ) +} +``` + +The `checkoutUrl` value is a standard web checkout URL that can be opened in any +browser. To present a native checkout sheet in your application, provide the +`checkoutUrl` to the `present(checkoutUrl)` function provided by the SDK: + +```tsx +function App() { + const shopifyCheckout = useShopifyCheckoutSheet() + const checkoutUrl = useRef(null) + const [createCart] = useMutation(createCartMutation) + const [addToCart] = useMutation(addToCartMutation) + + const handleAddToCart = useCallback((merchandiseId) => { + // Create a cart + const {data: cartCreateResponse} = await createCart() + // Add an item to the cart + const {data: addToCartResponse} = await addToCart({ + variables: { + cartId: cartCreateResponse.cartCreate.cart.id, + lines: [{quantity: 1, merchandiseId}] + } + }) + // Retrieve checkoutUrl from the Storefront response + checkoutUrl.current = addToCartResponse.cartLinesAdd.cart.checkoutUrl + + // Preload the checkout in the background for faster presentation + shopifyCheckout.preload(checkoutUrl.current) + }, []); + + const handleCheckout = useCallback(() => { + if (checkoutURL.current) { + // Present the checkout to the buyer + shopifyCheckout.present(checkoutURL.current) + } + }, []) + + return ( + + + + + ) +} +``` + +> [!TIP] +> To help optimize and deliver the best experience the SDK also provides +> a [preloading API](#preloading) that can be used to initialize the checkout +> session in the background and ahead of time. + +## Configuration + +The SDK provides a way to customize the presented checkout experience through a +`configuration` object in the Context Provider or a `setConfig` method on an +instance of the `ShopifyCheckoutSheet` class. + +| Name | Required | Default | Description | +| ------------- | -------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `colorScheme` | | `automatic` | Sets the color scheme for the checkout. | +| `preloading` | | `true` | Enable/disable [preloading](#preloading). | +| `colors` | | `{}` | An object with `ios` and `android` properties to override the colors for iOS and Android platforms individually. See [`colors`](#colors) for more information. | +| `logLevel` | | `error` | Sets the log level for the native SDK. Use `LogLevel.debug` for verbose logging during development, or `LogLevel.error` for production. | + +Here's an example of how a fully customized configuration object might look: + +```tsx +import { + ColorScheme, + Configuration, + LogLevel, + ShopifyCheckoutSheetProvider, +} from '@shopify/checkout-sheet-kit'; + +const config: Configuration = { + colorScheme: ColorScheme.web, + preloading: true, + logLevel: LogLevel.error, + colors: { + ios: { + backgroundColor: '#f0f0e8', + tintColor: '#2d2a38', + }, + android: { + backgroundColor: '#f0f0e8', + progressIndicator: '#2d2a38', + headerBackgroundColor: '#f0f0e8', + headerTextColor: '#2d2a38', + }, + }, +}; + +// If using React Context +function AppWithContext() { + return ( + + + + ); +} + +// If using ShopifyCheckoutSheet directly +const shopifyCheckout = new ShopifyCheckoutSheet(config); +``` + +### Colors + +The SDK defaults to the `automatic` color scheme option, will switches between +idiomatic `light` and `dark` themes depending on the users preference. This +behavior can be customized via the `colorScheme` property: + +| Name | Default | Description | +| ----------- | ------- | ------------------------------------------------------------------------------------------------ | +| `automatic` | ✔ | Alternates between an idiomatic light and dark theme - depending on the users device preference. | +| `light` | | Force the idomatic light theme. | +| `dark` | | Force the idomatic dark theme. | +| `web` | | Force your storefront web theme, as rendered by a mobile browser. | + +The `colors` configuration property can be used to provide overrides for iOS and +Android applications separately. + +```tsx +const config: Configuration = { + colorScheme: ColorScheme.light, + colors: { + ios: { + backgroundColor: '#ffffff', + tintColor: '#000000', + closeButtonColor: '#333333', + }, + android: { + backgroundColor: '#ffffff', + progressIndicator: '#2d2a38', + headerBackgroundColor: '#ffffff', + headerTextColor: '#000000', + closeButtonColor: '#333333', + }, + }, +}; +``` + +Note that when using the `automatic` option, the `colors.android` interface is +slightly different, as you can specify different overrides for `light` and +`dark` modes: + +```tsx +import { + ColorScheme, + Configuration, + ShopifyCheckoutSheetProvider, +} from '@shopify/checkout-sheet-kit'; + +const config: Configuration = { + colorScheme: ColorScheme.automatic, + colors: { + // Custom light/dark overrides for Android + android: { + light: { + backgroundColor: '#ffffff', + progressIndicator: '#2d2a38', + headerBackgroundColor: '#ffffff', + headerTextColor: '#000000', + closeButtonColor: '#000000', + }, + dark: { + backgroundColor: '#000000', + progressIndicator: '#0087ff', + headerBackgroundColor: '#000000', + headerTextColor: '#ffffff', + closeButtonColor: '#ffffff', + }, + }, + }, +}; + +function AppWithContext() { + return ( + + + + ); +} +``` + +### Localization + +#### Checkout Sheet title + +##### iOS - Localization + +On iOS, you can set a localized value on the `title` attribute of the +configuration. + +Alternatively, use a Localizable.xcstrings file in your app by doing the +following: + +1. Create a `Localizable.xcstrings` file under "ios/{YourApplicationName}" +2. Add an entry for the key `"shopify_checkout_sheet_title"` + +##### Android - Localization + +On Android, you can add a string entry for the key `"checkout_web_view_title"` +to the "android/app/src/res/values/strings.xml" file for your application. + +```diff + + Your App Name ++ Checkout + +``` + +> [!IMPORTANT] +> The `title` configuration attribute will only affect iOS. For Android you **must** use +> `res/values/strings.xml`. + +#### Currency + +To set an appropriate currency for a given cart, the Storefront API offers an +`@inContext(country)` directive which will ensure the correct currency is +presented. + +```tsx +const CREATE_CART_MUTATION = gql` + mutation CreateCart($input: CartInput, $country: CountryCode = CA) + @inContext(country: $country) { + cartCreate(input: $input) { + cart { + id + checkoutUrl + } + } + } +`; +``` + +See [Storefront Directives](https://shopify.dev/docs/api/storefront#directives) +for more information. + +#### Language + +Similarly to currency, you can use an `@inContext(language)` directive to set +the language for your checkout. + +```tsx +const CREATE_CART_MUTATION = gql` + mutation CreateCart($input: CartInput, $language: Language = EN) + @inContext(language: $language) { + cartCreate(input: $input) { + cart { + id + checkoutUrl + } + } + } +`; +``` + +See [Storefront Directives](https://shopify.dev/docs/api/storefront#directives) +for more information. + +## Preloading + +Initializing a checkout session requires communicating with Shopify servers, +thus depending on the network quality and bandwidth available to the buyer can +result in undesirable waiting time for the buyer. To help optimize and deliver +the best experience, the SDK provides a `preloading` "hint" that allows +developers to signal that the checkout session should be initialized in the +background, ahead of time. + +Preloading is an advanced feature that can be disabled by setting the +`preloading` configuration value to `false`. It is enabled by default. + +Once enabled, preloading a checkout is as simple as calling +`preload(checkoutUrl)` with a valid `checkoutUrl`. + +```tsx +// using hooks +const shopifyCheckout = useShopifyCheckoutSheet(); +ShopifyCheckout.preload(checkoutUrl); + +// using a class instance +const shopifyCheckout = new ShopifyCheckoutSheet(); +shopifyCheckout.preload(checkoutUrl); +``` + +### Important considerations + +1. Initiating preload results in background network requests and additional + CPU/memory utilization for the client, and should be used when there is a + high likelihood that the buyer will soon request to checkout—e.g. when the + buyer navigates to the cart overview or a similar app-specific experience. +2. A preloaded checkout session reflects the cart contents at the time when + `preload` is called. If the cart is updated after `preload` is called, the + application needs to call `preload` again to reflect the updated checkout + session. +3. Calling `preload(checkoutUrl)` is a hint, **not a guarantee**: the library + may debounce or ignore calls to this API depending on various conditions; the + preload may not complete before `present(checkoutUrl)` is called, in which + case the buyer may still see a spinner while the checkout session is + finalized. + +### Flash Sales + +It is important to note that during Flash Sales or periods of high amounts of traffic, buyers may be entered into a queue system. + +**Calls to preload which result in a buyer being enqueued will be rejected.** This means that a buyer will never enter the queue without their knowledge. + +### When to preload + +Calling `preload()` each time an item is added to a buyer's cart can put significant strain on Shopify systems, which in return can result in rejected requests. Rejected requests will not result in a visual error shown to users, but will degrade the experience since they will need to load checkout from scratch. + +Instead, a better approach is to call `preload()` when you have a strong enough signal that the buyer intends to check out. In some cases this might mean a buyer has navigated to a "cart" screen. + +### Cache invalidation + +Should you wish to manually clear the preload cache, there is a `ShopifyCheckoutSheetKit.invalidate()` helper function to do so. + +## Checkout lifecycle + +There are currently 3 checkout events exposed through the Native Module. You can +subscribe to these events using `addEventListener` and `removeEventListeners` +methods - available on both the context provider as well as the class instance. + +| Name | Callback | Description | +| ----------- | ----------------------------------------- | ------------------------------------------------------------ | +| `close` | `() => void` | Fired when the checkout has been closed. | +| `completed` | `(event: CheckoutCompletedEvent) => void` | Fired when the checkout has been successfully completed. | +| `error` | `(error: {message: string}) => void` | Fired when a checkout exception has been raised. | +| `pixel` | `(event: PixelEvent) => void` | Fired when a Web Pixel event has been relayed from checkout. | + +### `addEventListener(eventName, callback)` + +Subscribing to an event returns an `EmitterSubscription` object, which contains +a `remove()` function to unsubscribe. Here's an example of how you might create +an event listener in a React `useEffect`, ensuring to remove it on unmount. + +```tsx +// Using hooks +const shopifyCheckout = useShopifyCheckoutSheet(); + +useEffect(() => { + const close = shopifyCheckout.addEventListener('close', () => { + // Do something on checkout close + }); + + const completed = shopifyCheckout.addEventListener( + 'completed', + (event: CheckoutCompletedEvent) => { + // Lookup order on checkout completion + const orderId = event.orderDetails.id; + }, + ); + + const error = shopifyCheckout.addEventListener( + 'error', + (error: CheckoutError) => { + // Do something on checkout error + // console.log(error.message) + }, + ); + + const pixel = shopifyCheckout.addEventListener( + 'pixel', + (event: PixelEvent) => { + // Dispatch web pixel events to third-party services + if (hasPermissionToTrack) { + sendEventToAnalyticsProvider(event); + } + }, + ); + + return () => { + // It is important to clear the subscription on unmount to prevent memory leaks + close?.remove(); + completed?.remove(); + error?.remove(); + pixel?.remove(); + }; +}, [shopifyCheckout]); +``` + +### `removeEventListeners(eventName)` + +On the rare occasion that you want to remove all event listeners for a given +`eventName`, you can use the `removeEventListeners(eventName)` method. + +## Behavioral data - Web pixels + +App developers can use +[lifecycle events](#checkout-lifecycle) to monitor +and log the status of a checkout session. + +For behavioural monitoring, +["standard"](https://shopify.dev/docs/api/web-pixels-api/standard-events) and +["custom"](https://shopify.dev/docs/api/web-pixels-api#custom-web-pixels) Web +Pixel events will be relayed back to your application through the `"pixel"` +event listener. App developers should only subscribe to pixel events if they have proper levels of consent from merchants/buyers and are responsible for adherence to Apple's privacy policy and local regulations like GDPR and +ePrivacy directive before disseminating these events to first-party and +third-party systems. + +> [!NOTE] +> You will likely need to augment these events with customer/session information derived from app state. + +> [!NOTE] +> The `customData` attribute of CustomPixelEvent can take on any shape. As such, this attribute will be returned as a String. Client applications should define a custom data type and deserialize the customData string into that type. + +## Identity & customer accounts + +Buyer-aware checkout experience reduces friction and increases conversion. +Depending on the context of the buyer (guest or signed-in), knowledge of buyer +preferences, or account/identity system, the application can use one of the +following methods to initialize a personalized and contextualized buyer +experience. + +### Cart: buyer bag, identity, and preferences + +In addition to specifying the line items, the Cart can include buyer identity +(name, email, address, etc.), and delivery and payment preferences: see +[guide](https://shopify.dev/docs/custom-storefronts/building-with-the-storefront-api/cart/manage). +Included information will be used to present pre-filled and pre-selected choices +to the buyer within checkout. + +#### Multipass + +[Shopify Plus](https://help.shopify.com/en/manual/intro-to-shopify/pricing-plans/plans-features/shopify-plus-plan) +merchants using +[Classic Customer Accounts](https://help.shopify.com/en/manual/customers/customer-accounts/classic-customer-accounts) +can use [Multipass](https://shopify.dev/docs/api/multipass) +([API documentation](https://shopify.dev/docs/api/multipass)) to integrate an +external identity system and initialize a buyer-aware checkout session. + +```json +{ + "email": "", + "created_at": "", + "remote_ip": "", + "return_to": "" +} +``` + +1. Follow the [Multipass documentation](https://shopify.dev/docs/api/multipass) + to create a Multipass URL and set `return_to` to be the obtained + `checkoutUrl` +2. Provide the Multipass URL to `present(checkoutUrl)` + +> [!IMPORTANT] +> The above JSON omits useful customer attributes that should be +> provided where possible and encryption and signing should be done server-side +> to ensure Multipass keys are kept secret. + +#### Shop Pay + +To initialize accelerated Shop Pay checkout, the cart can set a +[walletPreference](https://shopify.dev/docs/api/storefront/latest/mutations/cartBuyerIdentityUpdate#field-cartbuyeridentityinput-walletpreferences) +to 'shop_pay'. The sign-in state of the buyer is app-local. The buyer will be +prompted to sign in to their Shop account on their first checkout, and their +sign-in state will be remembered for future checkout sessions. + +#### Customer Account API + +We are working on a library to provide buyer sign-in and authentication powered +by the +[new Customer Account API](https://www.shopify.com/partners/blog/introducing-customer-account-api-for-headless-stores)—stay +tuned. + +## Offsite Payments + +Certain payment providers finalize transactions by redirecting customers to +external banking apps. To enhance the user experience for your buyers, you can +set up your storefront to support Universal Links on iOS and App links on +Android, allowing customers to be redirected back to your app once the payment +is completed. + +### Universal Links - iOS + +See the +[Universal Links guide](https://github.com/Shopify/checkout-sheet-kit-react-native/blob/main/documentation/universal_links_ios.md) +for information on how to get started with adding support for Offsite Payments +in your app. + +It is crucial for your app to be configured to handle URL clicks during the +checkout process effectively. By default, the kit includes the following +delegate method to manage these interactions. This code ensures that external +links, such as HTTPS and deep-links, are opened correctly by iOS. + +```swift +public func checkoutDidClickLink(url: URL) { + if UIApplication.shared.canOpenURL(url) { + UIApplication.shared.open(url) + } +} +``` + +## Pickup points / Pickup in store + +### Geolocation - iOS + +Geolocation permission requests are handled out of the box by iOS, provided you've added the required location usage description to your `Info.plist` file: + +```xml +NSLocationWhenInUseUsageDescription +Your location is required to locate pickup points near you. +``` + +> [!TIP] +> Consider also adding `NSLocationAlwaysAndWhenInUseUsageDescription` if your app needs background location access for other features. + +### Geolocation - Android + +Android differs to iOS in that permission requests must be handled in two places: +(1) in your `AndroidManifest.xml` and (2) at runtime. + +```xml + + +``` + +The Checkout Kit native module will emit a `geolocationRequest` event when the webview requests geolocation +information. By default, the kit will listen for this event and request access to both coarse and fine access when +invoked. + +The geolocation request flow follows this sequence: + +1. When checkout needs location data (e.g., to show nearby pickup points), it triggers a geolocation request. +2. The native module emits a `geolocationRequest` event. +3. If using default behavior, the module automatically handles the Android runtime permission request. +4. The result is passed back to checkout, which then proceeds to show relevant pickup points if permission was granted. + +> [!NOTE] +> If the user denies location permissions, the checkout will still function but will not be able to show nearby pickup points. Users can manually enter their location instead. + +#### Opting out of the default behavior + +> [!NOTE] +> This section is only applicable for Android. + +In order to opt-out of the default permission handling, you can set `features.handleGeolocationRequests` to `false` +when you instantiate the `ShopifyCheckoutSheet` class. + +If you're using the sheet programmatically, you can do so by specifying a `features` object as the second argument: + +```tsx +const checkoutSheetKit = new ShopifyCheckoutSheet(config, {handleGeolocationRequests: false}); +``` + +If you're using the context provider, you can pass the same `features` object as a prop to the `ShopifyCheckoutSheetProvider` component: + +```tsx + + {children} + +``` + +When opting out, you'll need to implement your own permission handling logic and communicate the result back to the checkout sheet. This can be useful if you want to: + +- Customize the permission request UI/UX +- Coordinate location permissions with other app features +- Implement custom fallback behavior when permissions are denied + +The steps here to implement your own logic are to: + +1. Listen for the `geolocationRequest` +2. Request the desired permissions +3. Invoke the native callback by calling `initiateGeolocationRequest` with the permission status + +```tsx +// Listen for "geolocationRequest" events +shopify.addEventListener('geolocationRequest', async (event: GeolocationRequestEvent) => { + const coarse = 'android.permission.ACCESS_COARSE_LOCATION'; + const fine = 'android.permission.ACCESS_FINE_LOCATION'; + + // Request one or many permissions at once + const results = await PermissionsAndroid.requestMultiple([coarse, fine]); + + // Check the permission status results + const permissionGranted = results[coarse] === 'granted' || results[fine] === 'granted'; + + // Dispatch an event to the native module to invoke the native callback with the permission status + shopify.initiateGeolocationRequest(permissionGranted); +}) +``` + +--- + +## Accelerated Checkouts + +Accelerated checkout buttons surface Apple Pay and Shop Pay options earlier in the buyer journey so more orders complete without leaving your app. + +### Prerequisites + +- iOS 16 or later +- The `write_cart_wallet_payments` access scope ([request access](https://www.appsheet.com/start/1ff317b6-2da1-4f39-b041-c01cfada6098)) +- Apple Pay payment processing certificates ([setup guide](https://shopify.dev/docs/storefronts/mobile/create-apple-payment-processing-certificates)) +- A device configured for Apple Pay ([Apple setup instructions](https://developer.apple.com/documentation/passkit/setting-up-apple-pay)) + +### Configure the integration + +Pass an `acceleratedCheckouts` configuration when setting up the provider or `ShopifyCheckoutSheet` instance. This connects the accelerated checkout buttons to your storefront. + +```tsx +import {ShopifyCheckoutSheetProvider} from '@shopify/checkout-sheet-kit'; + +const config = { + acceleratedCheckouts: { + storefrontDomain: 'your-shop.myshopify.com', + storefrontAccessToken: 'your-storefront-access-token', + customer: { + // For authenticated customers + accessToken: 'customer-access-token', + // OR for guest customers + // email: 'customer@example.com', + // phoneNumber: '0123456789', + }, + wallets: { + applePay: { + merchantIdentifier: 'merchant.com.yourcompany', + contactFields: ['email', 'phone'], + // Optionally restrict shipping countries (ISO 3166-1 alpha-2) + // supportedShippingCountries: ['US', 'CA'], + }, + }, + }, +}; + +function App() { + return ( + + + + ); +} +``` + +> [!WARNING] +> Do not provide both `accessToken` and `email`/`phoneNumber` together. For authenticated customers, email and phone are fetched automatically from the Shopify account. + +### Render accelerated checkout buttons + +Use `AcceleratedCheckoutButtons` to attach accelerated checkout calls-to-action to product or cart surfaces once you have a valid cart ID or product variant ID from the Storefront API. + +```tsx +import { + AcceleratedCheckoutButtons, + AcceleratedCheckoutWallet, +} from '@shopify/checkout-sheet-kit'; + +function CartFooter({cartId}: {cartId: string}) { + return ( + + ); +} +``` + +You can also render buttons for a single product variant: + +```tsx + +``` + +#### Customize wallet options + +Accelerated checkout buttons display every available wallet by default. Use `wallets` to show a subset or adjust the order. + +```tsx +// Display only Shop Pay + + +// Display Shop Pay first, then Apple Pay + +``` + +#### Modify the Apple Pay button label + +Use `applePayLabel` to map to the native `PayWithApplePayButtonLabel` values. The default is `plain`. + +```tsx +import {ApplePayLabel} from '@shopify/checkout-sheet-kit'; + + +``` + +#### Customize the Apple Pay button style + +Use `applePayStyle` to set the color style of the Apple Pay button. The default is `automatic`, which adapts to the current appearance (light/dark mode). + +```tsx +import {ApplePayStyle} from '@shopify/checkout-sheet-kit'; + + +``` + +Available styles: `automatic`, `black`, `white`, `whiteOutline`. + +#### Customize button corners + +The `cornerRadius` prop lets you match the buttons to other calls-to-action in your app. Buttons default to an 8pt radius. + +```tsx +// Pill-shaped buttons + + +// Square buttons + +``` + +### Handle loading, errors, and lifecycle events + +Attach lifecycle handlers to respond when buyers finish, cancel, or encounter an error. + +```tsx + { + // Clear cart after successful checkout + clearCart(); + }} + onFail={(error) => { + console.error('Accelerated checkout failed:', error); + }} + onCancel={() => { + analytics.track('accelerated_checkout_cancelled'); + }} + onRenderStateChange={(event) => { + // event.state: 'loading' | 'rendered' | 'error' + setRenderState(event.state); + }} + onWebPixelEvent={(event) => { + analytics.track(event); + }} + onClickLink={(url) => { + Linking.openURL(url); + }} +/> +``` + +--- + +## Contributing + +See the [contributing documentation](CONTRIBUTING.md) for details on how to get started. + +## License + +Shopify's Checkout Kit is provided under an [MIT License](LICENSE). diff --git a/react-native/__mocks__/react-native-config.ts b/react-native/__mocks__/react-native-config.ts new file mode 100644 index 00000000..31dd0e60 --- /dev/null +++ b/react-native/__mocks__/react-native-config.ts @@ -0,0 +1,7 @@ +module.exports = { + __esModule: true, + default: { + CUSTOMER_ACCOUNT_API_SHOP_ID: 'test-shop-123', + CUSTOMER_ACCOUNT_API_CLIENT_ID: 'test-client-456', + }, +}; diff --git a/react-native/__mocks__/react-native-encrypted-storage.ts b/react-native/__mocks__/react-native-encrypted-storage.ts new file mode 100644 index 00000000..b8162965 --- /dev/null +++ b/react-native/__mocks__/react-native-encrypted-storage.ts @@ -0,0 +1,21 @@ +const store: Record = {}; + +const EncryptedStorage = { + setItem: jest.fn(async (key: string, value: string) => { + store[key] = value; + }), + getItem: jest.fn(async (key: string) => { + return store[key] ?? null; + }), + removeItem: jest.fn(async (key: string) => { + delete store[key]; + }), + clear: jest.fn(async () => { + Object.keys(store).forEach(key => delete store[key]); + }), +}; + +module.exports = { + __esModule: true, + default: EncryptedStorage, +}; diff --git a/react-native/__mocks__/react-native-quick-crypto.ts b/react-native/__mocks__/react-native-quick-crypto.ts new file mode 100644 index 00000000..6e0cb9e7 --- /dev/null +++ b/react-native/__mocks__/react-native-quick-crypto.ts @@ -0,0 +1,40 @@ +let callCount = 0; + +function randomBytes(size: number) { + callCount++; + const buffer = new ArrayBuffer(size); + const view = new Uint8Array(buffer); + for (let i = 0; i < size; i++) { + view[i] = (i + callCount) % 256; + } + return {buffer}; +} + +function createHash(_algorithm: string) { + return { + update(_data: string) { + return { + digest() { + const buffer = new ArrayBuffer(32); + const view = new Uint8Array(buffer); + for (let i = 0; i < 32; i++) { + view[i] = (i * 7) % 256; + } + return {buffer}; + }, + }; + }, + }; +} + +function resetCallCount() { + callCount = 0; +} + +module.exports = { + __esModule: true, + default: {randomBytes, createHash}, + randomBytes, + createHash, + resetCallCount, +}; diff --git a/react-native/__mocks__/react-native.ts b/react-native/__mocks__/react-native.ts new file mode 100644 index 00000000..69210799 --- /dev/null +++ b/react-native/__mocks__/react-native.ts @@ -0,0 +1,92 @@ +type Listener = {eventName: string; callback: (data: any) => void}; + +function createMockEmitter() { + let listeners: Listener[] = []; + + const addListener = jest.fn( + (eventName: string, callback: (data: any) => void) => { + listeners.push({eventName, callback}); + return {remove: jest.fn()}; + }, + ); + + const removeAllListeners = jest.fn((eventName?: string) => { + if (eventName) { + listeners = listeners.filter(l => l.eventName !== eventName); + } else { + listeners = []; + } + }); + + const emit = jest.fn((eventName: string, data: any) => { + const callbacks = listeners + .filter(l => l.eventName === eventName) + .map(l => l.callback); + callbacks.forEach(cb => cb(data)); + // Clear listeners after emit to avoid cross-test leakage + listeners = []; + }); + + return {addListener, removeAllListeners, emit}; +} + +const requireNativeComponent = (..._args: any[]) => { + const React = require('react'); + return (props: any) => + React.createElement('View', { + ...props, + testID: props?.testID ?? 'accelerated-checkout-buttons', + }); +}; + +const codegenNativeComponent = requireNativeComponent; + +const StyleSheet = { + flatten: jest.fn(style => style), +}; + +const exampleConfig = {preloading: true}; + +const ShopifyCheckoutSheetKit = { + version: '0.7.0', + getConstants: jest.fn(() => ({version: '0.7.0'})), + preload: jest.fn(), + present: jest.fn(), + dismiss: jest.fn(), + invalidateCache: jest.fn(), + getConfig: jest.fn(async () => exampleConfig), + setConfig: jest.fn(), + addEventListener: jest.fn(), + removeEventListeners: jest.fn(), + initiateGeolocationRequest: jest.fn(), + configureAcceleratedCheckouts: jest.fn(), + isAcceleratedCheckoutAvailable: jest.fn(), + addListener: jest.fn(), + removeListeners: jest.fn(), +}; + +// CommonJS export for Jest manual mock resolution +module.exports = { + Platform: {OS: 'ios'}, + PermissionsAndroid: { + requestMultiple: jest.fn(async () => ({})), + }, + NativeEventEmitter: jest.fn(() => createMockEmitter()), + requireNativeComponent, + codegenNativeComponent, + TurboModuleRegistry: { + getEnforcing: jest.fn((name: string) => { + if (name === 'ShopifyCheckoutSheetKit') { + return ShopifyCheckoutSheetKit; + } + return null; + }), + }, + NativeModules: { + ShopifyCheckoutSheetKit: { + ...ShopifyCheckoutSheetKit, + eventEmitter: createMockEmitter(), + }, + }, + StyleSheet, +}; diff --git a/react-native/babel.config.js b/react-native/babel.config.js new file mode 100644 index 00000000..f7b3da3b --- /dev/null +++ b/react-native/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ['module:@react-native/babel-preset'], +}; diff --git a/react-native/dev.yml b/react-native/dev.yml new file mode 100644 index 00000000..fdd13738 --- /dev/null +++ b/react-native/dev.yml @@ -0,0 +1,83 @@ +name: checkout-sheet-kit-react-native + +dev.edition: 2024 + +type: node + +up: + - packages: + - swiftlint + - sccache + - ruby + - xcode: + version: "26.2" + runtimes: + ios: + - version: 23C54 # 26.2 + architecture_variant: arm64 + # Node / pnpm versions are mirrored from package.json (engines.node, + # packageManager). dev validates engines.node matches the version below on + # every `dev up`, so drift is caught automatically. If you bump one, bump + # both. + - node: + version: v22.14.0 + package_manager: pnpm@10.33.1 + - custom: + name: Remove stale Yarn artifacts + met?: test ! -d .yarn + meet: | + rm -rf .yarn + - custom: + name: Install NPM dependencies + met?: ls -l | grep node_modules + meet: | + pnpm install + - custom: + name: Install gems + met?: (cd sample/ios && bundle check) + meet: | + (cd sample/ios && bundle install) + - custom: + name: Install pods + met?: (cd sample/ios && bundle exec pod check --ignore-dev-pods) + meet: | + pnpm run pod-install + - custom: + name: Build node module + met?: (cd modules/@shopify/checkout-sheet-kit && ls -l | grep lib) + meet: | + pnpm module build + +check: + lint_swift: ./scripts/lint_swift + lint_module: pnpm module lint + lint_sample: pnpm sample lint + +commands: + server: + desc: 'Start development server' + run: pnpm sample start --reset-cache + + ios: + desc: 'Run iOS simulator' + run: pnpm sample ios + + android: + desc: 'Run Android emulator' + run: pnpm sample android + + clean: + desc: 'rm -rf all generated directories' + run: | + pnpm module clean + pnpm sample clean + pnpm clean + if command -v sccache >/dev/null 2>&1; then + sccache --stop-server 2>/dev/null || true + fi + echo "✅ Cleaned root, module and sample workspaces" + + fix: + desc: Fix linting + run: | + ./scripts/lint_swift fix diff --git a/react-native/docs/contributing/release.md b/react-native/docs/contributing/release.md new file mode 100644 index 00000000..3e478044 --- /dev/null +++ b/react-native/docs/contributing/release.md @@ -0,0 +1,21 @@ +# Release + +The `@shopify/checkout-sheet-kit` module is published to the NPM package +registry with public access. + +In order to publish a new version of the package, you must complete the +following steps: + +1. Bump the version in `modules/@shopify/checkout-sheet-kit/package.json` to an + appropriate value. +2. Add a [Changelog](./CHANGELOG.md) entry. +3. Merge your PR to `main`. +4. Create a [Release](/releases) for your new version. + +Creating and publishing a Github release with begin the automated process of +publishing the latest version of the package to NPM. It will clean the module +folder, build a new version, run `npm pack --dry-run` to verify the contents and +publish to the NPM registry. + +You can follow the release action process via +https://github.com/Shopify/checkout-sheet-kit-react-native/actions/workflows/publish.yml. diff --git a/react-native/documentation/media/ios_configuration.png b/react-native/documentation/media/ios_configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..1bcc10fd93695d7a35179491553f5a56e5dafbbd GIT binary patch literal 112531 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 AQ2+n{ literal 0 HcmV?d00001 diff --git a/react-native/documentation/media/settings_developer_universal_links.jpg b/react-native/documentation/media/settings_developer_universal_links.jpg new file mode 100644 index 0000000000000000000000000000000000000000..92db043eeb453d142075b990d3790ad5e0fe317e GIT binary patch literal 43070 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 literal 0 HcmV?d00001 diff --git a/react-native/documentation/media/settings_diagnostics.jpg b/react-native/documentation/media/settings_diagnostics.jpg new file mode 100644 index 0000000000000000000000000000000000000000..03f7e44af81465e0a0c6d1ec209e5de0c7bd0038 GIT binary patch literal 43514 zcmeFYcUaTUwl5q-Y>0}0C{^hlQ36r|D!m3sLg@UE9-4Fs%?bhnKe}|O3893N(2IhA zp$Z}NfOH7Gcew2HzW3aH?!NE)?EBpPoU`xq?D_tY`OeID=94wE)~s1;&Dqe|Z@_I0 z6?GNBg$ow|L+20RY!sjfxI#^RnflU|%a<=-y>jI$%^ez=>(^=S-nvbDhxslG^ZmQ` z@3B7M=VWE)Wxscy>k&7vppb~D2n*+9ptvxQUsy!=FP&Vta`h_BH5x`58b)EZ`)tDh z+v)5ZfbJ^QL+a~P7dQbI=`K*wT{!yzU;|tLT%kmR@k*(1?E4fDiW>v3eN&in{8anNXoHvTs-< z;9X^fev4q!-gq>EG`gNq_VX_Q1RqF}hzw0ECl_n41f4Qp-mnHE`MUO}`wg7O z^_g#0aNl-uxMWAci2Y@k}T@O?$y`<=~#IV?J{p_%bceufg@{`Zp-#UFo zPPJAQX4MsvKUJ^TnTWps#R%tTO{?+JK9*)Dz*P6E2a2in`!7PTE`h8A_@$K=VBZUrorro&-Hif%O~X#mh@g7WHR{!CE*rtxSxQx0j1DpC%#Or zc!v}CDSd`4x$ucKY32wgm?m4uNyNui4-^#aYe$ed(|pAt%?iLk_A7b_noedP?J+T+ zh{t3m%CpBxrkMUII7l%JICGQeXIRg3XFVZi=D@OT&i81gtu}fT&wxuTkccDcNg_0U z`fx`eL6I(u@^7h>7cBTGCyK=m!h4!PVFsUTF;^{g=3QIo-EDV$rJsB-$WWICqO%-}a#G;TU+M$z&KP!3XGzNO)yt;e>SZcNGlBk)8HCWa{ESvA*I zhUqMC?j@6aV4*&)98y?11CVB9n)Q2$CKax)bFxuk$>}Uk%aQj+A{^0QIG7ZVX>~XUyYii0R zfq0#CTCHM`9il-}lRn$ecvt$-xg21s`aX)2Ou(616<0cp+OSz0O?FW~VV<**f?p5q zi1}SkWzu&bZog}sLJjlkM%3}1DDpV^9*K~lN;{$fa~}qh5sPKy%$msSd&1k8kz@_@ zG06biW$Ghnbv;e`HCw%K>35ph_?5_~y|5m0wNGgi6!kqzHH&k@> zR;5yhU~{2M9*OLQx4qIo^$THez`WgEe2f7E*vILqisG{(#X;o$@D$DPPWV;fCo~qB z5R+6C%O*9LvOyV#eNTV)&8(4p@ z;-;^i_bk`!}_f!><4nhwr;OpjNn!L}s`S*obi?c+$8OYm7%SD7GFCm~Y;3P{_%Ix)FwqCvB z@ut(*k_-;LLFR^GBi~-1aGM4lYBMwLKYy$&Tegq!$yj5d3EQ0Y|O4%S-q<&p2o}!mQ_4RU6ad$Mkm!qkada>r{0^s4K5Ix-(H!2 zSmG0>M2?Qr^o~a()rQ1o8@`_bEKacx2M#+n?w*|LpiiCKxSjrrRbphH9eAX$u%s?v#d=lw1@W#@p0`; zj?Ybp=_P|T<*MVJkv*oOPfj+TKinv0iq}P^RL%e%klNF$B%Oj4Oi*%a&35*(IVjEH z%T&K{tZr|^X5DX;LA8FgT%Zf%8K8X31-sl+-gD5adg^!v*o>k6eea0va4=s)t7>@Z zK3rwifctaz92#iOl3{#T|b#$$4wAU;;49Rs=@FlQ%PN>Pxx!Aj&6K6AvS*CIMzQw8vy{0 z+V~ab$?_E-RS{G)0aM={8jl!j0e{eG5H+7MH%)8?7~z9|d5#C?sJr^yRpyEnCzf|7 zgL_~4AP284N!Vs@=2Z8CdKWu{8QeV89Zk#X3DY$smC8l8T;7Bwj96`-Oy0bEVeBAx zjI>|0%+a4?NJT=-mV1~?k>)F#JYaLJgtodZbRBk3bOz8Idnw@M=P|-#wYj3oEie|X z$U-L{obEa5GQ!5y+u2WSWb0FA4Lyy8E@*J@fzp39pAc1zOg_vVhE+=KO6eZuZ~6^) z`74a=9xRskZtp}{jKZEP!X3_8l2%cb%c{Y6VfEEs!;SBJYlx$g;PqY>Sl{7FK3j3+ zdy~&aY&u*?AVM$UP_U5-jKK1YpgH{yjn_s>`x5ZzL9rT@15Cp%9%LI`HR^I`zDqGa zM20&zrTtu%74~41k;Y``qrSc7_;uSM?VYpAMqyTdnfV_9&}};IP&Y?kP_>c@f!z4J zej$7^eysJ`OT1)O@0fp2j76a_)*b<0a#hk%C(||S&Qo4KD9!G)c5u;aBO4ZyN54g9C*C9qdW#jOw(;b z6dio=>9|Tm%b;6$Ldeg?FF&;BvER{oRM)gM_26RH)35PG2T4i_B`zrTmA$KYyU^Y) zy=Yp`BCOGJ*n6|7abnx0$rBF*0c+hz_njU+3vEq5)-Lz$Qo z_{bgUeShWb0;T9OsjLFlw8f5UM%j9U5cZ1)c=E+sg@K;Tw>>drXm_vL{EmtsMu^eh zI6umpcDl4H)esl>G2C$CW#|qO;!R5To)vgV9@p+)H5*4%^|)PmB;Vl~nTR7e7g%3A z75~FsYO(byAGGfP?2xn;sxDGoL*tiL6Yp44r8VtqrDH$gjye2nFyU?F6qp`ZM%*ri zblhCROut2cP5{pSP|`8d%5x)0@7)cN(qn~UA3QPw#Sdz)p~Tv%$!^OHMQB7_M*?mJ>e zT&gGhet*~T=>oQ*sH|r>MbkNCHYnzZDt&o3Q1WyW2$Gz>CwcW^Vi`F-$jVs?Vt)Xc z6$L^tuT$A?K5murVd+@dPkaXGlbI(}3tjzY1_n~u(Sl*U;O0@wIaYsgapZ2evN`OyO&H!W?{_CtuC;1b{_8BKqXMh?7 zyzChug8mGUcLvzg3A==5bWUAp{CzX>UGwOv?xfnm(=pMzK8a7sxAuSMmPy(u_}{E?B*$6sew{0P4MVtBd^^+}4EdlVC9BelQaAFehuXIM+)<(u_yw zL61}!o^j}e?FYE9ab;_hBj|j`I0F=_xcPDiDLRvWnTbFvuiM#PM<+@6&dycSK_~*P z7Is0gv|^{~Ij1&x4`_JPj@i!u(@e{XjK0SrQky|GH;VtJ=sF0uHhJX?z|e@e`=SyR zbX8$L_ei%4@L=4j;zZFdA8)#71XI@~4|4^ru0vO$3pxNtvdC9Y@3unHo=;CiKP+Jq z{xSM<53khKFRNOdHXZ9qMC4Yx%$5&2Ib4&EAh~VI^8$Z2OKD^MB{DVxTeav%j+sCg z;_nvZ$|CqFMpgTRl(u(STgt1_rxP=c3hR9aa5I);_6VOW|DXwa&h3|Zk4QRu0oNuK zE@ZC4!{evC(x)w8CW5E_o7GD@=}@m7@5A68Wf)MnXkkCS(A_Wok+;OJWt7dYvgF(Z zKhGf@{U;H+GaKd_#{n-AHp-l{#RwZR9d5}wT9F!oH#!bkx*W?7xihmp!EuskV(ep@ z{_w!c*~hW9tIJ?po%2n-d|j%(wI^G0I-4^;;@EaO3?rFsmmA~nV+Jr5W3A{H#l}R%d|SjFWR!|I$Ks zx?I6X9fn(I{BI6z^2=g*Y*}ks|zGQSka#EkfQm0P3o{p z{RxM{-MP}8cpZb*D5N+mI;j<&=)*-vG}mR3s9(D0T&Z~jRE*^If84jmDTsfCo}0hc z!Aitxc?z-64tt#ebSQHOGga+PWeK{%M{Tmb91=0UpHix4QV&HRS2fWs0V{?iHLY@N z4imy^LOYs*jj^=_k5ZGd5ep3~%iB8~wNj*-Hb)b^iY~9D0*7*G#B5l)JnIc4P+xAR zqcSl8o+WzyaRV%_v?yB#X8AO_OCpHc5q=VL2C$1vu|J}I7Z#TFlx*UtVY;U%WEcU3 z>dd%%t^-};L7VrBD`Z(+5Cm=3_{Y<=L9_^DH83!nwww&Y7YSK8pQ{5c3|`uY7! zPk5}m$UWm*ao+UoE^K3ZW_d#@jp>I8^TTErT{&fP*IX~KEV^=Tf%SO{v%61!vwg>|VL?uu#erI^_k$alHp>-5t0~6YtT7lq=+xV25 z4ad`ld9KO&Yc0#40iq5S4u9A&ar|;5$Ast(QHrGat8npd>ocx8=7pZnRiKl(7LqMq zKnR1qBhIv@soOQ-!{0k$_=V{tombK-mv{!)kjUu7{a`XSwzpq=n1`~m3ckzjRw~1# z_b7Dz#iayhb#9N-h0Z;$SPo0o?!OVMG$JCxo`2@(NzuLln&l;z>2Rm~JhtkjVnhWs zPW(k>HvEY*7~=Oy5Lw0w=kuQv7TV$V3-Gku(L}D^K0;5JLC)zhYCo9rk`t1oohM;6jtaQb@k7~@Lfi=PR; zaIx5{p>?wx=9{|bHef3K1LZ}Hi09?4ruv7ojT$z8k3veMP@ri4nL@Fq|>XLRBrEIL{2)*Bhvtp&SEM5|ld@&F*gB z-*x-=5?PHpS2u%V#!FNKx>u~+{q);2_7PSu26OAOm*GN!COa+oF@G0z;YT?oTA|}} zViFemoT%DN(fQe1S-9EU?U5Iqi#GGk5pj#!I;1vOE7R|Y{Y=$UQrG!`N?<5x?c8kH z$1ze}6f`S)>*RRiP_c?6wKN-;(*QGD^(Z`-h7-{zpmVFl&(IG_>ykR{lGE_a2hLfG zI!7O4ePQ|RPx~o#gC0+n5!kt6kmi{7|98*NoGg~-%P__vW?w67XPInZ8>7at#Q_Z# zIEMg?vwNdGNe@zXv&BBoY$3lqQF^HLXt0fqPWqwM|4)|=Rw8-Jz#5d^uVFOT1iB!a zOUE=hZPh}b54iKNazQQuNI$1k+-UM3s{WUxI{bIoz)2ouc&^<^Ru<*AU`#3aP()6s z@OQ-^MU-X+4r8YZJ}`(zw+>}lvGjiWltHyX_26$g`cX}yp`k9~m>vEoLLp<6^=ZmX5$!BE&-Qb6ans=VMX-p{Tv5jxm7m~uRF=kks;)@(7E&0-b;wydhL?Sm1e zK9yA8Ta&y3dV~o}Gfr#MU?pKOYdCXg{|>Y5JDQK=xUS{x&1$-+&YP+>J}JG`=J~(M zo*ZTnT3cL73`{+D`sOt~vO|eK7Htst_Wo|Ufvh~Y4^VS+YV03}eUpXTG&41g5hl-d zaRp-j5i0mD*v?kdQG^|~A{x)n`CgksV^g3lxtYpq$zI-LZX6 z!#eFkmZ*39#@sdZ+SRWUVl!4@XuRVXw(S7$$LqquJ( z#0sQ$?t|{*(tud5*coH;!K4-eEF{JK(zBbg12(p~88|e6$t%$xbHU3z-a!|~!-SF# zjm;m6KME@vH;;tDVEgxZ2jBxMGNj*(HyAHASu~ zMT4S3nL<0R&x^s__us~rS%}mG_tJI~jToI-33CJvusaG0T~nS5jvwaRS6ZRko;wY= zrNB2&upT@ls<#Q{W@e{#hdzl@whm_xiW{@r*4_Re4FMyb$){~bSOm@!oH1)`xF5qu zbE9?1j4(d`kjv1KMJJ?;XJoysBHqSH!Nc}&O;A+YpH>~!*nH;FsVtQ)WybZO5Rv+5&gEstrfVM)^3BYGVdCL)g>+d4(ynX|5e(@(`2gP z^*G&8_S@JW7vKCXm;aZQT$qNdYQM@!NGMAeOm=|W47TM;-d=~AtCmn{I9l-5GEQ=1 zh>+t5Xx;v;j>WM?Tu(6Mdv3@}{hY=%y%$4vLc{RU)68#&lrs(sN zq=OvnXX@~A&g@#-TNZ1tJ;%AOJ|f1MaU168wCwKP?$bQNX)sx=J)?EdfH*22chbEg zw>Y?@{c+4i@*@#w91Di_oF84HnM7tnM`3zM@QetOS+T^8Szd$Wm=wFbFlW?xfvd=J>6oL`U8y2TdQs@ z8cI*;PXxK2sAE>V;>2*HmX*CcX0lnZW*@1PhR{?XTZT#3F^!_RbB0~{3YCgv`b5=e z{Ef7%B=#zGY0J(YZwRW0K8pbZ!a83bwYEvd+DXZT&*qQGB5U*!Y7M3@u&8S%VX?$CGo_NywY@WrdVHP81dd~+Vm}j=g9pn?9 z+Q4xJxT4hCgzMLPHow8f;Oug^Hz^+5*#G+8`k~wBV!O_#uUR_}%#3t^bdwZ-910D% z4geSe9{l^i4-~`~dZaFM2HfL6xsnQe1kFykHq6Oq*2X!#0J_xT9T$24xcGPR%=I$o zC#uB-r?fnWDYNE$H1BJcUAM<3T37eHpQLVz{Es33eeCl%6N5TuG1bMRE#XSd9gv9M zUf^7jd-fBe@6WJ-AOT3U!`@#t{y)xUId=JXa9KE4)MKjzEqf?`@}0U~T9tWv9FQ6j zeLe&BGw#5R^`&k<5OAO_?E9V3l~t!iK2-e!FyqetLyWUzN&>2GU0^RS9X6g|x2?41 z5qDTRv?`Oe@eMWZH&)x%dHPwIQf#pli(DkjD(0<(YO3|f7RHEmNBhI~_}q3_BptQ` z6mD4r#GVGo>mJl2cMtQ%>y8{l(vyf1NZYZvZ9+ZQdRcp;jPl9PG{Tte8+ov8XN8Tl zoz&yQ2;|1#XUh-JX8>S1ttH+M-!$>6QZlS2E2%iNJ)Z$HwgtYyBG+GQeJtR7DsTos zuvg|--QUc59F?)Kc>)(`i+B>{ddqf!>|fNg9&!d4?>Ga*ZJ<9d2+2_cKW_-gp^Msz4as@H!Tte+nz`pF7$G+eYZ^~dIPpJHfEi= zDqpoQnx$Z;;2L+F^s4$k*t}?>C1i0qhSu=J4ud!I|I;DNoLbmonvo^dPh(Y`q9jKV zJKR#Qj%TuuDURX~k3*mix|*`~?V{t52IIZbR`-KO19}cXfmZhy4+d=qFUzzc^BRY< zu-O*X1cDy26oL_}%3IWi`Ix!EE$g9@&g5O?J>JT0SBZsCf=TCeb7;AIqeF9NPzIlY zY0>L$4&gfglv{N-l2;EfuJq1#)0^$lYL=>xr32>%{lMn-^(?#h7N+MLY#*)Y1;ss? zXk??KPi(Z$`$6qvNTCD>xmu-mi$I6fUM>>r1Joc6l!|!&k3tTm+EjH5!?i5*>^a_M zQNE4fE1)WW^>*>Lwd6zT-K~5bAE%SHo8RAnVWX=w2G z5o)9Gh+$X-KQ!@s>EH5Qj?SKBiHMxsP(0&io?iIYdANzG$NX4`oq~#A^|0e0+fm@3 zGm|dO;9IO)$x*9Se9sU=jb#DW>QKT{T65JvBla>Eiae`@U7YpVFR7TmPe~&!wp^{Y{~gPsR5}lI%TKS}|8#w5jD{ zRBG!PnK7vmuGS;UBaV>Y2L8D|$<9NZYSDBowO#P5!4a&Wl=akgOytD;*l2AER>dti zaHWLS4000tI~-rI*{@ZoSHWkgpiH09oRs!!WNlw%{@0+=kkFLYL0t+b-#Z^cAJmR^ zZGfyT^SrIJRh(*iQjH}xBiN|5t~Axw-&B9$D%`P1Bw-NfWmU=f@ks|}pA*?X(2Fp0 zEwGE;eX1W5QSdq2Bq}_O6r@CIot$sH-_9%E3Yy1By3S7KSurOi?FJ8A#+aEEO2k`h z_d`!GG0Lr{OGrOa7kc?zNoQ(LCc&!(0v3&zI#tC36r-Dm+dj41^4;GM|J~cs?BA&b zZNu%xeb``|LwolYCy?RZ?=a>d5xH2^OIKU-OryvzZRoi>JX2JPYx-bN@n3ok2Ex%N zT~$#6^>f%XVp~$Ld{X&UN{_Hx*ow!=!z_^I4HW8XQU+Ugv(1}Z;)`!C{?EemLSe;; zPt~xu`C+YDfObQ!V3yt8WLW5s>Fnb%QQBmLtAH5cMn-Y-(YIeU$VI%F0fGFojv}+2 zM^=9g?DI|PR*;sv5wA7sMEuoIjB(cenXOg7<~L_WKS-jZnU4wC%R`^YxRxnqYQ4Pj z#OVyst}&}^!FaRO$qTB}?B}V+#S=9!S4ry;@H2dE!4s$7rbom3aV18Yj(xB^Sx`(F ztk)T+FLODp<5hP5K#e!C`Bk(fCL%O=!>w+Rlg}^KPa!*f>*c{yinOcjlV!%69<#W9 z5n0p54aBFpfcsD|M7MO4@v^U^Sqjdx${(w~`53lav|NjGS#x!n_VED?kMB%ZEyN~R zjx^xCM~$pZwkP;R4g{XE@^3V)u%uLzd%9*kU5fg*Wu!C>CWQ79uG`MLrJ2vp44~>? zrDsw-zNwvvNP&*<3>e}@5nqGl1JXyC_2r?`Og6mtYWDyNN6Ol-r!q3`-nje zpH(lS(kt+)^^Wa?mxxYk#dCF`WhshLZrCLKA6g(fmZ~bG=-NDIWi9!gA>|Lpl}`xS zV)Sq!lTeoxhCJHr2?^_k$=t!f(|M;M4__$- zaq%f(uQ$>zJH?WXMOBr4v<)kYHZXH4eoJVFoKI=p&PJQqCBS1j2Ks}x8A?tVl z(S+K8!L?XioQG};S1C1+Tb+CDeCsW#I@O_*FN-X?!ZkptFJBO)^%~DxqLryFGGUPr zwNQp9^VRYTQ}nCjL837|MSbaRZaMqR?4AxG@&l%z?cL#r$`B|%1gh@iE!(nRW_KV zM?JJEc-~>aR^ga-EnlBll$}s~m2}76E;L`x*`nJjmStRSGc1jfwg}&mfb)9S11led zcH(cre;yj9@LCyUmHN+^zi8oo-+o1(zOq3+W46`svKF=q7I_h7#pWVpk2 z{S}XJB5ojB6WnqTAQWv>(?78ydt7aGe`2-uX7Ui(mWTk-dU(}3rYOZtxUJkS4gE2$ zlY&kgzAZGeMVMO4uLv=ET}if|{#vCG)6q6Q^`anR2El1bnCy}R*&cn(v7v29kCc)& zy5tW*)km|ur-FoLn3rD{_!l8};+A=zDQd9Mg`jc}*r8m>`XHL2T zFN5K2rkf3G5U=1QxDU|DX+u^axuA=FQF;BY%x~s1fORbxH3E#Z@fYtivoDE%^ki-_ z&~Z53uOKpwEO%XWsAAp%g)Lt!5^1)9$+JKV=eYJ*(c#rB@UC_~7}Vm1JO9M9+2GOL zGl0mgc7n*f2dfT;eFR%%qi=U0OZCp(h(DeC7Jd3}FQ%DPbMJ^w5=q&2q}=GYxDl4p z+saBh{)r@E*Y$sZqxb?uM7m9P#L;Olf3f)Ls$ji&jF>tde4ejvVfq$&n{+d`q6i4_ zF;AU}m-lp}?7YrgLc(R9n%KHW4gW=P)BGq`*vaH-^TBQ_|< zf?@qo+H)vG+FW>#O~m&%xSpZ6cpLI0MvzYx7*tG~p9x$ND=nLN<*w?6a5oQ?;R|_R z2U$4xjbc#~Ye?RW^fSOb`S9t9R2uQ9Vxce_7qsCE;COm?zFYj2BFSR^S1;^s*+EiK z^M`U72B*eBVx)@udljdl+y3Qi&L{Nk#TCi#;&&J!ZI|>=QuRZMg#08l(k($eqQk^F zzOyAWBO?huId{iv7K%%GT%kXo_Ck^Vc1Fvg}USN z;3f+>`EQ>>Twk^p4 ztZaKOG)K$5E-YQdCYFVl)>NJWRy2SZ7~a*~|aY{qQbLpVK4y@Wt(`1tr*m<E1jno10>t!0u@sY}^<-WDGwUM)wR_zqFcWvDK`zz2} zjJ`MF78)PqHI+Kr~3!;|E%)% z>SNSYYi-lQxf+gqCMzLI-R366SHBY~y`?Fn;Cot1V26x8HfG#xa97fNoL1-SsD<2R z*LAPnpyPpnu$Rl?k|z}!1WMpS+$MnwQrl_P8o=7{UZAw``yhDQXjdStvXd-U!JJ2` z4WZVG(%zZ*G%PoF{Nw`&l+n3q#WA(GvK?|6$Sk2_(Hyi`+2v5d;;;Gqxtr3Dh{QJq zQzT{gfP0eW+LrjG9Q}&m9-6AywT;vtl+;S&4A%VVL#WMe9Wv-As(=!pVADR}Gax@% zR*lK=woVw@aX;MGjKP+6c$&oT@$qg)7&Nu4YuN;*TReBn|LRq4OW&(7|J}*oWiLlF zqY&lvZso?40pnahBkrLDF?0Hx;Or~r4f#{9`{ttZky;dKnLxgdL!u*dh@R5u&A|nX zKx}aQ9c95R&#gqa3GfqFYvP{zFh;UbosD_pAu2|4tuhNAUbhwkRaDKjFz`@lCQ43F zyoeuE)6scgr+BQhNX5tEEpCrlcfV-5MnsI$s0vXsMTF;uHs6)l~$xeCd1C$iE8yzXr2 zi6ox^h{+W_PpmEDl=^+6T&v+E<|7>o+^iXuiEbIFI$WHO4<)&`dHSBKOt6}_Z;Mzx z>_m@w(jWGz>d@WLMREm*_!?7OG2!wqT^?)5vbqp)bSnS^u`8;q$!h(XqEp;d_-Z{G z1~Sx2tzH}4H5$ZT`|R4e--sd*u_{3hOT%$yuOrFHL@j+qNQLaX_SVMtdU{-X{(9}9 z+ty>3b9>JK2||?{@d_2rnUwPw9mv%)Kr2(%#{mH5ly>l@BHvQU z>6TOSzvnkNQ8Sq*ix>r+l;uAcAgRX*j*I+@z{fDy^UFtzr7cLQr|L4+<8Tp&Jg4mr zP{1J>%mR_4uw=aBoDKN-A&Sb_S67qX+ftdOw2`M9^kYwz7ru8disxy10<9wF$qGpv z2wEWZj09JV>JYg`7*EsFhlW|~E7v450v;`zFS{zR5eRhj&CO3`SYFo1I5U+aG&F{) zq^`FW!8B!u<}H~?JK1`4kZN~O+mmw_`3I+<+b&P5+|&* zfL{Edqn;o>J?7S;u&>f~2IyQot#FAFWXZK*53kUL{G5Xf!o)aOD|;h4j2jAz-6$`f zrJW>u!?M|cA~9)QR8Bw-;FrmP+@|R6g*lN0XC@HNfDW)9fJ2Au!(unL{O>R%d#atUpt=yA> zg|8{Wz}|ASxt62e!F9vgMG1S_E-7wLaXUI>f5-7Oxivp+s!FzOMJzV16JNSyTd~%5 zgVLfS5!t%ArPO4}@?j}5V4t6CuEP;c2^z>d$xg+Hl$uLUiI{>M?uaIql`4 zV*krrck-U*xl6^k3egK~KncTq90#g_hKNR3$gYMY`}i7+_S|!kH_*aXc z!H~sUE&`%O`)+)V1uS%gf~XZ#sOPdWUgoPe>lq8_9$AK%?o$7OeVa1D)21!_#dW_@ z=`(C!u>AM)O-s`DqhF>Hc<6Fi{tg=^iGA6P&N#xuWJ$Z<6nUaJ=IXeT9;<8U=*-yZ z6u09h!^e3@#2|^7*Q^1hLLYX`%15{mlf3cUF({AdE@<1q&+v7b4kJoOU|1h1G3;R4 z?mF;yYw^6qmo3Bowf2*16lwS$35f8y!J?h3Ns;dZ%j~T3=xGm4(U+Sy)B2gf? zROF^##9)DBd9H-nqzJqw|98G&4AjwKY{rA>+{C5jBS>dfzLM&Aq{U=k==tQk5wkj* zvXH?QQGXxtF4RgJ&m9d$3wO%EH{w>(tfGHn-@;&0 zFbEqVZtXiM1z22Ez1#sFFg2YgX{s_;uTf47RmF-R*B`jsWE?-_Z#;<3SW@%u{qYE@ z>^NHI1&nlh)JI{6f%$M-nLrZl#y)vZvku>jvPv$5whMYfcdoJ;RVs8CWS%^2OtP%; zN4dBYoi<0G-E@1F|(1$B0QcALJ)jE%-cE$snUvnmA>Pn;Leh;XPezGDcGUhB+tWR zt;rBN@lofT#w0n0UU@ByJWdO54)LRTas~iK>|hS7y%s)3U98Wn0HJmR{F3MG3##QEG7Z^Bk__jBV0uU{ z`eY%<6*=b&ZSr;`Nk~jIv_sPfHtK+29V_ifTOqBsiwVC*Ml6=Clo4>Xvt~DtZqDoa z&s$;wNiABKEMV1`PTe5ZjTh^b0xGN_po)PeeZnU(hM0V|X4UM%wp;p;qEU3S+ zJQJm~P-MOwpsM_(W940l?kI<dD=}}+dT-p#n%r~VAlb? z_HJj?zJeWn?I@C{ijQCT5~&laur0f?D%Sd;%3eg#wQg69KNszC_zJ`6ni4q+TbPJa zMD~^$E@WD-O(d1#SsO%^=5lwmnIE-Fx^0GajDTW^QZ7CB2W#2)kLurC`MlEY68ixge3N0B0JFEf7-V3QE#mZ%g(XfG0HPXlH~0+TCv^(h z1;v{!yfe-G4nG}Mb-laJi1aSr|GmxDkrwRSF+jj8#qOaK@^ei z@+sLPQ}Xc9h1MY_2_$l$omtW{vl}8 zrH8117WOytNCpZjC%Ue3&ay;|z2-9y{-x9eaGi1A-E^D+M|QCWiZ+0bpKdlG0z_2v zSL)MIo&Nq)@o82TzmGZto8p4HD{JK4UbIeHWdXKiX}3`3UDO-mYP9rnrs)O zjmd}oJ8!W*Lbk`*!t-rWae-Rf8(t2rZmn_{87d991H!nfzy=jftjCPg$3tSQ>e1?? z5z$!aw-%2hkg58od6oIZcPL@hkkPYr^I`JFlq2WU@Z>o7uk>*Dj?vhx9d4G zrd1bPTi~8SC6c@Aw&_d|O$;k08Tm5Ey@Szyw4z6 zgZoNdU9YQGZWy4C^=kuBQp*Ab+mdnb^%pVtshaa(h|Igp!CrRBskPMs!2^vDO(T?x zM2S?OLw-)A#7vSqUXT7;(el7|w~`UWR5fIsgZt-P-jP{{7yTAYyUtwo`;;9q-p0*h zu^_f>zpn7yO_l$Lpl5IcI=oENFH*xxOQ=>cR$yt%-5BQ*lG|6(psIi~(D>qCTcre6 z&i`$Ep{FvV(xowEgljd-6Y(1{m|@|Y;kc$o+GZHkxMq);a{5y%rPyxgFv69$+lw}) zXw#viby@Vdt=@1=UzE4jeN60g-W z_xbG#Y6Y1$UV^Hi>V|fg0)UtaMn+ccu&WSSCGNLBXICcZBF(vesM>3@Y9np!IG(I# z8+w|x4r2?j5N#bC{$`Tlfb{5M!*U+Pi+)M$0du8mkGEbzV6TM=S>_e-bL#^@-`L-3 z+YAv!3muVlzk13>=5vEH5nPGL%x=d=WAk%(I7RgLO~`+Y!2{(VC*Z9nPKdtcDiim} zLJheu*|e@H!t80^I-IbXv31vY)thEFmG+h1zoE0?D7~dK3$xIFh=0aEkFKD?nBZ*@ zURa#BL>*6aNK0&J^Yn&zB)e28In}OiOlC`I6u+97-1Q0;!Kklh^U}9hEj9XQ`fL;G zt@XtaVZPXeMjV-KQ+fPjp$|7YGJm~z4fkmbRsGnAiGazk5iJH*>l;uIm96;_l-*`3 zJ@*;JYC$}_MNjTg$n$r)q$B#_+-W-opV!4Z48WU3F;Z>A?DL#ldOxej9sT`6{hqsY z0Zm=X5q_kK>osr}Jh?O)3aR#s1%cYX?65HOrMw(+8fl$dd5+2r6N()Q1xa+&46lDt z1(Lg)I6Y>nbkZj8i1GN{fw`)qi*KRM<&N4=RNJBlcw3_MxoPGO zT}Ho0tW$j8!$+(>AF9^-jGm@SWQ2ZxwNW3rJU!rA04s~>u+OW|Rr#~8@5fL!!Usry zRYT-L<}S8mMZFk5Hdt%pjA8bD7%5?+R0bSISo#9PGK?B7s5~ayTN~>nbXl-MO5;A~ zCZ!o}t8kg7_DYLY{X$j}!pdivNDeG<0y@|Z2gKN1jTprIQ+1oS9*E-knnBt)kjZ)K%l2O@dRR`2c%jy+@68o zPiGj0wcp*ZDys>e)gY+}CXa1ebb0vNG}`$fnaxE$IIA?3J-4lIVUr8*DKq8%$hPKk zoAOM9bup(dX(_i>veAhAGFfD0k4UWV@h|v&z#1B5{%DH z6X*Hmd;0IU52-V=cB5z3Przsj7KxnIRu^&Hk0tg4eWV5plIOB8Hoh1u>@RCcu`+Gt za`JNvv)6@RldmmS2|G(*ky&e;^EY2|@^QIe)Sa)-UZ#OiPBP8J1`dyuJn@K@h}aHJ zkT{D`7Yj2Ax*@fq%*u$nqeoIAd`$+1sf~}}SD;Nfqbm`j-kznCwQ z%E=0wUbRRgYcon%;_+hI`a)2De=(-O08~5G+BhbG7RUpUTinxE3{EGtrqQE~T1sH`o zw^VVma@z5WEYov8e0UDXEx5e#^9u@+7U!pctqbmg#v{I&*fMVY1_>_}Cbyw>n+9rJ z-V(OyF2?}V${%-j-%6A?RLI{qW8O$kvMTMM`K=P7EN^T-bKw0uY>xAIjRE8xzF#&m zz_Keaefd|>?Y`EQcUa+^+xG#mM0<*T+Z zvvX81T&2!7&v4njY5yKYIe&mTJ!USh3}RyM+loEjQSK3ol=1v7W#1Ssa$?!|@~usd z>921EXMnpCCA)I=XMnl~ry`A(%m0+L{|l(RC5f0(f4l`z6^6AEe(s>1^wQHYQC-!)#Ge;VfDbPD>_AH5neY z=^-NT8xNj)Lt4NL(C-Is6?)|ST9A{ey`J9wICL(3`3{$()l2cZ=+F;)4;Z?{B+jk1 z5EQ~}PYQb{3Ep@Hn3c!zI5Tb7G!{xNLu5^?zgCf+!yw>Bpu+fgqyfe%V-CZf$YR4b zl2Sg<()y8+BVty^Vf7nbzS!L#*>4Nna+TFaJ0d4;`HCjjL>8HjAkchJN_0Kjhy8m| zza`K8g0bg=oX_YMy)zOyY?rk8OMl&bd&~mV(J_U&toBbkv;V}v4i&5-tSzi#27vXq z6S%m=%%}I>Z0hoS8oT1hRbD&H{r07lollvpY<-N{T`q5*e--|VApaLGhBxQ28!^X`O9u7{^ul3id=p1V&b2+|oeMlgD!jK(0N?&& zlmF_st7Vm5r&)TFx~b8cRNnyBe~sq~UaA}NV=wP`N^K8t@6BIV{g>x2%qomWLAqV* zs-A@bp8Pc&s_~5MhAVH^z`YX}!EaXq;(w{USe}nRP3^_UNhG%K>7UyoG`w@f0#6y~ zw~WzgkYXC~?sSMkq%p@nLBZvLjPSjJVpPeH=>U1nV9C94E*GZB3ESg}zb1KLaJB*S-cDsZ_~P8B~Z)08jmIT#q!#PzKc+N^Y2S&$=LYZwazV5?ctT9spH7tb-o z^>)P1`lmcj5r>dJ?|cJX@6H&k@qwDVNY*MNNw86vk$(Tj6%|2gldX6(X)dkZ+KXoj zq>x*j=(9TYEs36Ae)=10fZpYtyTd~8Qi(6!2 zt#l;8Z8AR^4-%@1=P(gUDtJct?+@X?sjxGEZEnqIt`QnDtmRJn7aemPhO z3dQ|5_TD?Ft?b+P#CGFu8?c*<3C2y%m~4W;foOsZLL!4rFd%|J1expvCKzafz+{sI zk_blRY=g-rBLpIu3<5+H89eG=&3$w4o%_e!S5x(Brk<)!>8Nyc&eq=N?7i1sYkj`B ziG$0u!u_K9ac?D1t2bjQFs9%%w%I+qzo@vh!B2{%!q5=Ns&-!mQlrCf8SBZFx&QUf z*FRVZF;1n!xOwlwJm1zJy%qPMO2!*3=O9(chV()GXEEW?(20oyJ9_bi zXY@O2qL}Acl;hZ_>?_+e$Ao%rf-oACuxjO%Ujy33Vty8UP;K1rPN)U+Alt4;+?A*N zIW~$546u-w*7UjC#aG?k%*v`7e{&;?wu~iZ-U_J0mFmZUeZ`a=+&dS*DsdyVN;btNvzaMq=$$s;@+ytvo4BgkEig#d`Cqr|b!$e+BQdTlCC<0Fbey!&4J-c8X7k&0%PPo>+vt?L82Gu)cpA+GdSpTC zcxzpNNg&n^UUX0JU0WXNri$~RvE03A`M!dL?(u2>wCV52jf<=lWPQWd<}*4Xd|*U+?bCk za@VcfnKiw}NAHI@b7|3BmsENx{?UU(vX~MRZuK*}u1W1Q?kl7do=#zG^sLY&2h|ML z5+F!t7vJ#<>*xsE^t_u5{y;-j;qdj87A5|4G|6=7_qyxXD=pXELM%rhBsYNMV<|RK ztb@aF@clBahjL$cQ0TX1X-Oc1p7}thMC~OX>+C`!oerB2o|=p*2>y}Y)fW$v0335> z3T;2)Yr$y4{$OeU(f;Fx{rG2{$KbuHRjvhJS;p&ikCEtcfk1G773D z4SRu??O-Z@A8)~(^P9WN?~ktnz%~F{ITDn_hk8qGDdbvbULf8p(!N+B`%?qBQ1E&| z6~t6pAmZl465<spyC=9zZPu?a=BeFhbj6_g7 zk^26xpBtayd!w4$-{!_!znaGm(SQ2)W6J;Z{*_gwS?j>NJ|W9(zdgJ1AI^FA;DTpI z?RH>j+%Z$|ZLcel|6GKdunbaNmnLfG326Bmrfq4hC;LJ_Jmp?pR*Y=udXjgrpm*kd zrVnbGBz!S@o!_)Pm z%Gnf=BLT!foDP;bjKgpRAR8SuI$P`~I*sEQQaJ!R@%^<%5s$D+ebS2Y=Cu3(>%# z^e_nIiOELZ)05f^*?dHPR`;ON^q6!;*m(q$*Y6*$#cI;(k~G!JNYog2yqdcF;yC}s z1r-No)~s>D^o^DNo)nS#l5v&DFd)B@(TX+$YmV5g&kt52ZwpzKXTQB2(r zTf5(kD}t=SXICn%%Klb-CH6TDr^N>k_Cy{7_rWv-E3U~~X@qnwV!p|ksjc{iP{Q2~ zG~5fxewXU_>RmpWCgkPj#M>YB-!5M(w^FMUP$bl=dayb@p6}OM8EZESU{!HWmkxVx zxhQl?t@bwQQs_ijH{Ev9x5Sz;l8r?d7`&53*-tuq!%n zKOnZa+Nc(pf!gJJs02~Oy{|KeV*3qo?>$bM@iZ?1$Fb8J0GYf>hRgSf&y!81rI@N3018A_(DBD8U zgFTAfWdW*R8h54Zx#NJ#f2}SZcZ^Nxji--m?mHvx!_C@sushi+)sdc(0VoIjDciO~ zkX5tU)qRGxuzhE^(Qm5Uf02K1B|lY} zBK#IDJGj)9FX|x~y(;Jz0<9${)p#<&f~ZuB>~mzS`%?bix6w-QUW93pZslmYa_lb} zgLN9^h(E}-zzp-xwX*XHkmRO%r9>(maDap<(hQP~#zdyU@F9EI=YRjAnVLW2Ha#!7 z+mrg#xHE%d6!N$lO`vPnJT)t-s}3+w=&7j5ug5^XA&(!>b@sIioSL1d0ndq?i@mjb z9#AS2Q0@e67>n!TKQt`FEB~U|>}FoG|EshK>uB$OILa1Gsn5#`Oca$n{LB{e;*!2v zV@aen!?n0Z2iK5QxGompM>~?21GFkk6npyANxMOh6_HH=Q{&Qun&tW$xev)-e$iaF z%-LhH>#vGgnmpmiyLcHkbyaJjProAeBk7Jj7RtH_E_S}teWa*E)@jO2O5~%`+7zf9 zx+f^Vl?4Cdv1(TK=+mA8oeHRRrl3|=W~nK>J`|y_R_qICo74BL8GK}QO-vN(V7?r+ z-a~cAZ%Vo|wu9je$ZNd1h_ihje`v_tlEQJCyIVAVyg zdn4!>u_op>g~NtgPh5>+HE+WwEg$P?zD3bwALEG~C8HrKn3yyF90@+}d%Zdn?jED> zwsqUWx8(^)&_H3k2zJxS-c!K4URk)b*WIJV?X;hp-&|1!;njtFPU1G?=`2oa`M$+kz6)|0JTZ;@>3)=LQz^MOMOZJ%vomH zdselzVDvE~qIe>17IY@z_E*$ZJO`Jfg$gwLq&Y=98@)Z~n>B!FT!44~$(@JaD7{k?Mxum6a z%D|5UAjh_(^+0{aQb?B5z!`}I6BCe_!iX-m=?H@nXKW}gOAlHFVD`Ut#uQp=at2( zTP;fbJ#bVy5FMqZsSW~e`FZ4Z&*4ZZJ?0~3F$w-jyY`RB@crJWqIMPOT{`;?=r<#w zafj;o$1#-`X&W)KZ>pwCRSipOhX!xi7sf}Hez;j&Y5-tPM5$a^ttw5H>UFgza5BwX z=#p-5CVf9qs?izyoj$kNoHejiNg0~(#ElaO;-TxRg7bW;t=`3%N$tw_PxZAn7?M0}=|a*~ zHd^B9#9s|`ng}2=nwE@o56f7=%o(9&Z`5Wa+)drG$KVHA&*c5*{0f(A#f@H%!b=qX zT}gCu`gNpyNI+T>r<|U6Z4;su>%ddeDIPW>>^?0pOLbrN08Yd?Cwp|3-xa;YF4Lop z5}b?VeYh^uMreHK8K;|a6e}KiI<-MdMFZe40qnk279MOAdFaFnW|W=7+MhfP)rPiO zzB`PzL%y4oU4QyuG!#8p45?O`f8~<%^x%kHTI3MxFZzri1r~E1HamG}s_2AM@%Ze5 zb=tPTn~t>+eT!<1wZuBR|FS1Vs)mCDzBT7_S0(x znrU)TXuwk5nos^341@_@(IL?}^GX(~X&_y!E%zlt*sw zETS(ZHO4rv@DbP+044Ua>Gy z`{%8oTI1>9yu&2#l$w@6LvdHcbY9G`zj5T4trb}ti|mbw%ch-r79i_t*{E4s(PIIt zm#L31`%&(YnZ>w<9uCQLAjyR4;s0zjAl-EAx~o#W1V@mu_vcE>RDNS{sNigNIA<%a z-VnRl8<-J9BnC!j3$|Fz3P|x2(J+TOEX$jS9y3~8W4{j`8 zCY7zeUy4|DOz25=Al7Y!ulX#cpV@hsSzDJ_-o$11xYUZ}lV-F`3g&`*fP$1XA>>oEIcb) z0}|z4Ze2f2&d)$@oAwsf|M}JWP^U^dVM9#H%Dm2NA$(7dJJ^uGrzDmWtl9PTe9!3I zu;sF8Ze{4EWG_Cb^+cbfDi~M!#n8()c^@3s@u&fx0OBD`+`EE@ ztW=y?lwat;Hk%kiAqn4pBuUQLf&+?M{=kd@jSCO$(Ed@MCt<^>3^(im?C!c#pl?Zk zDs1l)0!ktE=u}l@VCby`8W(Bt+Z|lDH{vhe4G;o}ce_3QoXQ{dfo>_5=!vYp6P0Ix z!^C+T2rn4TQmo=>y99az^w&2!KaU)`xF2HrJ|=+cx1A)Ukmebmdh?CFBIc@Oh9^ZF zg1~W(jMbJ+NLJ3w*Q;DvQp5iHfw={x75b>EW%*1U?|dI)WrrXsO$(kly@tpr63Me4 zluvT=_uNuNl_{`UMw>gtMZXgAecJzn-*Qzco0Rt=H1Q|Rs@3(;nxxMnCViMHt&!tX zKS+mpTwwkBPaMB3;WSnG+pU(4GR0j?sgLa@lWVCG3~X(f99Zq$8oQ+BlhqIz9jl!e z5+Xr^@wk=$%-Eg0p_u$3=2e{Hp+8REr=ls6s&Z0)CsQ~c;cYt+-eocE>%Qlvi?L8K z6$7bbq*w;xZ|rBhU(Tk6tUsT8FCGqB^Y8=9JQ95JGki~$V=5J3T(6xc47QDoydE*4 zakjYZ5z@F%MfWN5#RC|BXui9#4G#L7m|@K`+1_iG984R6qz+r zG1_vhoGT-cZl;UJ_LeeQfS9Q3X6WYTaLuK%pw@oCd4BPBZ7e$sH?gHaV8??ClKfq4 z_+&o91pG)Z%+v}>1SBTZY^?NSv1Jm51H)VbQ39shGwz<$Il3SXvrY8c&J| z0Lzs`)XD-U5M7pUg-lIqHrE%HMcId{paR7L zhrQ5b<vFr|ow0 zmBtgXsGoX6>AaAQ*n&q@k^xVX8Hf4&xqK!{;0~(U_WN#@*yh3X#>VUCG|<@U&6*;c zsdZ0(Jti(nWv1HEtCEfS=94n5m6*}3r${zpO}t})N5e@al(Z4U>{F%P!>7lpdSu0w z-r8ddr04mAX0@63vtQ^?O+2v7k0RVNR^{o27U7=3@0&?@F6_G*PZNUD%l+w!k{K}b z0h0hjp0c;7mR#ry(};B8rxZ;DH6|3>O{BRQ*M}CPj)6sJana>MbVTgOMA1(rL9D7s zY(In3^6y3EN~L!Bh1HhgWsD$QO4`BLHnQSm_k0;DCM>Y6G(qEH?n_x$s}OFM%&V8w z=j4MNB6c*Ih;uCth*kIoA))0p_deFUB)HTa@_rw^Y1}0cH63R!@r%Z?#6yK+IEZVs zHa)h)jps#hHDsz$e}+dK`qTI6in=gb!``V{0cc`Ju$?6dXPrM%P>EAH3 zT>RMqOd13CR+wkQYt@LQE3+|u<%R9;LAqmO(v|C5Sp+NbLL(+TKp>1x4VUr5!Mx?> zavKjl4Izkg61Tak*9SC{0L{1+=wS-t^SwT~F$N7Q@9)CX3u{8$zLW;}l;b7}#yCS) z>c7)d(c|2hF?cnr`O4~@PErwm^dSSS8Co%^I>yNmlWG7gD8Xrx@gT+hm9z}(k;qZ{ z^tSK5)h^lkLy|)D){BwaPo9UEDR&%1Vav%zHP=jNLCBaps(a=$16{!ZWhJARnhlJ| z9=2hqaaqf`ApFLM^xn>dM=l{PT48m^G@t+d!}b5A zeKRQ~ECmoeG%^unKyN2&xaoA?{42{RN*2lTM8u&&0cvm1A|EDiWLs`|2P;Y3wX$5p zZeB#Q*kd$;)K1_siaEW=DN5Ld>=JDl&{m9WmVuYlUcD9V$!+eb3{%#Cvt6?xLZ$55 zY#!-B9hma+a{D@yR@%mVa4nZEk)NnIWD-D9o>hqxWi8_9zqs>V3y48$tm!qnjv&J%CHyncX>`6L?)P$ocFK@%XUfc35#9aoOE@8{IGF_Xkos=>U`+<#FZ z;2PH9hS-(7+NxJlu5^oU*gQj(KXd`3c4*^j1xv`0un;T^?~CK-Nd{thEp{u*x4AxS z@YeOXJ&iW^?J)Jb6)#)KSP_VA{F41yb`(-kgLccENr<}HJ4mZ(kjrdjGZ$QmtKL;) z1)EOmIOoPyX-TLmYa8}lBx)Uti521B?LQ0^eRA$_IVACwh9(?Q-{D+sXr-jsnfWP; z)Rb_uUtA%4Ax%8ZhL%pipySqpFL^M%l~70bNxZ@H0&Hala%<3>AhR@k4{zA$D!n1K{PF?Sb)a7Otz6c*WQ~a!<=4e^Up{;6=#85DV$#TB7ryE+L;kjNw(R=IVRfWsrbd7K8q) zl!Wci<8lx9HrX-#M_`Wk`BmO*{FR}Vtu}KUS*2Ud$&O0uwwc((d3eG_Grg4Ctntc1UVMf zsL@7ss#R*c$dB5_gRA`%8w(8M=Jg3YcjtJ&(ETaSNfo}Z0(!k2baAk=QE{?u8j(NK z$i1y_$zndgg#;U0qZe1@C0=sJZbRmoKQkRTt&~w*)AK4L${qVSJ(ai?6=yX7oDP3ow6@(DqJKJg29%;Pqwp-0P5M=ij_wR2eY}?XeEKAeYW5Y)!T9(*q7J=MuP6Szrql>{HiNa|kz3FI7%nv$q@l&g3{Rqbc`UHOBka>+wK38HWX;{jkebGEi>+rsEos{AG>#Uiv?P8P_>Ao#n3oM( zUt0r$Jc7mcd_v=kv2k0=Gq#S+!XfB}cCevsC$1*yT>1XAb7N8bJqeo98L?^xo5?Y@ zPZ@gjuBrGR1NtOSV-V>c)y6!vg$8&cWvoSl~TR7)9ku;g-SH|Kg|dZdKb+Q{V-IL0tX(~(hvc`&w!3X{W$I-% zJ;>ih9Q^g(NvJyg7GW<|URKOW^oTj}Rq$*p;hy!C_oM8qw&<5mn%0~|vz-;^?Jk5- zc0LcHWqL#U7Y(0zoqMAEkJ09OZE6cO&wiFL)0@+CE-8*#ZKqpujxer&d^fdj&~J2% zf>dpCRjQ1bS5`JwZ@=Onnp-)EX?d0{9xE`cA_$T58^Tl@v**Ekl80KO#&Y^Ds;{=0 z`SBd$qFbUT-J_N8ctj7iPbs3Tna9Gs@>^=Ho;{&HMFbV;dV>T$e&&JYj}BdRbTcT` zkG@v5diIG$;sb2+b!75m*YFSz!*@nKU_`NpFkG&g7STk#`=Z!T5eC#9J8 zdkG?pxNvdK}IKNr5>SP@H zf;Kdw2t+a;$E9Gzo$h*bdh%fw=P&O5lzNUPZl~&poTRvIGi*rDLOG`SFKieAHh-Ss zYl%~Ufia@9>IZQ`6sH2Kqb6j}ph)^P+utC!sS=TO!TLj@$HZvlDMW^qV~jkYJP!z6 zB&V!~jve$Ul4ys%)ahf?zqGs%* zrcNzgkN32LpCkL7l6{p3+=IX3?y%)Xf4AjF1PV)8<6cw&BX7et&NTK~~ zH+xB@;n26Begeu(5PKqCU~1HajOnH;7K=lTvwk_OF#|orpe*$3GL!0A!R%?$`p`RN zo7ssC|J29=RUXeMt;_4~0dAH68tYOs(6^K$0}Y(jDmK)_VXR(m>2x3^RY^^;BcW}z zlZ#(8Jx>O0iEZo4bFm3otHiqByk zPgR7wS+|tgQu2zq48h^SHYpC}T-9Nd{RmTsMv->!pT=!jz*;Os*9)g3FdjW1KX%ck zv27!ppvd&Y?1h@N6{>pIGet##zdeO)w+>cf;%w#~vIUCOZ4~EXqRMnv>;Y*T;Q;ES zyRb<%I?*!vxFFZkcmC@~P1B`Mt8t5@4*xP6eV;08rv(XHU-5?6ef2-GdS6>Svcn%m z#~5Pd^Zdm~g1QU)#v$jasn~^=>sC}Hpc=%kkTxIStT@fuXX$m|J4TF{o6ErgMV@JA z<-_fh;ug;Uih(a+jqILbq~()TW%AI;ScUuo{s9v zl|rpsUij&|6{f<|AH1r*(Gauve!Z{pGn4aw(f9(hFw=2PHZWLGNBgM2wH+$9Y;1=A z=^#eNCwN?qnCS7=lMp-VYRDwq-tG+gyKU^07cm7cox-gSuzkTV3;!(K#l;sxg&d)?)O~?V;fex%NKi6u^HaE(QQGWBqbB@Lg?z8$roH57t(8uoxrPg8$h2U_)ZSH;>ZPs~l*2ND7_yp;^K zE7oIttY`3>o2NrxmGo`4!4<$_H-2-zb>MAah0I|pi>8}#sV8SY zjJS{i4&#w}V=0PrCEJCD;|AHjK-TB6HyclCG zkD^$!YqfNVRR_Fa4d6RFVeRwJ#*e4V7v|SZErwHLGRp0OpWA%1{G5*;CVVGNWpO8W zA1uhkuAoW#f8ySNh$;ZzG3ad6v+1*1>(G%Y1ywYkuS&E)ta(Pxbm@AWO-I}!?Ct6! z1)e89+~{!1E3u&HYK0^)k#95QELLI+-K#DaP@x`v_7DjjRpPYK+pG5LKuSZzc_V9m z`fiLSaE?S>Bzss8n;pO!jdd zs|-I!x=c!+CJZkvEhd+vUDyh@~kkmsai9P}NPDL|N-K z{cUDOzotDx!65p{t%3xQ{~bpib!D!8<~3Wgww_~pKR2;E_t>h&xtW?P|c9!w-N3sI$))4%Tk^S=SU+M~bBlz_d% zRI(n}ttg$c)Q+h@{x^}hEp9Vxa&wvSkun?j>Kv7N|a$h z8On)WieGeURX1uTQ;2!`_lW*58q-T$D{kcHbKlr#)HnC^bo4HOjC7>l?jR1$ZOt9I zuV4ige;$3uMqz;ke^>UgX7xhQ%G-q6jl<8yN!zMfZxxP&v*M%w`ZSjE!L}rEL~{k_ zUcHMw;S-a_j>+S558dQMUk2H!G>_;W`hvlf#YP%XVQC8X(TJtSyb zcvD+%h@jPP9_@SuLCn)1+c-W|eH`9UvUyP9FU9vGVO#3(v^Gb=p}gdaji{ZKOG#n8 zAFsSotlX&Br-w3@yt|4YPQq#yc`EI`vTBr+Z&nSg_qmV9&;sbmv5ql8Vgs4e*glbL z_1_Hn9nfEhD=17bFsRUiIbzwglTme8ji&SeGR&@DZ+Adf&q`5z)CJ=jYz17pq>N>k zS9{b9c37HUtxfrTQL$?-7%)4-{YZV>h(1`VJ;g$+?cG@hZDj$y(JPqRB(LlnB)$eb zR%CwDS4qrObXdtD5i-9CgZtXPer2(zV0t(l5!usg0=* z`Nv&nbiDFIBn?kR|4K@%tgKcE`g?HFh1b1ubh!Jl`%9&dXm?qk{a9^8A%M8}n|x;N zq|q#_>zhWow;SrMilxiX@VYo5eva&drQeCv#qXx{@W*jmVPk#r<3-e}1N z-lVo%uQqY7LKPl`5NZz66stQ=q8ZGqh-{Z%NAI+kxT;_5?h3E3sfOe#G4g4X1NwJ% zFFHZ4yl+IAFB5ZcML$lpSHbYwX)(8jY?P?+zOy7$ffW;L&li~bwHG?YV|Y443lLv$ zSVRig@*|o5h|cQ%>`W!?zZX5VN~s)sKxI(sSavUxrSpheBeIyA_&Bl z4Qj4*pxyYLvs;pNI!_u_mRV)q-N0;um8Rt7lLw>X;~+gpI$}bMn5^y=AwOmY&8rzj zVi`pR%~QfB$;#;X@gHH@HyYStcPE$YfJbNVW5mj_jYsH6f;>;Yu~lAS=(3^P16jU6 z5p=kn*#Ud;JtqZuFU@HkX2y?Hna@AzU*@&Q_C1X5+!aHeWvPjtkdIyopT$cmIr!nS zDB!pSYiQF+&irN(n%cV2b*?jy6bnPfvr*v)<;O`dX(|bQ+A(R;kE+cYR}*rJ3cvr2 zAy-xlT`6wYZX})*h7jr4_d-2cDmD8>^C0gR%|YqqJITOG(3~W!ASX5GZkGAd8tSU} zOI$&?=wJ22Eo?$}_@`F+g!jSG-RZUtzzd!9(Vc%6rqCV>d$_JEFitaI)^2L*%J)B-y(`=E!OiG3C=uVb` zd-~vuw-LENEcj-7yGApRLBlk?EN8XL>Vv0L3UG}zJ%dLa3Tr+z^XWK)R^BR33%(tS z(Ckz_fB3G-H*mce-^`R-f8<$LXA;o(DuK&@0-8(_uV2ER`Z=~ei%6AJ&UJCEp3*2URZ>7r7-|dS?-whc^hM5 z8T0w-5#K9e3h){!h{vFTn6g9Yn9L1#FrBs8obTz8iTg$Kr`%T>(d3DEH&!*f-Q@MQ zUo0uE@e?mid!^GcnZ|zG zCje3T(YI5*lCg9>zod1-wGcMFoZt|u3^$XZX-J;B&QldLx^PC+E^aMM`9JN;iee@J=1U%~b@*3k*B?%Fp}^fX==_`f|jE<9>I zOdjYr=vlKf6#kK@5bOOD{kHPOmpON&1j@rhKIMBL2DP0PZzg4@dl&qR2I*$^k69Y9 z(WO0A`ex)}O9Bk?IHD>?~Pr&Qw+wl9|m~%`O^EoFkQD@KIkt zfLGl|V&dtTS;Mwh!o_rq29@(uz(y6`<^prOuun0RT=E8_B>zLj&@{TBNOLAm&+0=( zbI)+#9Z97ki{}MNfwlnCzBI>+9?~^tw{wh5D+Gv>@j1s>YC!C8PXu)w&_(0OT7HMasK|zF~s+* z58!ZwH!CB-fwPu0`^9gN@|B>TeL?$*kls%Un+mv&&#P4Ya$92gm%Jc?#z;h`7`EW$ zC1)_YBc{Te$@A{sHY`6_Ca&r0Nm-#&3}|9CCRsZEOY6^U7~zoD(n8hml7g^xSr1Zk z+pN8qiU64q1)3&jfY+wDw}Kp_HhLIAGbDAY?CiJ|i#%MpEI}40t|EpxSFOMDuKXNp z`HSYC2H0@rjqwV_%}sj$jjkB$FD>3?2)0SjW{tHN40-^E8#pwp_E^Ssr*5bgA05NA zbSe-5d_`xkyW20edDny|Osn9+JNYKk;W}q9Sz>77iFTKkU-8>l6W<-J)tj0EguPc^ zRE!a~*#qlyn7VAFndBW(MbhB=OWF6dh_@H8t+6kj*IqIdU5d8ab8LZJvX317c;r6y z{G%e!;KY1`tR8XCCe|!BV z-qDj1WQre=8IhHolL0_uFMb;S9!?8#^B4jvG)BpLBrvy&CQZ}atJ&4w=quG-^+(Bt zfDkD%*#$po-UK$v_CXV?cU2rcnW;g=cGqU-AXDKDH)~{m=;iC=Nt<>vQH95%8}00? zAXDo(*9t7xAGn)#rS+rFeiZ+!3@^y1(c*x%h=hZY?rPYymb2zc)b7!p*Z)?)f4%QL z#rUE9_PfBipB{omUG!NQU=q<6zkViF8n;6yECP+eH_SL682}yb@hD6xbk)gt^?p9 z5Vklf65o~I1AiY(rhDh^lb6{CyKjn zt#SpjUN0|bf6@2@XI?JX4Z2mdk^SJ?tvo+~B<#*LU?>P4`2wm zAJF)Xp{tcyvt%uB3~y3-?rgC5jS&;NMcb!e$p4mCR_RCgPL`4}tFd~4h6_w7{V9j& z{0Po#(VkyMMOXkhd`-r_b!6^yP_A2kx|GS|%aUI--mxX)UcYgXG2GB&IJu&AS^KqE$-|;nUde!_i#HV<7Dgkn~}B_6$~QV?pnGtE?Ua z*ENq`GC-6gq>KN^X;(>C>Z}bCIJmD{w+Msr1&!Xg2#N|E?oZMj2gLQU@|&9O%(=cB zBLr1@W}@TrfjxRx$t%viG4-oL$}a%l`x;iA7%xkICw`SX4cdJ0w>w{b~j!t;t#z z99;ol_DwaZ;RJck+)@72AwSD!i((3YHr|;w-`dRFo*2Th7V2Vd!In_yV-=oYOF7yW z3yE~t{v%;aYTyuV))7v97HBTU!#*4kHZ-=hoy!ruZi2TtVSw#r7E%1h&v2OCKvk_c z_m(rGJ#tW6IFvQ!-J)UdR2&wact{W&mu_miG>mQOeN}Y!wR*&?yQXZ)tH|RPM>$0N zsFpKZEotq(JDyS<>pR{@PcbdE_ExI(iT|xFg)WQ9x)dxA-5QXG{y2WcDjq`phx)^~ z2uwe5{l&miGIb1?jyb%?CQcO~IQuPzi-&%wOfdYyycJK6j`%XOWfmuYAftGPDx#2A z!AUi%RMP&we-yLffl&3}8`*92ZITZ?d=N}b>jZ@6{+AsDuX(84dii)5@j3DF%dV$6 z2gw)6t6JKnB|fufPSJrx-Cs0aC}ZAuoy2AOEUKfO_LO)U4Y7AQQD<-Du!gVxY!Ncz zNc&A9T5&!hPlk%eEdCFj!cVzC|MMvdcjAt!e1cwkFm!W~^n|K3A9liy)9ww$157g? zEY8hb^ese)MYZy6-9lv)us=91xsYGI(0Jw$YC)8n8&Ah`3S&dU%1>#WVM+~FtiQWr zx0gEQu!L{)OdE6s&koVPW19t?h@+GIVDE-kr0X^1F8+afN093}-`frbs4JvMy2L!O z7gou(=2rzVtNMt~PB#3NoO@kbT1LxHSpD%O`E|irk8}h(t5tC7x`S~noofY~wS5#8 zyI0XL8Ronf);Z1-ioWChK(F#7Kd4j2ZQFAP4a;I?SB0R(^0>rZ_mm0TUMy*|+HCEK z9HJ3q;lg8Py6Q=V$&;|tks*XB5pwc6tvf@yyv>r4Yxwc=@US}Kmak09JhSs^WIlvH z6O(=C?BVxcH1txgx1s*&=%<ND$^uCw&7@c86f;tQx^igLg zZeJy&U4Nj&HdD{Isk!&P$3Gzqz?=U>0Yso0r@6|-#jRc{YnUITebi!%(2v@@yBHsPD?Z*wOJWu`clFIDsF~WpUV}6QLDoBwe#i?XWx6- zhO&vXzzVO(BWKZrzoJUU>Gs|yLt-3jmHC$WCwtHoX|fz5AP4AJny!(7gV4qYPuBk^T} zo}jfBol0}qXUxpV$*Tq{%v8}*L1Ln&&BcK~NThBp>%RFmA;zN&8ak{`+%Vggsfb)X z8~sY}R*h^+$PC<41p)Q@q-T380Im%=bpwOG{YlGo!MDnK`MS82VR;zg4-!GqTjOT| z*vfJ32DtfiUumu2#G+5rex1y@i9^&S?fS9oQfk8YGcjV|wpU@Rtf2L5u|&oD|^=x-(A={|^`Qo)=E)U!|_| z4TtI%jxTCW9s?qb?p|IZPB6Z04!NnKr#ib>lhBIG(XU90lKH%*ajT_#cuQ7P`?NpA zS&GaV+f`1IWz(#tn{{EV!lCLekpxXus&DLL5h6gRb_KkSz(eT{6nQ%{fXaIvA@?h7OjMo>jtT7sGU zy0Aq+YI325U*oe0*XMfTj-g=QL=qBxhVR_>2F6~V@Vyw0&) z=%xJdgN#gCdx@afcJKeAy>pLd1JB}k6mzCyb;fvZr=c5jQuGuhpYvYV_RILSc#*7dA^%XIT-|y&*VKg9 zv%rkP1Z;#?%iBwxT&DT-L`++x&3VJ|d4%%PrO?=?%dLot&L-3xfU~dzqxHd0fQbtF zyk9miH+#`axouPh;LN{-l|pZB5{ZgDN5a-wVfMXGH^eDDZFzO&o~$dBxy?(1Gro!`mbV2#)cfaQ?#Y$RV`uilZ+IZ_kdyot8Ca325-c(@EyA8qk3nbm zQm1DC&m(m%gf0#vSD^Xw?XlJ)bl0k5JX}XishoZV z{3!|$knpu6L}kstsr7!~wxK(#;yp&!u!GZhdJY%4hXw zoN9A9NEFl^ap>OuYnYRDN-TTUHm-EHM=dFCijhF)hVRaO{GgZ3i|AJhziI+N+M4qi zHCvZc4c1=0;5e9<_MpRJ9QZI2d?Vl?wbKf3qwa-i9a_)DN#^JiVwKUU&y4b#6^X+! z@ki4-rzs*?4cbS(;v=8yLQ?7^#^iG-n&JwV#;$lW8KJJ&tL;=qgW5Q+@p{yI0-1M5 zkb~{LpHvg!NT?EIXyY)*k&#GUR||u+7yskk6}kuX39l?F6s+~DSZ)E&dlK~%Qg!?Q z7?J|$eYkn|v|vqiq+z%GZO^yq&^e)krGXzcF#Osdg})v~lA!g?#gu4Fu+abD>b4pA zj0_5_+c1oZhb)AXhHBqr`f7>B-dh8{7_EPd8FeY1jgl>mc=f{1Z0vM=-Y*#o0&kz1 zAMfU&MQ8Zaw)u$677fBs0GO+C@CsZUm2_p<*8lhi-|*IXou9o`Bor10DM=18>(5Pl zL7#BfX*@uOKHFs}FEgua*-faLnIQQ(#{Wmhw7YZykw@QL$koCp+pJ7XZeSV6}fIxuaX)NC0a2 zzBFoFvPDZFH3`jz0dFFB0cKeUtogaG`ye?P_K~mjJW|}AdZWzf8bhV7joF)~FzR5G(vavhX!)owr$b{DS$C1Ti)8m_}Bnz$nMsNX-@|%YFci@~%&=m~eyn^>sfw+qBcxlc%${*<=#L5rM z0&rP&X_4hsW2$Oqg4+mykjD8-r@;tXVng%0FF2AL4$~ZV@0W1n7=BGhs8KUmF9eh( z4&+7Ul!W8@s$&6|o1_H0rNi^6o#Y^``!)7%VYS$qIQ7*U7>%}*@_rEa^*(TjcQMsj zwa5S)z2VJz4_h`ji{bcNaoN`$8BPzV>E{atn2F_*&|#z|Z*=t7anq5Bg4^K2og5QQ zZI)#xazHzTM`zG07)*BtR@Ue0F&Gw|)SkKX#8p(2o3-}s_6h70*e9@0 PV4uJ~f&UV4{q^;4TW!}N literal 0 HcmV?d00001 diff --git a/react-native/documentation/media/settings_diagnostics_configured.jpg b/react-native/documentation/media/settings_diagnostics_configured.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f750ba2b1a6e9b5c9ce9957302ec48c14a03578e GIT binary patch literal 48133 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 Uf8G6G7Wm5o|8p#G;Wz1j0shLO%>V!Z literal 0 HcmV?d00001 diff --git a/react-native/documentation/universal_links_ios.md b/react-native/documentation/universal_links_ios.md new file mode 100644 index 00000000..12262e4c --- /dev/null +++ b/react-native/documentation/universal_links_ios.md @@ -0,0 +1,230 @@ +# Universal Links + +- [What are Universal Links?](#what-are-universal-links) +- [Setting Up an Entitlements File for Universal Links](#setting-up-an-entitlements-file-for-universal-links) + - [Steps to Configure the Entitlements File](#steps-to-configure-the-entitlements-file) + - [Points to Consider](#points-to-consider) +- [Configuring Universal Links for your Storefront](#configuring-universal-links-for-your-storefront) +- [Important: The catch-all route `*`](#important-the-catch-all-route-) +- [Handling Universal Links in your app](#handling-universal-links-in-your-app) +- [Security Considerations](#security-considerations) +- [Testing](#testing) +- [Testing](#testing-1) + - [1. Validate Associated Domains](#1-validate-associated-domains) + - [2. Trigger a Universal Link from terminal](#2-trigger-a-universal-link-from-terminal) + - [3. Universal Links Diagnostics (real device only)](#3-universal-links-diagnostics-real-device-only) +- [Further Reading and Resources](#further-reading-and-resources) + +## What are Universal Links? + +Universal Links are an iOS feature which allow apps to open links directly in an +app rather than sending the user to a browser. This feature provides a seamless +user experience by directly engaging app users with relevant content. + +## Setting Up an Entitlements File for Universal Links + +To enable Universal Links in your iOS app, you'll need to configure an +entitlements file that specifies the associated domains your app is allowed to +handle. Here’s how you can set it up: + +### Steps to Configure the Entitlements File + +1. **Open Your Xcode Project**: + + - Launch Xcode and open your project or workspace file. + +2. **Navigate to Your App Target's Capabilities**: + + - Click on your project in the Project Navigator. + - Select your app target from the list of targets. + - Click on the "Capabilities" tab at the top of the editor. + +3. **Enable Associated Domains**: + + - In the Capabilities section, find "Associated Domains" and toggle the + switch to enable it. + - A new section should appear to configure your associated domains. + +4. **Add Your Associated Domains**: + + - Add each domain you want to associate with your app in the format: + `applinks:yourdomain.com` + - For example, `applinks:example.com` if your domain is `example.com`. + +5. **Verify the Entitlements File**: + + - Xcode will automatically add an entitlements file to your project if it + doesn't exist, or update your existing one. You can verify this by checking + for a file named `YourApp.entitlements` in your project. + - Open this file to ensure the associated domains are listed correctly under + the `com.apple.developer.associated-domains` entry. + +6. **Build and Run Your App**: + - Make sure your app's provisioning profile includes support for the + associated domains capability. + - Build and run your app on a device to test the setup. + +### Points to Consider + +- **HTTPS Requirement**: Ensure all of your associated domains are served over + HTTPS. +- **Multiple Domains**: You can list multiple associated domains by adding each + one on a new line in the Associated Domains section within Xcode. +- **Testing**: After setting up, test your Universal Links by opening valid URLs + on a device to ensure they correctly redirect to your app. + +> [!IMPORTANT] +> +> `.well-known/apple-app-site-association` files will **not** be served from +> "\*.myshopify.com" domains. You must connect a non-myshopify domain under +> https://admin.shopify.com/settings/domains to serve these files. + +## Configuring Universal Links for your Storefront + +iOS Buy SDK Configuration + +- Start by navigating to your storefront's Admin panel at + https://admin.shopify.com/settings/apps/development. +- If an app is already set up, select the appropriate one. If not, proceed to + create a new app. +- Within your app's "Configuration" tab, click "Edit" on the "Storefront API" + section. +- In the "iOS Buy SDK" section, enter your Apple App ID, activate "Use iOS + Universal Links," and upload your Apple app certificate. + +> [!NOTE] Your Apple app certificate will ensure the integrity of your +> apple-app-site-association file. + +The result of configuring Universal Links for your store will be a +`.well-known/apple-app-site-association` JSON file served from your public +storefront domain. This file informs iOS about the routes that should open +directly in your app instead of in a web browser. Apple will periodically fetch +this file to configure app routing on buyer's devices. This process is essential +for ensuring a seamless app experience when users navigate URLs associated with +your app. + +```json +{ + "applinks": { + "apps": [], + "details": [ + { + "appID": "{APPLE_TEAM_ID}.{BUNDLE_IDENTIFIER}", + "paths": [ + "NOT /admin/*", + "NOT /*/amazon_payments/callback", + "NOT /*/checkouts/*/express/callback", + "/*" + ] + } + ] + } +} +``` + +## Important: The catch-all route `*` + +The /\* catch-all route in the configuration indicates that iOS should open any +URL from your domain in your app, except for those paths specifically excluded +by "NOT" rules. + +- **Exclusions**: URLs like admin paths and payment callbacks are excluded by + "NOT" rules to prevent them from opening in the app. +- **Email Links**: Links in emails, such as abandoned carts, will open in your + app when clicked. +- **Shared Links**: General web links from your domain will open in your app + unless they're specifically excluded. +- **Webview Links**: Links opened in a webview won't trigger the app unless it's + set up to support them. +- **Excluded Paths**: URLs like /admin/\* and payment callbacks will open + outside the app as specified. + +--- + +## Handling Universal Links in your app + +See https://github.com/Shopify/checkout-sheet-kit-react-native/blob/main/sample/src/App.tsx for sample code to implement Universal Links in your app. + +## Security Considerations + +- **Data Privacy**: + + - Universal Links can pass sensitive information through URLs. Ensure any + personal or sensitive data is encrypted or tokenized to protect user + privacy. + +- **URL Handling**: + + - Rigorously validate and sanitize any data received from Universal Links to + prevent URL injection attacks. Only allow expected URL formats and handle + unexpected URLs gracefully. + +- **App Update and Expiry**: + + - Keep your app updated to handle links correctly, and ensure that any links + requiring special app capabilities are managed. If a link cannot be handled + by the currently installed app, consider providing users with a fallback + option or gracefully notifying them. + +- **Testing and Monitoring**: + + - Regularly test the functionality of Universal Links to ensure they are + correctly pointing to your app and not opening other apps or browsers with + potentially harmful content. + - Monitor your app for any attempts at misuse or abuse of links. + +- **Certificate Management**: + + - Maintain secure and appropriate certificate management practices for your + app to prevent unauthorized access or configuration changes related to + Universal Links. + +## Testing + +With Universal Links set up, you can test the implementation in the simulator by +triggering URLs manually with: + +```sh +xcrun simctl openurl booted https://www.example.com/cart +``` + +## Testing + +### 1. Validate Associated Domains + +Verify that your app's entitlements file includes the correct associated domains. + +Ensure that the `.well-known/apple-app-site-association` file is accessible by going to `"https://{your_storefront_domain}/.well-known/apple-app-site-association"`. Remember that this file will only be accesible on a custom hosted domain, and not a "*.myshopify.com" domain. + +### 2. Trigger a Universal Link from terminal + +With Universal Links set up, you can test the implementation in the simulator by triggering URLs manually with: + +```sh +xcrun simctl openurl booted https://www.example.com/cart +``` + +### 3. Universal Links Diagnostics (real device only) + +Open "Settings" on a real device and search "Universal links": + + + +Go to "Diagnostics": + + + +Enter the URL for your store: + + + +Hit "Go" to ensure the well known files have been configured correctly. + + + +## Further Reading and Resources + +For more comprehensive information, consider visiting: + +- [Apple's Official Universal Links Documentation](https://developer.apple.com/documentation/xcode/supporting-universal-links-in-your-app) +- [Testing Universal Links](https://developer.apple.com/documentation/technotes/tn3155-debugging-universal-links#Test-universal-links-behavior) diff --git a/react-native/jest.config.js b/react-native/jest.config.js new file mode 100644 index 00000000..6763de59 --- /dev/null +++ b/react-native/jest.config.js @@ -0,0 +1,16 @@ +module.exports = { + preset: 'react-native', + modulePathIgnorePatterns: ['modules/@shopify/checkout-sheet-kit/lib'], + modulePaths: ['/sample/node_modules'], + setupFiles: ['/jest.setup.ts'], + transform: { + '\\.[jt]sx?$': 'babel-jest', + }, + globals: { + 'ts-jest': { + tsConfig: { + importHelpers: true, + }, + }, + }, +}; diff --git a/react-native/jest.setup.ts b/react-native/jest.setup.ts new file mode 100644 index 00000000..d195ddb1 --- /dev/null +++ b/react-native/jest.setup.ts @@ -0,0 +1,8 @@ +/** + * Ensure Jest picks up manual mocks written in TypeScript. + * Jest resolves __mocks__/react-native automatically when a test calls jest.mock('react-native') + * or when the module is required and a manual mock exists. No runtime code needed here. + * This file exists to ensure TypeScript is part of Jest's setupFiles and compiled. + */ + +export {}; diff --git a/react-native/metro.config.js b/react-native/metro.config.js new file mode 100644 index 00000000..e7eb3f45 --- /dev/null +++ b/react-native/metro.config.js @@ -0,0 +1,62 @@ +const path = require('path'); +const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config'); + +const root = path.resolve(__dirname); +const sample = path.resolve(root, 'sample'); + +/** + * Metro configuration + * https://reactnative.dev/docs/metro + * + * @type {import('@react-native/metro-config').MetroConfig} + */ +const config = mergeConfig(getDefaultConfig(__dirname), { + projectRoot: sample, + + watchFolders: [root], + + resolver: { + resolveRequest: (context, moduleName, platform) => { + if ( + moduleName === '@shopify/checkout-sheet-kit' || + moduleName.startsWith('@shopify/checkout-sheet-kit/') + ) { + const sub = moduleName.replace('@shopify/checkout-sheet-kit', ''); + const target = path.resolve( + root, + 'modules', + '@shopify/checkout-sheet-kit', + 'src', + sub ? sub.replace(/^\//, '') : 'index.ts', + ); + return {type: 'sourceFile', filePath: target}; + } + return context.resolveRequest(context, moduleName, platform); + }, + extraNodeModules: { + react: path.resolve(sample, 'node_modules', 'react'), + 'react-native': path.resolve(sample, 'node_modules', 'react-native'), + 'react-native-gesture-handler': path.resolve( + root, + 'node_modules', + 'react-native-gesture-handler', + ), + '@shopify/checkout-sheet-kit': path.resolve( + root, + 'modules', + '@shopify/checkout-sheet-kit', + ), + }, + }, + + transformer: { + getTransformOptions: async () => ({ + transform: { + experimentalImportSupport: false, + inlineRequires: true, + }, + }), + }, +}); + +module.exports = config; diff --git a/react-native/modules/@shopify/checkout-sheet-kit/LICENSE b/react-native/modules/@shopify/checkout-sheet-kit/LICENSE new file mode 100644 index 00000000..d42681cf --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/LICENSE @@ -0,0 +1,20 @@ +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/react-native/modules/@shopify/checkout-sheet-kit/RNShopifyCheckoutSheetKit.podspec b/react-native/modules/@shopify/checkout-sheet-kit/RNShopifyCheckoutSheetKit.podspec new file mode 100644 index 00000000..092b4913 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/RNShopifyCheckoutSheetKit.podspec @@ -0,0 +1,47 @@ +require "json" + +package = JSON.parse(File.read(File.join(__dir__, "package.json"))) + +folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32' + +fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1' + +Pod::Spec.new do |s| + s.name = "RNShopifyCheckoutSheetKit" + s.version = package["version"] + s.summary = package["description"] + s.homepage = package["homepage"] + s.license = package["license"] + s.authors = package["author"] + + s.platforms = { :ios => "13.0" } + s.source = { :git => "https://github.com/Shopify/checkout-sheet-kit-react-native.git", :tag => "#{s.version}" } + + s.source_files = "ios/*.{h,m,mm,swift}" + + s.dependency "React-Core" + s.dependency "ShopifyCheckoutSheetKit", "~> 3.8.0" + s.dependency "ShopifyCheckoutSheetKit/AcceleratedCheckouts", "~> 3.8.0" + + if fabric_enabled + # Use React Native's helper if available, otherwise add dependencies directly + if defined?(install_modules_dependencies) + install_modules_dependencies(s) + else + # Fallback: manually specify dependencies for New Architecture + s.dependency "React-Codegen" + s.dependency "RCT-Folly", :modular_headers => true + s.dependency "RCTRequired" + s.dependency "RCTTypeSafety" + s.dependency "ReactCommon/turbomodule/core" + end + + s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1" + + s.pod_target_xcconfig = { + "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"", + "OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1", + "CLANG_CXX_LANGUAGE_STANDARD" => "c++17" + } + end +end diff --git a/react-native/modules/@shopify/checkout-sheet-kit/android/build.gradle b/react-native/modules/@shopify/checkout-sheet-kit/android/build.gradle new file mode 100644 index 00000000..82b9a034 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/android/build.gradle @@ -0,0 +1,103 @@ +buildscript { + repositories { + google() + mavenCentral() + } + + dependencies { + classpath "com.android.tools.build:gradle:8.11.0" + } +} + +def isNewArchitectureEnabled() { + return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true" +} + +apply plugin: "com.android.library" + +if (isNewArchitectureEnabled()) { + apply plugin: "com.facebook.react" +} + +def getExtOrIntegerDefault(name) { + return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties[name]).toInteger() +} + +static def supportsNamespace() { + def parsed = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.') + def major = parsed[0].toInteger() + def minor = parsed[1].toInteger() + + // Namespace support was added in 7.3.0 + return (major == 7 && minor >= 3) || major >= 8 +} + +buildToolsVersion = "35.0.0" +minSdkVersion = 23 +compileSdkVersion = 36 +targetSdkVersion = 35 + +// We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP. +ndkVersion = "23.1.7779620" + +android { + if (supportsNamespace()) { + namespace "com.shopify.reactnative.checkoutsheetkit" + + sourceSets { + main { + manifest.srcFile "src/main/AndroidManifestNew.xml" + } + } + } + + compileSdkVersion getExtOrIntegerDefault("compileSdkVersion") + + defaultConfig { + minSdkVersion getExtOrIntegerDefault("minSdkVersion") + targetSdkVersion getExtOrIntegerDefault("targetSdkVersion") + + } + + buildTypes { + debug { + minifyEnabled false + } + + release { + minifyEnabled false + + // Rules in consumerProguardFiles are automatically included in the ProGuard configuration of any application that uses the library + consumerProguardFiles 'proguard-rules.pro' + } + } + + lintOptions { + disable "GradleCompatible" + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +repositories { + mavenCentral() + google() +} + + +dependencies { + // For < 0.71, this will be from the local maven repo + // For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin + //noinspection GradleDynamicVersion + implementation "com.facebook.react:react-native:+" + // Uncomment to install dependencies for local development + // implementation("com.facebook.react:react-android:+") + + implementation("com.shopify:checkout-sheet-kit:${SHOPIFY_CHECKOUT_SDK_VERSION}") + implementation("com.fasterxml.jackson.core:jackson-databind:2.12.5") + debugImplementation("com.shopify:checkout-sheet-kit:${SHOPIFY_CHECKOUT_SDK_VERSION}") +} + diff --git a/react-native/modules/@shopify/checkout-sheet-kit/android/gradle.properties b/react-native/modules/@shopify/checkout-sheet-kit/android/gradle.properties new file mode 100644 index 00000000..8445938b --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/android/gradle.properties @@ -0,0 +1,8 @@ +minSdkVersion=23 +targetSdkVersion=35 +compileSdkVersion=36 +ndkVersion=23.1.7779620 +buildToolsVersion = "35.0.0" + +# Version of Shopify Checkout SDK to use with React Native +SHOPIFY_CHECKOUT_SDK_VERSION=3.5.3 diff --git a/react-native/modules/@shopify/checkout-sheet-kit/android/proguard-rules.pro b/react-native/modules/@shopify/checkout-sheet-kit/android/proguard-rules.pro new file mode 100644 index 00000000..afeede94 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/android/proguard-rules.pro @@ -0,0 +1,2 @@ +# Keep Checkout Sheet Kit classes +-keep class com.shopify.checkoutsheetkit.** { *; } diff --git a/react-native/modules/@shopify/checkout-sheet-kit/android/src/main/AndroidManifest.xml b/react-native/modules/@shopify/checkout-sheet-kit/android/src/main/AndroidManifest.xml new file mode 100644 index 00000000..a5caf509 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/android/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + diff --git a/react-native/modules/@shopify/checkout-sheet-kit/android/src/main/AndroidManifestNew.xml b/react-native/modules/@shopify/checkout-sheet-kit/android/src/main/AndroidManifestNew.xml new file mode 100644 index 00000000..a2f47b60 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/android/src/main/AndroidManifestNew.xml @@ -0,0 +1,2 @@ + + diff --git a/react-native/modules/@shopify/checkout-sheet-kit/android/src/main/java/com/shopify/reactnative/checkoutsheetkit/CustomCheckoutEventProcessor.java b/react-native/modules/@shopify/checkout-sheet-kit/android/src/main/java/com/shopify/reactnative/checkoutsheetkit/CustomCheckoutEventProcessor.java new file mode 100644 index 00000000..f1a194a2 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/android/src/main/java/com/shopify/reactnative/checkoutsheetkit/CustomCheckoutEventProcessor.java @@ -0,0 +1,188 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +package com.shopify.reactnative.checkoutsheetkit; + +import android.content.Context; +import android.util.Log; +import android.webkit.GeolocationPermissions; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.shopify.checkoutsheetkit.*; +import com.facebook.react.modules.core.DeviceEventManagerModule; +import com.facebook.react.bridge.WritableNativeMap; +import com.facebook.react.bridge.ReactApplicationContext; +import com.shopify.checkoutsheetkit.pixelevents.PixelEvent; +import com.shopify.checkoutsheetkit.lifecycleevents.CheckoutCompletedEvent; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class CustomCheckoutEventProcessor extends DefaultCheckoutEventProcessor { + private final ReactApplicationContext reactContext; + private final ObjectMapper mapper = new ObjectMapper(); + + // Geolocation-specific variables + + private String geolocationOrigin; + private GeolocationPermissions.Callback geolocationCallback; + + public CustomCheckoutEventProcessor(Context context, ReactApplicationContext reactContext) { + super(context); + this.reactContext = reactContext; + } + + // Public methods + + public void invokeGeolocationCallback(boolean allow) { + if (geolocationCallback != null) { + boolean retainGeolocationForFutureRequests = false; + geolocationCallback.invoke(geolocationOrigin, allow, retainGeolocationForFutureRequests); + geolocationCallback = null; + } + } + + // Lifecycle events + + /** + * This method is called when the checkout sheet webpage requests geolocation + * permissions. + * + * Since the app needs to request permissions first before granting, we store + * the callback and origin in memory and emit a "geolocationRequest" event to + * the app. The app will then request the necessary geolocation permissions + * and invoke the native callback with the result. + * + * @param origin - The origin of the request + * @param callback - The callback to invoke when the app requests permissions + */ + @Override + public void onGeolocationPermissionsShowPrompt(@NonNull String origin, + @NonNull GeolocationPermissions.Callback callback) { + + // Store the callback and origin in memory. The kit will wait for the app to + // request permissions first before granting. + this.geolocationCallback = callback; + this.geolocationOrigin = origin; + + // Emit a "geolocationRequest" event to the app. + try { + Map event = new HashMap<>(); + event.put("origin", origin); + sendEventWithStringData("geolocationRequest", mapper.writeValueAsString(event)); + } catch (IOException e) { + Log.e("ShopifyCheckoutSheetKit", "Error emitting \"geolocationRequest\" event", e); + } + } + + @Override + public void onGeolocationPermissionsHidePrompt() { + super.onGeolocationPermissionsHidePrompt(); + + // Reset the geolocation callback and origin when the prompt is hidden. + this.geolocationCallback = null; + this.geolocationOrigin = null; + } + + @Override + public void onWebPixelEvent(@NonNull PixelEvent event) { + try { + String data = mapper.writeValueAsString(event); + sendEventWithStringData("pixel", data); + } catch (IOException e) { + Log.e("ShopifyCheckoutSheetKit", "Error processing pixel event", e); + } + } + + @Override + public void onCheckoutFailed(CheckoutException checkoutError) { + try { + String data = mapper.writeValueAsString(populateErrorDetails(checkoutError)); + sendEventWithStringData("error", data); + } catch (IOException e) { + Log.e("ShopifyCheckoutSheetKit", "Error processing checkout failed event", e); + } + } + + @Override + public void onCheckoutCanceled() { + sendEvent("close", null); + } + + @Override + public void onCheckoutCompleted(@NonNull CheckoutCompletedEvent event) { + try { + String data = mapper.writeValueAsString(event); + sendEventWithStringData("completed", data); + } catch (IOException e) { + Log.e("ShopifyCheckoutSheetKit", "Error processing completed event", e); + } + } + + // Private + + private Map populateErrorDetails(CheckoutException checkoutError) { + Map errorMap = new HashMap(); + errorMap.put("__typename", getErrorTypeName(checkoutError)); + errorMap.put("message", checkoutError.getErrorDescription()); + errorMap.put("recoverable", checkoutError.isRecoverable()); + errorMap.put("code", checkoutError.getErrorCode()); + + if (checkoutError instanceof HttpException) { + errorMap.put("statusCode", ((HttpException) checkoutError).getStatusCode()); + } + + return errorMap; + } + + private String getErrorTypeName(CheckoutException error) { + if (error instanceof CheckoutExpiredException) { + return "CheckoutExpiredError"; + } else if (error instanceof ClientException) { + return "CheckoutClientError"; + } else if (error instanceof HttpException) { + return "CheckoutHTTPError"; + } else if (error instanceof ConfigurationException) { + return "ConfigurationError"; + } else if (error instanceof CheckoutSheetKitException) { + return "InternalError"; + } else { + return "UnknownError"; + } + } + + private void sendEvent(String eventName, @Nullable WritableNativeMap params) { + reactContext + .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) + .emit(eventName, params); + } + + private void sendEventWithStringData(String name, String data) { + reactContext + .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) + .emit(name, data); + } +} diff --git a/react-native/modules/@shopify/checkout-sheet-kit/android/src/main/java/com/shopify/reactnative/checkoutsheetkit/ShopifyCheckoutSheetKitModule.java b/react-native/modules/@shopify/checkout-sheet-kit/android/src/main/java/com/shopify/reactnative/checkoutsheetkit/ShopifyCheckoutSheetKitModule.java new file mode 100644 index 00000000..53dd39e2 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/android/src/main/java/com/shopify/reactnative/checkoutsheetkit/ShopifyCheckoutSheetKitModule.java @@ -0,0 +1,349 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +package com.shopify.reactnative.checkoutsheetkit; + +import android.app.Activity; +import android.content.Context; +import androidx.activity.ComponentActivity; +import androidx.annotation.NonNull; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.WritableMap; +import com.shopify.checkoutsheetkit.*; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class ShopifyCheckoutSheetKitModule extends ReactContextBaseJavaModule { + private static final String MODULE_NAME = "ShopifyCheckoutSheetKit"; + + public static Configuration checkoutConfig = new Configuration(); + + private final ReactApplicationContext reactContext; + + private CheckoutSheetKitDialog checkoutSheet; + + private CustomCheckoutEventProcessor checkoutEventProcessor; + + public ShopifyCheckoutSheetKitModule(ReactApplicationContext reactContext) { + super(reactContext); + + this.reactContext = reactContext; + + ShopifyCheckoutSheetKit.configure(configuration -> { + configuration.setPlatform(Platform.REACT_NATIVE); + checkoutConfig = configuration; + }); + } + + @NonNull + @Override + public String getName() { + return MODULE_NAME; + } + + @Override + public Map getConstants() { + final Map constants = new HashMap<>(); + constants.put("version", ShopifyCheckoutSheetKit.version); + return constants; + } + + @ReactMethod + public void addListener(String eventName) { + // No-op but required for RN to register module + } + + @ReactMethod + public void removeListeners(Integer count) { + // No-op but required for RN to register module + } + + @ReactMethod + public void present(String checkoutURL) { + Activity currentActivity = getCurrentActivity(); + if (currentActivity instanceof ComponentActivity) { + checkoutEventProcessor = new CustomCheckoutEventProcessor(currentActivity, this.reactContext); + currentActivity.runOnUiThread(() -> { + checkoutSheet = ShopifyCheckoutSheetKit.present(checkoutURL, (ComponentActivity) currentActivity, + checkoutEventProcessor); + }); + } + } + + @ReactMethod + public void dismiss() { + if (checkoutSheet != null) { + checkoutSheet.dismiss(); + checkoutSheet = null; + } + } + + @ReactMethod + public void preload(String checkoutURL) { + Activity currentActivity = getCurrentActivity(); + + if (currentActivity instanceof ComponentActivity) { + ShopifyCheckoutSheetKit.preload(checkoutURL, (ComponentActivity) currentActivity); + } + } + + @ReactMethod + public void invalidateCache() { + ShopifyCheckoutSheetKit.invalidate(); + } + + @ReactMethod + public void getConfig(Promise promise) { + WritableMap resultConfig = Arguments.createMap(); + + resultConfig.putBoolean("preloading", checkoutConfig.getPreloading().getEnabled()); + resultConfig.putString("colorScheme", colorSchemeToString(checkoutConfig.getColorScheme())); + resultConfig.putString("logLevel", logLevelToString(checkoutConfig.getLogLevel())); + + promise.resolve(resultConfig); + } + + @ReactMethod + public void setConfig(ReadableMap config) { + Context context = getReactApplicationContext(); + + ShopifyCheckoutSheetKit.configure(configuration -> { + if (config.hasKey("preloading")) { + configuration.setPreloading(new Preloading(config.getBoolean("preloading"))); + } + + if (config.hasKey("logLevel")) { + LogLevel logLevel = getLogLevel(config.getString("logLevel")); + configuration.setLogLevel(logLevel); + } else { + configuration.setLogLevel(LogLevel.ERROR); + } + + if (config.hasKey("colorScheme")) { + ColorScheme colorScheme = getColorScheme(Objects.requireNonNull(config.getString("colorScheme"))); + ReadableMap colorsConfig = config.hasKey("colors") ? config.getMap("colors") : null; + ReadableMap androidConfig = null; + + if (colorsConfig != null && colorsConfig.hasKey("android")) { + androidConfig = colorsConfig.getMap("android"); + } + + if (this.isValidColorConfig(androidConfig)) { + ColorScheme colorSchemeWithOverrides = getColors(colorScheme, androidConfig); + if (colorSchemeWithOverrides != null) { + configuration.setColorScheme(colorSchemeWithOverrides); + checkoutConfig = configuration; + return; + } + } + + configuration.setColorScheme(colorScheme); + } + + checkoutConfig = configuration; + }); + } + + @ReactMethod + public void initiateGeolocationRequest(Boolean allow) { + if (checkoutEventProcessor != null) { + checkoutEventProcessor.invokeGeolocationCallback(allow); + } + } + + // Private + + private ColorScheme getColorScheme(String colorScheme) { + switch (colorScheme) { + case "web_default": + return new ColorScheme.Web(); + case "light": + return new ColorScheme.Light(); + case "dark": + return new ColorScheme.Dark(); + case "automatic": + default: + return new ColorScheme.Automatic(); + } + } + + private String colorSchemeToString(ColorScheme colorScheme) { + return colorScheme.getId(); + } + + private LogLevel getLogLevel(String logLevel) { + if (logLevel == null) { + return LogLevel.ERROR; + } + + switch (logLevel.toLowerCase()) { + case "debug": + return LogLevel.DEBUG; + default: + return LogLevel.ERROR; + } + } + + private String logLevelToString(LogLevel logLevel) { + if (logLevel == LogLevel.DEBUG) { + return "debug"; + } + return "error"; + } + + private boolean isValidColorConfig(ReadableMap config) { + if (config == null) { + return false; + } + + String[] requiredColorKeys = { "backgroundColor", "progressIndicator", "headerTextColor", "headerBackgroundColor" }; + + for (String key : requiredColorKeys) { + if (!config.hasKey(key) || config.getString(key) == null || parseColor(config.getString(key)) == null) { + return false; + } + } + + // closeButtonColor is optional, so we only validate it if it's present + if (config.hasKey("closeButtonColor") && config.getString("closeButtonColor") != null) { + if (parseColor(config.getString("closeButtonColor")) == null) { + return false; + } + } + + return true; + } + + private boolean isValidColorScheme(ColorScheme colorScheme, ReadableMap colorConfig) { + if (colorConfig == null) { + return false; + } + + if (colorScheme instanceof ColorScheme.Automatic) { + if (!colorConfig.hasKey("light") || !colorConfig.hasKey("dark")) { + return false; + } + + boolean validLight = this.isValidColorConfig(colorConfig.getMap("light")); + boolean validDark = this.isValidColorConfig(colorConfig.getMap("dark")); + + return validLight && validDark; + } + + return this.isValidColorConfig(colorConfig); + } + + private Color parseColorFromConfig(ReadableMap config, String colorKey) { + if (config.hasKey(colorKey)) { + String colorStr = config.getString(colorKey); + return parseColor(colorStr); + } + + return null; + } + + private Colors createColorsFromConfig(ReadableMap config) { + if (config == null) { + return null; + } + + Color webViewBackground = parseColorFromConfig(config, "backgroundColor"); + Color headerBackground = parseColorFromConfig(config, "headerBackgroundColor"); + Color headerFont = parseColorFromConfig(config, "headerTextColor"); + Color progressIndicator = parseColorFromConfig(config, "progressIndicator"); + Color closeButtonColor = parseColorFromConfig(config, "closeButtonColor"); + + if (webViewBackground != null && progressIndicator != null && headerFont != null && headerBackground != null) { + return new Colors( + webViewBackground, + headerBackground, + headerFont, + progressIndicator, + // Parameter allows passing a custom drawable, we'll just support custom color + // for now + null, + closeButtonColor); + } + + return null; + } + + private ColorScheme getColors(ColorScheme colorScheme, ReadableMap config) { + if (!this.isValidColorScheme(colorScheme, config)) { + return null; + } + + if (colorScheme instanceof ColorScheme.Automatic && this.isValidColorScheme(colorScheme, config)) { + Colors lightColors = createColorsFromConfig(config.getMap("light")); + Colors darkColors = createColorsFromConfig(config.getMap("dark")); + + if (lightColors != null && darkColors != null) { + ColorScheme.Automatic automaticColorScheme = (ColorScheme.Automatic) colorScheme; + automaticColorScheme.setLightColors(lightColors); + automaticColorScheme.setDarkColors(darkColors); + return automaticColorScheme; + } + } + + Colors colors = createColorsFromConfig(config); + + if (colors != null) { + if (colorScheme instanceof ColorScheme.Light) { + ((ColorScheme.Light) colorScheme).setColors(colors); + } else if (colorScheme instanceof ColorScheme.Dark) { + ((ColorScheme.Dark) colorScheme).setColors(colors); + } else if (colorScheme instanceof ColorScheme.Web) { + ((ColorScheme.Web) colorScheme).setColors(colors); + } + return colorScheme; + } + + return null; + } + + private Color parseColor(String colorStr) { + try { + colorStr = colorStr.replace("#", ""); + + long color = Long.parseLong(colorStr, 16); + + if (colorStr.length() == 6) { + // If alpha is not included, assume full opacity + // "L" is not needed here on the end of the hex value + color = color | 0xFF000000; + } + + return new Color.SRGB((int) color); + } catch (NumberFormatException e) { + System.out.println("Warning: Invalid color string. Default color will be used."); + return null; + } + } +} diff --git a/react-native/modules/@shopify/checkout-sheet-kit/android/src/main/java/com/shopify/reactnative/checkoutsheetkit/ShopifyCheckoutSheetKitPackage.java b/react-native/modules/@shopify/checkout-sheet-kit/android/src/main/java/com/shopify/reactnative/checkoutsheetkit/ShopifyCheckoutSheetKitPackage.java new file mode 100644 index 00000000..5300fb63 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/android/src/main/java/com/shopify/reactnative/checkoutsheetkit/ShopifyCheckoutSheetKitPackage.java @@ -0,0 +1,56 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +package com.shopify.reactnative.checkoutsheetkit; + +import androidx.annotation.NonNull; + +import com.facebook.react.ReactPackage; +import com.facebook.react.bridge.NativeModule; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.uimanager.ViewManager; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class ShopifyCheckoutSheetKitPackage implements ReactPackage { + + @NonNull + @Override + public List createViewManagers(@NonNull ReactApplicationContext reactContext) { + return Collections.emptyList(); + } + + @NonNull + @Override + public List createNativeModules( + @NonNull ReactApplicationContext reactContext) { + List modules = new ArrayList<>(); + + modules.add(new ShopifyCheckoutSheetKitModule(reactContext)); + + return modules; + } + +} diff --git a/react-native/modules/@shopify/checkout-sheet-kit/ios/.clang-format b/react-native/modules/@shopify/checkout-sheet-kit/ios/.clang-format new file mode 100644 index 00000000..f2646986 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/ios/.clang-format @@ -0,0 +1,29 @@ +BasedOnStyle: LLVM +Language: ObjC +UseTab: Never +IndentWidth: 2 +ContinuationIndentWidth: 2 +ColumnLimit: 120 + +# Keep long macro calls (e.g., RCT_EXTERN_METHOD) readable +AlignAfterOpenBracket: DontAlign +BinPackArguments: false +BinPackParameters: false +PenaltyBreakBeforeFirstCallParameter: 200 +ReflowComments: false + +# Objective-C specifics +ObjCSpaceAfterProperty: true +ObjCSpaceBeforeProtocolList: true +ObjCBreakBeforeNestedBlockParam: true +PointerAlignment: Left +BreakBeforeBraces: Attach +SpaceBeforeParens: ControlStatements +SortIncludes: false + +# Treat common React Native macros as statements for nicer wrapping +StatementMacros: + - RCT_EXTERN_METHOD + - RCT_EXTERN_MODULE + - RCT_EXPORT_VIEW_PROPERTY + diff --git a/react-native/modules/@shopify/checkout-sheet-kit/ios/AcceleratedCheckoutButtons+Extensions.swift b/react-native/modules/@shopify/checkout-sheet-kit/ios/AcceleratedCheckoutButtons+Extensions.swift new file mode 100644 index 00000000..cddc7f6c --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/ios/AcceleratedCheckoutButtons+Extensions.swift @@ -0,0 +1,80 @@ +/* + MIT License + + Copyright 2023 - Present, Shopify Inc. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import _PassKit_SwiftUI +import Foundation +import PassKit +import SwiftUI + +// MARK: - Apple Pay Button + +@available(iOS 16.0, *) +extension PayWithApplePayButtonLabel { + static func from(_ string: String?, fallback: PayWithApplePayButtonLabel = .plain) -> PayWithApplePayButtonLabel { + guard let string, let value = map[string] else { + return fallback + } + + return value + } + + private static let map: [String: PayWithApplePayButtonLabel] = [ + "addMoney": .addMoney, + "book": .book, + "buy": .buy, + "checkout": .checkout, + "continue": .continue, + "contribute": .contribute, + "donate": .donate, + "inStore": .inStore, + "order": .order, + "plain": .plain, + "reload": .reload, + "rent": .rent, + "setUp": .setUp, + "subscribe": .subscribe, + "support": .support, + "tip": .tip, + "topUp": .topUp + ] +} + +// MARK: - Apple Pay Button Style + +@available(iOS 16.0, *) +extension PayWithApplePayButtonStyle { + static func from(_ string: String?, fallback: PayWithApplePayButtonStyle = .automatic) -> PayWithApplePayButtonStyle { + guard let string, let value = map[string] else { + return fallback + } + + return value + } + + private static let map: [String: PayWithApplePayButtonStyle] = [ + "automatic": .automatic, + "black": .black, + "white": .white, + "whiteOutline": .whiteOutline + ] +} diff --git a/react-native/modules/@shopify/checkout-sheet-kit/ios/AcceleratedCheckoutButtons.swift b/react-native/modules/@shopify/checkout-sheet-kit/ios/AcceleratedCheckoutButtons.swift new file mode 100644 index 00000000..fcefb67c --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/ios/AcceleratedCheckoutButtons.swift @@ -0,0 +1,449 @@ +/* + MIT License + + Copyright 2023 - Present, Shopify Inc. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import Foundation +import PassKit +import React +import ShopifyCheckoutSheetKit +import SwiftUI +import UIKit + +// MARK: - AcceleratedCheckout Components + +@available(iOS 16.0, *) +class AcceleratedCheckoutConfiguration { + static let shared = AcceleratedCheckoutConfiguration() + var configuration: ShopifyAcceleratedCheckouts.Configuration? + var applePayConfiguration: ShopifyAcceleratedCheckouts.ApplePayConfiguration? + + var available: Bool { + if #available(iOS 16.0, *) { + return configuration != nil + } else { + return false + } + } + + var applePayAvailable: Bool { + if #available(iOS 16.0, *) { + return applePayConfiguration != nil + } else { + return false + } + } +} + +@objc(RCTAcceleratedCheckoutButtonsManager) +class RCTAcceleratedCheckoutButtonsManager: RCTViewManager { + /// Internal property used in tests to simulate legacy devices + internal var supported: Bool = true + + override func view() -> UIView! { + if supported { + if #available(iOS 16.0, *) { + return RCTAcceleratedCheckoutButtonsView() + } + } + + // Return an empty view for iOS < 16.0 (silent fallback) + return UIView() + } + + override static func requiresMainQueueSetup() -> Bool { + return true + } + + override func constantsToExport() -> [AnyHashable: Any]! { + return [:] + } +} + +@available(iOS 16.0, *) +class RCTAcceleratedCheckoutButtonsView: UIView { + private var hostingController: UIHostingController? + private var configuration: ShopifyAcceleratedCheckouts.Configuration? + private weak var parentViewController: UIViewController? + internal var instance: AcceleratedCheckoutButtons? + + @objc var onSizeChange: RCTDirectEventBlock? + + // MARK: - Props + + // Note that prop values are intentionally nil so that the kit defaults are used + + /** + * Accepts either { cartId } or { variantId, quantity }. + */ + @objc var checkoutIdentifier: NSDictionary? { + didSet { + updateView() + } + } + + @objc var cornerRadius: NSNumber? { + didSet { + updateView() + } + } + + @objc var wallets: [String]? { + didSet { + invalidateIntrinsicContentSize() + setNeedsLayout() + updateView() + } + } + + @objc var applePayLabel: String? { + didSet { + updateView() + } + } + + @objc var applePayStyle: String? { + didSet { + updateView() + } + } + + @objc var onFail: RCTBubblingEventBlock? + @objc var onComplete: RCTBubblingEventBlock? + @objc var onCancel: RCTBubblingEventBlock? + @objc var onRenderStateChange: RCTBubblingEventBlock? + @objc var onShouldRecoverFromError: RCTDirectEventBlock? + @objc var onWebPixelEvent: RCTBubblingEventBlock? + @objc var onClickLink: RCTBubblingEventBlock? + + // MARK: - Private + + /// Compute the wallets to render based on the `wallets` prop. + /// If `wallets` is provided and empty, render nothing. No fallback here; SDK provides defaults. + private var shopifyWallets: [Wallet] { + guard let providedWallets = wallets else { return [] } + do { + return try convertToShopifyWallets(providedWallets) + } catch { + return [] + } + } + + override init(frame: CGRect) { + super.init(frame: frame) + setupView() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + setupView() + } + + override func layoutSubviews() { + super.layoutSubviews() + hostingController?.view.frame = bounds + } + + // Deprecated in iOS 17 — superseded by registerForTraitChanges in setupView(). + // Remove this override when dropping iOS 16 support. + override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + if #unavailable(iOS 17.0) { + if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) { + updateView() + } + } + } + + override var intrinsicContentSize: CGSize { + let height = calculateRequiredHeight() + return CGSize(width: UIView.noIntrinsicMetric, height: height) + } + + private func setupView() { + // Configuration will be set via a static method from the main module + configuration = AcceleratedCheckoutConfiguration.shared.configuration + + // Find the parent view controller + DispatchQueue.main.async { [weak self] in + self?.parentViewController = self?.findViewController() + } + + updateView() + + // Replaces traitCollectionDidChange for iOS 17+. + // When dropping iOS 16 support, remove the traitCollectionDidChange override above. + if #available(iOS 17.0, *) { + registerForTraitChanges([UITraitUserInterfaceStyle.self]) { [weak self] (_: RCTAcceleratedCheckoutButtonsView, _: UITraitCollection) in + self?.updateView() + } + } + + // Listen for configuration updates + NotificationCenter.default.addObserver( + self, + selector: #selector(configurationUpdated), + name: Notification.Name("AcceleratedCheckoutConfigurationUpdated"), + object: nil + ) + + NotificationCenter.default.addObserver( + self, + selector: #selector(configurationUpdated), + name: Notification.Name("CheckoutKitConfigurationUpdated"), + object: nil + ) + + // Fire initial size change event + resizeWallets() + } + + private func findViewController() -> UIViewController? { + var responder: UIResponder? = self + while let nextResponder = responder?.next { + if let viewController = nextResponder as? UIViewController { + return viewController + } + responder = nextResponder + } + return nil + } + + @objc private func configurationUpdated() { + configuration = AcceleratedCheckoutConfiguration.shared.configuration + updateView() + } + + private func attachModifiers(to buttons: AcceleratedCheckoutButtons, wallets: [Wallet]?, applePayLabel: PayWithApplePayButtonLabel?, applePayStyle: PayWithApplePayButtonStyle) -> AcceleratedCheckoutButtons { + var modifiedButtons = buttons + + if let wallets { + modifiedButtons = modifiedButtons.wallets(wallets) + } + + if let applePayLabel { + modifiedButtons = modifiedButtons.applePayLabel(applePayLabel) + } + + modifiedButtons = modifiedButtons.applePayStyle(applePayStyle) + + if let cornerRadius { + modifiedButtons = modifiedButtons.cornerRadius(CGFloat(cornerRadius.doubleValue)) + } + + return modifiedButtons + } + + private func attachEventListeners(to buttons: AcceleratedCheckoutButtons) -> AcceleratedCheckoutButtons { + return buttons + .onComplete { [weak self] event in + self?.handleCheckoutCompleted(event) + } + .onFail { [weak self] error in + self?.handleCheckoutFailed(error) + } + .onCancel { [weak self] in + self?.handleCheckoutCancelled() + } + .onRenderStateChange { [weak self] state in + self?.handleRenderStateChange(state) + } + .onClickLink { [weak self] url in + self?.handleClickLink(url) + } + .onWebPixelEvent { [weak self] event in + self?.handleWebPixelEvent(event) + } + } + + private func updateView() { + let walletsEmpty = wallets != nil && shopifyWallets.isEmpty + + guard + let config = configuration, + let checkoutIdentifierDictionary = checkoutIdentifier as? [String: Any], + !walletsEmpty + else { + renderEmptyView() + return + } + + // Map wallets if provided; otherwise let the kit decide the defaults + let shopifyWallets: [Wallet]? = wallets != nil ? shopifyWallets : nil + + var buttons: AcceleratedCheckoutButtons + + if let cartIdentifier = extractCartIdentifier(from: checkoutIdentifierDictionary) { + buttons = AcceleratedCheckoutButtons(cartID: cartIdentifier) + } else if let productIdentifier = extractProductIdentifier(from: checkoutIdentifierDictionary) { + buttons = AcceleratedCheckoutButtons( + variantID: productIdentifier.variantId, + quantity: productIdentifier.quantity + ) + } else { + renderEmptyView() + return + } + + // Attach modifiers (wallets, applePayLabel, applePayStyle, cornerRadius) + buttons = attachModifiers(to: buttons, wallets: shopifyWallets, applePayLabel: PayWithApplePayButtonLabel.from(applePayLabel), applePayStyle: PayWithApplePayButtonStyle.from(applePayStyle)) + // Attach event handlers + buttons = attachEventListeners(to: buttons) + + var view: AnyView + + let colorScheme: SwiftUI.ColorScheme = traitCollection.userInterfaceStyle == .dark ? .dark : .light + + // Attach config (and Apple Pay config if available) + if let applePayConfig = AcceleratedCheckoutConfiguration.shared.applePayConfiguration { + view = AnyView(buttons.environmentObject(config).environmentObject(applePayConfig).environment(\.colorScheme, colorScheme)) + } else { + view = AnyView(buttons.environmentObject(config).environment(\.colorScheme, colorScheme)) + } + + if let hostingController { + hostingController.rootView = view + } else { + hostingController = UIHostingController(rootView: view) + hostingController?.view.backgroundColor = UIColor.clear + + // Ensure the hosting view can receive touch events + hostingController?.view.isUserInteractionEnabled = true + + if let hostingView = hostingController?.view { + addSubview(hostingView) + hostingView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + hostingView.topAnchor.constraint(equalTo: topAnchor), + hostingView.leadingAnchor.constraint(equalTo: leadingAnchor), + hostingView.trailingAnchor.constraint(equalTo: trailingAnchor), + hostingView.bottomAnchor.constraint(equalTo: bottomAnchor) + ]) + } + } + + // Ensure this view can also receive touch events + isUserInteractionEnabled = true + + instance = buttons + + // Fire size change event + resizeWallets() + } + + // MARK: - Event Handlers + + private func handleCheckoutCompleted(_ event: CheckoutCompletedEvent) { + onComplete?(ShopifyEventSerialization.serialize(checkoutCompletedEvent: event)) + } + + private func handleCheckoutFailed(_ error: CheckoutError) { + onFail?(ShopifyEventSerialization.serialize(checkoutError: error)) + } + + private func handleCheckoutCancelled() { + onCancel?([:]) + } + + private func handleRenderStateChange(_ state: RenderState) { + onRenderStateChange?(ShopifyEventSerialization.serialize(renderState: state)) + } + + private func handleWebPixelEvent(_ event: PixelEvent) { + onWebPixelEvent?(ShopifyEventSerialization.serialize(pixelEvent: event)) + } + + private func handleClickLink(_ url: URL) { + onClickLink?(ShopifyEventSerialization.serialize(clickEvent: url)) + } + + // MARK: - Helper Methods + + /// Parses `cartId` from `checkoutIdentifier` NSDictionary + private func extractCartIdentifier(from dictionary: [String: Any]) -> String? { + guard let rawCartId = dictionary["cartId"] as? String else { return nil } + let trimmedCartId = rawCartId.trimmingCharacters(in: .whitespacesAndNewlines) + return trimmedCartId.isEmpty ? nil : trimmedCartId + } + + /// Parses `variantId` and `quantity` from `checkoutIdentifier` NSDictionary + private func extractProductIdentifier(from dictionary: [String: Any]) -> (variantId: String, quantity: Int)? { + guard let rawVariantId = dictionary["variantId"] as? String else { return nil } + guard let rawQuantity = dictionary["quantity"] as? NSNumber else { return nil } + + let trimmedVariantId = rawVariantId.trimmingCharacters(in: .whitespacesAndNewlines) + let quantityValue = rawQuantity.intValue + + guard !trimmedVariantId.isEmpty, quantityValue > 0 else { return nil } + return (variantId: trimmedVariantId, quantity: quantityValue) + } + + private func renderEmptyView() { + instance = nil + hostingController?.rootView = AnyView(EmptyView()) + onSizeChange?(["height": 0]) + } + + /// Cases for returning 0 height + /// - No buttons instance available + /// - Wallets is explicitly an empty array + /// - OR wallets is provided and maps to empty + private func calculateRequiredHeight() -> CGFloat { + guard + let instance, + wallets?.isEmpty != true, + !(wallets != nil && shopifyWallets.isEmpty) + else { + return 0 + } + + let numberOfWallets = shopifyWallets.isEmpty + ? instance.wallets.count + : max(shopifyWallets.count, 1) + + let buttonHeight: CGFloat = 48 + let gapHeight: CGFloat = 8 + return (CGFloat(numberOfWallets) * buttonHeight) + (CGFloat(numberOfWallets - 1) * gapHeight) + } + + private func resizeWallets() { + DispatchQueue.main.async { [weak self] in + guard let self else { + return + } + + let height = self.calculateRequiredHeight() + self.onSizeChange?(["height": height]) + } + } + + private func convertToShopifyWallets(_ walletStrings: [String]) throws -> [Wallet] { + return try walletStrings.compactMap { walletString in + guard let wallet = Wallet(rawValue: walletString), wallet != nil else { + let message = "Unknown wallet option: \(String(describing: walletString))" + print("[ShopifyAcceleratedCheckouts] \(message)") + throw NSError(domain: "ShopifyAcceleratedCheckouts", code: 1, userInfo: ["message": message]) + } + + return wallet + } + } +} diff --git a/react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit+EventSerialization.swift b/react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit+EventSerialization.swift new file mode 100644 index 00000000..801937fb --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit+EventSerialization.swift @@ -0,0 +1,175 @@ +/* + MIT License + + Copyright 2023 - Present, Shopify Inc. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import Foundation +import ShopifyCheckoutSheetKit + +/** + * Shared event serialization utilities for converting ShopifyCheckoutSheetKit events + * to React Native compatible dictionaries. + */ +internal enum ShopifyEventSerialization { + /** + * Encodes a Codable object to a JSON dictionary for React Native bridge. + */ + static func encodeToJSON(from value: Codable) -> [String: Any] { + let encoder = JSONEncoder() + + do { + let jsonData = try encoder.encode(value) + if let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] { + return jsonObject + } + } catch { + print("Error encoding to JSON object: \(error)") + } + return [:] + } + + /** + * Converts a JSON string to a dictionary. + */ + static func stringToJSON(from value: String?) -> [String: Any]? { + guard let data = value?.data(using: .utf8, allowLossyConversion: false) else { return [:] } + do { + return try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] + } catch { + print("Failed to convert string to JSON: \(error)", value ?? "nil") + return [:] + } + } + + /** + * Converts a CheckoutCompletedEvent to a React Native compatible dictionary. + */ + static func serialize(checkoutCompletedEvent event: CheckoutCompletedEvent) -> [String: Any] { + return encodeToJSON(from: event) + } + + /** + * Converts a PixelEvent to a React Native compatible dictionary. + */ + static func serialize(pixelEvent event: PixelEvent) -> [String: Any] { + switch event { + case let .standardEvent(standardEvent): + let encoded = encodeToJSON(from: standardEvent) + return [ + "context": encoded["context"] ?? NSNull(), + "data": encoded["data"] ?? NSNull(), + "id": encoded["id"] ?? NSNull(), + "name": encoded["name"] ?? NSNull(), + "timestamp": encoded["timestamp"] ?? NSNull(), + "type": "STANDARD" + ] + + case let .customEvent(customEvent): + return [ + "context": encodeToJSON(from: customEvent.context), + "customData": stringToJSON(from: customEvent.customData) ?? NSNull(), + "id": customEvent.id, + "name": customEvent.name, + "timestamp": customEvent.timestamp, + "type": "CUSTOM" + ] + } + } + + static func serialize(clickEvent url: URL) -> [String: URL] { + return ["url": url] + } + + /** + * Converts a CheckoutError to a React Native compatible dictionary. + * Handles all specific error types with proper type information. + */ + static func serialize(checkoutError error: CheckoutError) -> [String: Any] { + switch error { + case let .checkoutExpired(message, code, recoverable): + return [ + "__typename": "CheckoutExpiredError", + "message": message, + "code": code.rawValue, + "recoverable": recoverable + ] + + case let .checkoutUnavailable(message, code, recoverable): + switch code { + case let .clientError(clientErrorCode): + return [ + "__typename": "CheckoutClientError", + "message": message, + "code": clientErrorCode.rawValue, + "recoverable": recoverable + ] + case let .httpError(statusCode): + return [ + "__typename": "CheckoutHTTPError", + "message": message, + "code": "http_error", + "statusCode": statusCode, + "recoverable": recoverable + ] + } + + case let .configurationError(message, code, recoverable): + return [ + "__typename": "ConfigurationError", + "message": message, + "code": code.rawValue, + "recoverable": recoverable + ] + + case let .sdkError(underlying, recoverable): + return [ + "__typename": "InternalError", + "code": "unknown", + "message": underlying.localizedDescription, + "recoverable": recoverable + ] + + @unknown default: + return [ + "__typename": "UnknownError", + "code": "unknown", + "message": error.localizedDescription, + "recoverable": error.isRecoverable + ] + } + } + + /** + * Converts a RenderState enum to a string for React Native. + */ + static func serialize(renderState state: RenderState) -> [String: String] { + switch state { + case .loading: + return ["state": "loading"] + case .rendered: + return ["state": "rendered"] + case let .error(reason): + return ["state": "error", "reason": reason] + @unknown default: + return ["state": "error", "reason": "unknown"] + } + } +} diff --git a/react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit+Extensions.swift b/react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit+Extensions.swift new file mode 100644 index 00000000..5b8a0033 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit+Extensions.swift @@ -0,0 +1,52 @@ +/* + MIT License + + Copyright 2023 - Present, Shopify Inc. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import UIKit + +// MARK: - UIColor Extensions + +extension UIColor { + convenience init(hex: String) { + let hexString: String = hex.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) + let start = hexString.index(hexString.startIndex, offsetBy: hexString.hasPrefix("#") ? 1 : 0) + let hexColor = String(hexString[start...]) + + let scanner = Scanner(string: hexColor) + var hexNumber: UInt64 = 0 + + if scanner.scanHexInt64(&hexNumber) { + let red = (hexNumber & 0xFF0000) >> 16 + let green = (hexNumber & 0x00FF00) >> 8 + let blue = hexNumber & 0x0000FF + + self.init( + red: CGFloat(red) / 0xFF, + green: CGFloat(green) / 0xFF, + blue: CGFloat(blue) / 0xFF, + alpha: 1 + ) + } else { + self.init(red: 0, green: 0, blue: 0, alpha: 1) + } + } +} diff --git a/react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit-Bridging-Header.h b/react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit-Bridging-Header.h new file mode 100644 index 00000000..3e860d9e --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit-Bridging-Header.h @@ -0,0 +1,28 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#import +#import +#import +#import +#import diff --git a/react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit.mm b/react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit.mm new file mode 100644 index 00000000..5a3d7017 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit.mm @@ -0,0 +1,154 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#import +#import + +@interface RCT_EXTERN_MODULE (RCTShopifyCheckoutSheetKit, NSObject) + +/** + * Present checkout + */ +RCT_EXTERN_METHOD(present : (NSString*)checkoutURLString); + +/** + * Preload checkout + */ +RCT_EXTERN_METHOD(preload : (NSString*)checkoutURLString); + +/** + * Dismiss checkout + */ +RCT_EXTERN_METHOD(dismiss); + +/** + * Invalidate preload cache + */ +RCT_EXTERN_METHOD(invalidateCache); + +/** + * Set configuration for checkout + */ +RCT_EXTERN_METHOD(setConfig : (NSDictionary*)configuration); + +/** + * Return configuration for checkout + */ +RCT_EXTERN_METHOD(getConfig : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject) + +/** + * Configure AcceleratedCheckouts + */ +RCT_EXTERN_METHOD(configureAcceleratedCheckouts : (NSString*)storefrontDomain storefrontAccessToken : ( + NSString*)storefrontAccessToken customerEmail : (NSString*)customerEmail customerPhoneNumber : (NSString*) + customerPhoneNumber customerAccessToken : (NSString*)customerAccessToken applePayMerchantIdentifier : (NSString*) + applePayMerchantIdentifier applyPayContactFields : (NSArray*)applyPayContactFields supportedShippingCountries : (NSArray*)supportedShippingCountries resolve : ( + RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject); + +/** + * Check if accelerated checkout is available + */ +RCT_EXTERN_METHOD( + isAcceleratedCheckoutAvailable : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject); + +/** + * Check if Apple Pay is available + */ +RCT_EXTERN_METHOD(isApplePayAvailable : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject); + +@end + +/** + * AcceleratedCheckoutButtons View Manager + */ +@interface RCT_EXTERN_MODULE (RCTAcceleratedCheckoutButtonsManager, RCTViewManager) + +/** + * Unified checkout identifier payload. + * Accepts either { cartId } or { variantId, quantity }. + */ +RCT_EXPORT_VIEW_PROPERTY(checkoutIdentifier, NSDictionary*) + +/** + * Corner radius for rendered buttons, in points. Defaults to 8. + */ +RCT_EXPORT_VIEW_PROPERTY(cornerRadius, NSNumber*) + +/** + * Wallets to render. Accepts an array of identifiers such as "shopPay" and "applePay". + * If omitted, native defaults are used. + */ +RCT_EXPORT_VIEW_PROPERTY(wallets, NSArray*) + +/** + * Label variant for the Apple Pay button (e.g., "plain", "buy", "checkout"). + */ +RCT_EXPORT_VIEW_PROPERTY(applePayLabel, NSString*) + +/** + * Style variant for the Apple Pay button (e.g., "automatic", "black", "white", "whiteOutline"). + */ +RCT_EXPORT_VIEW_PROPERTY(applePayStyle, NSString*) + +/** + * Emitted when checkout fails. Payload contains a CheckoutException-like shape. + */ +RCT_EXPORT_VIEW_PROPERTY(onFail, RCTBubblingEventBlock) + +/** + * Emitted when checkout completes successfully. Payload contains order details. + */ +RCT_EXPORT_VIEW_PROPERTY(onComplete, RCTBubblingEventBlock) + +/** + * Emitted when checkout is cancelled by the buyer. + */ +RCT_EXPORT_VIEW_PROPERTY(onCancel, RCTBubblingEventBlock) + +/** + * Emitted when the native render state changes. Values: "loading", "rendered", "error". + */ +RCT_EXPORT_VIEW_PROPERTY(onRenderStateChange, RCTBubblingEventBlock) + +/** + * Direct event used to determine whether native should attempt recovery from an error. + */ +RCT_EXPORT_VIEW_PROPERTY(onShouldRecoverFromError, RCTDirectEventBlock) + +/** + * Emitted when a web pixel event occurs during checkout. + */ +RCT_EXPORT_VIEW_PROPERTY(onWebPixelEvent, RCTBubblingEventBlock) + +/** + * Emitted when a link is clicked within the checkout experience. Payload contains the URL. + */ +RCT_EXPORT_VIEW_PROPERTY(onClickLink, RCTBubblingEventBlock) + +/** + * Emitted when the intrinsic height of the native view changes. Payload contains { height }. + */ +RCT_EXPORT_VIEW_PROPERTY(onSizeChange, RCTDirectEventBlock) + +@end diff --git a/react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit.swift b/react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit.swift new file mode 100644 index 00000000..25425e7c --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/ios/ShopifyCheckoutSheetKit.swift @@ -0,0 +1,329 @@ +/* + MIT License + + Copyright 2023 - Present, Shopify Inc. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import Foundation +import PassKit +import React +import ShopifyCheckoutSheetKit +import SwiftUI +import UIKit + +@objc(RCTShopifyCheckoutSheetKit) +class RCTShopifyCheckoutSheetKit: RCTEventEmitter, CheckoutDelegate { + private var hasListeners = false + + internal var checkoutSheet: UIViewController? + private var acceleratedCheckoutsConfiguration: Any? + private var acceleratedCheckoutsApplePayConfiguration: Any? + private var defaultLogLevel: LogLevel = .error + + override var methodQueue: DispatchQueue! { + return DispatchQueue.main + } + + @objc override static func requiresMainQueueSetup() -> Bool { + return true + } + + override init() { + ShopifyCheckoutSheetKit.configure { + $0.platform = ShopifyCheckoutSheetKit.Platform.reactNative + } + + super.init() + } + + override func supportedEvents() -> [String]! { + return ["close", "completed", "error", "pixel"] + } + + override func startObserving() { + hasListeners = true + } + + override func stopObserving() { + hasListeners = false + } + + func checkoutDidComplete(event: CheckoutCompletedEvent) { + if hasListeners { + sendEvent(withName: "completed", body: ShopifyEventSerialization.serialize(checkoutCompletedEvent: event)) + } + } + + func shouldRecoverFromError(error: CheckoutError) -> Bool { + return error.isRecoverable + } + + func checkoutDidFail(error: ShopifyCheckoutSheetKit.CheckoutError) { + guard hasListeners else { return } + + sendEvent(withName: "error", body: ShopifyEventSerialization.serialize(checkoutError: error)) + } + + func checkoutDidEmitWebPixelEvent(event: ShopifyCheckoutSheetKit.PixelEvent) { + if hasListeners { + sendEvent(withName: "pixel", body: ShopifyEventSerialization.serialize(pixelEvent: event)) + } + } + + func checkoutDidCancel() { + DispatchQueue.main.async { + if self.hasListeners { + self.sendEvent(withName: "close", body: nil) + } + + self.checkoutSheet?.dismiss(animated: true) + } + } + + @objc override func constantsToExport() -> [AnyHashable: Any]! { + return [ + "version": ShopifyCheckoutSheetKit.version + ] + } + + static func getRootViewController() -> UIViewController? { + return ( + UIApplication.shared.connectedScenes + .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene + )?.windows + .first(where: { $0.isKeyWindow })?.rootViewController + } + + func getCurrentViewController(_ controller: UIViewController? = getRootViewController()) -> UIViewController? { + if let presentedViewController = controller?.presentedViewController { + return getCurrentViewController(presentedViewController) + } + + if let navigationController = controller as? UINavigationController { + return getCurrentViewController(navigationController.visibleViewController) + } + + if let tabBarController = controller as? UITabBarController { + if let selectedViewController = tabBarController.selectedViewController { + return getCurrentViewController(selectedViewController) + } + } + + return controller + } + + @objc func dismiss() { + DispatchQueue.main.async { + self.checkoutSheet?.dismiss(animated: true) + } + } + + @objc func invalidateCache() { + ShopifyCheckoutSheetKit.invalidate() + } + + @objc func present(_ checkoutURL: String) { + DispatchQueue.main.async { + if let url = URL(string: checkoutURL), let viewController = self.getCurrentViewController() { + let view = CheckoutViewController(checkout: url, delegate: self) + viewController.present(view, animated: true) + self.checkoutSheet = view + } + } + } + + @objc func preload(_ checkoutURL: String) { + DispatchQueue.main.async { + if let url = URL(string: checkoutURL) { + ShopifyCheckoutSheetKit.preload(checkout: url) + } + } + } + + private func getColorScheme(_ colorScheme: String) -> ShopifyCheckoutSheetKit.Configuration.ColorScheme { + switch colorScheme { + case "web_default": + return ShopifyCheckoutSheetKit.Configuration.ColorScheme.web + case "automatic": + return ShopifyCheckoutSheetKit.Configuration.ColorScheme.automatic + case "light": + return ShopifyCheckoutSheetKit.Configuration.ColorScheme.light + case "dark": + return ShopifyCheckoutSheetKit.Configuration.ColorScheme.dark + default: + return ShopifyCheckoutSheetKit.Configuration.ColorScheme.automatic + } + } + + @objc func setConfig(_ configuration: [AnyHashable: Any]) { + let colorConfig = configuration["colors"] as? [AnyHashable: Any] + let iosConfig = colorConfig?["ios"] as? [String: String] + + if let title = configuration["title"] as? String { + ShopifyCheckoutSheetKit.configuration.title = title + } + + if let preloading = configuration["preloading"] as? Bool { + ShopifyCheckoutSheetKit.configuration.preloading.enabled = preloading + } + + if let colorScheme = configuration["colorScheme"] as? String { + ShopifyCheckoutSheetKit.configuration.colorScheme = getColorScheme(colorScheme) + } + + if let tintColorHex = iosConfig?["tintColor"] as? String { + ShopifyCheckoutSheetKit.configuration.tintColor = UIColor(hex: tintColorHex) + } + + if let backgroundColorHex = iosConfig?["backgroundColor"] as? String { + ShopifyCheckoutSheetKit.configuration.backgroundColor = UIColor(hex: backgroundColorHex) + } + + if let closeButtonColorHex = iosConfig?["closeButtonColor"] as? String { + ShopifyCheckoutSheetKit.configuration.closeButtonTintColor = UIColor(hex: closeButtonColorHex) + } + + if let logLevel = configuration["logLevel"] as? String { + ShopifyCheckoutSheetKit.configuration.logLevel = ShopifyCheckoutSheetKit.LogLevel(rawValue: logLevel.lowercased()) ?? defaultLogLevel + } else { + ShopifyCheckoutSheetKit.configuration.logLevel = defaultLogLevel + } + + NotificationCenter.default.post(name: Notification.Name("CheckoutKitConfigurationUpdated"), object: nil) + } + + @objc func getConfig(_ resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) { + let config: [String: Any] = [ + "title": ShopifyCheckoutSheetKit.configuration.title, + "preloading": ShopifyCheckoutSheetKit.configuration.preloading.enabled, + "colorScheme": ShopifyCheckoutSheetKit.configuration.colorScheme.rawValue, + "tintColor": ShopifyCheckoutSheetKit.configuration.tintColor, + "backgroundColor": ShopifyCheckoutSheetKit.configuration.backgroundColor, + "closeButtonColor": ShopifyCheckoutSheetKit.configuration.closeButtonTintColor, + "logLevel": logLevelToString(ShopifyCheckoutSheetKit.configuration.logLevel) + ] + + resolve(config) + } + + @objc func configureAcceleratedCheckouts( + _ storefrontDomain: String, + storefrontAccessToken: String, + customerEmail: String?, + customerPhoneNumber: String?, + customerAccessToken: String?, + applePayMerchantIdentifier: String?, + applyPayContactFields: [String]?, + supportedShippingCountries: [String]?, + resolve: @escaping RCTPromiseResolveBlock, + reject _: @escaping RCTPromiseRejectBlock + ) { + guard #available(iOS 16.0, *) else { + resolve(false) + return + } + + let customer = ShopifyAcceleratedCheckouts.Customer( + email: customerEmail, + phoneNumber: customerPhoneNumber, + customerAccessToken: customerAccessToken + ) + + acceleratedCheckoutsConfiguration = ShopifyAcceleratedCheckouts.Configuration( + storefrontDomain: storefrontDomain, + storefrontAccessToken: storefrontAccessToken, + customer: customer + ) + + if let merchantIdentifier = applePayMerchantIdentifier, let contactFields = applyPayContactFields { + do { + let fields = try contactFieldsToRequiredContactFields(contactFields) + + acceleratedCheckoutsApplePayConfiguration = ShopifyAcceleratedCheckouts.ApplePayConfiguration( + merchantIdentifier: merchantIdentifier, + contactFields: fields, + supportedShippingCountries: Set(supportedShippingCountries ?? []) + ) + + AcceleratedCheckoutConfiguration.shared.applePayConfiguration = acceleratedCheckoutsApplePayConfiguration as? ShopifyAcceleratedCheckouts.ApplePayConfiguration + } catch { + resolve(false) + return + } + } + + AcceleratedCheckoutConfiguration.shared.configuration = acceleratedCheckoutsConfiguration as? ShopifyAcceleratedCheckouts.Configuration + + NotificationCenter.default.post(name: Notification.Name("AcceleratedCheckoutConfigurationUpdated"), object: nil) + + resolve(true) + } + + @objc func isAcceleratedCheckoutAvailable( + _ resolve: @escaping RCTPromiseResolveBlock, + reject _: @escaping RCTPromiseRejectBlock + ) { + guard #available(iOS 16.0, *) else { + resolve(false) + return + } + + resolve(AcceleratedCheckoutConfiguration.shared.available) + } + + @objc func isApplePayAvailable( + _ resolve: @escaping RCTPromiseResolveBlock, + reject _: @escaping RCTPromiseRejectBlock + ) { + guard #available(iOS 16.0, *) else { + resolve(false) + return + } + + let available = AcceleratedCheckoutConfiguration.shared.available && AcceleratedCheckoutConfiguration.shared.applePayAvailable + + resolve(available) + } + + // MARK: - Private + + @available(iOS 16.0, *) + private func contactFieldsToRequiredContactFields(_ contactFields: [String]) throws -> [ShopifyAcceleratedCheckouts.RequiredContactFields] { + return try contactFields.compactMap { + guard let field = ShopifyAcceleratedCheckouts.RequiredContactFields(rawValue: $0), field != nil else { + let message = "Unknown contactField option: \(String(describing: $0))" + print("[ShopifyCheckoutSheetKit] \(message)") + throw NSError(domain: "ShopifyCheckoutSheetKit", code: 1, userInfo: ["message": message]) + } + return field + } + } + + private func logLevelToString(_ logLevel: LogLevel) -> String { + switch logLevel { + case .all, .debug: + return "debug" + case .error: + return "error" + default: + return "error" + } + } +} diff --git a/react-native/modules/@shopify/checkout-sheet-kit/package.json b/react-native/modules/@shopify/checkout-sheet-kit/package.json new file mode 100644 index 00000000..76ebaa87 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/package.json @@ -0,0 +1,79 @@ +{ + "name": "@shopify/checkout-sheet-kit", + "license": "MIT", + "version": "3.8.0", + "main": "lib/commonjs/index.js", + "types": "src/index.ts", + "source": "src/index.ts", + "module": "lib/module/index.js", + "description": "A React Native library for Shopify's Checkout Kit.", + "author": "Shopify", + "homepage": "https://github.com/shopify/checkout-sheet-kit-react-native", + "repository": { + "type": "git", + "url": "https://github.com/Shopify/checkout-sheet-kit-react-native" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "scripts": { + "clean": "rm -rf lib", + "build": "bob build", + "lint": "pnpm run typecheck && eslint src", + "typecheck": "tsc --noEmit" + }, + "files": [ + "LICENSE", + "README.md", + "package.json", + "src", + "ios", + "android", + "lib", + "*.podspec", + "!ios/build", + "!android/build", + "!android/gradle", + "!android/gradlew", + "!android/gradlew.bat", + "!android/local.properties", + "!**/*.spec.*", + "!**/*.test.*", + "!**/.*" + ], + "keywords": [ + "react-native", + "shopify", + "checkout" + ], + "peerDependencies": { + "react": "*", + "react-native": "*" + }, + "devDependencies": { + "react-native-builder-bob": "^0.23.2", + "typescript": "^5.9.2" + }, + "codegenConfig": { + "name": "RNShopifyCheckoutSheetKitSpec", + "type": "all", + "jsSrcsDir": "src/specs", + "android": { + "javaPackageName": "com.shopify.checkoutsheetkit" + } + }, + "react-native-builder-bob": { + "source": "src", + "output": "lib", + "targets": [ + "commonjs", + "module", + [ + "typescript", + { + "project": "tsconfig.build.json" + } + ] + ] + } +} diff --git a/react-native/modules/@shopify/checkout-sheet-kit/package.snapshot.json b/react-native/modules/@shopify/checkout-sheet-kit/package.snapshot.json new file mode 100644 index 00000000..8cddcc9f --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/package.snapshot.json @@ -0,0 +1,75 @@ +[ + "LICENSE", + "RNShopifyCheckoutSheetKit.podspec", + "android/build.gradle", + "android/gradle.properties", + "android/proguard-rules.pro", + "android/src/main/AndroidManifest.xml", + "android/src/main/AndroidManifestNew.xml", + "android/src/main/java/com/shopify/reactnative/checkoutsheetkit/CustomCheckoutEventProcessor.java", + "android/src/main/java/com/shopify/reactnative/checkoutsheetkit/ShopifyCheckoutSheetKitModule.java", + "android/src/main/java/com/shopify/reactnative/checkoutsheetkit/ShopifyCheckoutSheetKitPackage.java", + "ios/AcceleratedCheckoutButtons.swift", + "ios/AcceleratedCheckoutButtons+Extensions.swift", + "ios/ShopifyCheckoutSheetKit-Bridging-Header.h", + "ios/ShopifyCheckoutSheetKit.mm", + "ios/ShopifyCheckoutSheetKit.swift", + "ios/ShopifyCheckoutSheetKit+EventSerialization.swift", + "ios/ShopifyCheckoutSheetKit+Extensions.swift", + "lib/commonjs/components/AcceleratedCheckoutButtons.js", + "lib/commonjs/components/AcceleratedCheckoutButtons.js.map", + "lib/commonjs/context.js", + "lib/commonjs/context.js.map", + "lib/commonjs/errors.d.js", + "lib/commonjs/errors.d.js.map", + "lib/commonjs/events.d.js", + "lib/commonjs/events.d.js.map", + "lib/commonjs/index.d.js", + "lib/commonjs/index.d.js.map", + "lib/commonjs/index.js", + "lib/commonjs/index.js.map", + "lib/commonjs/pixels.d.js", + "lib/commonjs/pixels.d.js.map", + "lib/commonjs/specs/NativeShopifyCheckoutSheetKit.js", + "lib/commonjs/specs/NativeShopifyCheckoutSheetKit.js.map", + "lib/commonjs/specs/RCTAcceleratedCheckoutButtonsNativeComponent.js", + "lib/commonjs/specs/RCTAcceleratedCheckoutButtonsNativeComponent.js.map", + "lib/module/components/AcceleratedCheckoutButtons.js", + "lib/module/components/AcceleratedCheckoutButtons.js.map", + "lib/module/context.js", + "lib/module/context.js.map", + "lib/module/errors.d.js", + "lib/module/errors.d.js.map", + "lib/module/events.d.js", + "lib/module/events.d.js.map", + "lib/module/index.d.js", + "lib/module/index.d.js.map", + "lib/module/index.js", + "lib/module/index.js.map", + "lib/module/pixels.d.js", + "lib/module/pixels.d.js.map", + "lib/module/specs/NativeShopifyCheckoutSheetKit.js", + "lib/module/specs/NativeShopifyCheckoutSheetKit.js.map", + "lib/module/specs/RCTAcceleratedCheckoutButtonsNativeComponent.js", + "lib/module/specs/RCTAcceleratedCheckoutButtonsNativeComponent.js.map", + "lib/typescript/src/components/AcceleratedCheckoutButtons.d.ts", + "lib/typescript/src/components/AcceleratedCheckoutButtons.d.ts.map", + "lib/typescript/src/context.d.ts", + "lib/typescript/src/context.d.ts.map", + "lib/typescript/src/index.d.ts", + "lib/typescript/src/index.d.ts.map", + "lib/typescript/src/specs/NativeShopifyCheckoutSheetKit.d.ts", + "lib/typescript/src/specs/NativeShopifyCheckoutSheetKit.d.ts.map", + "lib/typescript/src/specs/RCTAcceleratedCheckoutButtonsNativeComponent.d.ts", + "lib/typescript/src/specs/RCTAcceleratedCheckoutButtonsNativeComponent.d.ts.map", + "package.json", + "src/components/AcceleratedCheckoutButtons.tsx", + "src/context.tsx", + "src/errors.d.ts", + "src/events.d.ts", + "src/index.d.ts", + "src/index.ts", + "src/pixels.d.ts", + "src/specs/NativeShopifyCheckoutSheetKit.ts", + "src/specs/RCTAcceleratedCheckoutButtonsNativeComponent.ts" +] diff --git a/react-native/modules/@shopify/checkout-sheet-kit/src/components/AcceleratedCheckoutButtons.tsx b/react-native/modules/@shopify/checkout-sheet-kit/src/components/AcceleratedCheckoutButtons.tsx new file mode 100644 index 00000000..c52ad100 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/src/components/AcceleratedCheckoutButtons.tsx @@ -0,0 +1,370 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +import React, {useCallback, useMemo, useState} from 'react'; +import {codegenNativeComponent, Platform} from 'react-native'; +import type {ViewStyle} from 'react-native'; +import type { + AcceleratedCheckoutWallet, + CheckoutCompletedEvent, + CheckoutException, + PixelEvent, +} from '..'; + +export enum RenderState { + Loading = 'loading', + Rendered = 'rendered', + Error = 'error', +} + +export type RenderStateChangeEvent = + | {state: RenderState.Error; reason?: string} + | {state: Omit}; + +export enum ApplePayLabel { + addMoney = 'addMoney', + book = 'book', + buy = 'buy', + checkout = 'checkout', + continue = 'continue', + contribute = 'contribute', + donate = 'donate', + inStore = 'inStore', + order = 'order', + plain = 'plain', + reload = 'reload', + rent = 'rent', + setUp = 'setUp', + subscribe = 'subscribe', + support = 'support', + tip = 'tip', + topUp = 'topUp', +} + +export enum ApplePayStyle { + automatic = 'automatic', + black = 'black', + white = 'white', + whiteOutline = 'whiteOutline', +} + +type CheckoutIdentifier = + | { + cartId: string; + } + | { + variantId: string; + quantity: number; + }; + +interface CommonAcceleratedCheckoutButtonsProps { + /** + * Corner radius for the button (defaults to 8) + */ + cornerRadius?: number; + + /** + * Wallets to display in the button + * Defaults to both shopPay and applePay if not specified + */ + wallets?: AcceleratedCheckoutWallet[]; + + /** + * Label for the Apple Pay button + */ + applePayLabel?: ApplePayLabel; + + /** + * Style for the Apple Pay button color + * Defaults to 'automatic' which adapts to the current appearance (light/dark mode) + */ + applePayStyle?: ApplePayStyle; + + /** + * Called when checkout fails + */ + onFail?: (error: CheckoutException) => void; + + /** + * Called when checkout is completed successfully + */ + onComplete?: (event: CheckoutCompletedEvent) => void; + + /** + * Called when checkout is cancelled + */ + onCancel?: () => void; + + /** + * Called when the render state changes + * States from SDK: loading, rendered, error + */ + onRenderStateChange?: (event: RenderStateChangeEvent) => void; + + /** + * Called when a web pixel event is triggered + */ + onWebPixelEvent?: (event: PixelEvent) => void; + + /** + * Called when a link is clicked within the checkout + */ + onClickLink?: (url: string) => void; + + /** + * Called when the size of the button changes + */ + onSizeChange?: (event: {nativeEvent: {height: number}}) => void; +} + +interface CartProps { + /** + * The cart ID for cart-based checkout + */ + cartId: string; +} + +interface VariantProps { + /** + * The variant ID for product-based checkout + */ + variantId: string; + + /** + * The quantity for product-based checkout + */ + quantity: number; +} + +export type AcceleratedCheckoutButtonsProps = (CartProps | VariantProps) & + CommonAcceleratedCheckoutButtonsProps; + +interface NativeAcceleratedCheckoutButtonsProps { + applePayLabel?: string; + applePayStyle?: string; + style?: ViewStyle; + checkoutIdentifier: CheckoutIdentifier; + cornerRadius?: number; + wallets?: AcceleratedCheckoutWallet[]; + onFail?: (event: {nativeEvent: CheckoutException}) => void; + onComplete?: (event: {nativeEvent: CheckoutCompletedEvent}) => void; + onCancel?: () => void; + onRenderStateChange?: (event: { + nativeEvent: {state: string; reason?: string | undefined}; + }) => void; + onWebPixelEvent?: (event: {nativeEvent: PixelEvent}) => void; + onClickLink?: (event: {nativeEvent: {url: string}}) => void; + onSizeChange?: (event: {nativeEvent: {height: number}}) => void; +} + +const RCTAcceleratedCheckoutButtons = + codegenNativeComponent( + 'RCTAcceleratedCheckoutButtons', + ); + +/** + * AcceleratedCheckoutButton provides pre-built payment UI components for Shop Pay and Apple Pay. + * It enables faster checkout with fewer steps and supports both cart and product page checkout. + * + * @example Cart-based checkout + * console.log('Checkout completed!', event.orderDetails)} + * onFail={(error) => console.error('Checkout failed:', error.message)} + * /> + * + * @example Product-based checkout + * console.log('Checkout completed!', event.orderDetails)} + * /> + */ + +const defaultStyles = {flex: 1}; + +export const AcceleratedCheckoutButtons: React.FC< + AcceleratedCheckoutButtonsProps +> = ({ + applePayLabel, + applePayStyle, + cornerRadius, + wallets, + onFail, + onComplete, + onCancel, + onRenderStateChange, + onWebPixelEvent, + onClickLink, + ...props +}) => { + const isCart = isCartProps(props); + const isVariant = isVariantProps(props); + const [dynamicHeight, setDynamicHeight] = useState( + undefined, + ); + + const handleFail = useCallback( + (event: {nativeEvent: CheckoutException}) => { + onFail?.(event.nativeEvent); + }, + [onFail], + ); + + const handleComplete = useCallback( + (event: {nativeEvent: CheckoutCompletedEvent}) => { + onComplete?.(event.nativeEvent); + }, + [onComplete], + ); + + const handleCancel = useCallback(() => { + onCancel?.(); + }, [onCancel]); + + const handleRenderStateChange = useCallback( + (event: {nativeEvent: {state: string; reason?: string | undefined}}) => { + const state = validRenderState(event.nativeEvent.state); + const reason = event.nativeEvent.reason; + + if (state === RenderState.Error) { + onRenderStateChange?.({state, reason}); + } else { + onRenderStateChange?.({state}); + } + }, + [onRenderStateChange], + ); + + const handleWebPixelEvent = useCallback( + (event: {nativeEvent: PixelEvent}) => { + onWebPixelEvent?.(event.nativeEvent); + }, + [onWebPixelEvent], + ); + + const handleClickLink = useCallback( + (event: {nativeEvent: {url: string}}) => { + if (event.nativeEvent?.url) { + onClickLink?.(event.nativeEvent.url); + } + }, + [onClickLink], + ); + + const handleSizeChange = useCallback( + (event: {nativeEvent: {height: number}}) => { + setDynamicHeight(event.nativeEvent.height); + }, + [], + ); + + const checkoutIdentifier: CheckoutIdentifier | undefined = useMemo(() => { + switch (true) { + case isCart: + return {cartId: props.cartId}; + case isVariant: + return {variantId: props.variantId, quantity: props.quantity}; + default: + return undefined; + } + }, [isCart, isVariant, props]); + + // Only render on iOS for now since ShopifyAcceleratedCheckouts is iOS-only + if (Platform.OS !== 'ios' || parseInt(Platform.Version, 10) < 16) { + return null; + } + + if (!checkoutIdentifier) { + /** + * @todo + * + * The ShopifyAcceleratedCheckouts module will handle this error by returning an empty view over the bridge + * to the javascript client. + * + * The onRenderStateChange event will be invoked with both an error state and a reason to indicate the error, at + * which point this error handling can be removed. + * + */ + + const error = new Error( + 'AcceleratedCheckoutButton: Either `cartId` or `variantId` and `quantity` must be provided', + ); + if (__DEV__) { + throw error; + } else { + // eslint-disable-next-line no-console + console.warn(error.message); + return null; + } + } + + return ( + + ); +}; + +export default AcceleratedCheckoutButtons; + +function validRenderState(state: string): RenderState { + switch (state) { + case RenderState.Loading: + return RenderState.Loading; + case RenderState.Rendered: + return RenderState.Rendered; + case RenderState.Error: + return RenderState.Error; + default: + // eslint-disable-next-line no-console + console.error( + `[ShopifyAcceleratedCheckouts] Invalid render state: ${state}`, + ); + return RenderState.Error; + } +} + +function isCartProps( + props: AcceleratedCheckoutButtonsProps, +): props is CartProps { + return 'cartId' in props; +} + +function isVariantProps( + props: AcceleratedCheckoutButtonsProps, +): props is VariantProps { + return 'variantId' in props && 'quantity' in props && props.quantity > 0; +} diff --git a/react-native/modules/@shopify/checkout-sheet-kit/src/context.tsx b/react-native/modules/@shopify/checkout-sheet-kit/src/context.tsx new file mode 100644 index 00000000..daf0c627 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/src/context.tsx @@ -0,0 +1,179 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +import React, {useCallback, useMemo, useRef, useEffect, useState} from 'react'; +import type {PropsWithChildren} from 'react'; +import {type EmitterSubscription} from 'react-native'; +import {ShopifyCheckoutSheet} from './index'; +import type {Features} from './index.d'; +import type { + AddEventListener, + RemoveEventListeners, + CheckoutEvent, + Configuration, +} from './index.d'; + +type Maybe = T | undefined; + +interface Context { + acceleratedCheckoutsAvailable: boolean; + addEventListener: AddEventListener; + getConfig: () => Promise; + setConfig: (config: Configuration) => Promise; + removeEventListeners: RemoveEventListeners; + preload: (checkoutUrl: string) => void; + present: (checkoutUrl: string) => void; + dismiss: () => void; + invalidate: () => void; + version: Maybe; +} + +const ShopifyCheckoutSheetContext = React.createContext( + null as unknown as Context, +); + +interface Props { + features?: Partial; + configuration?: Configuration; +} + +export function ShopifyCheckoutSheetProvider({ + features, + configuration, + children, +}: PropsWithChildren) { + const [acceleratedCheckoutsAvailable, setAcceleratedCheckoutsAvailable] = + useState(false); + const instance = useRef(null); + + if (!instance.current) { + instance.current = new ShopifyCheckoutSheet(configuration, features); + } + + useEffect(() => { + async function configureCheckoutKit() { + if (!instance.current || !configuration) { + return; + } + + const customer = configuration.acceleratedCheckouts?.customer; + if (customer?.accessToken && (customer?.email || customer?.phoneNumber)) { + // eslint-disable-next-line no-console + console.warn( + '[ShopifyCheckoutSheetKit] Providing accessToken with contactFields (email / phoneNumber) is deprecated and will become an error in v4.' + + 'When the user is authenticated with Customer Accounts, provide accessToken' + + 'When the user is otherwise authenticated, provide email/phoneNumber.', + ); + } + + await instance.current?.setConfig(configuration); + setAcceleratedCheckoutsAvailable( + instance.current.acceleratedCheckoutsReady, + ); + } + + configureCheckoutKit(); + }, [configuration]); + + const addEventListener: AddEventListener = useCallback( + (eventName, callback): EmitterSubscription | undefined => { + return instance.current?.addEventListener(eventName, callback); + }, + [], + ); + + const removeEventListeners = useCallback((eventName: CheckoutEvent) => { + instance.current?.removeEventListeners(eventName); + }, []); + + const present = useCallback((checkoutUrl: string) => { + if (checkoutUrl) { + instance.current?.present(checkoutUrl); + } + }, []); + + const preload = useCallback((checkoutUrl: string) => { + if (checkoutUrl) { + instance.current?.preload(checkoutUrl); + } + }, []); + + const invalidate = useCallback(() => { + instance.current?.invalidate(); + }, []); + + const dismiss = useCallback(() => { + instance.current?.dismiss(); + }, []); + + const setConfig = useCallback(async (config: Configuration) => { + await instance.current?.setConfig(config); + }, []); + + const getConfig = useCallback(async () => { + return instance.current?.getConfig(); + }, []); + + const context = useMemo((): Context => { + return { + acceleratedCheckoutsAvailable, + addEventListener, + dismiss, + setConfig, + getConfig, + preload, + present, + invalidate, + removeEventListeners, + version: instance.current?.version, + }; + }, [ + acceleratedCheckoutsAvailable, + addEventListener, + dismiss, + removeEventListeners, + getConfig, + setConfig, + preload, + present, + invalidate, + ]); + + return ( + + {children} + + ); +} + +export function useShopifyCheckoutSheet() { + const context = React.useContext(ShopifyCheckoutSheetContext); + if (!context) { + throw new Error( + 'useShopifyCheckoutSheet must be used from within a ShopifyCheckoutSheetContext', + ); + } + return context; +} + +export default ShopifyCheckoutSheetContext; diff --git a/react-native/modules/@shopify/checkout-sheet-kit/src/errors.d.ts b/react-native/modules/@shopify/checkout-sheet-kit/src/errors.d.ts new file mode 100644 index 00000000..faff876b --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/src/errors.d.ts @@ -0,0 +1,132 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +export enum CheckoutErrorCode { + storefrontPasswordRequired = 'storefront_password_required', + cartExpired = 'cart_expired', + cartCompleted = 'cart_completed', + invalidCart = 'invalid_cart', + clientError = 'client_error', + httpError = 'http_error', + sendingBridgeEventError = 'error_sending_message', + receivingBridgeEventError = 'error_receiving_message', + renderProcessGone = 'render_process_gone', + unknown = 'unknown', +} + +export enum CheckoutNativeErrorType { + InternalError = 'InternalError', + ConfigurationError = 'ConfigurationError', + CheckoutClientError = 'CheckoutClientError', + CheckoutHTTPError = 'CheckoutHTTPError', + CheckoutExpiredError = 'CheckoutExpiredError', + UnknownError = 'UnknownError', +} + +function getCheckoutErrorCode(code: string | undefined): CheckoutErrorCode { + const codeKey = Object.keys(CheckoutErrorCode).find( + key => CheckoutErrorCode[key as keyof typeof CheckoutErrorCode] === code, + ); + + return codeKey ? CheckoutErrorCode[codeKey] : CheckoutErrorCode.unknown; +} + +type BridgeError = { + __typename: CheckoutNativeErrorType; + code: CheckoutErrorCode; + message: string; + recoverable: boolean; +}; + +export type CheckoutNativeError = + | BridgeError + | (BridgeError & {statusCode: number}); + +class GenericErrorWithCode { + message: string; + recoverable: boolean; + code: CheckoutErrorCode; + + constructor(exception: CheckoutNativeError) { + this.code = getCheckoutErrorCode(exception.code); + this.message = exception.message; + this.recoverable = exception.recoverable; + this.name = this.constructor.name; + } +} + +class GenericNetworkError { + code: CheckoutErrorCode; + message: string; + recoverable: boolean; + statusCode: number; + + constructor(exception: CheckoutNativeError) { + this.code = getCheckoutErrorCode(exception.code); + this.statusCode = exception.statusCode; + this.message = exception.message; + this.recoverable = exception.recoverable; + this.name = this.constructor.name; + } +} + +export class ConfigurationError extends GenericErrorWithCode {} +export class CheckoutClientError extends GenericErrorWithCode {} +export class CheckoutExpiredError extends GenericErrorWithCode {} +export class CheckoutHTTPError extends GenericNetworkError {} + +export class GenericError { + code: CheckoutErrorCode; + message?: string; + recoverable: boolean; + statusCode?: number; + name: string; + + constructor(exception?: CheckoutNativeError) { + this.code = getCheckoutErrorCode(exception?.code); + this.message = exception?.message; + this.name = this.constructor.name; + this.recoverable = exception?.recoverable ?? false; + this.statusCode = exception?.statusCode; + } +} + +export class InternalError { + code: CheckoutErrorCode; + message: string; + recoverable: boolean; + + constructor(exception: CheckoutNativeError) { + this.code = getCheckoutErrorCode(exception.code); + this.message = exception.message; + this.recoverable = exception.recoverable; + } +} + +export type CheckoutException = + | CheckoutClientError + | CheckoutExpiredError + | CheckoutHTTPError + | ConfigurationError + | GenericError + | InternalError; diff --git a/react-native/modules/@shopify/checkout-sheet-kit/src/events.d.ts b/react-native/modules/@shopify/checkout-sheet-kit/src/events.d.ts new file mode 100644 index 00000000..325596d4 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/src/events.d.ts @@ -0,0 +1,112 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +namespace CheckoutCompletedEvent { + interface Address { + address1?: string; + address2?: string; + city?: string; + countryCode?: string; + firstName?: string; + lastName?: string; + name?: string; + phone?: string; + postalCode?: string; + referenceId?: string; + zoneCode?: string; + } + + interface CartInfo { + lines: CartLine[]; + price: Price; + token: string; + } + + interface CartLineImage { + altText?: string; + lg: string; + md: string; + sm: string; + } + + interface CartLine { + discounts?: Discount[]; + image?: CartLineImage; + merchandiseId?: string; + price: Money; + productId?: string; + quantity: number; + title: string; + } + + interface DeliveryDetails { + additionalInfo?: string; + location?: Address; + name?: string; + } + + interface DeliveryInfo { + details: DeliveryDetails; + method: string; + } + + interface Discount { + amount?: Money; + applicationType?: string; + title?: string; + value?: number; + valueType?: string; + } + + export interface OrderDetails { + billingAddress?: Address; + cart: CartInfo; + deliveries?: DeliveryInfo[]; + email?: string; + id: string; + paymentMethods?: PaymentMethod[]; + phone?: string; + } + + interface PaymentMethod { + details: {[key: string]: string | null}; + type: string; + } + + interface Price { + discounts?: Discount[]; + shipping?: Money; + subtotal?: Money; + taxes?: Money; + total?: Money; + } + + interface Money { + amount?: number; + currencyCode?: string; + } +} + +export interface CheckoutCompletedEvent { + orderDetails: CheckoutCompletedEvent.OrderDetails; +} diff --git a/react-native/modules/@shopify/checkout-sheet-kit/src/index.d.ts b/react-native/modules/@shopify/checkout-sheet-kit/src/index.d.ts new file mode 100644 index 00000000..34147dad --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/src/index.d.ts @@ -0,0 +1,353 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +import type {EmitterSubscription} from 'react-native'; +import type {PixelEvent} from './pixels'; +import type {CheckoutCompletedEvent} from './events'; +import type {CheckoutException} from './errors'; + +export type Maybe = T | undefined; + +/** + * Configuration options for checkout sheet kit features + */ +export interface Features { + /** + * When enabled, the checkout will handle geolocation permission requests internally. + * If disabled, geolocation requests will emit a 'geolocationRequest' event that + * must be handled by the application. + */ + handleGeolocationRequests: boolean; +} + +export enum ColorScheme { + automatic = 'automatic', + light = 'light', + dark = 'dark', + web = 'web_default', +} + +/** + * Log level for the checkout sheet kit. + * Controls the verbosity of logs emitted by the native SDK. + * @defaults to error + */ +export enum LogLevel { + /** + * Show debug logs. + */ + debug = 'debug', + /** + * Show only error logs. + */ + error = 'error', +} + +export interface IosColors { + /** + * A HEX color value for customizing the color of the progress bar. + */ + tintColor?: string; + /** + * A HEX color value for customizing the background color of the webview. + */ + backgroundColor?: string; + /** + * A HEX color value for customizing the color of the close button. + */ + closeButtonColor?: string; +} + +export interface AndroidColors { + /** + * A HEX color value for customizing the color of the progress bar. + */ + progressIndicator: string; + /** + * A HEX color value for customizing the background color of the webview. + */ + backgroundColor: string; + /** + * A HEX color value for customizing the background color of the webview header. + */ + headerBackgroundColor: string; + /** + * A HEX color value for customizing the text color of the webview header. + */ + headerTextColor: string; + /** + * A HEX color value for customizing the color of the close button. + */ + closeButtonColor?: string; +} + +export interface AndroidAutomaticColors { + /** + * Color overrides when the theme preference is 'light'. + */ + light: AndroidColors; + /** + * Color overrides when the theme preference is 'dark'. + */ + dark: AndroidColors; +} + +interface CommonConfiguration { + /** + * Enable/disable preloading for checkout. This option must be enabled for `.preload()` to work as expected. + */ + preloading?: boolean; + /** + * Sets the title of the Checkout sheet. + * + * * Important: This will only modify the Checkout Sheet on iOS, not Android. + * + * To implement localization support for iOS: + * 1. Create a "Localizable.xcstrings" file under "ios/{YourApplication}" + * 2. Set a translated value for a "shopify_checkout_sheet_title" key + * + * To implement localization support for Android: + * 1. Open the "android/app/src/main/res/values/strings.xml" file + * 2. Add "Checkout" + */ + title?: string; + /** + * Sets the log level for the checkout sheet kit. + * Controls the verbosity of logs emitted by the native SDK. + * + * @default LogLevel.error + */ + logLevel?: LogLevel; +} + +export type Configuration = CommonConfiguration & { + acceleratedCheckouts?: AcceleratedCheckoutConfiguration; +} & ( + | { + /** + * The selected color scheme for the checkout. See README.md for more details. + */ + colorScheme?: ColorScheme.web | ColorScheme.light | ColorScheme.dark; + /** + * Platform-specific color overrides + */ + colors?: { + ios?: IosColors; + android?: AndroidColors; + }; + } + | { + /** + * The selected color scheme for the checkout. See README.md for more details. + */ + colorScheme?: ColorScheme.automatic; + /** + * Platform-specific color overrides + */ + colors?: { + ios?: IosColors; + android?: AndroidAutomaticColors; + }; + } + ); + +export type CheckoutEvent = + | 'close' + | 'completed' + | 'error' + | 'geolocationRequest' + | 'pixel'; + +export interface GeolocationRequestEvent { + origin: string; +} + +export type CloseEventCallback = () => void; +export type GeolocationRequestEventCallback = ( + event: GeolocationRequestEvent, +) => void; +export type PixelEventCallback = (event: PixelEvent) => void; +export type CheckoutExceptionCallback = (error: CheckoutException) => void; +export type CheckoutCompletedEventCallback = ( + event: CheckoutCompletedEvent, +) => void; + +export type CheckoutEventCallback = + | CloseEventCallback + | CheckoutExceptionCallback + | CheckoutCompletedEventCallback + | GeolocationRequestEventCallback + | PixelEventCallback; + +/** + * Available wallet types for accelerated checkout + */ +export enum AcceleratedCheckoutWallet { + shopPay = 'shopPay', + applePay = 'applePay', +} + +export enum ApplePayContactField { + email = 'email', + phone = 'phone', +} + +/** + * Configuration for AcceleratedCheckouts + */ +export interface AcceleratedCheckoutConfiguration { + /** + * The storefront domain (e.g., "your-shop.myshopify.com") + */ + storefrontDomain: string; + + /** + * The storefront access token with `write_cart_wallet_payments` scope + */ + storefrontAccessToken: string; + + /** + * Customer information for personalized checkout + * + * @todo v4: Change to union type to match Swift SDK: + * `{ accessToken: string } | { email: string; phoneNumber: string }` + * This will enforce mutually exclusive customer identification patterns. + */ + customer?: { + email?: string; + phoneNumber?: string; + accessToken?: string; + }; + /** + * Enable and configure accelerated checkout wallets. + */ + wallets?: { + /** + * Apple Pay specific configuration. + * When provided, Apple Pay buttons can render and the Apple Pay sheet will + * request the specified buyer contact fields. + */ + applePay?: { + /** + * Buyer contact fields to request in the Apple Pay sheet. + * Supported values: + * - 'email': request the buyer's email address + * - 'phone': request the buyer's phone number + */ + contactFields: ApplePayContactField[]; + /** + * The Apple Merchant Identifier used to sign Apple Pay payment requests on iOS. + * Example: 'merchant.com.yourcompany' + */ + merchantIdentifier: string; + /** + * Restrict the countries available for shipping during the Apple Pay flow. + * Expects ISO 3166-1 alpha-2 country codes (e.g., "US", "CA", "GB"). + * @default null (all countries supported, as per Shop configuration) + */ + supportedShippingCountries?: string[]; + }; + }; +} + +function addEventListener( + event: 'close', + callback: () => void, +): Maybe; + +function addEventListener( + event: 'completed', + callback: CheckoutCompletedEventCallback, +): Maybe; + +function addEventListener( + event: 'error', + callback: CheckoutExceptionCallback, +): Maybe; + +function addEventListener( + event: 'pixel', + callback: PixelEventCallback, +): Maybe; + +function addEventListener( + event: 'geolocationRequest', + callback: GeolocationRequestEventCallback, +): Maybe; + +function removeEventListeners(event: CheckoutEvent): void; + +export type AddEventListener = typeof addEventListener; +export type RemoveEventListeners = typeof removeEventListeners; + +export interface ShopifyCheckoutSheetKit { + /** + * The version number of the Shopify Checkout SDK. + */ + readonly version: string; + /** + * Preload the checkout for faster presentation. + */ + preload(checkoutURL: string): void; + + /** + * Invalidate preload cache. + */ + invalidate(): void; + /** + * Present the checkout. + */ + present(checkoutURL: string): void; + /** + * Configure the checkout. See README.md for more details. + */ + setConfig(config: Configuration): void; + /** + * Return the current config for the checkout. See README.md for more details. + */ + getConfig(): Promise; + /** + * Listen for checkout events + */ + addEventListener: AddEventListener; + /** + * Remove subscriptions to checkout events. + */ + removeEventListeners: RemoveEventListeners; + /** + * Cleans up any event callbacks to prevent memory leaks. + */ + teardown(): void; + + /** + * Configure AcceleratedCheckouts for Shop Pay and Apple Pay buttons + */ + configureAcceleratedCheckouts( + config: AcceleratedCheckoutConfiguration, + ): Promise; + + /** + * Check if accelerated checkout is available for the given cart or product + */ + isAcceleratedCheckoutAvailable(): Promise; +} diff --git a/react-native/modules/@shopify/checkout-sheet-kit/src/index.ts b/react-native/modules/@shopify/checkout-sheet-kit/src/index.ts new file mode 100644 index 00000000..5e5bc8f1 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/src/index.ts @@ -0,0 +1,547 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +import {NativeEventEmitter, PermissionsAndroid, Platform} from 'react-native'; +import type { + EmitterSubscription, + EventSubscription, + PermissionStatus, +} from 'react-native'; +import RNShopifyCheckoutSheetKit from './specs/NativeShopifyCheckoutSheetKit'; +import {ShopifyCheckoutSheetProvider, useShopifyCheckoutSheet} from './context'; +import {ApplePayContactField, ColorScheme, LogLevel} from './index.d'; +import type { + AcceleratedCheckoutConfiguration, + CheckoutEvent, + CheckoutEventCallback, + Configuration, + Features, + GeolocationRequestEvent, + Maybe, + ShopifyCheckoutSheetKit, +} from './index.d'; +import {AcceleratedCheckoutWallet} from './index.d'; +import type {CheckoutException, CheckoutNativeError} from './errors.d'; +import { + CheckoutExpiredError, + CheckoutClientError, + CheckoutHTTPError, + ConfigurationError, + InternalError, + CheckoutNativeErrorType, + GenericError, +} from './errors.d'; +import {CheckoutErrorCode} from './errors.d'; +import type {CheckoutCompletedEvent} from './events.d'; +import type {CustomEvent, PixelEvent, StandardEvent} from './pixels.d'; +import {ApplePayLabel, ApplePayStyle} from './components/AcceleratedCheckoutButtons'; +import type { + AcceleratedCheckoutButtonsProps, + RenderStateChangeEvent, +} from './components/AcceleratedCheckoutButtons'; + +const defaultFeatures: Features = { + handleGeolocationRequests: true, +}; + +class ShopifyCheckoutSheet implements ShopifyCheckoutSheetKit { + private static eventEmitter: NativeEventEmitter = new NativeEventEmitter( + RNShopifyCheckoutSheetKit, + ); + + private features: Features; + private geolocationCallback: Maybe; + + private _acceleratedCheckoutsReady = false; + + get acceleratedCheckoutsReady(): boolean { + return this._acceleratedCheckoutsReady; + } + + /** + * Initializes a new ShopifyCheckoutSheet instance + * @param configuration Optional configuration settings for the checkout + * @param features Optional feature flags to customize behavior, defaults to defaultFeatures + */ + constructor( + configuration?: Configuration, + features: Partial = defaultFeatures, + ) { + this.features = {...defaultFeatures, ...features}; + + if (configuration != null) { + this.setConfig(configuration); + } + + if ( + Platform.OS === 'android' && + this.featureEnabled('handleGeolocationRequests') + ) { + this.subscribeToGeolocationRequestPrompts(); + } + } + + public readonly version: string = + RNShopifyCheckoutSheetKit.getConstants().version; + + /** + * Dismisses the currently displayed checkout sheet + */ + public dismiss(): void { + RNShopifyCheckoutSheetKit.dismiss(); + } + + /** + * Invalidates the checkout that was cached using preload + */ + public invalidate(): void { + RNShopifyCheckoutSheetKit.invalidateCache(); + } + + /** + * Preloads checkout for a given URL to improve performance + * @param checkoutUrl The URL of the checkout to preload + */ + public preload(checkoutUrl: string): void { + RNShopifyCheckoutSheetKit.preload(checkoutUrl); + } + + /** + * Presents the checkout sheet for a given checkout URL + * @param checkoutUrl The URL of the checkout to display + */ + public present(checkoutUrl: string): void { + RNShopifyCheckoutSheetKit.present(checkoutUrl); + } + + /** + * Retrieves the current checkout configuration + * @returns Promise containing the current Configuration + */ + public async getConfig(): Promise { + return RNShopifyCheckoutSheetKit.getConfig() as Promise; + } + + /** + * Updates the checkout configuration + * @param configuration New configuration settings to apply + */ + public async setConfig(configuration: Configuration): Promise { + if (configuration.acceleratedCheckouts) { + this._acceleratedCheckoutsReady = + await this.configureAcceleratedCheckouts( + configuration.acceleratedCheckouts, + ); + } + RNShopifyCheckoutSheetKit.setConfig(configuration); + } + + /** + * Adds an event listener for checkout events + * @param event The type of event to listen for + * @param callback Function to be called when the event occurs + * @returns An EmitterSubscription that can be used to remove the listener + */ + public addEventListener( + event: CheckoutEvent, + callback: CheckoutEventCallback, + ): EmitterSubscription | undefined { + let eventCallback; + + switch (event) { + case 'pixel': + eventCallback = this.interceptEventEmission( + 'pixel', + callback, + this.parseCustomPixelData, + ); + break; + case 'completed': + eventCallback = this.interceptEventEmission('completed', callback); + break; + case 'error': + eventCallback = this.interceptEventEmission( + 'error', + callback, + this.parseCheckoutError, + ); + break; + case 'geolocationRequest': + eventCallback = this.interceptEventEmission( + 'geolocationRequest', + callback, + ); + break; + default: + eventCallback = callback; + } + + // Default handler for all non-pixel events + return ShopifyCheckoutSheet.eventEmitter.addListener(event, eventCallback); + } + + /** + * Removes all event listeners for a specific event type + * @param event The type of event to remove listeners for + */ + public removeEventListeners(event: CheckoutEvent) { + ShopifyCheckoutSheet.eventEmitter.removeAllListeners(event); + } + + /** + * Cleans up resources and event listeners used by the checkout sheet + */ + public teardown() { + this.geolocationCallback?.remove(); + } + + /** + * Configure AcceleratedCheckouts for Shop Pay and Apple Pay buttons + * @param config Configuration for AcceleratedCheckouts + */ + public async configureAcceleratedCheckouts( + config: AcceleratedCheckoutConfiguration, + ): Promise { + if (!this.acceleratedCheckoutsSupported) { + return false; + } + + try { + this.validateAcceleratedCheckoutsConfiguration(config); + + const configured = + await RNShopifyCheckoutSheetKit.configureAcceleratedCheckouts( + config.storefrontDomain, + config.storefrontAccessToken, + config.customer?.email || null, + config.customer?.phoneNumber || null, + config.customer?.accessToken || null, + config.wallets?.applePay?.merchantIdentifier || null, + config.wallets?.applePay?.contactFields || [], + config.wallets?.applePay?.supportedShippingCountries || [], + ); + return configured; + } catch (error) { + // eslint-disable-next-line no-console + console.error( + '[ShopifyCheckoutSheetKit] Failed to configure accelerated checkouts with', + error, + ); + return false; + } + } + + /** + * Check if accelerated checkout is available for the given cart or product + * @param options Options containing either cartId or variantId/quantity + * @returns Promise indicating availability + */ + public async isAcceleratedCheckoutAvailable(): Promise { + if (!this.acceleratedCheckoutsSupported) { + return false; + } + + return RNShopifyCheckoutSheetKit.isAcceleratedCheckoutAvailable(); + } + + /** + * Initiates a geolocation request for Android devices + * Only needed if features.handleGeolocationRequests is false + */ + public async initiateGeolocationRequest(allow: boolean) { + if (Platform.OS === 'android') { + RNShopifyCheckoutSheetKit.initiateGeolocationRequest?.(allow); + } + } + + // --- private + + /** + * Accelerated Checkouts is only supported from iOS 16.0 onwards + */ + private get acceleratedCheckoutsSupported(): boolean { + return Platform.OS === 'ios' && this.majorVersion >= 16; + } + + private get majorVersion(): number { + return parseInt(String(Platform.Version), 10); + } + + private validateAcceleratedCheckoutsConfiguration( + acceleratedCheckouts: Configuration['acceleratedCheckouts'], + ) { + if (!acceleratedCheckouts) { + return; + } + + const {storefrontDomain, storefrontAccessToken, wallets} = + acceleratedCheckouts; + + /** + * Required Accelerated Checkouts configuration properties + */ + if (!storefrontDomain) { + throw new Error('`storefrontDomain` is required'); + } + if (!storefrontAccessToken) { + throw new Error('`storefrontAccessToken` is required'); + } + + /** + * Validate Apple Pay config if available + */ + if (wallets?.applePay) { + const {merchantIdentifier, contactFields, supportedShippingCountries} = + wallets.applePay; + + if (!merchantIdentifier) { + throw new Error('`wallets.applePay.merchantIdentifier` is required'); + } + + const expectedContactFields = Object.values(ApplePayContactField); + const hasInvalidContactFields = + Array.isArray(contactFields) && + contactFields.some( + value => + !expectedContactFields.includes( + value.toLowerCase() as ApplePayContactField, + ), + ); + + if (hasInvalidContactFields) { + throw new Error( + `'wallets.applePay.contactFields' contains unexpected values. Expected "${expectedContactFields.join(', ')}", received "${contactFields}"`, + ); + } + + if ( + Array.isArray(supportedShippingCountries) && + supportedShippingCountries?.some(country => typeof country !== 'string') + ) { + throw new Error( + `'wallets.applePay.supportedShippingCountries' contains unexpected values. Expects ISO 3166-1 alpha-2 country codes (e.g., "US", "CA", "GB").`, + ); + } + } + } + + /** + * Checks if a specific feature is enabled in the configuration + * @param feature The feature to check + * @returns boolean indicating if the feature is enabled + */ + private featureEnabled(feature: keyof Features) { + return this.features[feature] ?? true; + } + + /** + * Sets up geolocation request handling for Android devices + */ + private subscribeToGeolocationRequestPrompts() { + this.geolocationCallback = this.addEventListener( + 'geolocationRequest', + async () => { + const coarseOrFineGrainAccessGranted = await this.requestGeolocation(); + + this.initiateGeolocationRequest(coarseOrFineGrainAccessGranted); + }, + ); + } + + /** + * Requests geolocation permissions on Android + * @returns Promise indicating if permission was granted + */ + private async requestGeolocation(): Promise { + const coarse = 'android.permission.ACCESS_COARSE_LOCATION'; + const fine = 'android.permission.ACCESS_FINE_LOCATION'; + const results = await PermissionsAndroid.requestMultiple([coarse, fine]); + + return [results[coarse], results[fine]].some(this.permissionGranted); + } + + /** + * Checks if the given permission status indicates that permission was granted + * @param status The permission status to check + * @returns boolean indicating if the permission was granted + */ + private permissionGranted(status: PermissionStatus): boolean { + return status === 'granted'; + } + + /** + * Parses custom pixel event data from string to object if needed + * @param eventData The pixel event data to parse + * @returns Parsed PixelEvent object + */ + private parseCustomPixelData(eventData: PixelEvent): PixelEvent { + if ( + isCustomPixelEvent(eventData) && + eventData.hasOwnProperty('customData') && + typeof eventData.customData === 'string' + ) { + try { + return { + ...eventData, + customData: JSON.parse(eventData.customData), + }; + } catch { + return eventData; + } + } + + return eventData; + } + + /** + * Converts native checkout errors into appropriate error class instances + * @param exception The native error to parse + * @returns Appropriate CheckoutException instance + */ + private parseCheckoutError( + exception: CheckoutNativeError, + ): CheckoutException { + switch (exception?.__typename) { + case CheckoutNativeErrorType.InternalError: + return new InternalError(exception); + case CheckoutNativeErrorType.ConfigurationError: + return new ConfigurationError(exception); + case CheckoutNativeErrorType.CheckoutClientError: + return new CheckoutClientError(exception); + case CheckoutNativeErrorType.CheckoutHTTPError: + return new CheckoutHTTPError(exception); + case CheckoutNativeErrorType.CheckoutExpiredError: + return new CheckoutExpiredError(exception); + default: + return new GenericError(exception); + } + } + + /** + * Handles event emission parsing and transformation + * @param event The type of event being intercepted + * @param callback The callback to execute with the parsed data + * @param transformData Optional function to transform the event data + * @returns Function that handles the event emission + */ + private interceptEventEmission( + event: CheckoutEvent, + callback: CheckoutEventCallback, + transformData?: (data: any) => any, + ): (eventData: string | typeof callback) => void { + return (eventData: string | typeof callback): void => { + try { + if (typeof eventData === 'string') { + try { + let parsed = JSON.parse(eventData); + parsed = transformData?.(parsed) ?? parsed; + callback(parsed); + } catch (error) { + const parseError = new LifecycleEventParseError( + `Failed to parse "${event}" event data: Invalid JSON`, + { + cause: 'Invalid JSON', + }, + ); + // eslint-disable-next-line no-console + console.error(parseError, eventData); + } + } else if (eventData && typeof eventData === 'object') { + callback(transformData?.(eventData) ?? eventData); + } + } catch (error) { + const parseError = new LifecycleEventParseError( + `Failed to parse "${event}" event data`, + { + cause: 'Unknown', + }, + ); + // eslint-disable-next-line no-console + console.error(parseError); + } + }; + } +} + +function isCustomPixelEvent(event: PixelEvent): event is CustomEvent { + return event.type === 'CUSTOM'; +} + +export class LifecycleEventParseError extends Error { + constructor(message?: string, options?: ErrorOptions) { + super(message, options); + this.name = 'LifecycleEventParseError'; + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, LifecycleEventParseError); + } + } +} + +// API +export { + AcceleratedCheckoutWallet, + ApplePayContactField, + ApplePayLabel, + ApplePayStyle, + ColorScheme, + LogLevel, + ShopifyCheckoutSheet, + ShopifyCheckoutSheetProvider, + useShopifyCheckoutSheet, +}; + +// Error classes +export { + CheckoutClientError, + CheckoutErrorCode, + CheckoutExpiredError, + CheckoutHTTPError, + CheckoutNativeErrorType, + ConfigurationError, + GenericError, + InternalError, +}; + +// Types +export type { + AcceleratedCheckoutButtonsProps, + AcceleratedCheckoutConfiguration, + CheckoutCompletedEvent, + CheckoutEvent, + CheckoutEventCallback, + CheckoutException, + Configuration, + CustomEvent, + Features, + GeolocationRequestEvent, + PixelEvent, + RenderStateChangeEvent, + StandardEvent, +}; + +// Components +export { + AcceleratedCheckoutButtons, + RenderState, +} from './components/AcceleratedCheckoutButtons'; diff --git a/react-native/modules/@shopify/checkout-sheet-kit/src/pixels.d.ts b/react-native/modules/@shopify/checkout-sheet-kit/src/pixels.d.ts new file mode 100644 index 00000000..f60c24ca --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/src/pixels.d.ts @@ -0,0 +1,578 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +export type PixelEvent = CustomEvent | StandardEvent; + +/** + * A Standard Web Pixels event. + * + * See https://shopify.dev/docs/api/web-pixels-api/standard-events + */ +export interface StandardEvent { + /* A snapshot of various read-only properties of the browser at the time of the event */ + context?: Context; + /* Event data */ + data?: StandardEventData; + /* The ID of the event */ + id?: string; + /* The name of the event */ + name?: string; + /* A timestamp of when the event occurred (ISO_8601) */ + timestamp?: string; + /* Event type */ + type?: 'STANDARD'; +} + +export interface StandardEventData { + checkout?: Checkout; +} + +/** + * A Custom Web Pixels event. + * + * See https://shopify.dev/docs/api/web-pixels-api/emitting-data#publishing-custom-events + */ +export interface CustomEvent { + /* A snapshot of various read-only properties of the browser at the time of the event */ + context?: Context; + /** + * A free-form object representing data specific to a custom event provided by + * the custom event publisher. + */ + customData?: any; + /* The ID of the event */ + id?: string; + /* The name of the event */ + name?: string; + /* The timestamp of when the event occurred (ISO_8601) */ + timestamp?: string; + /* Event type */ + type?: 'CUSTOM'; +} + +interface Context { + /* Snapshot of a subset of properties of the `document` object in the top */ + /* frame of the browser */ + document?: WebPixelsDocument; + /* Snapshot of a subset of properties of the `navigator` object in the top */ + /* frame of the browser */ + navigator?: WebPixelsNavigator; + /* Snapshot of a subset of properties of the `window` object in the top frame */ + /* of the browser */ + window?: WebPixelsWindow; +} + +/** + * A snapshot of a subset of properties of the `document` object in the top frame of the browser. + * + * Per [MDN](https://developer.mozilla.org/en-US/docs/Web/API/Document) + * */ +interface WebPixelsDocument { + /* The character set being used by the document */ + characterSet?: string; + /* Returns the URI of the current document */ + location?: Location; + /* Returns the URI of the page that linked to this page */ + referrer?: string; + /* Returns the title of the current document */ + title?: string; +} + +/** + * The location, or current URL, of the window object. + * + * Per [MDN](https://developer.mozilla.org/en-US/docs/Web/API/Window) + */ +interface Location { + /* String containing a `'#'` followed by the fragment identifier of the URL */ + hash?: string; + /* String containing the host, that is the hostname, a `':'`, and the port of the URL */ + host?: string; + /* String containing the domain of the URL */ + hostname?: string; + /* String containing the entire URL */ + href?: string; + /* String containing the canonical form of the origin of the specific location */ + origin?: string; + /* String containing an initial `'/'` followed by the path of the URL, not including the query string or fragment */ + pathname?: string; + /* String containing the port number of the URL */ + port?: string; + /* String containing the protocol scheme of the URL, including the final `':'` */ + locationProtocol?: string; + /* String containing a `'?'` followed by the parameters or "querystring" of */ + /* the URL */ + search?: string; +} + +/** + * A snapshot of a subset of properties based on the `navigator` object + * in the top frame of the browser. + * + * Per [MDN](https://developer.mozilla.org/en-US/docs/Web/API/Navigator) + */ +interface WebPixelsNavigator { + /* Returns `false` if setting a cookie will be ignored and true otherwise */ + cookieEnabled?: boolean; + /* Returns a string representing the preferred language of the user, usually */ + /* the language of the browser UI. The `null` value is returned when this */ + /* is unknown */ + language?: string; + /* Returns an array of strings representing the languages known to the user, */ + /* by order of preference */ + languages?: string[]; + /* Returns the user agent string for the current browser */ + userAgent?: string; +} + +/** + * A snapshot of a subset of properties of the `window` object in the top frame of the browser. + * + * Per [MDN](https://developer.mozilla.org/en-US/docs/Web/API/Window) + */ +interface WebPixelsWindow { + /* The height of the content area of the browser window including, if */ + /* rendered, the horizontal scrollbar */ + innerHeight?: number; + /* The width of the content area of the browser window including, if rendered, */ + /* the vertical scrollbar */ + innerWidth?: number; + /* Location, or current URL, of the window object */ + location?: Location; + /* The global object's origin, serialized as a string */ + origin?: string; + /* The height of the outside of the browser window */ + outerHeight?: number; + /* The width of the outside of the browser window */ + outerWidth?: number; + /* Alias for window.scrollX */ + pageXOffset?: number; + /* Alias for window.scrollY */ + pageYOffset?: number; + /* Interface representing a screen, usually the one on which the current window is being rendered */ + screen?: Screen; + /* Horizontal distance from the left border of the user's browser viewport to */ + /* the left side of the screen */ + screenX?: number; + /* Vertical distance from the top border of the user's browser viewport to the */ + /* top side of the screen */ + screenY?: number; + /* Number of pixels that the document has already been scrolled horizontally */ + scrollX?: number; + /* Number of pixels that the document has already been scrolled vertically */ + scrollY?: number; +} + +/* Per [MDN](https://developer.mozilla.org/en-US/docs/Web/API/Screen), the */ +/* interface representing a screen, usually the one on which the current */ +/* window is being rendered */ +// +/* The interface representing a screen, usually the one on which the current */ +/* window is being rendered */ +interface Screen { + /* The height of the screen */ + height?: number; + /* The width of the screen */ + width?: number; +} + +/* A monetary value with currency allocated to the transaction method. */ +interface MoneyV2 { + /* A decimal money amount. */ + amount?: number; + /* Three-letter code that represents the currency, for example, USD. */ + /* Supported codes include standard ISO 4217 codes, legacy codes, and non- */ + /* standard codes. */ + currencyCode?: string; +} + +/* Information about the merchandise in the cart. */ +interface CartLine { + /* The cost of the merchandise that the customer will pay for at checkout. The */ + /* costs are subject to change and changes will be reflected at checkout. */ + cost?: CartLineCost; + /* The merchandise that the buyer intends to purchase. */ + merchandise?: ProductVariant; + /* The quantity of the merchandise that the customer intends to purchase. */ + quantity?: number; +} + +/* The cost of the merchandise line that the customer will pay at checkout. */ +interface CartLineCost { + /* The total cost of the merchandise line. */ + totalAmount?: MoneyV2; +} + +/** + * A product variant represents a different version of a product, such as + * differing sizes or differing colors. + * */ +interface ProductVariant { + /* A globally unique identifier. */ + id?: string; + /* Image associated with the product variant. This field falls back to the */ + /* product image if no image is available. */ + image?: Image; + /* The product variant’s price. */ + price?: MoneyV2; + /* The product object that the product variant belongs to. */ + product?: Product; + /* The SKU (stock keeping unit) associated with the variant. */ + sku?: string; + /* The product variant’s title. */ + title?: string; + /* The product variant’s untranslated title. */ + untranslatedTitle?: string; +} + +/* An image resource. */ +interface Image { + /* The location of the image as a URL. */ + src?: string; +} + +/* The product object that the product variant belongs to. */ +interface Product { + /* The ID of the product. */ + id?: string; + /* The product’s title. */ + title?: string; + /* The [product type](https://help.shopify.com/en/manual/products/details/product-type) */ + type?: string; + /* The product’s untranslated title. */ + untranslatedTitle?: string; + /* The relative URL of the product. */ + url?: string; + /* The product’s vendor name. */ + vendor?: string; +} + +/* A container for all the information required to add items to checkout and pay. */ +interface Checkout { + /* A list of attributes accumulated throughout the checkout process. */ + attributes?: Attribute[]; + /* The billing address to where the order will be charged. */ + billingAddress?: MailingAddress; + /* Indicates whether the customer has consented to be sent marketing material via email. */ + buyerAcceptsEmailMarketing?: boolean; + /*Indicates whether the customer has consented to be sent marketing material via SMS. */ + buyerAcceptsSmsMarketing?: boolean; + /** + * The three-letter code that represents the currency, for example, USD. + * Supported codes include standard ISO 4217 codes, legacy codes, and non- + * standard codes. + */ + currencyCode?: string; + /* Represents the selected delivery options for a checkout. */ + delivery?: Delivery; + /* A list of discount applications. */ + discountApplications?: DiscountApplication[]; + /* The total amount of the discounts applied to the price of the checkout. */ + discountsAmount?: MoneyV2; + /* The email attached to this checkout. */ + email?: string; + /* A list of line item objects, each one containing information about an item */ + /* in the checkout. */ + lineItems?: CheckoutLineItem[]; + /* Information about the active localized experience. */ + localization?: Localization; + /* The resulting order from a paid checkout. */ + order?: Order; + /* A unique phone number for the customer. Formatted using E.164 standard. For */ + /* example, *+16135551111*. */ + phone?: string; + /* The shipping address to where the line items will be shipped. */ + shippingAddress?: MailingAddress; + /* Once a shipping rate is selected by the customer it is transitioned to a */ + /* `shipping_line` object. */ + shippingLine?: ShippingRate; + /* The phone number provided by the buyer after opting in to SMS marketing. */ + smsMarketingPhone?: string; + /* The price at checkout before duties, shipping, and taxes. */ + subtotalPrice?: MoneyV2; + /* A unique identifier for a particular checkout. */ + token?: string; + /* The sum of all the prices of all the items in the checkout, including */ + /* duties, taxes, and discounts. */ + totalPrice?: MoneyV2; + /* The sum of all the taxes applied to the line items and shipping lines in */ + /* the checkout. */ + totalTax?: MoneyV2; + /* A list of transactions associated with a checkout or order. */ + transactions?: Transaction[]; +} + +/* Custom attributes left by the customer to the merchant, either in their cart */ +/* or during checkout. */ +interface Attribute { + /* The key for the attribute. */ + key?: string; + /* The value for the attribute. */ + value?: string; +} + +/* A single line item in the checkout, grouped by variant and attributes. */ +interface CheckoutLineItem { + /* The discounts that have been applied to the checkout line item by a */ + /* discount application. */ + discountAllocations?: DiscountAllocation[]; + /* The combined price of all of the items in the line item after line-level discounts have been applied. */ + finalLinePrice?: MoneyV2; + /* A globally unique identifier. */ + id?: string; + /** The properties of the line item. A shop may add, or enable customers to add custom information to a line item. + * Line item properties consist of a key and value pair. + */ + properties?: Property[]; + /* The quantity of the line item. */ + quantity?: number; + /* The title of the line item. Defaults to the product's title. */ + sellingPlanAllocation?: SellingPlanAllocation; + title?: string; + /* Product variant of the line item. */ + variant?: ProductVariant; +} + +interface Country { + /* The ISO-3166-1 code for this country, for example, "US". */ + isoCode?: string; +} + +interface Delivery { + selectedDeliveryOptions?: DeliveryOption[]; +} + +interface DeliveryOption { + /* The delivery option that the customer has selected. */ + cost?: MoneyV2; + /* The cost of the delivery option after discounts have been applied. */ + costAfterDiscounts?: MoneyV2; + /* The description of the delivery option. */ + description?: string; + /* The unique identifier of the delivery option. */ + handle?: string; + /* The title of the delivery option. */ + title?: string; + /* he type of delivery option, e.g. pickup, pickupPoint, shipping, local. */ + type?: string; +} + +/* The discount that has been applied to the checkout line item. */ +interface DiscountAllocation { + /* The monetary value with currency allocated to the discount. */ + amount?: MoneyV2; + /* The information about the intent of the discount. */ + discountApplication?: DiscountApplication; +} + +/* The information about the intent of the discount. */ +interface DiscountApplication { + /* The method by which the discount's value is applied to its entitled items. */ + // + /* - `ACROSS`: The value is spread across all entitled lines. */ + /* - `EACH`: The value is applied onto every entitled line. */ + allocationMethod?: string; + /* How the discount amount is distributed on the discounted lines. */ + // + /* - `ALL`: The discount is allocated onto all the lines. */ + /* - `ENTITLED`: The discount is allocated onto only the lines that it's */ + /* entitled for. */ + /* - `EXPLICIT`: The discount is allocated onto explicitly chosen lines. */ + targetSelection?: string; + /* The type of line (i.e. line item or shipping line) on an order that the */ + /* discount is applicable towards. */ + // + /* - `LINE_ITEM`: The discount applies onto line items. */ + /* - `SHIPPING_LINE`: The discount applies onto shipping lines. */ + targetType?: string; + /* The customer-facing name of the discount. If the type of discount is */ + /* a `DISCOUNT_CODE`, this `title` attribute represents the code of the */ + /* discount. */ + title?: string; + /* The type of the discount. */ + // + /* - `AUTOMATIC`: A discount automatically at checkout or in the cart without */ + /* the need for a code. */ + /* - `DISCOUNT_CODE`: A discount applied onto checkouts through the use of */ + /* a code. */ + /* - `MANUAL`: A discount that is applied to an order by a merchant or store */ + /* owner manually, rather than being automatically applied by the system or */ + /* through a script. */ + /* - `SCRIPT`: A discount applied to a customer's order using a script */ + type?: string; + /* The value of the discount. Fixed discounts return a `Money` Object, while */ + /* Percentage discounts return a `PricingPercentageValue` object. */ + value?: Value; +} + +interface Language { + /* The BCP-47 language tag. It may contain a dash followed by an ISO 3166-1 alpha-2 region code, for example, "en-US". */ + isoCode?: string; +} + +interface Localization { + /* The country of the active localized experience. */ + country?: Country; + /* The language of the active localized experience. */ + language?: Language; + /* The market including the country of the active localized experience. */ + market?: Market; +} + +/* A mailing address for customers and shipping. */ +interface MailingAddress { + /* The first line of the address. This is usually the street address or a P.O. */ + /* Box number. */ + address1?: string; + /* The second line of the address. This is usually an apartment, suite, or */ + /* unit number. */ + address2?: string; + /* The name of the city, district, village, or town. */ + city?: string; + /* The name of the country. */ + country?: string; + /* The two-letter code that represents the country, for example, US. */ + /* The country codes generally follows ISO 3166-1 alpha-2 guidelines. */ + countryCode?: string; + /* The customer’s first name. */ + firstName?: string; + /* The customer’s last name. */ + lastName?: string; + /* The phone number for this mailing address as entered by the customer. */ + phone?: string; + /* The region of the address, such as the province, state, or district. */ + province?: string; + /* The two-letter code for the region. */ + /* For example, ON. */ + provinceCode?: string; + /* The ZIP or postal code of the address. */ + zip?: string; +} + +interface Market { + /* A human-readable, shop-scoped identifier. */ + handle?: string; + /* A globally unique identifier. */ + id?: string; +} + +/** + * An order is a customer’s completed request to purchase one or more products + * from a shop. An order is created when a customer completes the checkout + * process. + */ +interface Order { + /* The ID of the order. */ + id?: string; + /* The customer that placed the order. */ + customer?: OrderCustomer; +} + +interface OrderCustomer { + /* The ID of the customer. */ + id?: string; + /* Indicates whether the customer is a first-time buyer. */ + isFirstOrder?: boolean; +} + +/** + * A value given to a customer when a discount is applied to an order. The + * application of a discount with this value gives the customer the specified + * percentage off a specified item. + */ +interface PricingPercentageValue { + /* The percentage value of the object. */ + percentage?: number; +} + +interface Property { + /* The key for the property. */ + key?: string; + /* The value for the property. */ + value?: string; +} + +interface SellingPlan { + /* A globally unique identifier. */ + id?: string; + /* The name of the selling plan. For example, '6 weeks of prepaid granola, delivered weekly'. */ + name?: string; +} + +interface SellingPlanAllocation { + /** + * A representation of how products and variants can be sold and purchased. For example, an individual selling plan could be + * '6 weeks of prepaid granola, delivered weekly'. + */ + sellingPlan?: SellingPlan; +} + +/* A shipping rate to be applied to a checkout. */ +interface ShippingRate { + /* Price of this shipping rate. */ + price?: MoneyV2; +} + +/* A transaction associated with a checkout or order. */ +interface Transaction { + /* The monetary value with currency allocated to the transaction method. */ + amount?: MoneyV2; + /* The name of the payment provider used for the transaction. */ + gateway?: string; + /* The payment method used for the transaction. */ + paymentMethod?: TransactionPaymentMethod; +} + +interface TransactionPaymentMethod { + /* The name of the payment method used for the transaction. This may further specify the payment method used. */ + name?: string; + /** + * The type of payment method used for the transaction. + * + * - creditCard: A vaulted or manually entered credit card. + * - redeemable: A redeemable payment method, such as a gift card or store credit. + * - deferred: A deferred payment, such as invoicing the buyer and collecting payment later. + * - local: A local payment method specific to the current region or market. + * - manualPayment: A manual payment method, such as an in-person retail transaction. + * - paymentOnDelivery: A payment that will be collected on delivery. + * - wallet: An integrated wallet, such as PayPal, Google Pay, Apple Pay, etc. + * - offsite: A payment processed outside of Shopify's checkout, excluding integrated wallets. + * - customOnSite: A custom payment method that is processed through a checkout extension with a payments app. + * - other: Another type of payment not defined here. + */ + type?: string; +} + +/* A value given to a customer when a discount is applied to an order. The */ +/* application of a discount with this value gives the customer the specified */ +/* percentage off a specified item. */ +interface Value { + /* The decimal money amount. */ + amount?: number; + /* The three-letter code that represents the currency, for example, USD. */ + /* Supported codes include standard ISO 4217 codes, legacy codes, and non- */ + /* standard codes. */ + currencyCode?: string; + /* The percentage value of the object. */ + percentage?: number; +} diff --git a/react-native/modules/@shopify/checkout-sheet-kit/src/specs/NativeShopifyCheckoutSheetKit.ts b/react-native/modules/@shopify/checkout-sheet-kit/src/specs/NativeShopifyCheckoutSheetKit.ts new file mode 100644 index 00000000..89855ea5 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/src/specs/NativeShopifyCheckoutSheetKit.ts @@ -0,0 +1,101 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +import type {TurboModule} from 'react-native'; +import {TurboModuleRegistry} from 'react-native'; + +type IosColorsSpec = { + tintColor?: string; + backgroundColor?: string; + closeButtonColor?: string; +}; + +type AndroidColorsBaseSpec = { + progressIndicator?: string; + backgroundColor?: string; + headerBackgroundColor?: string; + headerTextColor?: string; + closeButtonColor?: string; +}; + +type AndroidColorsSpec = { + progressIndicator?: string; + backgroundColor?: string; + headerBackgroundColor?: string; + headerTextColor?: string; + closeButtonColor?: string; + light?: AndroidColorsBaseSpec; + dark?: AndroidColorsBaseSpec; +}; + +type ColorsSpec = { + ios?: IosColorsSpec; + android?: AndroidColorsSpec; +}; + +type ConfigurationSpec = { + preloading?: boolean; + title?: string; + colorScheme?: string; + logLevel?: string; + colors?: ColorsSpec; +}; + +type ConfigurationResultSpec = { + preloading: boolean; + colorScheme: string; + logLevel: string; + title?: string; + tintColor?: string; + backgroundColor?: string; + closeButtonColor?: string; +}; + +export interface Spec extends TurboModule { + present(checkoutUrl: string): void; + preload(checkoutUrl: string): void; + dismiss(): void; + invalidateCache(): void; + setConfig(configuration: ConfigurationSpec): void; + getConfig(): Promise; + configureAcceleratedCheckouts( + storefrontDomain: string, + storefrontAccessToken: string, + customerEmail: string | null, + customerPhoneNumber: string | null, + customerAccessToken: string | null, + applePayMerchantIdentifier: string | null, + applyPayContactFields: string[], + supportedShippingCountries: string[], + ): Promise; + isAcceleratedCheckoutAvailable(): Promise; + isApplePayAvailable(): Promise; + initiateGeolocationRequest(allow: boolean): void; + addListener(eventName: string): void; + removeListeners(count: number): void; + getConstants(): {version: string}; +} + +export default TurboModuleRegistry.getEnforcing( + 'ShopifyCheckoutSheetKit', +); diff --git a/react-native/modules/@shopify/checkout-sheet-kit/src/specs/RCTAcceleratedCheckoutButtonsNativeComponent.ts b/react-native/modules/@shopify/checkout-sheet-kit/src/specs/RCTAcceleratedCheckoutButtonsNativeComponent.ts new file mode 100644 index 00000000..9af49d0d --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/src/specs/RCTAcceleratedCheckoutButtonsNativeComponent.ts @@ -0,0 +1,81 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +import {codegenNativeComponent, type ViewProps} from 'react-native'; +import type { + BubblingEventHandler, + DirectEventHandler, + Double, + Float, + // eslint-disable-next-line @react-native/no-deep-imports -- codegen parser requires these type names to be imported directly (not via aliases) so it can match them statically during AST traversal +} from 'react-native/Libraries/Types/CodegenTypes'; + +type FailEvent = Readonly<{ + __typename: string; + message: string; + code?: string; + recoverable?: boolean; +}>; + +type CompleteEvent = Readonly<{ + orderDetails: Readonly<{ + id: string; + email?: string; + phone?: string; + }>; +}>; + +type RenderStateChangeEvent = Readonly<{ + state: string; + reason?: string; +}>; + +type ClickLinkEvent = Readonly<{url: string}>; +type SizeChangeEvent = Readonly<{height: Double}>; + +type CheckoutIdentifierSpec = Readonly<{ + cartId?: string; + variantId?: string; + quantity?: Double; +}>; + +interface NativeProps extends ViewProps { + checkoutIdentifier: CheckoutIdentifierSpec; + cornerRadius?: Float; + wallets?: ReadonlyArray; + applePayLabel?: string; + onFail?: BubblingEventHandler; + onComplete?: BubblingEventHandler; + onCancel?: BubblingEventHandler; + onRenderStateChange?: BubblingEventHandler; + onWebPixelEvent?: BubblingEventHandler>; + onClickLink?: BubblingEventHandler; + onSizeChange?: DirectEventHandler; + onShouldRecoverFromError?: DirectEventHandler< + Readonly<{recoverable: boolean}> + >; +} + +export default codegenNativeComponent( + 'RCTAcceleratedCheckoutButtons', +); diff --git a/react-native/modules/@shopify/checkout-sheet-kit/tests/AcceleratedCheckoutButtons.test.tsx b/react-native/modules/@shopify/checkout-sheet-kit/tests/AcceleratedCheckoutButtons.test.tsx new file mode 100644 index 00000000..862d7105 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/tests/AcceleratedCheckoutButtons.test.tsx @@ -0,0 +1,386 @@ +import React from 'react'; +import {render, act} from '@testing-library/react-native'; +import {Platform} from 'react-native'; +import { + AcceleratedCheckoutButtons, + AcceleratedCheckoutWallet, + RenderState, +} from '../src'; + +jest.mock('react-native'); + +const mockLog = jest.fn(); +// Silence console.error +const mockError = jest.fn(); + +beforeAll(() => { + global.console = { + ...global.console, + log: mockLog, + error: mockError, + }; +}); + +beforeEach(() => { + jest.clearAllMocks(); + Platform.OS = 'ios'; +}); + +describe('AcceleratedCheckoutButtons', () => { + describe('iOS Platform', () => { + beforeEach(() => { + Platform.OS = 'ios'; + // Default to iOS 16 for most tests + (Platform as any).Version = '16.0'; + }); + + describe('iOS Version Compatibility', () => { + it.each(['16.0', '17.0', '16.4.1'])('renders on iOS %s', version => { + (Platform as any).Version = version; + + const {getByTestId} = render( + , + ); + + expect(getByTestId('accelerated-checkout-buttons')).toBeTruthy(); + }); + + it.each(['15.5', '14.0', '15.0'])( + 'does not render on iOS %s', + version => { + (Platform as any).Version = version; + + const {queryByTestId} = render( + , + ); + + expect(queryByTestId('accelerated-checkout-buttons')).toBeNull(); + expect(mockLog).not.toHaveBeenCalled(); + expect(mockError).not.toHaveBeenCalled(); + }, + ); + }); + + it('renders without crashing with cartId', () => { + const {getByTestId} = render( + , + ); + + expect(getByTestId('accelerated-checkout-buttons')).toBeTruthy(); + }); + + it('renders without crashing with variant', () => { + const {getByTestId} = render( + , + ); + + expect(getByTestId('accelerated-checkout-buttons')).toBeTruthy(); + }); + + it('renders without crashing with variant and quantity', () => { + const {getByTestId} = render( + , + ); + + expect(getByTestId('accelerated-checkout-buttons')).toBeTruthy(); + }); + + it('passes through props to native component', () => { + const {getByTestId} = render( + , + ); + + const nativeComponent = getByTestId('accelerated-checkout-buttons'); + expect(nativeComponent).toBeTruthy(); + expect(nativeComponent.props.checkoutIdentifier).toEqual({ + cartId: 'gid://shopify/Cart/123', + }); + expect(nativeComponent.props.cornerRadius).toBe(12); + expect(nativeComponent.props.wallets).toEqual([ + AcceleratedCheckoutWallet.shopPay, + ]); + }); + + it.each([0, -1, -2, Number.NaN])( + 'throws when invalid variant quantity %p', + quantity => { + expect(() => { + render( + , + ); + }).toThrow( + 'AcceleratedCheckoutButton: Either `cartId` or `variantId` and `quantity` must be provided', + ); + }, + ); + + it('uses default values for cornerRadius', () => { + const {getByTestId} = render( + , + ); + + const nativeComponent = getByTestId('accelerated-checkout-buttons'); + expect(nativeComponent).toBeTruthy(); + expect(nativeComponent.props.cornerRadius).toBeUndefined(); + }); + + it('passes through custom quantity and cornerRadius', () => { + const {getByTestId} = render( + , + ); + + const nativeComponent = getByTestId('accelerated-checkout-buttons'); + expect(nativeComponent).toBeTruthy(); + expect(nativeComponent.props.cornerRadius).toBe(16); + }); + + it('supports custom wallet configuration', () => { + const customWallets = [ + AcceleratedCheckoutWallet.applePay, + AcceleratedCheckoutWallet.shopPay, + ]; + + const {getByTestId} = render( + , + ); + + const nativeComponent = getByTestId('accelerated-checkout-buttons'); + expect(nativeComponent).toBeTruthy(); + expect(nativeComponent.props.wallets).toEqual(customWallets); + }); + + it('forwards native fail event to onFail prop', () => { + const onFail = jest.fn(); + const {getByTestId} = render( + , + ); + + const nativeComponent = getByTestId('accelerated-checkout-buttons'); + const error = {message: 'boom'} as any; + nativeComponent.props.onFail({nativeEvent: error}); + expect(onFail).toHaveBeenCalledWith(error); + }); + + it('forwards native complete event to onComplete prop', () => { + const onComplete = jest.fn(); + const {getByTestId} = render( + , + ); + + const nativeComponent = getByTestId('accelerated-checkout-buttons'); + const details = {orderDetails: {id: '1'}} as any; + nativeComponent.props.onComplete({nativeEvent: details}); + expect(onComplete).toHaveBeenCalledWith(details); + }); + + it('calls onCancel when native cancel is invoked', () => { + const onCancel = jest.fn(); + const {getByTestId} = render( + , + ); + const nativeComponent = getByTestId('accelerated-checkout-buttons'); + nativeComponent.props.onCancel(); + expect(onCancel).toHaveBeenCalled(); + }); + + it('maps render state change to typed states including error reason', () => { + const onRenderStateChange = jest.fn(); + const {getByTestId} = render( + , + ); + const nativeComponent = getByTestId('accelerated-checkout-buttons'); + nativeComponent.props.onRenderStateChange({ + nativeEvent: {state: 'error', reason: 'bad'}, + }); + expect(onRenderStateChange).toHaveBeenCalledWith({ + state: RenderState.Error, + reason: 'bad', + }); + + nativeComponent.props.onRenderStateChange({ + nativeEvent: {state: 'rendered'}, + }); + expect(onRenderStateChange).toHaveBeenCalledWith({ + state: RenderState.Rendered, + }); + + nativeComponent.props.onRenderStateChange({ + nativeEvent: {state: 'loading'}, + }); + expect(onRenderStateChange).toHaveBeenCalledWith({ + state: RenderState.Loading, + }); + + nativeComponent.props.onRenderStateChange({ + nativeEvent: {state: 'unexpected'}, + }); + expect(onRenderStateChange).toHaveBeenCalledWith({ + state: RenderState.Error, + }); + }); + + it('forwards web pixel native events', () => { + const onWebPixelEvent = jest.fn(); + const {getByTestId} = render( + , + ); + const nativeComponent = getByTestId('accelerated-checkout-buttons'); + const pixel = {type: 'STANDARD'} as any; + nativeComponent.props.onWebPixelEvent({nativeEvent: pixel}); + expect(onWebPixelEvent).toHaveBeenCalledWith(pixel); + }); + + it('handles onClickLink when URL is present and ignores when absent', () => { + const onClickLink = jest.fn(); + const {getByTestId} = render( + , + ); + const nativeComponent = getByTestId('accelerated-checkout-buttons'); + nativeComponent.props.onClickLink({ + nativeEvent: {url: 'https://checkout.shopify.com'}, + }); + expect(onClickLink).toHaveBeenCalledWith('https://checkout.shopify.com'); + + onClickLink.mockClear(); + nativeComponent.props.onClickLink({nativeEvent: {}}); + expect(onClickLink).not.toHaveBeenCalled(); + }); + + it('applies dynamic height when onSizeChange is emitted', async () => { + const {getByTestId} = render( + , + ); + let nativeComponent = getByTestId('accelerated-checkout-buttons'); + await act(async () => { + nativeComponent.props.onSizeChange({nativeEvent: {height: 42}}); + }); + nativeComponent = getByTestId('accelerated-checkout-buttons'); + expect(nativeComponent.props.style).toEqual({ + flex: 1, + height: 42, + }); + }); + + it('warns and returns null when missing identifiers in production', () => { + const originalDev = (global as any).__DEV__; + (global as any).__DEV__ = false; + (Platform as any).Version = '16.0'; + const warn = jest.spyOn(global.console, 'warn').mockImplementation(); + + const {queryByTestId} = render( + // invalid: no cartId and invalid variant path + , + ); + expect(queryByTestId('accelerated-checkout-buttons')).toBeNull(); + expect(warn).toHaveBeenCalledWith( + 'AcceleratedCheckoutButton: Either `cartId` or `variantId` and `quantity` must be provided', + ); + + warn.mockRestore(); + (global as any).__DEV__ = originalDev; + }); + + it('handles callbacks without throwing', () => { + const mockCallbacks = { + onFail: jest.fn(), + onComplete: jest.fn(), + onCancel: jest.fn(), + onRenderStateChange: jest.fn(), + onWebPixelEvent: jest.fn(), + onClickLink: jest.fn(), + }; + + expect(() => { + render( + , + ); + }).not.toThrow(); + }); + }); + + describe('Android Platform', () => { + beforeEach(() => { + Platform.OS = 'android'; + }); + + it('returns null on Android', () => { + const {queryByTestId} = render( + , + ); + + expect(queryByTestId('accelerated-checkout-buttons')).toBeNull(); + }); + + it('does not warn on Android even without required props', () => { + render(); + + expect(mockLog).not.toHaveBeenCalled(); + }); + }); + + describe('RenderState enum', () => { + it('exports correct render states', () => { + expect(RenderState.Loading).toBe('loading'); + expect(RenderState.Rendered).toBe('rendered'); + expect(RenderState.Error).toBe('error'); + }); + + it('logs unexpected render states', async () => { + const {getByTestId} = render( + , + ); + const nativeComponent = getByTestId('accelerated-checkout-buttons'); + nativeComponent.props.onRenderStateChange({ + nativeEvent: {state: 'unexpected'}, + }); + + expect(mockError).toHaveBeenCalledWith( + '[ShopifyAcceleratedCheckouts] Invalid render state: unexpected', + ); + }); + }); +}); diff --git a/react-native/modules/@shopify/checkout-sheet-kit/tests/context.test.tsx b/react-native/modules/@shopify/checkout-sheet-kit/tests/context.test.tsx new file mode 100644 index 00000000..6af74682 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/tests/context.test.tsx @@ -0,0 +1,404 @@ +import React from 'react'; +import {render, act} from '@testing-library/react-native'; +import {NativeModules, Platform} from 'react-native'; +import { + ShopifyCheckoutSheetProvider, + useShopifyCheckoutSheet, +} from '../src/context'; +import {ApplePayContactField, ColorScheme, type Configuration} from '../src'; + +const checkoutUrl = 'https://shopify.com/checkout'; +const config: Configuration = { + colorScheme: ColorScheme.automatic, +}; + +jest.mock('react-native'); + +const HookTestComponent = ({ + onHookValue, +}: { + onHookValue: (value: any) => void; +}) => { + const hookValue = useShopifyCheckoutSheet(); + onHookValue(hookValue); + return null; +}; + +const MockChild = () => null; + +describe('ShopifyCheckoutSheetProvider', () => { + const TestComponent = ({children}: {children: React.ReactNode}) => ( + + {children} + + ); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('renders without crashing', () => { + const component = render( + + + , + ); + + expect(component).toBeTruthy(); + }); + + it('creates ShopifyCheckoutSheet instance with configuration', () => { + render( + + + , + ); + + expect( + NativeModules.ShopifyCheckoutSheetKit.setConfig, + ).toHaveBeenCalledWith(config); + }); + + it('skips configuration when no configuration is provided', () => { + render( + + + , + ); + + expect( + NativeModules.ShopifyCheckoutSheetKit.setConfig, + ).not.toHaveBeenCalled(); + expect( + NativeModules.ShopifyCheckoutSheetKit.configureAcceleratedCheckouts, + ).not.toHaveBeenCalled(); + }); + + it('configures accelerated checkouts when provided', async () => { + (Platform as any).Version = '17.0'; + ( + NativeModules.ShopifyCheckoutSheetKit + .configureAcceleratedCheckouts as unknown as {mockResolvedValue: any} + ).mockResolvedValue(true); + + const configWithAccelerated: Configuration = { + ...config, + acceleratedCheckouts: { + storefrontDomain: 'test-shop.myshopify.com', + storefrontAccessToken: 'shpat_test_token', + customer: { + email: 'test@example.com', + phoneNumber: '+123', + accessToken: 'customer-access-token', + }, + wallets: { + applePay: { + merchantIdentifier: 'merchant.test', + contactFields: [ApplePayContactField.email], + }, + }, + }, + }; + + render( + + + , + ); + + await act(async () => { + await Promise.resolve(); + }); + + expect( + NativeModules.ShopifyCheckoutSheetKit.configureAcceleratedCheckouts, + ).toHaveBeenCalledWith( + 'test-shop.myshopify.com', + 'shpat_test_token', + 'test@example.com', + '+123', + 'customer-access-token', + 'merchant.test', + ['email'], + [], + ); + }); + + it('reuses the same instance across re-renders', () => { + const {rerender} = render( + + + , + ); + + rerender( + + + , + ); + + expect( + NativeModules.ShopifyCheckoutSheetKit.setConfig.mock.calls, + ).toHaveLength(2); + }); +}); + +describe('useShopifyCheckoutSheet', () => { + const Wrapper = ({children}: {children: React.ReactNode}) => ( + + {children} + + ); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('provides addEventListener function', () => { + let hookValue: any; + const onHookValue = (value: any) => { + hookValue = value; + }; + + render( + + + , + ); + + expect(hookValue.addEventListener).toBeDefined(); + expect(typeof hookValue.addEventListener).toBe('function'); + }); + + it('provides removeEventListeners function', () => { + let hookValue: any; + const onHookValue = (value: any) => { + hookValue = value; + }; + + render( + + + , + ); + + act(() => { + hookValue.removeEventListeners('close'); + }); + + expect(hookValue.removeEventListeners).toBeDefined(); + }); + + it('provides present function and calls it with checkoutUrl', () => { + let hookValue: any; + const onHookValue = (value: any) => { + hookValue = value; + }; + + render( + + + , + ); + + act(() => { + hookValue.present(checkoutUrl); + }); + + expect(NativeModules.ShopifyCheckoutSheetKit.present).toHaveBeenCalledWith( + checkoutUrl, + ); + }); + + it('does not call present with empty checkoutUrl', () => { + let hookValue: any; + const onHookValue = (value: any) => { + hookValue = value; + }; + + render( + + + , + ); + + act(() => { + hookValue.present(''); + }); + + expect( + NativeModules.ShopifyCheckoutSheetKit.present, + ).not.toHaveBeenCalled(); + }); + + it('provides preload function and calls it with checkoutUrl', () => { + let hookValue: any; + const onHookValue = (value: any) => { + hookValue = value; + }; + + render( + + + , + ); + + act(() => { + hookValue.preload(checkoutUrl); + }); + + expect(NativeModules.ShopifyCheckoutSheetKit.preload).toHaveBeenCalledWith( + checkoutUrl, + ); + }); + + it('does not call preload with empty checkoutUrl', () => { + let hookValue: any; + const onHookValue = (value: any) => { + hookValue = value; + }; + + render( + + + , + ); + + act(() => { + hookValue.preload(''); + }); + + expect( + NativeModules.ShopifyCheckoutSheetKit.preload, + ).not.toHaveBeenCalled(); + }); + + it('provides invalidate function', () => { + let hookValue: any; + const onHookValue = (value: any) => { + hookValue = value; + }; + + render( + + + , + ); + + act(() => { + hookValue.invalidate(); + }); + + expect( + NativeModules.ShopifyCheckoutSheetKit.invalidateCache, + ).toHaveBeenCalled(); + }); + + it('provides dismiss function', () => { + let hookValue: any; + const onHookValue = (value: any) => { + hookValue = value; + }; + + render( + + + , + ); + + act(() => { + hookValue.dismiss(); + }); + + expect(NativeModules.ShopifyCheckoutSheetKit.dismiss).toHaveBeenCalled(); + }); + + it('provides setConfig function', () => { + let hookValue: any; + const onHookValue = (value: any) => { + hookValue = value; + }; + + const newConfig = {colorScheme: ColorScheme.light}; + + render( + + + , + ); + + act(() => { + hookValue.setConfig(newConfig); + }); + + expect( + NativeModules.ShopifyCheckoutSheetKit.setConfig, + ).toHaveBeenCalledWith(newConfig); + }); + + it('provides getConfig function', async () => { + let hookValue: any; + const onHookValue = (value: any) => { + hookValue = value; + }; + + render( + + + , + ); + + await act(async () => { + const config = await hookValue.getConfig(); + expect(config).toEqual({preloading: true}); + }); + + expect(NativeModules.ShopifyCheckoutSheetKit.getConfig).toHaveBeenCalled(); + }); + + it('provides version from the instance', () => { + let hookValue: any; + const onHookValue = (value: any) => { + hookValue = value; + }; + + render( + + + , + ); + + expect(hookValue.version).toBe('0.7.0'); + }); + + it('addEventListener returns subscription object', () => { + let hookValue: any; + const onHookValue = (value: any) => { + hookValue = value; + }; + + render( + + + , + ); + + const subscription = hookValue.addEventListener('close', jest.fn()); + expect(subscription).toBeDefined(); + expect(subscription.remove).toBeDefined(); + }); +}); + +describe('ShopifyCheckoutSheetContext without provider', () => { + it('throws error when hook is used without provider', () => { + const errorSpy = jest.spyOn(console, 'error').mockImplementation(); + + expect(() => { + render( {}} />); + }).toThrow( + 'useShopifyCheckoutSheet must be used from within a ShopifyCheckoutSheetContext', + ); + + errorSpy.mockRestore(); + }); +}); diff --git a/react-native/modules/@shopify/checkout-sheet-kit/tests/index.test.ts b/react-native/modules/@shopify/checkout-sheet-kit/tests/index.test.ts new file mode 100644 index 00000000..da69755e --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/tests/index.test.ts @@ -0,0 +1,1001 @@ +/* eslint-disable no-new */ +/* eslint-disable no-console */ + +import { + LifecycleEventParseError, + ShopifyCheckoutSheet, + CheckoutErrorCode, + InternalError, + ConfigurationError, + CheckoutHTTPError, + CheckoutClientError, + CheckoutExpiredError, + GenericError, + AcceleratedCheckoutWallet, + RenderState, + LogLevel, + ColorScheme, + CheckoutNativeErrorType, + type Configuration, + type AcceleratedCheckoutConfiguration, +} from '../src'; +import type {ApplePayContactField} from '../src/index.d'; +import {TurboModuleRegistry, PermissionsAndroid, Platform} from 'react-native'; + +const NativeModule = TurboModuleRegistry.getEnforcing( + 'ShopifyCheckoutSheetKit', +) as any; + +const checkoutUrl = 'https://shopify.com/checkout'; +const config: Configuration = { + colorScheme: ColorScheme.automatic, +}; + +jest.mock('react-native'); + +global.console = { + ...global.console, + error: jest.fn(), + warn: jest.fn(), +}; + +describe('Exports', () => { + describe('AcceleratedCheckoutWallet enum', () => { + it('exports correct wallet types', () => { + expect(AcceleratedCheckoutWallet.shopPay).toBe('shopPay'); + expect(AcceleratedCheckoutWallet.applePay).toBe('applePay'); + }); + }); + + describe('RenderState enum', () => { + it('exports correct render states', () => { + expect(RenderState.Loading).toBe('loading'); + expect(RenderState.Rendered).toBe('rendered'); + expect(RenderState.Error).toBe('error'); + }); + }); + + describe('LogLevel enum', () => { + it('exports correct log levels', () => { + expect(LogLevel.debug).toBe('debug'); + expect(LogLevel.error).toBe('error'); + }); + }); +}); + +describe('ShopifyCheckoutSheetKit', () => { + // @ts-expect-error "eventEmitter is private" + const eventEmitter = ShopifyCheckoutSheet.eventEmitter; + + afterEach(() => { + NativeModule.setConfig.mockReset(); + jest.clearAllMocks(); + }); + + describe('instantiation', () => { + it('calls `setConfig` with the specified config on instantiation', () => { + new ShopifyCheckoutSheet(config); + expect( + NativeModule.setConfig, + ).toHaveBeenCalledWith(config); + }); + + it('does not call `setConfig` if no config was specified on instantiation', () => { + new ShopifyCheckoutSheet(); + expect( + NativeModule.setConfig, + ).not.toHaveBeenCalled(); + }); + }); + + describe('setConfig', () => { + it('calls the `setConfig` on the Native Module', () => { + const instance = new ShopifyCheckoutSheet(); + instance.setConfig(config); + expect( + NativeModule.setConfig, + ).toHaveBeenCalledTimes(1); + expect( + NativeModule.setConfig, + ).toHaveBeenCalledWith(config); + }); + + it('calls `setConfig` with logLevel configuration', () => { + const instance = new ShopifyCheckoutSheet(); + const configWithLogLevel: Configuration = { + colorScheme: ColorScheme.automatic, + logLevel: LogLevel.debug, + }; + instance.setConfig(configWithLogLevel); + expect( + NativeModule.setConfig, + ).toHaveBeenCalledWith(configWithLogLevel); + }); + }); + + describe('preload', () => { + it('calls `preload` with a checkout URL', () => { + const instance = new ShopifyCheckoutSheet(); + instance.preload(checkoutUrl); + expect( + NativeModule.preload, + ).toHaveBeenCalledTimes(1); + expect( + NativeModule.preload, + ).toHaveBeenCalledWith(checkoutUrl); + }); + }); + + describe('invalidate', () => { + it('calls `invalidateCache`', () => { + const instance = new ShopifyCheckoutSheet(); + instance.invalidate(); + expect( + NativeModule.invalidateCache, + ).toHaveBeenCalledTimes(1); + }); + }); + + describe('present', () => { + it('calls `present` with a checkout URL', () => { + const instance = new ShopifyCheckoutSheet(); + instance.present(checkoutUrl); + expect( + NativeModule.present, + ).toHaveBeenCalledTimes(1); + expect( + NativeModule.present, + ).toHaveBeenCalledWith(checkoutUrl); + }); + }); + + describe('dismiss', () => { + it('calls `dismiss`', () => { + const instance = new ShopifyCheckoutSheet(); + instance.dismiss(); + expect( + NativeModule.dismiss, + ).toHaveBeenCalledTimes(1); + }); + }); + + describe('getConfig', () => { + it('returns the config from the Native Module', async () => { + const instance = new ShopifyCheckoutSheet(); + await expect(instance.getConfig()).resolves.toStrictEqual({ + preloading: true, + }); + expect( + NativeModule.getConfig, + ).toHaveBeenCalledTimes(1); + }); + }); + + describe('addEventListener', () => { + it('creates a new event listener for a specific event', () => { + const instance = new ShopifyCheckoutSheet(); + const eventName = 'close'; + const callback = jest.fn(); + instance.addEventListener(eventName, callback); + expect(eventEmitter.addListener).toHaveBeenCalledWith( + eventName, + callback, + ); + }); + + describe('Pixel Events', () => { + it('parses web pixel event JSON string data', () => { + const instance = new ShopifyCheckoutSheet(); + const eventName = 'pixel'; + const callback = jest.fn(); + instance.addEventListener(eventName, callback); + NativeModule.addEventListener( + eventName, + callback, + ); + expect(eventEmitter.addListener).toHaveBeenCalledWith( + 'pixel', + expect.any(Function), + ); + eventEmitter.emit( + 'pixel', + JSON.stringify({type: 'STANDARD', someAttribute: 123}), + ); + expect(callback).toHaveBeenCalledWith({ + type: 'STANDARD', + someAttribute: 123, + }); + }); + + it('parses custom web pixel event data', () => { + const instance = new ShopifyCheckoutSheet(); + const eventName = 'pixel'; + const callback = jest.fn(); + instance.addEventListener(eventName, callback); + NativeModule.addEventListener( + eventName, + callback, + ); + expect(eventEmitter.addListener).toHaveBeenCalledWith( + 'pixel', + expect.any(Function), + ); + eventEmitter.emit( + 'pixel', + JSON.stringify({ + type: 'CUSTOM', + someAttribute: 123, + customData: JSON.stringify({valid: true}), + }), + ); + expect(callback).toHaveBeenCalledWith({ + type: 'CUSTOM', + someAttribute: 123, + customData: {valid: true}, + }); + }); + + it('fails gracefully if custom event data cannot be parsed', () => { + const instance = new ShopifyCheckoutSheet(); + const eventName = 'pixel'; + const callback = jest.fn(); + instance.addEventListener(eventName, callback); + NativeModule.addEventListener( + eventName, + callback, + ); + expect(eventEmitter.addListener).toHaveBeenCalledWith( + 'pixel', + expect.any(Function), + ); + eventEmitter.emit( + 'pixel', + JSON.stringify({ + type: 'CUSTOM', + someAttribute: 123, + customData: 'Invalid JSON', + }), + ); + expect(callback).toHaveBeenCalledWith({ + type: 'CUSTOM', + someAttribute: 123, + customData: 'Invalid JSON', + }); + }); + + it('prints an error if the web pixel event data cannot be parsed', () => { + const mock = jest.spyOn(global.console, 'error'); + const instance = new ShopifyCheckoutSheet(); + const eventName = 'pixel'; + const callback = jest.fn(); + instance.addEventListener(eventName, callback); + NativeModule.addEventListener( + eventName, + callback, + ); + expect(eventEmitter.addListener).toHaveBeenCalledWith( + 'pixel', + expect.any(Function), + ); + const invalidData = '{"someAttribute": 123'; + eventEmitter.emit('pixel', invalidData); + expect(mock).toHaveBeenCalledWith( + expect.any(LifecycleEventParseError), + invalidData, + ); + }); + + it('handles unexpected errors during event processing', () => { + const mock = jest.spyOn(global.console, 'error'); + const instance = new ShopifyCheckoutSheet(); + const eventName = 'pixel'; + const callback = jest.fn(() => { + throw new Error('Callback error'); + }); + instance.addEventListener(eventName, callback); + NativeModule.addEventListener( + eventName, + callback, + ); + expect(eventEmitter.addListener).toHaveBeenCalledWith( + 'pixel', + expect.any(Function), + ); + eventEmitter.emit('pixel', {type: 'STANDARD', someAttribute: 123}); + expect(mock).toHaveBeenCalledWith(expect.any(LifecycleEventParseError)); + }); + + it('handles falsy object event data', () => { + const instance = new ShopifyCheckoutSheet(); + const eventName = 'pixel'; + const callback = jest.fn(); + instance.addEventListener(eventName, callback); + + // Emit falsy object (null is typeof 'object') + eventEmitter.emit('pixel', null); + expect(callback).not.toHaveBeenCalled(); + }); + }); + + describe('Completed Event', () => { + it('parses completed event string data as JSON', () => { + const instance = new ShopifyCheckoutSheet(); + const eventName = 'completed'; + const callback = jest.fn(); + instance.addEventListener(eventName, callback); + NativeModule.addEventListener( + eventName, + callback, + ); + expect(eventEmitter.addListener).toHaveBeenCalledWith( + 'completed', + expect.any(Function), + ); + eventEmitter.emit( + 'completed', + JSON.stringify({orderDetails: {id: 'test-id'}}), + ); + expect(callback).toHaveBeenCalledWith({orderDetails: {id: 'test-id'}}); + }); + + it('parses completed event JSON data', () => { + const instance = new ShopifyCheckoutSheet(); + const eventName = 'completed'; + const callback = jest.fn(); + instance.addEventListener(eventName, callback); + NativeModule.addEventListener( + eventName, + callback, + ); + expect(eventEmitter.addListener).toHaveBeenCalledWith( + 'completed', + expect.any(Function), + ); + eventEmitter.emit('completed', {orderDetails: {id: 'test-id'}}); + expect(callback).toHaveBeenCalledWith({orderDetails: {id: 'test-id'}}); + }); + + it('prints an error if the completed event data cannot be parsed', () => { + const mock = jest.spyOn(global.console, 'error'); + const instance = new ShopifyCheckoutSheet(); + const eventName = 'completed'; + const callback = jest.fn(); + instance.addEventListener(eventName, callback); + NativeModule.addEventListener( + eventName, + callback, + ); + expect(eventEmitter.addListener).toHaveBeenCalledWith( + 'completed', + expect.any(Function), + ); + const invalidData = 'INVALID JSON'; + eventEmitter.emit('completed', invalidData); + expect(mock).toHaveBeenCalledWith( + expect.any(LifecycleEventParseError), + invalidData, + ); + }); + }); + + describe('Error Event', () => { + const internalError = { + __typename: CheckoutNativeErrorType.InternalError, + message: 'Something went wrong', + code: CheckoutErrorCode.unknown, + recoverable: true, + }; + + const configError = { + __typename: CheckoutNativeErrorType.ConfigurationError, + message: 'Storefront Password Required', + code: CheckoutErrorCode.storefrontPasswordRequired, + recoverable: false, + }; + + const clientError = { + __typename: CheckoutNativeErrorType.CheckoutClientError, + message: 'Storefront Password Required', + code: CheckoutErrorCode.storefrontPasswordRequired, + recoverable: false, + }; + + const networkError = { + __typename: CheckoutNativeErrorType.CheckoutHTTPError, + message: 'Checkout not found', + code: CheckoutErrorCode.httpError, + statusCode: 400, + recoverable: false, + }; + + const expiredError = { + __typename: CheckoutNativeErrorType.CheckoutExpiredError, + message: 'Customer Account Required', + code: CheckoutErrorCode.cartExpired, + recoverable: false, + }; + + it.each([ + {error: internalError, constructor: InternalError}, + {error: configError, constructor: ConfigurationError}, + {error: clientError, constructor: CheckoutClientError}, + {error: networkError, constructor: CheckoutHTTPError}, + {error: expiredError, constructor: CheckoutExpiredError}, + ])( + `correctly parses error $error`, + ({ + error, + constructor, + }: { + error: any; + constructor: new (...args: any[]) => any; + }) => { + const instance = new ShopifyCheckoutSheet(); + const eventName = 'error'; + const callback = jest.fn(); + instance.addEventListener(eventName, callback); + NativeModule.addEventListener( + eventName, + callback, + ); + expect(eventEmitter.addListener).toHaveBeenCalledWith( + 'error', + expect.any(Function), + ); + eventEmitter.emit('error', error); + const calledWith = callback.mock.calls[0][0]; + expect(calledWith).toBeInstanceOf(constructor); + expect(calledWith).not.toHaveProperty('__typename'); + expect(calledWith).toHaveProperty('code'); + expect(calledWith).toHaveProperty('message'); + expect(calledWith).toHaveProperty('recoverable'); + }, + ); + + it('returns an unknown generic error if the error cannot be parsed', () => { + const instance = new ShopifyCheckoutSheet(); + const eventName = 'error'; + const callback = jest.fn(); + instance.addEventListener(eventName, callback); + NativeModule.addEventListener( + eventName, + callback, + ); + const error = { + __typename: 'UnknownError', + message: 'Something went wrong', + }; + expect(eventEmitter.addListener).toHaveBeenCalledWith( + 'error', + expect.any(Function), + ); + eventEmitter.emit('error', error); + const calledWith = callback.mock.calls[0][0]; + expect(calledWith).toBeInstanceOf(GenericError); + expect(callback).toHaveBeenCalledWith(new GenericError(error as any)); + }); + }); + }); + + describe('removeEventListeners', () => { + it('Removes all listeners for a specific event', () => { + const instance = new ShopifyCheckoutSheet(); + instance.addEventListener('close', () => {}); + instance.addEventListener('close', () => {}); + instance.removeEventListeners('close'); + expect(eventEmitter.removeAllListeners).toHaveBeenCalledWith('close'); + }); + }); + + describe('Geolocation', () => { + const defaultConfig = {}; + + async function emitGeolocationRequest() { + await new Promise(resolve => { + eventEmitter.emit('geolocationRequest', { + origin: 'https://shopify.com', + }); + setTimeout(resolve); + }); + } + + describe('Android', () => { + const originalPlatform = Platform.OS; + + beforeEach(() => { + Platform.OS = 'android'; + }); + + afterAll(() => { + Platform.OS = originalPlatform; + }); + + it('subscribes to geolocation requests on Android when feature is enabled', () => { + new ShopifyCheckoutSheet(defaultConfig); + + expect(eventEmitter.addListener).toHaveBeenCalledWith( + 'geolocationRequest', + expect.any(Function), + ); + }); + + it('does not subscribe to geolocation requests when feature is disabled', () => { + new ShopifyCheckoutSheet(defaultConfig, { + handleGeolocationRequests: false, + }); + + expect(eventEmitter.addListener).not.toHaveBeenCalledWith( + 'geolocationRequest', + expect.any(Function), + ); + }); + + it('handles geolocation permission grant correctly', async () => { + const mockPermissions = { + 'android.permission.ACCESS_COARSE_LOCATION': 'granted', + 'android.permission.ACCESS_FINE_LOCATION': 'denied', + }; + + ( + PermissionsAndroid.requestMultiple as unknown as { + mockResolvedValue: (v: any) => void; + } + ).mockResolvedValue(mockPermissions); + + new ShopifyCheckoutSheet(); + + await emitGeolocationRequest(); + + expect(PermissionsAndroid.requestMultiple).toHaveBeenCalledWith([ + 'android.permission.ACCESS_COARSE_LOCATION', + 'android.permission.ACCESS_FINE_LOCATION', + ]); + expect( + NativeModule.initiateGeolocationRequest, + ).toHaveBeenCalledWith(true); + }); + + it('handles geolocation permission denial correctly', async () => { + const mockPermissions = { + 'android.permission.ACCESS_COARSE_LOCATION': 'denied', + 'android.permission.ACCESS_FINE_LOCATION': 'denied', + }; + + ( + PermissionsAndroid.requestMultiple as unknown as { + mockResolvedValue: (v: any) => void; + } + ).mockResolvedValue(mockPermissions); + + new ShopifyCheckoutSheet(); + + await emitGeolocationRequest(); + + expect(PermissionsAndroid.requestMultiple).toHaveBeenCalledWith([ + 'android.permission.ACCESS_COARSE_LOCATION', + 'android.permission.ACCESS_FINE_LOCATION', + ]); + expect( + NativeModule.initiateGeolocationRequest, + ).toHaveBeenCalledWith(false); + }); + + it('cleans up geolocation callback on teardown', () => { + const sheet = new ShopifyCheckoutSheet(); + const mockRemove = jest.fn(); + + // @ts-expect-error + sheet.geolocationCallback = { + remove: mockRemove, + }; + + sheet.teardown(); + + expect(mockRemove).toHaveBeenCalled(); + }); + }); + + describe('iOS', () => { + const originalPlatform = Platform.OS; + + beforeEach(() => { + Platform.OS = 'ios'; + }); + + afterAll(() => { + Platform.OS = originalPlatform; + }); + + it('does not subscribe to geolocation requests', () => { + new ShopifyCheckoutSheet(); + + expect(eventEmitter.addListener).not.toHaveBeenCalledWith( + 'geolocationRequest', + expect.any(Function), + ); + }); + + it('does not call the native function, even if an event is emitted', async () => { + new ShopifyCheckoutSheet(); + + await emitGeolocationRequest(); + + expect( + NativeModule.initiateGeolocationRequest, + ).not.toHaveBeenCalled(); + }); + + it('tears down gracefully', () => { + const sheet = new ShopifyCheckoutSheet(); + + expect(() => sheet.teardown()).not.toThrow(); + }); + }); + }); + + describe('Feature Management', () => { + it('returns true for undefined features (feature fallback)', () => { + // Create instance without any features to test fallback + const instance = new ShopifyCheckoutSheet(undefined, {}); + + // Access private method via type assertion to test featureEnabled + const featureEnabled = (instance as any).featureEnabled( + 'handleGeolocationRequests', + ); + expect(featureEnabled).toBe(true); + }); + + it('returns false when feature is explicitly disabled', () => { + // Create instance with feature explicitly disabled + const instance = new ShopifyCheckoutSheet(undefined, { + handleGeolocationRequests: false, + }); + + // Access private method via type assertion to test featureEnabled + const featureEnabled = (instance as any).featureEnabled( + 'handleGeolocationRequests', + ); + expect(featureEnabled).toBe(false); + }); + + it('returns true when feature is explicitly enabled', () => { + // Create instance with feature explicitly enabled + const instance = new ShopifyCheckoutSheet(undefined, { + handleGeolocationRequests: true, + }); + + // Access private method via type assertion to test featureEnabled + const featureEnabled = (instance as any).featureEnabled( + 'handleGeolocationRequests', + ); + expect(featureEnabled).toBe(true); + }); + }); + + describe('LifecycleEventParseError', () => { + it('creates error without Error.captureStackTrace', () => { + const originalCaptureStackTrace = Error.captureStackTrace; + delete (Error as any).captureStackTrace; + + const error = new LifecycleEventParseError('test message'); + expect(error.name).toBe('LifecycleEventParseError'); + expect(error.message).toBe('test message'); + + // Restore + if (originalCaptureStackTrace) { + Error.captureStackTrace = originalCaptureStackTrace; + } + }); + + it('creates error with Error.captureStackTrace', () => { + const mockCaptureStackTrace = jest.fn(); + Error.captureStackTrace = mockCaptureStackTrace; + + const error = new LifecycleEventParseError('test message'); + expect(error.name).toBe('LifecycleEventParseError'); + expect(mockCaptureStackTrace).toHaveBeenCalledWith( + error, + LifecycleEventParseError, + ); + }); + }); + + describe('Accelerated Checkout', () => { + const acceleratedConfig: AcceleratedCheckoutConfiguration = { + storefrontDomain: 'test-shop.myshopify.com', + storefrontAccessToken: 'shpat_test_token', + customer: { + email: 'test@example.com', + phoneNumber: '+1234567890', + accessToken: 'customer-access-token', + }, + wallets: { + applePay: { + contactFields: ['email', 'phone'] as ApplePayContactField[], + merchantIdentifier: 'merchant.com.test', + }, + }, + }; + + beforeEach(() => { + Platform.OS = 'ios'; + Platform.Version = '17.0'; + NativeModule.configureAcceleratedCheckouts.mockReset(); + NativeModule.isAcceleratedCheckoutAvailable.mockReset(); + }); + + describe('configureAcceleratedCheckouts', () => { + it('calls native configureAcceleratedCheckouts with correct parameters on iOS', async () => { + const instance = new ShopifyCheckoutSheet(); + NativeModule.configureAcceleratedCheckouts.mockResolvedValue( + true, + ); + + const result = + await instance.configureAcceleratedCheckouts(acceleratedConfig); + + expect(result).toBe(true); + expect( + NativeModule.configureAcceleratedCheckouts, + ).toHaveBeenCalledWith( + 'test-shop.myshopify.com', + 'shpat_test_token', + 'test@example.com', + '+1234567890', + 'customer-access-token', + 'merchant.com.test', + ['email', 'phone'], + [], + ); + }); + + it('calls native configureAcceleratedCheckouts with null customer data when not provided', async () => { + const instance = new ShopifyCheckoutSheet(); + const minimalConfig = { + storefrontDomain: 'test-shop.myshopify.com', + storefrontAccessToken: 'shpat_test_token', + }; + NativeModule.configureAcceleratedCheckouts.mockResolvedValue( + true, + ); + + await instance.configureAcceleratedCheckouts(minimalConfig); + + expect( + NativeModule.configureAcceleratedCheckouts, + ).toHaveBeenCalledWith( + 'test-shop.myshopify.com', + 'shpat_test_token', + null, + null, + null, + null, + [], + [], + ); + }); + + it('returns false on Android', async () => { + Platform.OS = 'android'; + const instance = new ShopifyCheckoutSheet(); + + const result = + await instance.configureAcceleratedCheckouts(acceleratedConfig); + + expect(result).toBe(false); + expect( + NativeModule.configureAcceleratedCheckouts, + ).not.toHaveBeenCalled(); + }); + + it('validates required storefrontDomain', async () => { + const instance = new ShopifyCheckoutSheet(); + const invalidConfig = { + ...acceleratedConfig, + storefrontDomain: '', + }; + const expectedError = new Error('`storefrontDomain` is required'); + + await expect( + instance.configureAcceleratedCheckouts(invalidConfig), + ).resolves.toBe(false); + expect(console.error).toHaveBeenCalledWith( + '[ShopifyCheckoutSheetKit] Failed to configure accelerated checkouts with', + expectedError, + ); + }); + + it('validates required storefrontAccessToken', async () => { + const instance = new ShopifyCheckoutSheet(); + const invalidConfig = { + ...acceleratedConfig, + storefrontAccessToken: '', + }; + + const expectedError = new Error('`storefrontAccessToken` is required'); + + await expect( + instance.configureAcceleratedCheckouts(invalidConfig), + ).resolves.toBe(false); + expect(console.error).toHaveBeenCalledWith( + '[ShopifyCheckoutSheetKit] Failed to configure accelerated checkouts with', + expectedError, + ); + }); + + it('validates required merchantIdentifier when Apple Pay is configured', async () => { + const instance = new ShopifyCheckoutSheet(); + const invalidConfig = { + ...acceleratedConfig, + wallets: { + applePay: { + contactFields: ['email'] as ApplePayContactField[], + merchantIdentifier: '', + }, + }, + }; + + const expectedError = new Error( + '`wallets.applePay.merchantIdentifier` is required', + ); + + await expect( + instance.configureAcceleratedCheckouts(invalidConfig), + ).resolves.toBe(false); + expect(console.error).toHaveBeenCalledWith( + '[ShopifyCheckoutSheetKit] Failed to configure accelerated checkouts with', + expectedError, + ); + }); + + it('validates required contactFields when Apple Pay is configured', async () => { + const instance = new ShopifyCheckoutSheet(); + const invalidConfig = { + ...acceleratedConfig, + wallets: { + applePay: { + contactFields: ['invalid'], + merchantIdentifier: 'merchant.test.com', + }, + }, + }; + + const expectedError = new Error( + `'wallets.applePay.contactFields' contains unexpected values. Expected "email, phone", received "invalid"`, + ); + + await expect( + instance.configureAcceleratedCheckouts(invalidConfig as any), + ).resolves.toBe(false); + expect(console.error).toHaveBeenCalledWith( + '[ShopifyCheckoutSheetKit] Failed to configure accelerated checkouts with', + expectedError, + ); + }); + + it('does not throw when Apple Pay wallet is not configured', async () => { + const instance = new ShopifyCheckoutSheet(); + const configWithoutApplePay = { + storefrontDomain: 'test-shop.myshopify.com', + storefrontAccessToken: 'shpat_test_token', + }; + NativeModule.configureAcceleratedCheckouts.mockResolvedValue( + true, + ); + + await expect( + instance.configureAcceleratedCheckouts(configWithoutApplePay), + ).resolves.toBe(true); + }); + + it('throws when a non-string value is given for supportedShippingCountries', async () => { + const instance = new ShopifyCheckoutSheet(); + const invalidConfig = { + ...acceleratedConfig, + wallets: { + applePay: { + contactFields: [], + merchantIdentifier: 'merchant.test.com', + supportedShippingCountries: [NaN], + }, + }, + }; + + const expectedError = new Error( + `'wallets.applePay.supportedShippingCountries' contains unexpected values. Expects ISO 3166-1 alpha-2 country codes (e.g., "US", "CA", "GB").`, + ); + + await expect( + instance.configureAcceleratedCheckouts(invalidConfig as any), + ).resolves.toBe(false); + expect(console.error).toHaveBeenCalledWith( + '[ShopifyCheckoutSheetKit] Failed to configure accelerated checkouts with', + expectedError, + ); + }); + + it('calls configureAcceleratedCheckouts with an empty array for supportShippingCountries when omitted', async () => { + const instance = new ShopifyCheckoutSheet(); + + await instance.configureAcceleratedCheckouts({ + ...acceleratedConfig, + wallets: { + applePay: { + contactFields: [], + merchantIdentifier: 'merchant.test.com', + }, + }, + }); + + expect( + NativeModule.configureAcceleratedCheckouts, + ).toHaveBeenCalledWith( + 'test-shop.myshopify.com', + 'shpat_test_token', + 'test@example.com', + '+1234567890', + 'customer-access-token', + 'merchant.test.com', + [], + [], + ); + }); + + it('calls configureAcceleratedCheckouts with supportShippingCountries when given', async () => { + const instance = new ShopifyCheckoutSheet(); + + await instance.configureAcceleratedCheckouts({ + ...acceleratedConfig, + wallets: { + applePay: { + contactFields: [], + merchantIdentifier: 'merchant.test.com', + supportedShippingCountries: ['IE', 'CA'], + }, + }, + }); + + expect( + NativeModule.configureAcceleratedCheckouts, + ).toHaveBeenCalledWith( + 'test-shop.myshopify.com', + 'shpat_test_token', + 'test@example.com', + '+1234567890', + 'customer-access-token', + 'merchant.test.com', + [], + ['IE', 'CA'], + ); + }); + }); + + describe('isAcceleratedCheckoutAvailable', () => { + it('calls native isAcceleratedCheckoutAvailable on iOS', async () => { + const instance = new ShopifyCheckoutSheet(); + NativeModule.isAcceleratedCheckoutAvailable.mockResolvedValue( + true, + ); + + const result = await instance.isAcceleratedCheckoutAvailable(); + + expect(result).toBe(true); + expect( + NativeModule.isAcceleratedCheckoutAvailable, + ).toHaveBeenCalledTimes(1); + }); + + it('returns false on Android', async () => { + Platform.OS = 'android'; + const instance = new ShopifyCheckoutSheet(); + + const result = await instance.isAcceleratedCheckoutAvailable(); + + expect(result).toBe(false); + expect( + NativeModule.isAcceleratedCheckoutAvailable, + ).not.toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/react-native/modules/@shopify/checkout-sheet-kit/tests/linking.test.ts b/react-native/modules/@shopify/checkout-sheet-kit/tests/linking.test.ts new file mode 100644 index 00000000..f83795f8 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/tests/linking.test.ts @@ -0,0 +1,22 @@ +jest.mock('react-native', () => ({ + NativeModules: {}, + NativeEventEmitter: jest.fn(), + Platform: { + OS: 'ios', + }, + TurboModuleRegistry: { + getEnforcing: jest.fn((name: string) => { + throw new Error( + `TurboModuleRegistry.getEnforcing(...): '${name}' could not be found.`, + ); + }), + }, +})); + +describe('Native Module Linking', () => { + it('throws error when native module is not linked', () => { + expect(() => { + require('../src/index'); + }).toThrow('ShopifyCheckoutSheetKit'); + }); +}); diff --git a/react-native/modules/@shopify/checkout-sheet-kit/tsconfig.build.json b/react-native/modules/@shopify/checkout-sheet-kit/tsconfig.build.json new file mode 100644 index 00000000..0e96e3a0 --- /dev/null +++ b/react-native/modules/@shopify/checkout-sheet-kit/tsconfig.build.json @@ -0,0 +1,27 @@ + +{ + "compilerOptions": { + "rootDir": ".", + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "jsx": "react-native", + "lib": ["esnext"], + "module": "esnext", + "moduleResolution": "node", + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "noImplicitUseStrict": false, + "noStrictGenericChecks": false, + "noImplicitAny": true, + "noUncheckedIndexedAccess": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "esnext", + "verbatimModuleSyntax": true, + } +} diff --git a/react-native/package.json b/react-native/package.json new file mode 100644 index 00000000..1993ca2b --- /dev/null +++ b/react-native/package.json @@ -0,0 +1,87 @@ +{ + "name": "checkout-sheet-kit-react-native", + "description": "A React Native library for Shopify's Checkout Kit.", + "private": true, + "version": "0.0.1", + "repository": "https://github.com/Shopify/checkout-sheet-kit-react-native", + "author": "Shopify (https://github.com/Shopify/checkout-sheet-kit-react-native)", + "license": "MIT", + "bugs": { + "url": "https://github.com/Shopify/checkout-sheet-kit-react-native/issues" + }, + "homepage": "https://github.com/Shopify/checkout-sheet-kit-react-native", + "packageManager": "pnpm@10.33.1+sha512.05ba3c1d5d1c18f68df06470d74055e62d41fc110a0c660db1b2dfb2785327f04cf0f68345d4609bc52089e7fa0343c31593b2f9594e2c5d5da426230acc9820", + "pnpm": { + "onlyBuiltDependencies": [ + "unrs-resolver" + ] + }, + "scripts": { + "clean": "rm -rf node_modules; watchman watch-del . || true", + "sample": "pnpm --filter sample", + "module": "pnpm --filter @shopify/checkout-sheet-kit", + "pod-install": "(cd sample/ios && bundle install && bundle exec pod repo update && bundle exec pod cache clean --all && bundle exec pod install --repo-update)", + "snapshot": "./scripts/create_snapshot", + "compare-snapshot": "./scripts/compare_snapshot", + "turbo": "turbo", + "test": "jest" + }, + "devDependencies": { + "@babel/core": "^7.25.2", + "@babel/preset-env": "^7.25.3", + "@babel/runtime": "^7.25.0", + "@react-native-community/cli": "19.1.1", + "@react-native-community/cli-platform-android": "19.1.1", + "@react-native-community/cli-platform-ios": "19.1.1", + "@react-native/babel-preset": "0.80.2", + "@react-native/eslint-config": "0.80.2", + "@react-native/metro-config": "0.80.2", + "@react-native/typescript-config": "0.80.2", + "@testing-library/react-native": "^13.3.1", + "@tsconfig/react-native": "^3.0.6", + "@types/jest": "^29.5.13", + "@types/react": "^19.1.0", + "@types/react-native-dotenv": "^0.2.1", + "@types/react-test-renderer": "19.1.0", + "eslint": "^8.57.1", + "eslint-plugin-prettier": "^5.5.4", + "jest": "^30.0.5", + "prettier": "^3.2.5", + "react": "19.1.0", + "react-native": "0.80.2", + "react-native-dotenv": "^3.4.11", + "react-native-gesture-handler": "2.26.0", + "react-native-gradle-plugin": "^0.71.19", + "react-test-renderer": "19.1.0", + "ts-jest": "^29.4.1", + "turbo": "^1.13.4", + "typescript": "^5.9.2" + }, + "engines": { + "node": "22.14.0" + }, + "prettier": { + "arrowParens": "avoid", + "bracketSameLine": true, + "bracketSpacing": false, + "singleQuote": true, + "trailingComma": "all", + "semi": true, + "useTabs": false, + "proseWrap": "always" + }, + "keywords": [ + "react-native", + "shopify", + "checkout" + ], + "eslintConfig": { + "root": true, + "extends": "@react-native", + "rules": { + "@typescript-eslint/no-shadow": "off", + "@typescript-eslint/consistent-type-imports": "error", + "no-console": "error" + } + } +} diff --git a/react-native/pnpm-lock.yaml b/react-native/pnpm-lock.yaml new file mode 100644 index 00000000..278d55ac --- /dev/null +++ b/react-native/pnpm-lock.yaml @@ -0,0 +1,10295 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@babel/core': + specifier: ^7.25.2 + version: 7.28.3 + '@babel/preset-env': + specifier: ^7.25.3 + version: 7.28.3(@babel/core@7.28.3) + '@babel/runtime': + specifier: ^7.25.0 + version: 7.28.3 + '@react-native-community/cli': + specifier: 19.1.1 + version: 19.1.1(typescript@5.9.2) + '@react-native-community/cli-platform-android': + specifier: 19.1.1 + version: 19.1.1 + '@react-native-community/cli-platform-ios': + specifier: 19.1.1 + version: 19.1.1 + '@react-native/babel-preset': + specifier: 0.80.2 + version: 0.80.2(@babel/core@7.28.3) + '@react-native/eslint-config': + specifier: 0.80.2 + version: 0.80.2(eslint@8.57.1)(jest@30.0.5(@types/node@20.9.3))(prettier@3.2.5)(typescript@5.9.2) + '@react-native/metro-config': + specifier: 0.80.2 + version: 0.80.2(@babel/core@7.28.3) + '@react-native/typescript-config': + specifier: 0.80.2 + version: 0.80.2 + '@testing-library/react-native': + specifier: ^13.3.1 + version: 13.3.1(jest@30.0.5(@types/node@20.9.3))(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react-test-renderer@19.1.0(react@19.1.0))(react@19.1.0) + '@tsconfig/react-native': + specifier: ^3.0.6 + version: 3.0.6 + '@types/jest': + specifier: ^29.5.13 + version: 29.5.14 + '@types/react': + specifier: ^19.1.0 + version: 19.1.12 + '@types/react-native-dotenv': + specifier: ^0.2.1 + version: 0.2.2 + '@types/react-test-renderer': + specifier: 19.1.0 + version: 19.1.0 + eslint: + specifier: ^8.57.1 + version: 8.57.1 + eslint-plugin-prettier: + specifier: ^5.5.4 + version: 5.5.4(eslint-config-prettier@8.10.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.2.5) + jest: + specifier: ^30.0.5 + version: 30.0.5(@types/node@20.9.3) + prettier: + specifier: ^3.2.5 + version: 3.2.5 + react: + specifier: 19.1.0 + version: 19.1.0 + react-native: + specifier: 0.80.2 + version: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + react-native-dotenv: + specifier: ^3.4.11 + version: 3.4.11(@babel/runtime@7.28.3) + react-native-gesture-handler: + specifier: 2.26.0 + version: 2.26.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + react-native-gradle-plugin: + specifier: ^0.71.19 + version: 0.71.19 + react-test-renderer: + specifier: 19.1.0 + version: 19.1.0(react@19.1.0) + ts-jest: + specifier: ^29.4.1 + version: 29.4.1(@babel/core@7.28.3)(@jest/transform@30.0.5)(@jest/types@30.0.5)(babel-jest@30.0.5(@babel/core@7.28.3))(jest-util@30.0.5)(jest@30.0.5(@types/node@20.9.3))(typescript@5.9.2) + turbo: + specifier: ^1.13.4 + version: 1.13.4 + typescript: + specifier: ^5.9.2 + version: 5.9.2 + + modules/@shopify/checkout-sheet-kit: + dependencies: + react: + specifier: '*' + version: 19.1.0 + react-native: + specifier: '*' + version: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + devDependencies: + react-native-builder-bob: + specifier: ^0.23.2 + version: 0.23.2 + typescript: + specifier: ^5.9.2 + version: 5.9.2 + + sample: + dependencies: + '@apollo/client': + specifier: ^3.13.9 + version: 3.14.1(@types/react@19.1.12)(graphql@16.13.2)(react@19.1.0) + '@react-native/babel-preset': + specifier: '*' + version: 0.80.2(@babel/core@7.28.3) + '@react-native/metro-config': + specifier: '*' + version: 0.80.2(@babel/core@7.28.3) + '@react-navigation/bottom-tabs': + specifier: ^7.4.6 + version: 7.15.9(@react-native-masked-view/masked-view@0.3.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(@react-navigation/native@7.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.7.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + '@react-navigation/native': + specifier: ^7.1.17 + version: 7.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + '@react-navigation/native-stack': + specifier: ^7.3.25 + version: 7.14.11(@react-native-masked-view/masked-view@0.3.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(@react-navigation/native@7.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.7.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + '@react-navigation/stack': + specifier: ^7.4.8 + version: 7.8.10(4bd8dd23d724a396af48ae32b42242ae) + '@shopify/checkout-sheet-kit': + specifier: workspace:* + version: link:../modules/@shopify/checkout-sheet-kit + '@types/react-native': + specifier: '*' + version: 0.73.0(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + graphql: + specifier: ^16.8.2 + version: 16.13.2 + jotai: + specifier: ^2.13.1 + version: 2.19.1(@babel/core@7.28.3)(@babel/template@7.28.6)(@types/react@19.1.12)(react@19.1.0) + react: + specifier: '*' + version: 19.1.0 + react-native: + specifier: '*' + version: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + react-native-config: + specifier: 1.5.6 + version: 1.5.6 + react-native-dotenv: + specifier: ^3.4.11 + version: 3.4.11(@babel/runtime@7.28.3) + react-native-encrypted-storage: + specifier: ^4.0.3 + version: 4.0.3(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + react-native-nitro-modules: + specifier: ^0.33.7 + version: 0.33.9(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + react-native-quick-base64: + specifier: ^2.2.2 + version: 2.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + react-native-quick-crypto: + specifier: 1.0.9 + version: 1.0.9(react-native-nitro-modules@0.33.9(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-quick-base64@2.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + react-native-reanimated: + specifier: 3.18.0 + version: 3.18.0(@babel/core@7.28.3)(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + react-native-safe-area-context: + specifier: ^5.6.1 + version: 5.7.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + react-native-screens: + specifier: 4.16.0 + version: 4.16.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + react-native-vector-icons: + specifier: ^10.3.0 + version: 10.3.0 + react-native-webview: + specifier: ^13.16.0 + version: 13.16.1(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + devDependencies: + '@babel/core': + specifier: ^7.20.0 + version: 7.28.3 + '@babel/plugin-proposal-nullish-coalescing-operator': + specifier: ^7.18.6 + version: 7.18.6(@babel/core@7.28.3) + '@babel/plugin-proposal-optional-chaining': + specifier: ^7.21.0 + version: 7.21.0(@babel/core@7.28.3) + '@babel/plugin-transform-arrow-functions': + specifier: ^7.27.1 + version: 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-shorthand-properties': + specifier: ^7.23.3 + version: 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-template-literals': + specifier: ^7.23.3 + version: 7.27.1(@babel/core@7.28.3) + '@babel/preset-env': + specifier: ^7.20.0 + version: 7.28.3(@babel/core@7.28.3) + '@babel/runtime': + specifier: ^7.27.6 + version: 7.28.3 + '@react-native-masked-view/masked-view': + specifier: ^0.3.2 + version: 0.3.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + '@types/react-native-vector-icons': + specifier: ^6.4.18 + version: 6.4.18 + '@types/setimmediate': + specifier: ^1 + version: 1.0.4 + babel-plugin-module-resolver: + specifier: ^5.0.0 + version: 5.0.3 + setimmediate: + specifier: ^1.0.5 + version: 1.0.5 + +packages: + + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + '@ampproject/remapping@2.2.1': + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + + '@apollo/client@3.14.1': + resolution: {integrity: sha512-SgGX6E23JsZhUdG2anxiyHvEvvN6CUaI4ZfMsndZFeuHPXL3H0IsaiNAhLITSISbeyeYd+CBd9oERXQDdjXWZw==} + peerDependencies: + graphql: ^15.0.0 || ^16.0.0 + graphql-ws: ^5.5.5 || ^6.0.3 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc + subscriptions-transport-ws: ^0.9.0 || ^0.11.0 + peerDependenciesMeta: + graphql-ws: + optional: true + react: + optional: true + react-dom: + optional: true + subscriptions-transport-ws: + optional: true + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.3': + resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} + engines: {node: '>=6.9.0'} + + '@babel/eslint-parser@7.28.0': + resolution: {integrity: sha512-N4ntErOlKvcbTt01rr5wj3y55xnIdx1ymrfIr8C2WnM1Y9glFgWaGDEULJIazOX3XM9NRzhfJ6zZnQ1sBNWU+w==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 + + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.28.3': + resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-class-features-plugin@7.28.6': + resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.27.1': + resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.5': + resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.28.6': + resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.28.3': + resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.3': + resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.3': + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.29.2': + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': + resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3': + resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-class-properties@7.18.6': + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-export-default-from@7.27.1': + resolution: {integrity: sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6': + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-optional-chaining@7.21.0': + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-export-default-from@7.27.1': + resolution: {integrity: sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-flow@7.27.1': + resolution: {integrity: sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.27.1': + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.28.6': + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.28.0': + resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.27.1': + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.28.0': + resolution: {integrity: sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.28.3': + resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.28.3': + resolution: {integrity: sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.27.1': + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.28.0': + resolution: {integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.27.1': + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-explicit-resource-management@7.28.0': + resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.27.1': + resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-flow-strip-types@7.27.1': + resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.27.1': + resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.27.1': + resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.27.1': + resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.27.1': + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.28.0': + resolution: {integrity: sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.27.1': + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.27.1': + resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.27.1': + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.27.1': + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.28.0': + resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.27.1': + resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.27.1': + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.28.3': + resolution: {integrity: sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.27.1': + resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-runtime@7.28.3': + resolution: {integrity: sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.27.1': + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.28.0': + resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.28.6': + resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.27.1': + resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1': + resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.28.3': + resolution: {integrity: sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-flow@7.27.1': + resolution: {integrity: sha512-ez3a2it5Fn6P54W8QkbfIyyIbxlXvcxyWHHvno1Wg0Ej5eiJY5hBb8ExttoIOJJk7V2dZE6prP7iby5q2aQ0Lg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-react@7.28.5': + resolution: {integrity: sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.28.5': + resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.28.3': + resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.3': + resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@craftzdog/react-native-buffer@6.1.0': + resolution: {integrity: sha512-lJXdjZ7fTllLbzDrwg/FrJLjQ5sBcAgwcqgAB6OPpXTHdCenEhHZblQpfmBLLe7/S7m0yKXL3kN3jpwOEkpjGg==} + + '@egjs/hammerjs@2.0.17': + resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==} + engines: {node: '>=0.8.0'} + + '@emnapi/core@1.4.3': + resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + + '@emnapi/wasi-threads@1.0.2': + resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@graphql-typed-document-node/core@3.2.0': + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/ttlcache@1.4.1': + resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@30.0.5': + resolution: {integrity: sha512-xY6b0XiL0Nav3ReresUarwl2oIz1gTnxGbGpho9/rbUWsLH0f1OD/VT84xs8c7VmH7MChnLb0pag6PhZhAdDiA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/core@30.0.5': + resolution: {integrity: sha512-fKD0OulvRsXF1hmaFgHhVJzczWzA1RXMMo9LTPuFXo9q/alDbME3JIyWYqovWsUBWSoBcsHaGPSLF9rz4l9Qeg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/create-cache-key-function@29.7.0': + resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/diff-sequences@30.0.1': + resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/environment@30.0.5': + resolution: {integrity: sha512-aRX7WoaWx1oaOkDQvCWImVQ8XNtdv5sEWgk4gxR6NXb7WBUnL5sRak4WRzIQRZ1VTWPvV4VI4mgGjNL9TeKMYA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@30.0.5': + resolution: {integrity: sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect@30.0.5': + resolution: {integrity: sha512-6udac8KKrtTtC+AXZ2iUN/R7dp7Ydry+Fo6FPFnDG54wjVMnb6vW/XNlf7Xj8UDjAE3aAVAsR4KFyKk3TCXmTA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@30.0.5': + resolution: {integrity: sha512-ZO5DHfNV+kgEAeP3gK3XlpJLL4U3Sz6ebl/n68Uwt64qFFs5bv4bfEEjyRGK5uM0C90ewooNgFuKMdkbEoMEXw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/get-type@30.0.1': + resolution: {integrity: sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/globals@30.0.5': + resolution: {integrity: sha512-7oEJT19WW4oe6HR7oLRvHxwlJk2gev0U9px3ufs8sX9PoD1Eza68KF0/tlN7X0dq/WVsBScXQGgCldA1V9Y/jA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/pattern@30.0.1': + resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/reporters@30.0.5': + resolution: {integrity: sha512-mafft7VBX4jzED1FwGC1o/9QUM2xebzavImZMeqnsklgcyxBto8mV4HzNSzUrryJ+8R9MFOM3HgYuDradWR+4g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/schemas@30.0.5': + resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/snapshot-utils@30.0.5': + resolution: {integrity: sha512-XcCQ5qWHLvi29UUrowgDFvV4t7ETxX91CbDczMnoqXPOIcZOxyNdSjm6kV5XMc8+HkxfRegU/MUmnTbJRzGrUQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/source-map@30.0.1': + resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-result@30.0.5': + resolution: {integrity: sha512-wPyztnK0gbDMQAJZ43tdMro+qblDHH1Ru/ylzUo21TBKqt88ZqnKKK2m30LKmLLoKtR2lxdpCC/P3g1vfKcawQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-sequencer@30.0.5': + resolution: {integrity: sha512-Aea/G1egWoIIozmDD7PBXUOxkekXl7ueGzrsGGi1SbeKgQqCYCIf+wfbflEbf2LiPxL8j2JZGLyrzZagjvW4YQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@30.0.5': + resolution: {integrity: sha512-Vk8amLQCmuZyy6GbBht1Jfo9RSdBtg7Lks+B0PecnjI8J+PCLQPGh7uI8Q/2wwpW2gLdiAfiHNsmekKlywULqg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/types@26.6.2': + resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} + engines: {node: '>= 10.14.2'} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@30.0.5': + resolution: {integrity: sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.1': + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.5': + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.30': + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + + '@napi-rs/wasm-runtime@0.2.11': + resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} + + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.2.7': + resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@react-native-community/cli-clean@19.1.1': + resolution: {integrity: sha512-pP7SmK+PNw5B1Aa2c6y06FBNc9iGah/leFFM2uewpyZRJQ4zycX6Zz1UANpq9YZfp65n7NZKV9Gct2uaVRuP/Q==} + + '@react-native-community/cli-config-android@19.1.1': + resolution: {integrity: sha512-uAUXU/BPuasBy7For5lvVEpxiwA29X5BWKjM4fgxWmsQhaZHW//6PNRep94w3WVnAp+CUbW6+o3SzFqMX0PdIw==} + + '@react-native-community/cli-config-apple@19.1.1': + resolution: {integrity: sha512-dKS7pg5eAEgRB8sOWYpr6XCR/3xUcttHNsuYYbuMXfY9d0M3d0oGquuMOW/p3Ri9sJI16bRAs/YIXDF2m4gYIA==} + + '@react-native-community/cli-config@19.1.1': + resolution: {integrity: sha512-qGLYCFf3whCa/we3iKd5BY4RlcAUhSykwGpnJpjseXLaI5iJzIn/IMd70EBG8QvhV/KQxM7VFMQj6KgGcoNKYg==} + + '@react-native-community/cli-doctor@19.1.1': + resolution: {integrity: sha512-P6JgTpa8fn6SfGiotyRhiCqBlRlKx8MUUdMESPGyPzvMb8omz+Jv0ibdNg9CVT11/0x5oRsoGv07os/o+Eg0zQ==} + + '@react-native-community/cli-platform-android@19.1.1': + resolution: {integrity: sha512-omEAcIYz22Lxi/WjYHkNaUMEKV+o60PL3DJE6Wz3c4bkuDfxICJ8JcPawT4fDMsBX7DYwnYf6/Lk/leqQmHzOw==} + + '@react-native-community/cli-platform-apple@19.1.1': + resolution: {integrity: sha512-nsJ/TlQ97Lcmz5dVZVSwYYQzJmK6q/9X31VTAFhUf94ShugF3zXjaNnOJieKYDJlXy4G0EnrEulX1gTt29ebyw==} + + '@react-native-community/cli-platform-ios@19.1.1': + resolution: {integrity: sha512-QHw/eBszq+62xUBorVqjgDYsVrZ5JAYJZkc6UKO327LnVn10OUB/bPGA/FzDWZdGB77pt0IalNP8nxyGOytMfg==} + + '@react-native-community/cli-server-api@19.1.1': + resolution: {integrity: sha512-p0FFm82uPrtLZBWTD3bZ43mMBIV5mXwvGFYMcsfGiuMoS9SNbw4ImEFTG2IutVpr7Qb6NMjx6SbgYYMnTdZXmw==} + + '@react-native-community/cli-tools@19.1.1': + resolution: {integrity: sha512-0yWOdrfgO7jVtYzhNcm9hTA1hqrD6haqDaesFq4d3YCmh8lkkTb61Q/kNIKQCUfaCTR/Qcc4mdwy6ObdXRoTIQ==} + + '@react-native-community/cli-types@19.1.1': + resolution: {integrity: sha512-rOGiYjeDM9tkYBEuK6TJrnxpMhmaId1Un8pjQJswz7W9w2Vb6+nnLfWja7X7VmDIvqIK5GhVobRHsmKCKIdDEA==} + + '@react-native-community/cli@19.1.1': + resolution: {integrity: sha512-H17sV83KPg2H2GCNuUSMM1ZM2sy6msVSmxrhJSycH8ua3i9Iixja8DeYtGIcJUzjdU/4U2eSDs6PjOSZUVn8CQ==} + engines: {node: '>=18'} + hasBin: true + + '@react-native-masked-view/masked-view@0.3.2': + resolution: {integrity: sha512-XwuQoW7/GEgWRMovOQtX3A4PrXhyaZm0lVUiY8qJDvdngjLms9Cpdck6SmGAUNqQwcj2EadHC1HwL0bEyoa/SQ==} + peerDependencies: + react: '>=16' + react-native: '>=0.57' + + '@react-native/assets-registry@0.80.2': + resolution: {integrity: sha512-+sI2zIM22amhkZqW+RpD3qDoopeRiezrTtZMP+Y3HI+6/2JbEq7DdyV/2YS1lrSSdyy3STW2V37Lt4dKqP0lEQ==} + engines: {node: '>=18'} + + '@react-native/babel-plugin-codegen@0.80.2': + resolution: {integrity: sha512-q0XzdrdDebPwt5tEi2MSo90kpEcs4e3ZZskrbxda081DEjHhgm3bbIxAiW3BxY6adOf/eXxgOhKEGWTfG2me6g==} + engines: {node: '>=18'} + + '@react-native/babel-preset@0.80.2': + resolution: {integrity: sha512-vLtS8YJV0nAnOZ8kVJBaXzHlwvoMXpYB4/NBR1BuAesE+WTiAkXpDFnKSkXBHoS03d/5HYNVcW8VRaB2f0Jmtw==} + engines: {node: '>=18'} + peerDependencies: + '@babel/core': '*' + + '@react-native/codegen@0.80.2': + resolution: {integrity: sha512-eYad9ex9/RS6oFbbpu6LxsczktbhfJbJlTvtRlcWLJjJbFTeNr5Q7CgBT2/m5VtpxnJ/0YdmZ9vdazsJ2yp9kw==} + engines: {node: '>=18'} + peerDependencies: + '@babel/core': '*' + + '@react-native/community-cli-plugin@0.80.2': + resolution: {integrity: sha512-UBjsE+lv1YtThs56mgFaUdWv0jNE1oO58Lkbf3dn47F0e7YiTubIcvP6AnlaMhZF2Pmt9ky8J1jTpgItO9tGeg==} + engines: {node: '>=18'} + peerDependencies: + '@react-native-community/cli': '*' + peerDependenciesMeta: + '@react-native-community/cli': + optional: true + + '@react-native/debugger-frontend@0.80.2': + resolution: {integrity: sha512-n3D88bqNk0bY+YjNxbM6giqva06xj+rgEfu91Pg+nJ0szSL2eLl7ULERJqI3hxFt0XGuTpTOxZgw/Po5maXa4g==} + engines: {node: '>=18'} + + '@react-native/dev-middleware@0.80.2': + resolution: {integrity: sha512-8OeBEZNiApdbZaqTrrzeyFwXn/JwgJox7jdtjVAH56DggTVJXdbnyUjQ4ts6XAacEQgpFOAskoO730eyafOkAA==} + engines: {node: '>=18'} + + '@react-native/eslint-config@0.80.2': + resolution: {integrity: sha512-gcuMYuuG7XfM0gkDUHoWuOmXFQwFo6U4wkspJCnYnOuTB/uS/qghM2/CnpZVIhS9toFiQ1NO3ib829rdFz5NPg==} + engines: {node: '>=18'} + peerDependencies: + eslint: '>=8' + prettier: '>=2' + + '@react-native/eslint-plugin@0.80.2': + resolution: {integrity: sha512-I0HDmMGtChz6s9EShHasgZfiMUc6XtCAPMjR//jqTTav746eng98Z/zk25/nVeGCCD+X8KtlzHH9AUUqYv5sNQ==} + engines: {node: '>=18'} + + '@react-native/gradle-plugin@0.80.2': + resolution: {integrity: sha512-C5/FYbIfCXPFjF/hIcWFKC9rEadDDhPMbxE7tarGR9tmYKyb9o7fYvfNe8fFgbCRKelMHP0ShATz3T73pHHDfA==} + engines: {node: '>=18'} + + '@react-native/js-polyfills@0.80.2': + resolution: {integrity: sha512-f63M3paxHK92p6L9o+AY7hV/YojCZAhb+fdDpSfOtDtCngWbBhd6foJrO6IybzDFERxlwErupUg3pqr5w3KJWw==} + engines: {node: '>=18'} + + '@react-native/metro-babel-transformer@0.80.2': + resolution: {integrity: sha512-y5KqJpxxbTGIlPgnEeZmNesYyhHfhYKK3mSgeN49VRAj1kinauoXyowfRbpns5EvBzhcoe4uycI+n17U+BmqSA==} + engines: {node: '>=18'} + peerDependencies: + '@babel/core': '*' + + '@react-native/metro-config@0.80.2': + resolution: {integrity: sha512-Xn9q70ySQn4VfsYozRk3brLXyA8joqcFxZdYSNOzbwmXqqc30AC1KqNsjFnK+nE6H/JeqT2hCd+86OzkPzYVzA==} + engines: {node: '>=18'} + + '@react-native/normalize-colors@0.80.2': + resolution: {integrity: sha512-08Ax7554Z31NXi5SQ6h1GsiSrlZEOYHQNSC7u+x91Tdiq87IXldW8Ib1N3ThXoDcD8bjr+I+MdlabEJw36/fFg==} + + '@react-native/typescript-config@0.80.2': + resolution: {integrity: sha512-bq2WgQD0xN+VKBWCDSa7iKbJRUCVNjxjbB7Yzai8EKPSkoYjp08LeoEzPRr1wXJGeFI3OOwsSm/MZbUr72KmNA==} + + '@react-native/virtualized-lists@0.80.2': + resolution: {integrity: sha512-kXsIV2eB73QClbbH/z/lRhZkyj3Dke4tarM5w2yXSNwJthMPMfj4KqLZ6Lnf0nmPPjz7qo/voKtlrGqlM822Rg==} + engines: {node: '>=18'} + peerDependencies: + '@types/react': ^19.0.0 + react: '*' + react-native: '*' + peerDependenciesMeta: + '@types/react': + optional: true + + '@react-navigation/bottom-tabs@7.15.9': + resolution: {integrity: sha512-Ou28A1aZLj5wiFQ3F93aIsrI4NCwn3IJzkkjNo9KLFXsc0Yks+UqrVaFlffHFLsrbajuGRG/OQpnMA1ljayY5Q==} + peerDependencies: + '@react-navigation/native': ^7.2.2 + react: '>= 18.2.0' + react-native: '*' + react-native-safe-area-context: '>= 4.0.0' + react-native-screens: '>= 4.0.0' + + '@react-navigation/core@7.17.2': + resolution: {integrity: sha512-Rt2OZwcgOmjv401uLGAKaRM6xo0fiBce/A7LfRHI1oe5FV+KooWcgAoZ2XOtgKj6UzVMuQWt3b2e6rxo/mDJRA==} + peerDependencies: + react: '>= 18.2.0' + + '@react-navigation/elements@2.9.14': + resolution: {integrity: sha512-lKqzu+su2pI/YIZmR7L7xdOs4UL+rVXKJAMpRMBrwInEy96SjIFst6QDGpE89Dunnu3VjVpjWfByo9f2GWBHDQ==} + peerDependencies: + '@react-native-masked-view/masked-view': '>= 0.2.0' + '@react-navigation/native': ^7.2.2 + react: '>= 18.2.0' + react-native: '*' + react-native-safe-area-context: '>= 4.0.0' + peerDependenciesMeta: + '@react-native-masked-view/masked-view': + optional: true + + '@react-navigation/native-stack@7.14.11': + resolution: {integrity: sha512-1ufBtJ7KbVFlQhXsYSYHqjgkmP30AzJSgW48YjWMQZ3NZGAyYe34w9Wd4KpdebQCfDClPe9maU+8crA/awa6lQ==} + peerDependencies: + '@react-navigation/native': ^7.2.2 + react: '>= 18.2.0' + react-native: '*' + react-native-safe-area-context: '>= 4.0.0' + react-native-screens: '>= 4.0.0' + + '@react-navigation/native@7.2.2': + resolution: {integrity: sha512-kem1Ko2BcbAjmbQIv66dNmr6EtfDut3QU0qjsVhMnLLhktwyXb6FzZYp8gTrUb6AvkAbaJoi+BF5Pl55pAUa5w==} + peerDependencies: + react: '>= 18.2.0' + react-native: '*' + + '@react-navigation/routers@7.5.3': + resolution: {integrity: sha512-1tJHg4KKRJuQ1/EvJxatrMef3NZXEPzwUIUZ3n1yJ2t7Q97siwRtbynRpQG9/69ebbtiZ8W3ScOZF/OmhvM4Rg==} + + '@react-navigation/stack@7.8.10': + resolution: {integrity: sha512-Nwa9VOPAa7hD5Z+5S2Z3jLN8zUZwRJtz2NthFd0PKFzGPUS+6qw69PAO6J99qNBxhc+SEJ6nP+9o0ViLbCLs/A==} + peerDependencies: + '@react-navigation/native': ^7.2.2 + react: '>= 18.2.0' + react-native: '*' + react-native-gesture-handler: '>= 2.0.0' + react-native-safe-area-context: '>= 4.0.0' + react-native-screens: '>= 4.0.0' + + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinclair/typebox@0.34.37': + resolution: {integrity: sha512-2TRuQVgQYfy+EzHRTIvkhv2ADEouJ2xNS/Vq+W5EuuewBdOrvATvljZTxHWZSTYr2sTjTHpGvucaGAt67S2akw==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@sinonjs/fake-timers@13.0.5': + resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} + + '@testing-library/react-native@13.3.1': + resolution: {integrity: sha512-o7aGggPVEl/Samx26ubACT0nuQn8/n+1VfDZ3lJ6SFrK9IYkEvaMY2M5hHg9kYcImNFlgsmqc3FgN1VaLAkjyA==} + engines: {node: '>=18'} + peerDependencies: + jest: '>=29.0.0' + react: '>=18.2.0' + react-native: '>=0.71' + react-test-renderer: '>=18.2.0' + peerDependenciesMeta: + jest: + optional: true + + '@tsconfig/react-native@3.0.6': + resolution: {integrity: sha512-cWG+s5ZJfEBhaJbCs8QqeWhGbYHhUoq93+wOAdGzh1k/m7FkEmJkUTVsCVJ+rhLpwTNIVrLaHL/IUfBne5D6mw==} + + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.7': + resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.4': + resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/hammerjs@2.0.46': + resolution: {integrity: sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.14': + resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@20.9.3': + resolution: {integrity: sha512-nk5wXLAXGBKfrhLB0cyHGbSqopS+nz0BUgZkUQqSHSSgdee0kssp1IAqlQOu333bW+gMNs2QREx7iynm19Abxw==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/react-native-dotenv@0.2.2': + resolution: {integrity: sha512-YDgO2hdTK5PaxZrIFtVXrjeFOhJ+7A9a8VDUK4QmHCPGIB5i6DroLG9IpItX5qCshz7aPsQfgy9X3w82Otd4HA==} + + '@types/react-native-vector-icons@6.4.18': + resolution: {integrity: sha512-YGlNWb+k5laTBHd7+uZowB9DpIK3SXUneZqAiKQaj1jnJCZM0x71GDim5JCTMi4IFkhc9m8H/Gm28T5BjyivUw==} + + '@types/react-native@0.70.19': + resolution: {integrity: sha512-c6WbyCgWTBgKKMESj/8b4w+zWcZSsCforson7UdXtXMecG3MxCinYi6ihhrHVPyUrVzORsvEzK8zg32z4pK6Sg==} + + '@types/react-native@0.73.0': + resolution: {integrity: sha512-6ZRPQrYM72qYKGWidEttRe6M5DZBEV5F+MHMHqd4TTYx0tfkcdrUFGdef6CCxY0jXU7wldvd/zA/b0A/kTeJmA==} + deprecated: This is a stub types definition. react-native provides its own type definitions, so you do not need this installed. + + '@types/react-test-renderer@19.1.0': + resolution: {integrity: sha512-XD0WZrHqjNrxA/MaR9O22w/RNidWR9YZmBdRGI7wcnWGrv/3dA8wKCJ8m63Sn+tLJhcjmuhOi629N66W6kgWzQ==} + + '@types/react@19.1.12': + resolution: {integrity: sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==} + + '@types/semver@7.5.6': + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + + '@types/setimmediate@1.0.4': + resolution: {integrity: sha512-rWPw1drMVf5zInxNpgH3nn/h6KkWqwgLT2y/ciAYQ16RAsbXOXe0AmtZ/HyzwPNw+r4GMJuI7IV7YNKO7Fs/xA==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@15.0.19': + resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@unrs/resolver-binding-android-arm-eabi@1.9.2': + resolution: {integrity: sha512-tS+lqTU3N0kkthU+rYp0spAYq15DU8ld9kXkaKg9sbQqJNF+WPMuNHZQGCgdxrUOEO0j22RKMwRVhF1HTl+X8A==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.9.2': + resolution: {integrity: sha512-MffGiZULa/KmkNjHeuuflLVqfhqLv1vZLm8lWIyeADvlElJ/GLSOkoUX+5jf4/EGtfwrNFcEaB8BRas03KT0/Q==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.9.2': + resolution: {integrity: sha512-dzJYK5rohS1sYl1DHdJ3mwfwClJj5BClQnQSyAgEfggbUwA9RlROQSSbKBLqrGfsiC/VyrDPtbO8hh56fnkbsQ==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.9.2': + resolution: {integrity: sha512-gaIMWK+CWtXcg9gUyznkdV54LzQ90S3X3dn8zlh+QR5Xy7Y+Efqw4Rs4im61K1juy4YNb67vmJsCDAGOnIeffQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.9.2': + resolution: {integrity: sha512-S7QpkMbVoVJb0xwHFwujnwCAEDe/596xqY603rpi/ioTn9VDgBHnCCxh+UFrr5yxuMH+dliHfjwCZJXOPJGPnw==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.2': + resolution: {integrity: sha512-+XPUMCuCCI80I46nCDFbGum0ZODP5NWGiwS3Pj8fOgsG5/ctz+/zzuBlq/WmGa+EjWZdue6CF0aWWNv84sE1uw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.9.2': + resolution: {integrity: sha512-sqvUyAd1JUpwbz33Ce2tuTLJKM+ucSsYpPGl2vuFwZnEIg0CmdxiZ01MHQ3j6ExuRqEDUCy8yvkDKvjYFPb8Zg==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.9.2': + resolution: {integrity: sha512-UYA0MA8ajkEDCFRQdng/FVx3F6szBvk3EPnkTTQuuO9lV1kPGuTB+V9TmbDxy5ikaEgyWKxa4CI3ySjklZ9lFA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-arm64-musl@1.9.2': + resolution: {integrity: sha512-P/CO3ODU9YJIHFqAkHbquKtFst0COxdphc8TKGL5yCX75GOiVpGqd1d15ahpqu8xXVsqP4MGFP2C3LRZnnL5MA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.9.2': + resolution: {integrity: sha512-uKStFlOELBxBum2s1hODPtgJhY4NxYJE9pAeyBgNEzHgTqTiVBPjfTlPFJkfxyTjQEuxZbbJlJnMCrRgD7ubzw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.9.2': + resolution: {integrity: sha512-LkbNnZlhINfY9gK30AHs26IIVEZ9PEl9qOScYdmY2o81imJYI4IMnJiW0vJVtXaDHvBvxeAgEy5CflwJFIl3tQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-riscv64-musl@1.9.2': + resolution: {integrity: sha512-vI+e6FzLyZHSLFNomPi+nT+qUWN4YSj8pFtQZSFTtmgFoxqB6NyjxSjAxEC1m93qn6hUXhIsh8WMp+fGgxCoRg==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-s390x-gnu@1.9.2': + resolution: {integrity: sha512-sSO4AlAYhSM2RAzBsRpahcJB1msc6uYLAtP6pesPbZtptF8OU/CbCPhSRW6cnYOGuVmEmWVW5xVboAqCnWTeHQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-x64-gnu@1.9.2': + resolution: {integrity: sha512-jkSkwch0uPFva20Mdu8orbQjv2A3G88NExTN2oPTI1AJ+7mZfYW3cDCTyoH6OnctBKbBVeJCEqh0U02lTkqD5w==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-x64-musl@1.9.2': + resolution: {integrity: sha512-Uk64NoiTpQbkpl+bXsbeyOPRpUoMdcUqa+hDC1KhMW7aN1lfW8PBlBH4mJ3n3Y47dYE8qi0XTxy1mBACruYBaw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-wasm32-wasi@1.9.2': + resolution: {integrity: sha512-EpBGwkcjDicjR/ybC0g8wO5adPNdVuMrNalVgYcWi+gYtC1XYNuxe3rufcO7dA76OHGeVabcO6cSkPJKVcbCXQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.9.2': + resolution: {integrity: sha512-EdFbGn7o1SxGmN6aZw9wAkehZJetFPao0VGZ9OMBwKx6TkvDuj6cNeLimF/Psi6ts9lMOe+Dt6z19fZQ9Ye2fw==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.9.2': + resolution: {integrity: sha512-JY9hi1p7AG+5c/dMU8o2kWemM8I6VZxfGwn1GCtf3c5i+IKcMo2NQ8OjZ4Z3/itvY/Si3K10jOBQn7qsD/whUA==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.9.2': + resolution: {integrity: sha512-ryoo+EB19lMxAd80ln9BVf8pdOAxLb97amrQ3SFN9OCRn/5M5wvwDgAe4i8ZjhpbiHoDeP8yavcTEnpKBo7lZg==} + cpu: [x64] + os: [win32] + + '@vscode/sudo-prompt@9.3.1': + resolution: {integrity: sha512-9ORTwwS74VaTn38tNbQhsA5U44zkJfcb0BdTSyyG6frP4e8KMtHuTXYmwefe5dpL8XB1aGSIVTaLjD3BbWb5iA==} + + '@wry/caches@1.0.1': + resolution: {integrity: sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==} + engines: {node: '>=8'} + + '@wry/context@0.7.4': + resolution: {integrity: sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==} + engines: {node: '>=8'} + + '@wry/equality@0.5.7': + resolution: {integrity: sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==} + engines: {node: '>=8'} + + '@wry/trie@0.5.0': + resolution: {integrity: sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==} + engines: {node: '>=8'} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + anser@1.4.10: + resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-fragments@0.2.1: + resolution: {integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==} + + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + appdirsjs@1.2.7: + resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + + array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.2: + resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} + + arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + astral-regex@1.0.0: + resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} + engines: {node: '>=4'} + + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + asynciterator.prototype@1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-jest@30.0.5: + resolution: {integrity: sha512-mRijnKimhGDMsizTvBTWotwNpzrkHr+VvZUQBof2AufXKB8NXrL1W69TG20EvOz7aevx6FTJIaBuBkYxS8zolg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-istanbul@7.0.0: + resolution: {integrity: sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==} + engines: {node: '>=12'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-plugin-jest-hoist@30.0.1: + resolution: {integrity: sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + babel-plugin-module-resolver@5.0.3: + resolution: {integrity: sha512-h8h6H71ZvdLJZxZrYkaeR30BojTaV7O9GfqacY14SNj5CNB8ocL9tydNzTC0JrnNN7vY3eJhwCmkDj7tuEUaqQ==} + + babel-plugin-polyfill-corejs2@0.4.14: + resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.5: + resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-syntax-hermes-parser@0.28.1: + resolution: {integrity: sha512-meT17DOuUElMNsL5LZN56d+KBp22hb0EfxWfuPUeoSi54e40v1W4C2V36P75FpsH9fVEfDKpw5Nnkahc8haSsQ==} + + babel-plugin-transform-flow-enums@0.0.2: + resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} + + babel-preset-current-node-syntax@1.1.0: + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@30.0.1: + resolution: {integrity: sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.25.3: + resolution: {integrity: sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + caller-callsite@2.0.0: + resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} + engines: {node: '>=4'} + + caller-path@2.0.0: + resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} + engines: {node: '>=4'} + + callsites@2.0.0: + resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} + engines: {node: '>=4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001737: + resolution: {integrity: sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + chrome-launcher@0.15.2: + resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} + engines: {node: '>=12.13.0'} + hasBin: true + + chromium-edge-launcher@0.2.0: + resolution: {integrity: sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + ci-info@4.2.0: + resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} + engines: {node: '>=8'} + + cjs-module-lexer@2.1.0: + resolution: {integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + + command-exists@1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.8.1: + resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} + engines: {node: '>= 0.8.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + core-js-compat@3.45.1: + resolution: {integrity: sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==} + + cosmiconfig@5.2.1: + resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} + engines: {node: '>=4'} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + dayjs@1.11.15: + resolution: {integrity: sha512-MC+DfnSWiM9APs7fpiurHGCoeIx0Gdl6QZBy+5lu8MbYKN5FZEXqOgrundfibdfhGZ15o9hzmZ2xJjZnbvgKXQ==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + + dedent@1.6.0: + resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + del@6.1.1: + resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} + engines: {node: '>=10'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.209: + resolution: {integrity: sha512-Xoz0uMrim9ZETCQt8UgM5FxQF9+imA7PBpokoGcZloA1uw2LeHzTlip5cb5KOAsXZLjh/moN2vReN3ZjJmjI9A==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + envinfo@7.14.0: + resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} + engines: {node: '>=4'} + hasBin: true + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + + errorhandler@1.5.1: + resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} + engines: {node: '>= 0.8'} + + es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.0.15: + resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@8.10.0: + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-eslint-comments@3.2.0: + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} + peerDependencies: + eslint: '>=4.19.1' + + eslint-plugin-ft-flow@2.0.3: + resolution: {integrity: sha512-Vbsd/b+LYA99jUbsL6viEUWShFaYQt2YQs3QN3f+aeszOhh2sgdcU0mjzDyD4yyBvMc8qy2uwvBBWfMzEX06tg==} + engines: {node: '>=12.22.0'} + peerDependencies: + '@babel/eslint-parser': ^7.12.0 + eslint: ^8.1.0 + + eslint-plugin-jest@27.9.0: + resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 || ^7.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + + eslint-plugin-prettier@5.5.4: + resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react-native-globals@0.1.2: + resolution: {integrity: sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g==} + + eslint-plugin-react-native@4.1.0: + resolution: {integrity: sha512-QLo7rzTBOl43FvVqDdq5Ql9IoElIuTdjrz9SKAXCvULvBoRZ44JGSkx9z4999ZusCsb4rK3gjS8gOGyeYqZv2Q==} + peerDependencies: + eslint: ^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-react@7.33.2: + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit-x@0.2.2: + resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} + engines: {node: '>= 0.8.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + expect@30.0.5: + resolution: {integrity: sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-xml-parser@4.5.3: + resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} + hasBin: true + + fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + + find-babel-config@2.1.2: + resolution: {integrity: sha512-ZfZp1rQyp4gyuxqt1ZqjFGVeVBvmpURMqdIWXbPRfB97Bf6BzdK/xSIbylEINzQ0kB5tlDQfn9HkNXXWsqTqLg==} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + + flow-enums-runtime@0.0.6: + resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + glob@9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + graphql-tag@2.12.6: + resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} + engines: {node: '>=10'} + peerDependencies: + graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + graphql@16.13.2: + resolution: {integrity: sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hermes-estree@0.28.1: + resolution: {integrity: sha512-w3nxl/RGM7LBae0v8LH2o36+8VqwOZGv9rX1wyoWT6YaKZLqpJZ0YQ5P0LVr3tuRpf7vCx0iIG4i/VmBJejxTQ==} + + hermes-estree@0.29.1: + resolution: {integrity: sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==} + + hermes-parser@0.28.1: + resolution: {integrity: sha512-nf8o+hE8g7UJWParnccljHumE9Vlq8F7MqIdeahl+4x0tvCUJYRrT0L7h0MMg/X9YJmkNwsfbaNNrzPtFXOscg==} + + hermes-parser@0.29.1: + resolution: {integrity: sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + image-size@1.0.2: + resolution: {integrity: sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==} + engines: {node: '>=14.0.0'} + hasBin: true + + import-fresh@2.0.0: + resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} + engines: {node: '>=4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} + engines: {node: '>= 0.4'} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + is-absolute@1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} + + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-directory@0.3.1: + resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} + engines: {node: '>=0.10.0'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-git-dirty@2.0.2: + resolution: {integrity: sha512-U3YCo+GKR/rDsY7r0v/LBICbQwsx859tDQnAT+v0E/zCDeWbQ1TUt1FtyExeyik7VIJlYOLHCIifLdz71HDalg==} + engines: {node: '>=10'} + + is-git-repository@2.0.0: + resolution: {integrity: sha512-HDO50CG5suIAcmqG4F1buqVXEZRPn+RaXIn9pFKq/947FBo2bCRwK7ZluEVZOy99a4IQyqsjbKEpAiOXCccOHQ==} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + + is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-cwd@2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-relative@1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} + + is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + + is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unc-path@1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@1.1.0: + resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} + engines: {node: '>=4'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} + + iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + jest-changed-files@30.0.5: + resolution: {integrity: sha512-bGl2Ntdx0eAwXuGpdLdVYVr5YQHnSZlQ0y9HVDu565lCUAe9sj6JOtBbMmBBikGIegne9piDDIOeiLVoqTkz4A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-circus@30.0.5: + resolution: {integrity: sha512-h/sjXEs4GS+NFFfqBDYT7y5Msfxh04EwWLhQi0F8kuWpe+J/7tICSlswU8qvBqumR3kFgHbfu7vU6qruWWBPug==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-cli@30.0.5: + resolution: {integrity: sha512-Sa45PGMkBZzF94HMrlX4kUyPOwUpdZasaliKN3mifvDmkhLYqLLg8HQTzn6gq7vJGahFYMQjXgyJWfYImKZzOw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@30.0.5: + resolution: {integrity: sha512-aIVh+JNOOpzUgzUnPn5FLtyVnqc3TQHVMupYtyeURSb//iLColiMIR8TxCIDKyx9ZgjKnXGucuW68hCxgbrwmA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@types/node': '*' + esbuild-register: '>=3.4.0' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + esbuild-register: + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-diff@30.0.5: + resolution: {integrity: sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-docblock@30.0.1: + resolution: {integrity: sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-each@30.0.5: + resolution: {integrity: sha512-dKjRsx1uZ96TVyejD3/aAWcNKy6ajMaN531CwWIsrazIqIoXI9TnnpPlkrEYku/8rkS3dh2rbH+kMOyiEIv0xQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-node@30.0.5: + resolution: {integrity: sha512-ppYizXdLMSvciGsRsMEnv/5EFpvOdXBaXRBzFUDPWrsfmog4kYrOGWXarLllz6AXan6ZAA/kYokgDWuos1IKDA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@30.0.5: + resolution: {integrity: sha512-dkmlWNlsTSR0nH3nRfW5BKbqHefLZv0/6LCccG0xFCTWcJu8TuEwG+5Cm75iBfjVoockmO6J35o5gxtFSn5xeg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-leak-detector@30.0.5: + resolution: {integrity: sha512-3Uxr5uP8jmHMcsOtYMRB/zf1gXN3yUIc+iPorhNETG54gErFIiUhLvyY/OggYpSMOEYqsmRxmuU4ZOoX5jpRFg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@30.0.5: + resolution: {integrity: sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@30.0.5: + resolution: {integrity: sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@30.0.5: + resolution: {integrity: sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-regex-util@30.0.1: + resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve-dependencies@30.0.5: + resolution: {integrity: sha512-/xMvBR4MpwkrHW4ikZIWRttBBRZgWK4d6xt3xW1iRDSKt4tXzYkMkyPfBnSCgv96cpkrctfXs6gexeqMYqdEpw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve@30.0.5: + resolution: {integrity: sha512-d+DjBQ1tIhdz91B79mywH5yYu76bZuE96sSbxj8MkjWVx5WNdt1deEFRONVL4UkKLSrAbMkdhb24XN691yDRHg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runner@30.0.5: + resolution: {integrity: sha512-JcCOucZmgp+YuGgLAXHNy7ualBx4wYSgJVWrYMRBnb79j9PD0Jxh0EHvR5Cx/r0Ce+ZBC4hCdz2AzFFLl9hCiw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runtime@30.0.5: + resolution: {integrity: sha512-7oySNDkqpe4xpX5PPiJTe5vEa+Ak/NnNz2bGYZrA1ftG3RL3EFlHaUkA1Cjx+R8IhK0Vg43RML5mJedGTPNz3A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-snapshot@30.0.5: + resolution: {integrity: sha512-T00dWU/Ek3LqTp4+DcW6PraVxjk28WY5Ua/s+3zUKSERZSNyxTqhDXCWKG5p2HAJ+crVQ3WJ2P9YVHpj1tkW+g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@30.0.5: + resolution: {integrity: sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@30.0.5: + resolution: {integrity: sha512-ouTm6VFHaS2boyl+k4u+Qip4TSH7Uld5tyD8psQ8abGgt2uYYB8VwVfAHWHjHc0NWmGGbwO5h0sCPOGHHevefw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-watcher@30.0.5: + resolution: {integrity: sha512-z9slj/0vOwBDBjN3L4z4ZYaA+pG56d6p3kTUhFRYGvXbXMWhXmb/FIxREZCD06DYUwDKKnj2T80+Pb71CQ0KEg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@30.0.5: + resolution: {integrity: sha512-ojRXsWzEP16NdUuBw/4H/zkZdHOa7MMYCk4E430l+8fELeLg/mqmMlRhjL7UNZvQrDmnovWZV4DxX03fZF48fQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest@30.0.5: + resolution: {integrity: sha512-y2mfcJywuTUkvLm2Lp1/pFX8kTgMO5yyQGq/Sk/n2mN7XWYp4JsCZ/QXW34M8YScgk8bPZlREH04f6blPnoHnQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + joi@17.13.3: + resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + + jotai@2.19.1: + resolution: {integrity: sha512-sqm9lVZiqBHZH8aSRk32DSiZDHY3yUIlulXYn9GQj7/LvoUdYXSMti7ZPJGo+6zjzKFt5a25k/I6iBCi43PJcw==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@babel/core': '>=7.0.0' + '@babel/template': '>=7.0.0' + '@types/react': '>=17.0.0' + react: '>=17.0.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@babel/template': + optional: true + '@types/react': + optional: true + react: + optional: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsc-safe-url@0.2.4: + resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + launch-editor@2.11.1: + resolution: {integrity: sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lighthouse-logger@1.4.2: + resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + logkitty@0.7.1: + resolution: {integrity: sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==} + hasBin: true + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@10.0.3: + resolution: {integrity: sha512-B7gr+F6MkqB3uzINHXNctGieGsRTMwIBgxkp0yq/5BwcuDzD4A8wQpHQW6vDAm1uKSLQghmRdD9sKqf2vJ1cEg==} + engines: {node: 14 || >=16.14} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + marky@1.2.5: + resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + metro-babel-transformer@0.82.5: + resolution: {integrity: sha512-W/scFDnwJXSccJYnOFdGiYr9srhbHPdxX9TvvACOFsIXdLilh3XuxQl/wXW6jEJfgIb0jTvoTlwwrqvuwymr6Q==} + engines: {node: '>=18.18'} + + metro-cache-key@0.82.5: + resolution: {integrity: sha512-qpVmPbDJuRLrT4kcGlUouyqLGssJnbTllVtvIgXfR7ZuzMKf0mGS+8WzcqzNK8+kCyakombQWR0uDd8qhWGJcA==} + engines: {node: '>=18.18'} + + metro-cache@0.82.5: + resolution: {integrity: sha512-AwHV9607xZpedu1NQcjUkua8v7HfOTKfftl6Vc9OGr/jbpiJX6Gpy8E/V9jo/U9UuVYX2PqSUcVNZmu+LTm71Q==} + engines: {node: '>=18.18'} + + metro-config@0.82.5: + resolution: {integrity: sha512-/r83VqE55l0WsBf8IhNmc/3z71y2zIPe5kRSuqA5tY/SL/ULzlHUJEMd1szztd0G45JozLwjvrhAzhDPJ/Qo/g==} + engines: {node: '>=18.18'} + + metro-core@0.82.5: + resolution: {integrity: sha512-OJL18VbSw2RgtBm1f2P3J5kb892LCVJqMvslXxuxjAPex8OH7Eb8RBfgEo7VZSjgb/LOf4jhC4UFk5l5tAOHHA==} + engines: {node: '>=18.18'} + + metro-file-map@0.82.5: + resolution: {integrity: sha512-vpMDxkGIB+MTN8Af5hvSAanc6zXQipsAUO+XUx3PCQieKUfLwdoa8qaZ1WAQYRpaU+CJ8vhBcxtzzo3d9IsCIQ==} + engines: {node: '>=18.18'} + + metro-minify-terser@0.82.5: + resolution: {integrity: sha512-v6Nx7A4We6PqPu/ta1oGTqJ4Usz0P7c+3XNeBxW9kp8zayS3lHUKR0sY0wsCHInxZlNAEICx791x+uXytFUuwg==} + engines: {node: '>=18.18'} + + metro-resolver@0.82.5: + resolution: {integrity: sha512-kFowLnWACt3bEsuVsaRNgwplT8U7kETnaFHaZePlARz4Fg8tZtmRDUmjaD68CGAwc0rwdwNCkWizLYpnyVcs2g==} + engines: {node: '>=18.18'} + + metro-runtime@0.82.5: + resolution: {integrity: sha512-rQZDoCUf7k4Broyw3Ixxlq5ieIPiR1ULONdpcYpbJQ6yQ5GGEyYjtkztGD+OhHlw81LCR2SUAoPvtTus2WDK5g==} + engines: {node: '>=18.18'} + + metro-source-map@0.82.5: + resolution: {integrity: sha512-wH+awTOQJVkbhn2SKyaw+0cd+RVSCZ3sHVgyqJFQXIee/yLs3dZqKjjeKKhhVeudgjXo7aE/vSu/zVfcQEcUfw==} + engines: {node: '>=18.18'} + + metro-symbolicate@0.82.5: + resolution: {integrity: sha512-1u+07gzrvYDJ/oNXuOG1EXSvXZka/0JSW1q2EYBWerVKMOhvv9JzDGyzmuV7hHbF2Hg3T3S2uiM36sLz1qKsiw==} + engines: {node: '>=18.18'} + hasBin: true + + metro-transform-plugins@0.82.5: + resolution: {integrity: sha512-57Bqf3rgq9nPqLrT2d9kf/2WVieTFqsQ6qWHpEng5naIUtc/Iiw9+0bfLLWSAw0GH40iJ4yMjFcFJDtNSYynMA==} + engines: {node: '>=18.18'} + + metro-transform-worker@0.82.5: + resolution: {integrity: sha512-mx0grhAX7xe+XUQH6qoHHlWedI8fhSpDGsfga7CpkO9Lk9W+aPitNtJWNGrW8PfjKEWbT9Uz9O50dkI8bJqigw==} + engines: {node: '>=18.18'} + + metro@0.82.5: + resolution: {integrity: sha512-8oAXxL7do8QckID/WZEKaIFuQJFUTLzfVcC48ghkHhNK2RGuQq8Xvf4AVd+TUA0SZtX0q8TGNXZ/eba1ckeGCg==} + engines: {node: '>=18.18'} + hasBin: true + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + + minimatch@8.0.7: + resolution: {integrity: sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + + minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-postinstall@0.2.5: + resolution: {integrity: sha512-kmsgUvCRIJohHjbZ3V8avP0I1Pekw329MVAMDzVxsrkjgdnqiwvMX5XwR+hWV66vsAtZ+iM+fVnq8RTQawUmCQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + nocache@3.0.4: + resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==} + engines: {node: '>=12.0.0'} + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + node-stream-zip@1.15.0: + resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} + engines: {node: '>=0.12.0'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + + ob1@0.82.5: + resolution: {integrity: sha512-QyQQ6e66f+Ut/qUVjEce0E/wux5nAGLXYZDn1jr15JWstHsCH3l6VVrg8NKDptW9NEiBXKOJeGF/ydxeSDF3IQ==} + engines: {node: '>=18.18'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.7: + resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + engines: {node: '>= 0.4'} + + object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + + object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.1.0: + resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@6.4.0: + resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} + engines: {node: '>=8'} + + open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + + optimism@0.18.1: + resolution: {integrity: sha512-mLXNwWPa9dgFyDqkNi54sjDyNJ9/fTI6WGBLgnXku1vdKY/jovHfZT5r+aiVeFFLOz+foPNOm5YJ4mqgld2GBQ==} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@26.6.2: + resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} + engines: {node: '>= 10'} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-format@30.0.5: + resolution: {integrity: sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@7.0.1: + resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + react-devtools-core@6.1.5: + resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==} + + react-freeze@1.0.4: + resolution: {integrity: sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==} + engines: {node: '>=10'} + peerDependencies: + react: '>=17.0.0' + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-is@19.1.1: + resolution: {integrity: sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==} + + react-native-builder-bob@0.23.2: + resolution: {integrity: sha512-ehv2XKS9cvPR5JR7FIpSx3qY7tULkljT2Kb82FBAxXsFLjqlRU1WfqHRLh6lytL2XqAxLQODpPfHUH53SsXnag==} + engines: {node: '>= 18.0.0'} + hasBin: true + + react-native-config@1.5.6: + resolution: {integrity: sha512-UB3LEco0FGGbbGvS+DfH2VmGKiP/y5C2MkmfBmfsIaxHSbM1KOTMKYG7YRf6xFhZbJ/01BedHG7SIny5i7N9BQ==} + peerDependencies: + react-native-windows: '>=0.61' + peerDependenciesMeta: + react-native-windows: + optional: true + + react-native-dotenv@3.4.11: + resolution: {integrity: sha512-6vnIE+WHABSeHCaYP6l3O1BOEhWxKH6nHAdV7n/wKn/sciZ64zPPp2NUdEUf1m7g4uuzlLbjgr+6uDt89q2DOg==} + peerDependencies: + '@babel/runtime': ^7.20.6 + + react-native-encrypted-storage@4.0.3: + resolution: {integrity: sha512-0pJA4Aj2S1PIJEbU7pN/Qvf7JIJx3hFywx+i+bLHtgK0/6Zryf1V2xVsWcrD50dfiu3jY1eN2gesQ5osGxE7jA==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-gesture-handler@2.26.0: + resolution: {integrity: sha512-pfE1j9Vzu0qpWj/Aq1IK+cYnougN69mCKvWuq1rdNjH2zs1WIszF0Mum9/oGQTemgjyc/JgiqOOTgwcleAMAGg==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-gradle-plugin@0.71.19: + resolution: {integrity: sha512-1dVk9NwhoyKHCSxcrM6vY6cxmojeATsBobDicX0ZKr7DgUF2cBQRTKsimQFvzH8XhOVXyH8p4HyDSZNIFI8OlQ==} + + react-native-is-edge-to-edge@1.1.7: + resolution: {integrity: sha512-EH6i7E8epJGIcu7KpfXYXiV2JFIYITtq+rVS8uEb+92naMRBdxhTuS8Wn2Q7j9sqyO0B+Xbaaf9VdipIAmGW4w==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-is-edge-to-edge@1.3.1: + resolution: {integrity: sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-nitro-modules@0.33.9: + resolution: {integrity: sha512-BM9C5mCGYYjrc8CDWZZ0anLWU/knH2xaEuFzvzogKTOW6fzgS6mmsCdM3ty+AhImJNSYwK19DLrHaqwnrrwEzw==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-quick-base64@2.2.2: + resolution: {integrity: sha512-WLHSifHLoamr2kF00Gov0W9ud6CfPshe1rmqWTquVIi9c62qxOaJCFVDrXFZhEBU8B8PvGLVuOlVKH78yhY0Fg==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-quick-crypto@1.0.9: + resolution: {integrity: sha512-SAugK0DZg8Q0ELkPWZnzFabbRngZQh0BjwXEMpXH3YQgiM1vVHnb83YOdOTcBmUnM/mAKz+PW9lrvccloNwjbA==} + peerDependencies: + expo: '>=48.0.0' + expo-build-properties: '*' + react: '*' + react-native: '*' + react-native-nitro-modules: '>=0.29.1' + react-native-quick-base64: '>=2.1.0' + peerDependenciesMeta: + expo: + optional: true + expo-build-properties: + optional: true + + react-native-reanimated@3.18.0: + resolution: {integrity: sha512-eVcNcqeOkMW+BUWAHdtvN3FKgC8J8wiEJkX6bNGGQaLS7m7e4amTfjIcqf/Ta+lerZLurmDaQ0lICI1CKPrb1Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + react: '*' + react-native: '*' + + react-native-safe-area-context@5.7.0: + resolution: {integrity: sha512-/9/MtQz8ODphjsLdZ+GZAIcC/RtoqW9EeShf7Uvnfgm/pzYrJ75y3PV/J1wuAV1T5Dye5ygq4EAW20RoBq0ABQ==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-screens@4.16.0: + resolution: {integrity: sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-vector-icons@10.3.0: + resolution: {integrity: sha512-IFQ0RE57819hOUdFvgK4FowM5aMXg7C7XKsuGLevqXkkIJatc3QopN0wYrb2IrzUgmdpfP+QVIbI3S6h7M0btw==} + deprecated: react-native-vector-icons package has moved to a new model of per-icon-family packages. See the https://github.com/oblador/react-native-vector-icons/blob/master/MIGRATION.md on how to migrate + hasBin: true + + react-native-webview@13.16.1: + resolution: {integrity: sha512-If0eHhoEdOYDcHsX+xBFwHMbWBGK1BvGDQDQdVkwtSIXiq1uiqjkpWVP2uQ1as94J0CzvFE9PUNDuhiX0Z6ubw==} + peerDependencies: + react: '*' + react-native: '*' + + react-native@0.80.2: + resolution: {integrity: sha512-6ySV4qTJo/To3lgpG/9Mcg/ZtvExqOVZuT7JVGcO5rS2Bjvl/yUAkQF0hTnbRb2Ch6T5MlKghrM4OeHX+KA9Pg==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@types/react': ^19.1.0 + react: ^19.1.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + + react-test-renderer@19.1.0: + resolution: {integrity: sha512-jXkSl3CpvPYEF+p/eGDLB4sPoDX8pKkYvRl9+rR8HxLY0X04vW7hCm1/0zHoUSjPZ3bDa+wXWNTDVIw/R8aDVw==} + peerDependencies: + react: ^19.1.0 + + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + reflect.getprototypeof@1.0.4: + resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} + + regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + hasBin: true + + rehackt@0.1.0: + resolution: {integrity: sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw==} + peerDependencies: + '@types/react': '*' + react: '*' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + reselect@4.1.8: + resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@3.0.0: + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: '>=4'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serialize-error@2.1.0: + resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} + engines: {node: '>=0.10.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sf-symbols-typescript@2.2.0: + resolution: {integrity: sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw==} + engines: {node: '>=10'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@2.1.0: + resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} + engines: {node: '>=6'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + stacktrace-parser@0.1.10: + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: '>=6'} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-natural-compare@3.0.1: + resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.matchall@4.0.10: + resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + + string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + + string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + + synckit@0.11.8: + resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} + engines: {node: ^14.18.0 || >=16.0.0} + + terser@5.24.0: + resolution: {integrity: sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + throat@5.0.0: + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-invariant@0.10.3: + resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==} + engines: {node: '>=8'} + + ts-jest@29.4.1: + resolution: {integrity: sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 || ^30.0.0 + '@jest/types': ^29.0.0 || ^30.0.0 + babel-jest: ^29.0.0 || ^30.0.0 + esbuild: '*' + jest: ^29.0.0 || ^30.0.0 + jest-util: ^29.0.0 || ^30.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/transform': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + jest-util: + optional: true + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + turbo-darwin-64@1.13.4: + resolution: {integrity: sha512-A0eKd73R7CGnRinTiS7txkMElg+R5rKFp9HV7baDiEL4xTG1FIg/56Vm7A5RVgg8UNgG2qNnrfatJtb+dRmNdw==} + cpu: [x64] + os: [darwin] + + turbo-darwin-arm64@1.13.4: + resolution: {integrity: sha512-eG769Q0NF6/Vyjsr3mKCnkG/eW6dKMBZk6dxWOdrHfrg6QgfkBUk0WUUujzdtVPiUIvsh4l46vQrNVd9EOtbyA==} + cpu: [arm64] + os: [darwin] + + turbo-linux-64@1.13.4: + resolution: {integrity: sha512-Bq0JphDeNw3XEi+Xb/e4xoKhs1DHN7OoLVUbTIQz+gazYjigVZvtwCvgrZI7eW9Xo1eOXM2zw2u1DGLLUfmGkQ==} + cpu: [x64] + os: [linux] + + turbo-linux-arm64@1.13.4: + resolution: {integrity: sha512-BJcXw1DDiHO/okYbaNdcWN6szjXyHWx9d460v6fCHY65G8CyqGU3y2uUTPK89o8lq/b2C8NK0yZD+Vp0f9VoIg==} + cpu: [arm64] + os: [linux] + + turbo-windows-64@1.13.4: + resolution: {integrity: sha512-OFFhXHOFLN7A78vD/dlVuuSSVEB3s9ZBj18Tm1hk3aW1HTWTuAw0ReN6ZNlVObZUHvGy8d57OAGGxf2bT3etQw==} + cpu: [x64] + os: [win32] + + turbo-windows-arm64@1.13.4: + resolution: {integrity: sha512-u5A+VOKHswJJmJ8o8rcilBfU5U3Y1TTAfP9wX8bFh8teYF1ghP0EhtMRLjhtp6RPa+XCxHHVA2CiC3gbh5eg5g==} + cpu: [arm64] + os: [win32] + + turbo@1.13.4: + resolution: {integrity: sha512-1q7+9UJABuBAHrcC4Sxp5lOqYS5mvxRrwa33wpIyM18hlOCpRD/fTJNxZ0vhbMcJmz15o9kkVm743mPn7p6jpQ==} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + engines: {node: '>=14.17'} + hasBin: true + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + unc-path-regex@0.1.2: + resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} + engines: {node: '>=0.10.0'} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unrs-resolver@1.9.2: + resolution: {integrity: sha512-VUyWiTNQD7itdiMuJy+EuLEErLj3uwX/EpHQF8EOf33Dq3Ju6VW1GXm+swk6+1h7a49uv9fKZ+dft9jU7esdLA==} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-latest-callback@0.2.6: + resolution: {integrity: sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==} + peerDependencies: + react: '>=16.8' + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + v8-to-istanbul@9.1.3: + resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==} + engines: {node: '>=10.12.0'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vlq@1.0.1: + resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + warn-once@0.1.1: + resolution: {integrity: sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + whatwg-fetch@3.6.19: + resolution: {integrity: sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + + which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ws@6.2.3: + resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@1.10.3: + resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} + engines: {node: '>= 6'} + + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zen-observable-ts@1.2.5: + resolution: {integrity: sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==} + + zen-observable@0.8.15: + resolution: {integrity: sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==} + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@ampproject/remapping@2.2.1': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + + '@apollo/client@3.14.1(@types/react@19.1.12)(graphql@16.13.2)(react@19.1.0)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.13.2) + '@wry/caches': 1.0.1 + '@wry/equality': 0.5.7 + '@wry/trie': 0.5.0 + graphql: 16.13.2 + graphql-tag: 2.12.6(graphql@16.13.2) + hoist-non-react-statics: 3.3.2 + optimism: 0.18.1 + prop-types: 15.8.1 + rehackt: 0.1.0(@types/react@19.1.12)(react@19.1.0) + symbol-observable: 4.0.0 + ts-invariant: 0.10.3 + tslib: 2.8.1 + zen-observable-ts: 1.2.5 + optionalDependencies: + react: 19.1.0 + transitivePeerDependencies: + - '@types/react' + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.0': {} + + '@babel/core@7.28.3': + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helpers': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/eslint-parser@7.28.0(@babel/core@7.28.3)(eslint@8.57.1)': + dependencies: + '@babel/core': 7.28.3 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.57.1 + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 + + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + jsesc: 3.0.2 + + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + jsesc: 3.0.2 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.2 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.3) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.29.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.2.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.1 + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.28.5': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.2 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-plugin-utils@7.28.6': {} + + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.3 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.28.6(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helper-wrap-function@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + + '@babel/parser@7.28.3': + dependencies: + '@babel/types': 7.28.2 + + '@babel/parser@7.29.2': + dependencies: + '@babel/types': 7.29.0 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-export-default-from@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.3) + + '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-export-default-from@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.3) + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-block-scoping@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 + + '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.3) + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-object-rest-spread@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.3) + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regenerator@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-runtime@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.3) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.3) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.3) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/preset-env@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.28.3) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.3) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.3) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.3) + '@babel/plugin-transform-classes': 7.28.3(@babel/core@7.28.3) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-object-rest-spread': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.3) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-regenerator': 7.28.3(@babel/core@7.28.3) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.3) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.3) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.3) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.3) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.3) + core-js-compat: 3.45.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-flow@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.3) + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.2 + esutils: 2.0.3 + + '@babel/preset-react@7.28.5(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.28.5(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + '@babel/runtime@7.28.3': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + + '@babel/traverse@7.28.3': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.3 + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.2': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@bcoe/v8-coverage@0.2.3': {} + + '@craftzdog/react-native-buffer@6.1.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)': + dependencies: + ieee754: 1.2.1 + react-native-quick-base64: 2.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + transitivePeerDependencies: + - react + - react-native + + '@egjs/hammerjs@2.0.17': + dependencies: + '@types/hammerjs': 2.0.46 + + '@emnapi/core@1.4.3': + dependencies: + '@emnapi/wasi-threads': 1.0.2 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.4.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.0.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.1 + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@graphql-typed-document-node/core@3.2.0(graphql@16.13.2)': + dependencies: + graphql: 16.13.2 + + '@hapi/hoek@9.3.0': {} + + '@hapi/topo@5.1.0': + dependencies: + '@hapi/hoek': 9.3.0 + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.1 + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/ttlcache@1.4.1': {} + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@30.0.5': + dependencies: + '@jest/types': 30.0.5 + '@types/node': 20.9.3 + chalk: 4.1.2 + jest-message-util: 30.0.5 + jest-util: 30.0.5 + slash: 3.0.0 + + '@jest/core@30.0.5': + dependencies: + '@jest/console': 30.0.5 + '@jest/pattern': 30.0.1 + '@jest/reporters': 30.0.5 + '@jest/test-result': 30.0.5 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 20.9.3 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 4.2.0 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-changed-files: 30.0.5 + jest-config: 30.0.5(@types/node@20.9.3) + jest-haste-map: 30.0.5 + jest-message-util: 30.0.5 + jest-regex-util: 30.0.1 + jest-resolve: 30.0.5 + jest-resolve-dependencies: 30.0.5 + jest-runner: 30.0.5 + jest-runtime: 30.0.5 + jest-snapshot: 30.0.5 + jest-util: 30.0.5 + jest-validate: 30.0.5 + jest-watcher: 30.0.5 + micromatch: 4.0.8 + pretty-format: 30.0.5 + slash: 3.0.0 + transitivePeerDependencies: + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + '@jest/create-cache-key-function@29.7.0': + dependencies: + '@jest/types': 29.6.3 + + '@jest/diff-sequences@30.0.1': {} + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.9.3 + jest-mock: 29.7.0 + + '@jest/environment@30.0.5': + dependencies: + '@jest/fake-timers': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 20.9.3 + jest-mock: 30.0.5 + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/expect-utils@30.0.5': + dependencies: + '@jest/get-type': 30.0.1 + + '@jest/expect@30.0.5': + dependencies: + expect: 30.0.5 + jest-snapshot: 30.0.5 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 20.9.3 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/fake-timers@30.0.5': + dependencies: + '@jest/types': 30.0.5 + '@sinonjs/fake-timers': 13.0.5 + '@types/node': 20.9.3 + jest-message-util: 30.0.5 + jest-mock: 30.0.5 + jest-util: 30.0.5 + + '@jest/get-type@30.0.1': {} + + '@jest/globals@30.0.5': + dependencies: + '@jest/environment': 30.0.5 + '@jest/expect': 30.0.5 + '@jest/types': 30.0.5 + jest-mock: 30.0.5 + transitivePeerDependencies: + - supports-color + + '@jest/pattern@30.0.1': + dependencies: + '@types/node': 20.9.3 + jest-regex-util: 30.0.1 + + '@jest/reporters@30.0.5': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 30.0.5 + '@jest/test-result': 30.0.5 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + '@jridgewell/trace-mapping': 0.3.30 + '@types/node': 20.9.3 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit-x: 0.2.2 + glob: 10.3.10 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.6 + jest-message-util: 30.0.5 + jest-util: 30.0.5 + jest-worker: 30.0.5 + slash: 3.0.0 + string-length: 4.0.2 + v8-to-istanbul: 9.1.3 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/schemas@30.0.5': + dependencies: + '@sinclair/typebox': 0.34.37 + + '@jest/snapshot-utils@30.0.5': + dependencies: + '@jest/types': 30.0.5 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 + + '@jest/source-map@30.0.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.30 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@30.0.5': + dependencies: + '@jest/console': 30.0.5 + '@jest/types': 30.0.5 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@30.0.5': + dependencies: + '@jest/test-result': 30.0.5 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.5 + slash: 3.0.0 + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.28.3 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.30 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/transform@30.0.5': + dependencies: + '@babel/core': 7.28.3 + '@jest/types': 30.0.5 + '@jridgewell/trace-mapping': 0.3.30 + babel-plugin-istanbul: 7.0.0 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.5 + jest-regex-util: 30.0.1 + jest-util: 30.0.5 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + + '@jest/types@26.6.2': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.9.3 + '@types/yargs': 15.0.19 + chalk: 4.1.2 + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.9.3 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jest/types@30.0.5': + dependencies: + '@jest/pattern': 30.0.1 + '@jest/schemas': 30.0.5 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.9.3 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.30 + + '@jridgewell/resolve-uri@3.1.1': {} + + '@jridgewell/source-map@0.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.30': + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@napi-rs/wasm-runtime@0.2.11': + dependencies: + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.3 + '@tybys/wasm-util': 0.9.0 + optional: true + + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + dependencies: + eslint-scope: 5.1.1 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.2.7': {} + + '@react-native-community/cli-clean@19.1.1': + dependencies: + '@react-native-community/cli-tools': 19.1.1 + chalk: 4.1.2 + execa: 5.1.1 + fast-glob: 3.3.3 + + '@react-native-community/cli-config-android@19.1.1': + dependencies: + '@react-native-community/cli-tools': 19.1.1 + chalk: 4.1.2 + fast-glob: 3.3.3 + fast-xml-parser: 4.5.3 + + '@react-native-community/cli-config-apple@19.1.1': + dependencies: + '@react-native-community/cli-tools': 19.1.1 + chalk: 4.1.2 + execa: 5.1.1 + fast-glob: 3.3.3 + + '@react-native-community/cli-config@19.1.1(typescript@5.9.2)': + dependencies: + '@react-native-community/cli-tools': 19.1.1 + chalk: 4.1.2 + cosmiconfig: 9.0.0(typescript@5.9.2) + deepmerge: 4.3.1 + fast-glob: 3.3.3 + joi: 17.13.3 + transitivePeerDependencies: + - typescript + + '@react-native-community/cli-doctor@19.1.1(typescript@5.9.2)': + dependencies: + '@react-native-community/cli-config': 19.1.1(typescript@5.9.2) + '@react-native-community/cli-platform-android': 19.1.1 + '@react-native-community/cli-platform-apple': 19.1.1 + '@react-native-community/cli-platform-ios': 19.1.1 + '@react-native-community/cli-tools': 19.1.1 + chalk: 4.1.2 + command-exists: 1.2.9 + deepmerge: 4.3.1 + envinfo: 7.14.0 + execa: 5.1.1 + node-stream-zip: 1.15.0 + ora: 5.4.1 + semver: 7.7.2 + wcwidth: 1.0.1 + yaml: 2.8.1 + transitivePeerDependencies: + - typescript + + '@react-native-community/cli-platform-android@19.1.1': + dependencies: + '@react-native-community/cli-config-android': 19.1.1 + '@react-native-community/cli-tools': 19.1.1 + chalk: 4.1.2 + execa: 5.1.1 + logkitty: 0.7.1 + + '@react-native-community/cli-platform-apple@19.1.1': + dependencies: + '@react-native-community/cli-config-apple': 19.1.1 + '@react-native-community/cli-tools': 19.1.1 + chalk: 4.1.2 + execa: 5.1.1 + fast-xml-parser: 4.5.3 + + '@react-native-community/cli-platform-ios@19.1.1': + dependencies: + '@react-native-community/cli-platform-apple': 19.1.1 + + '@react-native-community/cli-server-api@19.1.1': + dependencies: + '@react-native-community/cli-tools': 19.1.1 + body-parser: 1.20.3 + compression: 1.8.1 + connect: 3.7.0 + errorhandler: 1.5.1 + nocache: 3.0.4 + open: 6.4.0 + pretty-format: 26.6.2 + serve-static: 1.16.2 + ws: 6.2.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native-community/cli-tools@19.1.1': + dependencies: + '@vscode/sudo-prompt': 9.3.1 + appdirsjs: 1.2.7 + chalk: 4.1.2 + execa: 5.1.1 + find-up: 5.0.0 + launch-editor: 2.11.1 + mime: 2.6.0 + ora: 5.4.1 + prompts: 2.4.2 + semver: 7.7.2 + + '@react-native-community/cli-types@19.1.1': + dependencies: + joi: 17.13.3 + + '@react-native-community/cli@19.1.1(typescript@5.9.2)': + dependencies: + '@react-native-community/cli-clean': 19.1.1 + '@react-native-community/cli-config': 19.1.1(typescript@5.9.2) + '@react-native-community/cli-doctor': 19.1.1(typescript@5.9.2) + '@react-native-community/cli-server-api': 19.1.1 + '@react-native-community/cli-tools': 19.1.1 + '@react-native-community/cli-types': 19.1.1 + chalk: 4.1.2 + commander: 9.5.0 + deepmerge: 4.3.1 + execa: 5.1.1 + find-up: 5.0.0 + fs-extra: 8.1.0 + graceful-fs: 4.2.11 + prompts: 2.4.2 + semver: 7.7.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - typescript + - utf-8-validate + + '@react-native-masked-view/masked-view@0.3.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)': + dependencies: + react: 19.1.0 + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + + '@react-native/assets-registry@0.80.2': {} + + '@react-native/babel-plugin-codegen@0.80.2(@babel/core@7.28.3)': + dependencies: + '@babel/traverse': 7.28.3 + '@react-native/codegen': 0.80.2(@babel/core@7.28.3) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@react-native/babel-preset@0.80.2(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-export-default-from': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-classes': 7.28.3(@babel/core@7.28.3) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-object-rest-spread': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.3) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-regenerator': 7.28.3(@babel/core@7.28.3) + '@babel/plugin-transform-runtime': 7.28.3(@babel/core@7.28.3) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.3) + '@babel/template': 7.27.2 + '@react-native/babel-plugin-codegen': 0.80.2(@babel/core@7.28.3) + babel-plugin-syntax-hermes-parser: 0.28.1 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.28.3) + react-refresh: 0.14.0 + transitivePeerDependencies: + - supports-color + + '@react-native/codegen@0.80.2(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + glob: 7.2.3 + hermes-parser: 0.28.1 + invariant: 2.2.4 + nullthrows: 1.1.1 + yargs: 17.7.2 + + '@react-native/community-cli-plugin@0.80.2(@react-native-community/cli@19.1.1(typescript@5.9.2))': + dependencies: + '@react-native/dev-middleware': 0.80.2 + chalk: 4.1.2 + debug: 4.4.1 + invariant: 2.2.4 + metro: 0.82.5 + metro-config: 0.82.5 + metro-core: 0.82.5 + semver: 7.7.2 + optionalDependencies: + '@react-native-community/cli': 19.1.1(typescript@5.9.2) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native/debugger-frontend@0.80.2': {} + + '@react-native/dev-middleware@0.80.2': + dependencies: + '@isaacs/ttlcache': 1.4.1 + '@react-native/debugger-frontend': 0.80.2 + chrome-launcher: 0.15.2 + chromium-edge-launcher: 0.2.0 + connect: 3.7.0 + debug: 4.4.1 + invariant: 2.2.4 + nullthrows: 1.1.1 + open: 7.4.2 + serve-static: 1.16.2 + ws: 6.2.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native/eslint-config@0.80.2(eslint@8.57.1)(jest@30.0.5(@types/node@20.9.3))(prettier@3.2.5)(typescript@5.9.2)': + dependencies: + '@babel/core': 7.28.3 + '@babel/eslint-parser': 7.28.0(@babel/core@7.28.3)(eslint@8.57.1) + '@react-native/eslint-plugin': 0.80.2 + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.2) + eslint: 8.57.1 + eslint-config-prettier: 8.10.0(eslint@8.57.1) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.1) + eslint-plugin-ft-flow: 2.0.3(@babel/eslint-parser@7.28.0(@babel/core@7.28.3)(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(jest@30.0.5(@types/node@20.9.3))(typescript@5.9.2) + eslint-plugin-react: 7.33.2(eslint@8.57.1) + eslint-plugin-react-hooks: 5.2.0(eslint@8.57.1) + eslint-plugin-react-native: 4.1.0(eslint@8.57.1) + prettier: 3.2.5 + transitivePeerDependencies: + - jest + - supports-color + - typescript + + '@react-native/eslint-plugin@0.80.2': {} + + '@react-native/gradle-plugin@0.80.2': {} + + '@react-native/js-polyfills@0.80.2': {} + + '@react-native/metro-babel-transformer@0.80.2(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@react-native/babel-preset': 0.80.2(@babel/core@7.28.3) + hermes-parser: 0.28.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + '@react-native/metro-config@0.80.2(@babel/core@7.28.3)': + dependencies: + '@react-native/js-polyfills': 0.80.2 + '@react-native/metro-babel-transformer': 0.80.2(@babel/core@7.28.3) + metro-config: 0.82.5 + metro-runtime: 0.82.5 + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@react-native/normalize-colors@0.80.2': {} + + '@react-native/typescript-config@0.80.2': {} + + '@react-native/virtualized-lists@0.80.2(@types/react@19.1.12)(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)': + dependencies: + invariant: 2.2.4 + nullthrows: 1.1.1 + react: 19.1.0 + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.12 + + '@react-navigation/bottom-tabs@7.15.9(@react-native-masked-view/masked-view@0.3.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(@react-navigation/native@7.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.7.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)': + dependencies: + '@react-navigation/elements': 2.9.14(@react-native-masked-view/masked-view@0.3.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(@react-navigation/native@7.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.7.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + '@react-navigation/native': 7.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + color: 4.2.3 + react: 19.1.0 + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + react-native-safe-area-context: 5.7.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + react-native-screens: 4.16.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + sf-symbols-typescript: 2.2.0 + transitivePeerDependencies: + - '@react-native-masked-view/masked-view' + + '@react-navigation/core@7.17.2(react@19.1.0)': + dependencies: + '@react-navigation/routers': 7.5.3 + escape-string-regexp: 4.0.0 + fast-deep-equal: 3.1.3 + nanoid: 3.3.11 + query-string: 7.1.3 + react: 19.1.0 + react-is: 19.1.1 + use-latest-callback: 0.2.6(react@19.1.0) + use-sync-external-store: 1.6.0(react@19.1.0) + + '@react-navigation/elements@2.9.14(@react-native-masked-view/masked-view@0.3.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(@react-navigation/native@7.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.7.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)': + dependencies: + '@react-navigation/native': 7.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + color: 4.2.3 + react: 19.1.0 + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + react-native-safe-area-context: 5.7.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + use-latest-callback: 0.2.6(react@19.1.0) + use-sync-external-store: 1.6.0(react@19.1.0) + optionalDependencies: + '@react-native-masked-view/masked-view': 0.3.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + + '@react-navigation/native-stack@7.14.11(@react-native-masked-view/masked-view@0.3.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(@react-navigation/native@7.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.7.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)': + dependencies: + '@react-navigation/elements': 2.9.14(@react-native-masked-view/masked-view@0.3.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(@react-navigation/native@7.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.7.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + '@react-navigation/native': 7.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + color: 4.2.3 + react: 19.1.0 + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + react-native-safe-area-context: 5.7.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + react-native-screens: 4.16.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + sf-symbols-typescript: 2.2.0 + warn-once: 0.1.1 + transitivePeerDependencies: + - '@react-native-masked-view/masked-view' + + '@react-navigation/native@7.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)': + dependencies: + '@react-navigation/core': 7.17.2(react@19.1.0) + escape-string-regexp: 4.0.0 + fast-deep-equal: 3.1.3 + nanoid: 3.3.11 + react: 19.1.0 + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + use-latest-callback: 0.2.6(react@19.1.0) + + '@react-navigation/routers@7.5.3': + dependencies: + nanoid: 3.3.11 + + '@react-navigation/stack@7.8.10(4bd8dd23d724a396af48ae32b42242ae)': + dependencies: + '@react-navigation/elements': 2.9.14(@react-native-masked-view/masked-view@0.3.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(@react-navigation/native@7.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.7.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + '@react-navigation/native': 7.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + color: 4.2.3 + react: 19.1.0 + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + react-native-gesture-handler: 2.26.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + react-native-safe-area-context: 5.7.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + react-native-screens: 4.16.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + use-latest-callback: 0.2.6(react@19.1.0) + transitivePeerDependencies: + - '@react-native-masked-view/masked-view' + + '@sideway/address@4.1.5': + dependencies: + '@hapi/hoek': 9.3.0 + + '@sideway/formula@3.0.1': {} + + '@sideway/pinpoint@2.0.0': {} + + '@sinclair/typebox@0.27.8': {} + + '@sinclair/typebox@0.34.37': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@sinonjs/fake-timers@13.0.5': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@testing-library/react-native@13.3.1(jest@30.0.5(@types/node@20.9.3))(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react-test-renderer@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + jest-matcher-utils: 30.0.5 + picocolors: 1.1.1 + pretty-format: 30.0.5 + react: 19.1.0 + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + react-test-renderer: 19.1.0(react@19.1.0) + redent: 3.0.0 + optionalDependencies: + jest: 30.0.5(@types/node@20.9.3) + + '@tsconfig/react-native@3.0.6': {} + + '@tybys/wasm-util@0.9.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + '@types/babel__generator': 7.6.7 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.4 + + '@types/babel__generator@7.6.7': + dependencies: + '@babel/types': 7.29.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + + '@types/babel__traverse@7.20.4': + dependencies: + '@babel/types': 7.29.0 + + '@types/graceful-fs@4.1.9': + dependencies: + '@types/node': 20.9.3 + + '@types/hammerjs@2.0.46': {} + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/jest@29.5.14': + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + + '@types/json-schema@7.0.15': {} + + '@types/node@20.9.3': + dependencies: + undici-types: 5.26.5 + + '@types/parse-json@4.0.2': {} + + '@types/react-native-dotenv@0.2.2': {} + + '@types/react-native-vector-icons@6.4.18': + dependencies: + '@types/react': 19.1.12 + '@types/react-native': 0.70.19 + + '@types/react-native@0.70.19': + dependencies: + '@types/react': 19.1.12 + + '@types/react-native@0.73.0(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0)': + dependencies: + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + transitivePeerDependencies: + - '@babel/core' + - '@react-native-community/cli' + - '@types/react' + - bufferutil + - react + - supports-color + - utf-8-validate + + '@types/react-test-renderer@19.1.0': + dependencies: + '@types/react': 19.1.12 + + '@types/react@19.1.12': + dependencies: + csstype: 3.1.2 + + '@types/semver@7.5.6': {} + + '@types/setimmediate@1.0.4': {} + + '@types/stack-utils@2.0.3': {} + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@15.0.19': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.1 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.2) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.2) + debug: 4.4.1 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/types@7.18.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.1 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.2 + tsutils: 3.21.0(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.1 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.2) + eslint: 8.57.1 + eslint-scope: 5.1.1 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.9.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.2) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.3.0': {} + + '@unrs/resolver-binding-android-arm-eabi@1.9.2': + optional: true + + '@unrs/resolver-binding-android-arm64@1.9.2': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.9.2': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.9.2': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.9.2': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.2': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.9.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.9.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.9.2': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.9.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.9.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.9.2': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.9.2': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.9.2': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.9.2': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.9.2': + dependencies: + '@napi-rs/wasm-runtime': 0.2.11 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.9.2': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.9.2': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.9.2': + optional: true + + '@vscode/sudo-prompt@9.3.1': {} + + '@wry/caches@1.0.1': + dependencies: + tslib: 2.8.1 + + '@wry/context@0.7.4': + dependencies: + tslib: 2.8.1 + + '@wry/equality@0.5.7': + dependencies: + tslib: 2.8.1 + + '@wry/trie@0.5.0': + dependencies: + tslib: 2.8.1 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-jsx@5.3.2(acorn@8.11.2): + dependencies: + acorn: 8.11.2 + + acorn@8.11.2: {} + + agent-base@7.1.4: {} + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + anser@1.4.10: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-fragments@0.2.1: + dependencies: + colorette: 1.4.0 + slice-ansi: 2.1.0 + strip-ansi: 5.2.0 + + ansi-regex@4.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + appdirsjs@1.2.7: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.0: + dependencies: + call-bind: 1.0.8 + is-array-buffer: 3.0.2 + + array-includes@3.1.7: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.3.0 + is-string: 1.0.7 + + array-union@2.1.0: {} + + array.prototype.flat@1.3.2: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + + array.prototype.flatmap@1.3.2: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + + array.prototype.tosorted@1.1.2: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + get-intrinsic: 1.3.0 + + arraybuffer.prototype.slice@1.0.2: + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + + asap@2.0.6: {} + + astral-regex@1.0.0: {} + + async-limiter@1.0.1: {} + + asynciterator.prototype@1.0.0: + dependencies: + has-symbols: 1.1.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + babel-jest@29.7.0(@babel/core@7.28.3): + dependencies: + '@babel/core': 7.28.3 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.28.3) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-jest@30.0.5(@babel/core@7.28.3): + dependencies: + '@babel/core': 7.28.3 + '@jest/transform': 30.0.5 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 7.0.0 + babel-preset-jest: 30.0.1(@babel/core@7.28.3) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@7.0.0: + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 6.0.3 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.4 + + babel-plugin-jest-hoist@30.0.1: + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + '@types/babel__core': 7.20.5 + + babel-plugin-module-resolver@5.0.3: + dependencies: + find-babel-config: 2.1.2 + glob: 9.3.5 + pkg-up: 3.1.0 + reselect: 4.1.8 + resolve: 1.22.10 + + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.3): + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/core': 7.28.3 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.3) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.3): + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.3) + core-js-compat: 3.45.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.3): + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + + babel-plugin-syntax-hermes-parser@0.28.1: + dependencies: + hermes-parser: 0.28.1 + + babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.28.3): + dependencies: + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - '@babel/core' + + babel-preset-current-node-syntax@1.1.0(@babel/core@7.28.3): + dependencies: + '@babel/core': 7.28.3 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.3) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.3) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.3) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.3) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.3) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.3) + + babel-preset-jest@29.6.3(@babel/core@7.28.3): + dependencies: + '@babel/core': 7.28.3 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.3) + + babel-preset-jest@30.0.1(@babel/core@7.28.3): + dependencies: + '@babel/core': 7.28.3 + babel-plugin-jest-hoist: 30.0.1 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.3) + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.25.3: + dependencies: + caniuse-lite: 1.0.30001737 + electron-to-chromium: 1.5.209 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.3) + + bs-logger@0.2.6: + dependencies: + fast-json-stable-stringify: 2.1.0 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + caller-callsite@2.0.0: + dependencies: + callsites: 2.0.0 + + caller-path@2.0.0: + dependencies: + caller-callsite: 2.0.0 + + callsites@2.0.0: {} + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001737: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + char-regex@1.0.2: {} + + chrome-launcher@0.15.2: + dependencies: + '@types/node': 20.9.3 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + transitivePeerDependencies: + - supports-color + + chromium-edge-launcher@0.2.0: + dependencies: + '@types/node': 20.9.3 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + mkdirp: 1.0.4 + rimraf: 3.0.2 + transitivePeerDependencies: + - supports-color + + ci-info@2.0.0: {} + + ci-info@3.9.0: {} + + ci-info@4.2.0: {} + + cjs-module-lexer@2.1.0: {} + + clean-stack@2.2.0: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.9.2: {} + + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@1.0.4: {} + + co@4.6.0: {} + + collect-v8-coverage@1.0.2: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.4 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + colorette@1.4.0: {} + + command-exists@1.2.9: {} + + commander@12.1.0: {} + + commander@2.20.3: {} + + commander@9.5.0: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.54.0 + + compression@1.8.1: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.1.0 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + concat-map@0.0.1: {} + + connect@3.7.0: + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + core-js-compat@3.45.1: + dependencies: + browserslist: 4.25.3 + + cosmiconfig@5.2.1: + dependencies: + import-fresh: 2.0.0 + is-directory: 0.3.1 + js-yaml: 3.14.1 + parse-json: 4.0.0 + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.3 + + cosmiconfig@9.0.0(typescript@5.9.2): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.9.2 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.1.2: {} + + dayjs@1.11.15: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + decamelize@1.2.0: {} + + decode-uri-component@0.2.2: {} + + dedent@0.7.0: {} + + dedent@1.6.0: {} + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + del@6.1.1: + dependencies: + globby: 11.1.0 + graceful-fs: 4.2.11 + is-glob: 4.0.3 + is-path-cwd: 2.2.0 + is-path-inside: 3.0.3 + p-map: 4.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + + depd@2.0.0: {} + + destroy@1.2.0: {} + + detect-newline@3.1.0: {} + + diff-sequences@29.6.3: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dotenv@16.6.1: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.209: {} + + emittery@0.13.1: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + env-paths@2.2.1: {} + + envinfo@7.14.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + error-stack-parser@2.1.4: + dependencies: + stackframe: 1.3.4 + + errorhandler@1.5.1: + dependencies: + accepts: 1.3.8 + escape-html: 1.0.3 + + es-abstract@1.22.3: + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.2 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + es-set-tostringtag: 2.0.2 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.3.0 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.0.1 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.0.6 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.15 + is-weakref: 1.0.2 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.0.1 + safe-regex-test: 1.1.0 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.20 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.0.15: + dependencies: + asynciterator.prototype: 1.0.0 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-set-tostringtag: 2.0.2 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.3 + has-property-descriptors: 1.0.2 + has-proto: 1.0.1 + has-symbols: 1.1.0 + internal-slot: 1.0.6 + iterator.prototype: 1.1.2 + safe-array-concat: 1.0.1 + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.2: + dependencies: + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.0.2: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@8.10.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-eslint-comments@3.2.0(eslint@8.57.1): + dependencies: + escape-string-regexp: 1.0.5 + eslint: 8.57.1 + ignore: 5.3.2 + + eslint-plugin-ft-flow@2.0.3(@babel/eslint-parser@7.28.0(@babel/core@7.28.3)(eslint@8.57.1))(eslint@8.57.1): + dependencies: + '@babel/eslint-parser': 7.28.0(@babel/core@7.28.3)(eslint@8.57.1) + eslint: 8.57.1 + lodash: 4.17.21 + string-natural-compare: 3.0.1 + + eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(jest@30.0.5(@types/node@20.9.3))(typescript@5.9.2): + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.9.2) + eslint: 8.57.1 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) + jest: 30.0.5(@types/node@20.9.3) + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-prettier@5.5.4(eslint-config-prettier@8.10.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.2.5): + dependencies: + eslint: 8.57.1 + prettier: 3.2.5 + prettier-linter-helpers: 1.0.0 + synckit: 0.11.8 + optionalDependencies: + eslint-config-prettier: 8.10.0(eslint@8.57.1) + + eslint-plugin-react-hooks@5.2.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-react-native-globals@0.1.2: {} + + eslint-plugin-react-native@4.1.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-plugin-react-native-globals: 0.1.2 + + eslint-plugin-react@7.33.2(eslint@8.57.1): + dependencies: + array-includes: 3.1.7 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.2 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.15 + eslint: 8.57.1 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.5 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + object.hasown: 1.1.3 + object.values: 1.1.7 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.10 + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.5 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.5.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + event-target-shim@5.0.1: {} + + events@3.3.0: {} + + execa@4.1.0: + dependencies: + cross-spawn: 7.0.6 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exit-x@0.2.2: {} + + expect@29.7.0: + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + + expect@30.0.5: + dependencies: + '@jest/expect-utils': 30.0.5 + '@jest/get-type': 30.0.1 + jest-matcher-utils: 30.0.5 + jest-message-util: 30.0.5 + jest-mock: 30.0.5 + jest-util: 30.0.5 + + exponential-backoff@3.1.1: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-xml-parser@4.5.3: + dependencies: + strnum: 1.1.2 + + fastq@1.15.0: + dependencies: + reusify: 1.0.4 + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + filter-obj@1.1.0: {} + + finalhandler@1.1.2: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-babel-config@2.1.2: + dependencies: + json5: 2.2.3 + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.2.9: {} + + flow-enums-runtime@0.0.6: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.1.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fresh@0.5.2: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.6: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.22.3 + functions-have-names: 1.2.3 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-package-type@0.1.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.4 + + get-stream@6.0.1: {} + + get-symbol-description@1.0.0: + dependencies: + call-bind: 1.0.8 + get-intrinsic: 1.3.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.3.10: + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.5 + minipass: 7.0.4 + path-scurry: 1.10.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.9 + once: 1.4.0 + + glob@9.3.5: + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.7 + minipass: 4.2.8 + path-scurry: 1.10.1 + + globals@13.23.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.3: + dependencies: + define-properties: 1.2.1 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + graphql-tag@2.12.6(graphql@16.13.2): + dependencies: + graphql: 16.13.2 + tslib: 2.8.1 + + graphql@16.13.2: {} + + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + has-bigints@1.0.2: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.0.1: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hermes-estree@0.28.1: {} + + hermes-estree@0.29.1: {} + + hermes-parser@0.28.1: + dependencies: + hermes-estree: 0.28.1 + + hermes-parser@0.29.1: + dependencies: + hermes-estree: 0.29.1 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + html-escaper@2.0.2: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + human-signals@1.1.1: {} + + human-signals@2.1.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + image-size@1.0.2: + dependencies: + queue: 6.0.2 + + import-fresh@2.0.0: + dependencies: + caller-path: 2.0.0 + resolve-from: 3.0.0 + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internal-slot@1.0.6: + dependencies: + get-intrinsic: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + is-absolute@1.0.0: + dependencies: + is-relative: 1.0.0 + is-windows: 1.0.2 + + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-array-buffer@3.0.2: + dependencies: + call-bind: 1.0.8 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-arrayish@0.2.1: {} + + is-arrayish@0.3.4: {} + + is-async-function@2.0.0: + dependencies: + has-tostringtag: 1.0.2 + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.8 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + + is-directory@0.3.1: {} + + is-docker@2.2.1: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.0.2: + dependencies: + call-bind: 1.0.8 + + is-fullwidth-code-point@2.0.0: {} + + is-fullwidth-code-point@3.0.0: {} + + is-generator-fn@2.1.0: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-git-dirty@2.0.2: + dependencies: + execa: 4.1.0 + is-git-repository: 2.0.0 + + is-git-repository@2.0.0: + dependencies: + execa: 4.1.0 + is-absolute: 1.0.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-interactive@1.0.0: {} + + is-map@2.0.2: {} + + is-negative-zero@2.0.2: {} + + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-cwd@2.2.0: {} + + is-path-inside@3.0.3: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-relative@1.0.0: + dependencies: + is-unc-path: 1.0.0 + + is-set@2.0.2: {} + + is-shared-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.8 + + is-stream@2.0.1: {} + + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + + is-unc-path@1.0.0: + dependencies: + unc-path-regex: 0.1.2 + + is-unicode-supported@0.1.0: {} + + is-weakmap@2.0.1: {} + + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.8 + + is-weakset@2.0.2: + dependencies: + call-bind: 1.0.8 + get-intrinsic: 1.3.0 + + is-windows@1.0.2: {} + + is-wsl@1.1.0: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1: + dependencies: + '@babel/core': 7.28.3 + '@babel/parser': 7.29.2 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.28.3 + '@babel/parser': 7.29.2 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.30 + debug: 4.4.1 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.6: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + iterator.prototype@1.1.2: + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + reflect.getprototypeof: 1.0.4 + set-function-name: 2.0.1 + + jackspeak@2.3.6: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jest-changed-files@30.0.5: + dependencies: + execa: 5.1.1 + jest-util: 30.0.5 + p-limit: 3.1.0 + + jest-circus@30.0.5: + dependencies: + '@jest/environment': 30.0.5 + '@jest/expect': 30.0.5 + '@jest/test-result': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 20.9.3 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.6.0 + is-generator-fn: 2.1.0 + jest-each: 30.0.5 + jest-matcher-utils: 30.0.5 + jest-message-util: 30.0.5 + jest-runtime: 30.0.5 + jest-snapshot: 30.0.5 + jest-util: 30.0.5 + p-limit: 3.1.0 + pretty-format: 30.0.5 + pure-rand: 7.0.1 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@30.0.5(@types/node@20.9.3): + dependencies: + '@jest/core': 30.0.5 + '@jest/test-result': 30.0.5 + '@jest/types': 30.0.5 + chalk: 4.1.2 + exit-x: 0.2.2 + import-local: 3.2.0 + jest-config: 30.0.5(@types/node@20.9.3) + jest-util: 30.0.5 + jest-validate: 30.0.5 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + jest-config@30.0.5(@types/node@20.9.3): + dependencies: + '@babel/core': 7.28.3 + '@jest/get-type': 30.0.1 + '@jest/pattern': 30.0.1 + '@jest/test-sequencer': 30.0.5 + '@jest/types': 30.0.5 + babel-jest: 30.0.5(@babel/core@7.28.3) + chalk: 4.1.2 + ci-info: 4.2.0 + deepmerge: 4.3.1 + glob: 10.3.10 + graceful-fs: 4.2.11 + jest-circus: 30.0.5 + jest-docblock: 30.0.1 + jest-environment-node: 30.0.5 + jest-regex-util: 30.0.1 + jest-resolve: 30.0.5 + jest-runner: 30.0.5 + jest-util: 30.0.5 + jest-validate: 30.0.5 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 30.0.5 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.9.3 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-diff@30.0.5: + dependencies: + '@jest/diff-sequences': 30.0.1 + '@jest/get-type': 30.0.1 + chalk: 4.1.2 + pretty-format: 30.0.5 + + jest-docblock@30.0.1: + dependencies: + detect-newline: 3.1.0 + + jest-each@30.0.5: + dependencies: + '@jest/get-type': 30.0.1 + '@jest/types': 30.0.5 + chalk: 4.1.2 + jest-util: 30.0.5 + pretty-format: 30.0.5 + + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.9.3 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-environment-node@30.0.5: + dependencies: + '@jest/environment': 30.0.5 + '@jest/fake-timers': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 20.9.3 + jest-mock: 30.0.5 + jest-util: 30.0.5 + jest-validate: 30.0.5 + + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 20.9.3 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-haste-map@30.0.5: + dependencies: + '@jest/types': 30.0.5 + '@types/node': 20.9.3 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 30.0.1 + jest-util: 30.0.5 + jest-worker: 30.0.5 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@30.0.5: + dependencies: + '@jest/get-type': 30.0.1 + pretty-format: 30.0.5 + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-matcher-utils@30.0.5: + dependencies: + '@jest/get-type': 30.0.1 + chalk: 4.1.2 + jest-diff: 30.0.5 + pretty-format: 30.0.5 + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.27.1 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-message-util@30.0.5: + dependencies: + '@babel/code-frame': 7.27.1 + '@jest/types': 30.0.5 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 30.0.5 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.9.3 + jest-util: 29.7.0 + + jest-mock@30.0.5: + dependencies: + '@jest/types': 30.0.5 + '@types/node': 20.9.3 + jest-util: 30.0.5 + + jest-pnp-resolver@1.2.3(jest-resolve@30.0.5): + optionalDependencies: + jest-resolve: 30.0.5 + + jest-regex-util@29.6.3: {} + + jest-regex-util@30.0.1: {} + + jest-resolve-dependencies@30.0.5: + dependencies: + jest-regex-util: 30.0.1 + jest-snapshot: 30.0.5 + transitivePeerDependencies: + - supports-color + + jest-resolve@30.0.5: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.5 + jest-pnp-resolver: 1.2.3(jest-resolve@30.0.5) + jest-util: 30.0.5 + jest-validate: 30.0.5 + slash: 3.0.0 + unrs-resolver: 1.9.2 + + jest-runner@30.0.5: + dependencies: + '@jest/console': 30.0.5 + '@jest/environment': 30.0.5 + '@jest/test-result': 30.0.5 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 20.9.3 + chalk: 4.1.2 + emittery: 0.13.1 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-docblock: 30.0.1 + jest-environment-node: 30.0.5 + jest-haste-map: 30.0.5 + jest-leak-detector: 30.0.5 + jest-message-util: 30.0.5 + jest-resolve: 30.0.5 + jest-runtime: 30.0.5 + jest-util: 30.0.5 + jest-watcher: 30.0.5 + jest-worker: 30.0.5 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@30.0.5: + dependencies: + '@jest/environment': 30.0.5 + '@jest/fake-timers': 30.0.5 + '@jest/globals': 30.0.5 + '@jest/source-map': 30.0.1 + '@jest/test-result': 30.0.5 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 20.9.3 + chalk: 4.1.2 + cjs-module-lexer: 2.1.0 + collect-v8-coverage: 1.0.2 + glob: 10.3.10 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.5 + jest-message-util: 30.0.5 + jest-mock: 30.0.5 + jest-regex-util: 30.0.1 + jest-resolve: 30.0.5 + jest-snapshot: 30.0.5 + jest-util: 30.0.5 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-snapshot@30.0.5: + dependencies: + '@babel/core': 7.28.3 + '@babel/generator': 7.28.3 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) + '@babel/types': 7.28.2 + '@jest/expect-utils': 30.0.5 + '@jest/get-type': 30.0.1 + '@jest/snapshot-utils': 30.0.5 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.3) + chalk: 4.1.2 + expect: 30.0.5 + graceful-fs: 4.2.11 + jest-diff: 30.0.5 + jest-matcher-utils: 30.0.5 + jest-message-util: 30.0.5 + jest-util: 30.0.5 + pretty-format: 30.0.5 + semver: 7.7.2 + synckit: 0.11.8 + transitivePeerDependencies: + - supports-color + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.9.3 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-util@30.0.5: + dependencies: + '@jest/types': 30.0.5 + '@types/node': 20.9.3 + chalk: 4.1.2 + ci-info: 4.2.0 + graceful-fs: 4.2.11 + picomatch: 4.0.2 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-validate@30.0.5: + dependencies: + '@jest/get-type': 30.0.1 + '@jest/types': 30.0.5 + camelcase: 6.3.0 + chalk: 4.1.2 + leven: 3.1.0 + pretty-format: 30.0.5 + + jest-watcher@30.0.5: + dependencies: + '@jest/test-result': 30.0.5 + '@jest/types': 30.0.5 + '@types/node': 20.9.3 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 30.0.5 + string-length: 4.0.2 + + jest-worker@29.7.0: + dependencies: + '@types/node': 20.9.3 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest-worker@30.0.5: + dependencies: + '@types/node': 20.9.3 + '@ungap/structured-clone': 1.3.0 + jest-util: 30.0.5 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@30.0.5(@types/node@20.9.3): + dependencies: + '@jest/core': 30.0.5 + '@jest/types': 30.0.5 + import-local: 3.2.0 + jest-cli: 30.0.5(@types/node@20.9.3) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + joi@17.13.3: + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + + jotai@2.19.1(@babel/core@7.28.3)(@babel/template@7.28.6)(@types/react@19.1.12)(react@19.1.0): + optionalDependencies: + '@babel/core': 7.28.3 + '@babel/template': 7.28.6 + '@types/react': 19.1.12 + react: 19.1.0 + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsc-safe-url@0.2.4: {} + + jsesc@3.0.2: {} + + json-buffer@3.0.1: {} + + json-parse-better-errors@1.0.2: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.7 + array.prototype.flat: 1.3.2 + object.assign: 4.1.4 + object.values: 1.1.7 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + launch-editor@2.11.1: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.8.3 + + leven@3.1.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lighthouse-logger@1.4.2: + dependencies: + debug: 2.6.9 + marky: 1.2.5 + transitivePeerDependencies: + - supports-color + + lines-and-columns@1.2.4: {} + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.debounce@4.0.8: {} + + lodash.memoize@4.1.2: {} + + lodash.merge@4.6.2: {} + + lodash.throttle@4.1.1: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + logkitty@0.7.1: + dependencies: + ansi-fragments: 0.2.1 + dayjs: 1.11.15 + yargs: 15.4.1 + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@10.0.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + make-dir@4.0.0: + dependencies: + semver: 7.7.2 + + make-error@1.3.6: {} + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + marky@1.2.5: {} + + math-intrinsics@1.1.0: {} + + media-typer@0.3.0: {} + + memoize-one@5.2.1: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + metro-babel-transformer@0.82.5: + dependencies: + '@babel/core': 7.28.3 + flow-enums-runtime: 0.0.6 + hermes-parser: 0.29.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-cache-key@0.82.5: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-cache@0.82.5: + dependencies: + exponential-backoff: 3.1.1 + flow-enums-runtime: 0.0.6 + https-proxy-agent: 7.0.6 + metro-core: 0.82.5 + transitivePeerDependencies: + - supports-color + + metro-config@0.82.5: + dependencies: + connect: 3.7.0 + cosmiconfig: 5.2.1 + flow-enums-runtime: 0.0.6 + jest-validate: 29.7.0 + metro: 0.82.5 + metro-cache: 0.82.5 + metro-core: 0.82.5 + metro-runtime: 0.82.5 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro-core@0.82.5: + dependencies: + flow-enums-runtime: 0.0.6 + lodash.throttle: 4.1.1 + metro-resolver: 0.82.5 + + metro-file-map@0.82.5: + dependencies: + debug: 4.4.1 + fb-watchman: 2.0.2 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + invariant: 2.2.4 + jest-worker: 29.7.0 + micromatch: 4.0.8 + nullthrows: 1.1.1 + walker: 1.0.8 + transitivePeerDependencies: + - supports-color + + metro-minify-terser@0.82.5: + dependencies: + flow-enums-runtime: 0.0.6 + terser: 5.24.0 + + metro-resolver@0.82.5: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-runtime@0.82.5: + dependencies: + '@babel/runtime': 7.28.3 + flow-enums-runtime: 0.0.6 + + metro-source-map@0.82.5: + dependencies: + '@babel/traverse': 7.28.3 + '@babel/traverse--for-generate-function-map': '@babel/traverse@7.29.0' + '@babel/types': 7.28.2 + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-symbolicate: 0.82.5 + nullthrows: 1.1.1 + ob1: 0.82.5 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-symbolicate@0.82.5: + dependencies: + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-source-map: 0.82.5 + nullthrows: 1.1.1 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-transform-plugins@0.82.5: + dependencies: + '@babel/core': 7.28.3 + '@babel/generator': 7.29.1 + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.3 + flow-enums-runtime: 0.0.6 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-transform-worker@0.82.5: + dependencies: + '@babel/core': 7.28.3 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + flow-enums-runtime: 0.0.6 + metro: 0.82.5 + metro-babel-transformer: 0.82.5 + metro-cache: 0.82.5 + metro-cache-key: 0.82.5 + metro-minify-terser: 0.82.5 + metro-source-map: 0.82.5 + metro-transform-plugins: 0.82.5 + nullthrows: 1.1.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro@0.82.5: + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.3 + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + accepts: 1.3.8 + chalk: 4.1.2 + ci-info: 2.0.0 + connect: 3.7.0 + debug: 4.4.1 + error-stack-parser: 2.1.4 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + hermes-parser: 0.29.1 + image-size: 1.0.2 + invariant: 2.2.4 + jest-worker: 29.7.0 + jsc-safe-url: 0.2.4 + lodash.throttle: 4.1.1 + metro-babel-transformer: 0.82.5 + metro-cache: 0.82.5 + metro-cache-key: 0.82.5 + metro-config: 0.82.5 + metro-core: 0.82.5 + metro-file-map: 0.82.5 + metro-resolver: 0.82.5 + metro-runtime: 0.82.5 + metro-source-map: 0.82.5 + metro-symbolicate: 0.82.5 + metro-transform-plugins: 0.82.5 + metro-transform-worker: 0.82.5 + mime-types: 2.1.35 + nullthrows: 1.1.1 + serialize-error: 2.1.0 + source-map: 0.5.7 + throat: 5.0.0 + ws: 7.5.10 + yargs: 17.7.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mime@2.6.0: {} + + mimic-fn@2.1.0: {} + + min-indent@1.0.1: {} + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.9: + dependencies: + brace-expansion: 2.0.1 + + minimatch@8.0.7: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@4.2.8: {} + + minipass@7.0.4: {} + + mkdirp@1.0.4: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + napi-postinstall@0.2.5: {} + + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + + negotiator@0.6.4: {} + + neo-async@2.6.2: {} + + nocache@3.0.4: {} + + node-int64@0.4.0: {} + + node-releases@2.0.19: {} + + node-stream-zip@1.15.0: {} + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + nullthrows@1.1.1: {} + + ob1@0.82.5: + dependencies: + flow-enums-runtime: 0.0.6 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.7: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.22.3 + + object.fromentries@2.0.7: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.22.3 + + object.hasown@1.1.3: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.22.3 + + object.values@1.1.7: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.22.3 + + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.1.0: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + open@6.4.0: + dependencies: + is-wsl: 1.1.0 + + open@7.4.2: + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + + optimism@0.18.1: + dependencies: + '@wry/caches': 1.0.1 + '@wry/context': 0.7.4 + '@wry/trie': 0.5.0 + tslib: 2.8.1 + + optionator@0.9.3: + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + p-try@2.2.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@4.0.0: + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.0 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parseurl@1.3.3: {} + + path-exists@3.0.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.10.1: + dependencies: + lru-cache: 10.0.3 + minipass: 7.0.4 + + path-type@4.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pirates@4.0.7: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pkg-up@3.1.0: + dependencies: + find-up: 3.0.0 + + possible-typed-array-names@1.1.0: {} + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.2.5: {} + + pretty-format@26.6.2: + dependencies: + '@jest/types': 26.6.2 + ansi-regex: 5.0.1 + ansi-styles: 4.3.0 + react-is: 17.0.2 + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + pretty-format@30.0.5: + dependencies: + '@jest/schemas': 30.0.5 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + process@0.11.10: {} + + promise@8.3.0: + dependencies: + asap: 2.0.6 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + pump@3.0.4: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode@2.3.1: {} + + pure-rand@7.0.1: {} + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + query-string@7.1.3: + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + + queue-microtask@1.2.3: {} + + queue@6.0.2: + dependencies: + inherits: 2.0.4 + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + react-devtools-core@6.1.5: + dependencies: + shell-quote: 1.8.3 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + react-freeze@1.0.4(react@19.1.0): + dependencies: + react: 19.1.0 + + react-is@16.13.1: {} + + react-is@17.0.2: {} + + react-is@18.3.1: {} + + react-is@19.1.1: {} + + react-native-builder-bob@0.23.2: + dependencies: + '@babel/core': 7.28.3 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.28.3) + '@babel/preset-env': 7.28.3(@babel/core@7.28.3) + '@babel/preset-flow': 7.27.1(@babel/core@7.28.3) + '@babel/preset-react': 7.28.5(@babel/core@7.28.3) + '@babel/preset-typescript': 7.28.5(@babel/core@7.28.3) + browserslist: 4.25.3 + cosmiconfig: 7.1.0 + cross-spawn: 7.0.6 + dedent: 0.7.0 + del: 6.1.1 + fs-extra: 10.1.0 + glob: 8.1.0 + is-git-dirty: 2.0.2 + json5: 2.2.3 + kleur: 4.1.5 + prompts: 2.4.2 + which: 2.0.2 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + react-native-config@1.5.6: {} + + react-native-dotenv@3.4.11(@babel/runtime@7.28.3): + dependencies: + '@babel/runtime': 7.28.3 + dotenv: 16.6.1 + + react-native-encrypted-storage@4.0.3(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + + react-native-gesture-handler@2.26.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0): + dependencies: + '@egjs/hammerjs': 2.0.17 + hoist-non-react-statics: 3.3.2 + invariant: 2.2.4 + react: 19.1.0 + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + + react-native-gradle-plugin@0.71.19: {} + + react-native-is-edge-to-edge@1.1.7(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + + react-native-is-edge-to-edge@1.3.1(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + + react-native-nitro-modules@0.33.9(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + + react-native-quick-base64@2.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + + react-native-quick-crypto@1.0.9(react-native-nitro-modules@0.33.9(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-quick-base64@2.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0): + dependencies: + '@craftzdog/react-native-buffer': 6.1.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + events: 3.3.0 + react: 19.1.0 + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + react-native-nitro-modules: 0.33.9(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + react-native-quick-base64: 2.2.2(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + readable-stream: 4.5.2 + safe-buffer: 5.2.1 + util: 0.12.5 + + react-native-reanimated@3.18.0(@babel/core@7.28.3)(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0): + dependencies: + '@babel/core': 7.28.3 + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-classes': 7.28.3(@babel/core@7.28.3) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.3) + '@babel/preset-typescript': 7.28.5(@babel/core@7.28.3) + convert-source-map: 2.0.0 + invariant: 2.2.4 + react: 19.1.0 + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + react-native-is-edge-to-edge: 1.1.7(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + transitivePeerDependencies: + - supports-color + + react-native-safe-area-context@5.7.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + + react-native-screens@4.16.0(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-freeze: 1.0.4(react@19.1.0) + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + react-native-is-edge-to-edge: 1.3.1(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + warn-once: 0.1.1 + + react-native-vector-icons@10.3.0: + dependencies: + prop-types: 15.8.1 + yargs: 16.2.0 + + react-native-webview@13.16.1(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0): + dependencies: + escape-string-regexp: 4.0.0 + invariant: 2.2.4 + react: 19.1.0 + react-native: 0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0) + + react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0): + dependencies: + '@jest/create-cache-key-function': 29.7.0 + '@react-native/assets-registry': 0.80.2 + '@react-native/codegen': 0.80.2(@babel/core@7.28.3) + '@react-native/community-cli-plugin': 0.80.2(@react-native-community/cli@19.1.1(typescript@5.9.2)) + '@react-native/gradle-plugin': 0.80.2 + '@react-native/js-polyfills': 0.80.2 + '@react-native/normalize-colors': 0.80.2 + '@react-native/virtualized-lists': 0.80.2(@types/react@19.1.12)(react-native@0.80.2(@babel/core@7.28.3)(@react-native-community/cli@19.1.1(typescript@5.9.2))(@types/react@19.1.12)(react@19.1.0))(react@19.1.0) + abort-controller: 3.0.0 + anser: 1.4.10 + ansi-regex: 5.0.1 + babel-jest: 29.7.0(@babel/core@7.28.3) + babel-plugin-syntax-hermes-parser: 0.28.1 + base64-js: 1.5.1 + chalk: 4.1.2 + commander: 12.1.0 + flow-enums-runtime: 0.0.6 + glob: 7.2.3 + invariant: 2.2.4 + jest-environment-node: 29.7.0 + memoize-one: 5.2.1 + metro-runtime: 0.82.5 + metro-source-map: 0.82.5 + nullthrows: 1.1.1 + pretty-format: 29.7.0 + promise: 8.3.0 + react: 19.1.0 + react-devtools-core: 6.1.5 + react-refresh: 0.14.0 + regenerator-runtime: 0.13.11 + scheduler: 0.26.0 + semver: 7.7.2 + stacktrace-parser: 0.1.10 + whatwg-fetch: 3.6.19 + ws: 6.2.3 + yargs: 17.7.2 + optionalDependencies: + '@types/react': 19.1.12 + transitivePeerDependencies: + - '@babel/core' + - '@react-native-community/cli' + - bufferutil + - supports-color + - utf-8-validate + + react-refresh@0.14.0: {} + + react-test-renderer@19.1.0(react@19.1.0): + dependencies: + react: 19.1.0 + react-is: 19.1.1 + scheduler: 0.26.0 + + react@19.1.0: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.5.2: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + reflect.getprototypeof@1.0.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.3.0 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + + regenerate-unicode-properties@10.2.0: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regenerator-runtime@0.13.11: {} + + regexp.prototype.flags@1.5.1: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + set-function-name: 2.0.1 + + regexpu-core@6.2.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.12.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + + regjsgen@0.8.0: {} + + regjsparser@0.12.0: + dependencies: + jsesc: 3.0.2 + + rehackt@0.1.0(@types/react@19.1.12)(react@19.1.0): + optionalDependencies: + '@types/react': 19.1.12 + react: 19.1.0 + + require-directory@2.1.1: {} + + require-main-filename@2.0.0: {} + + reselect@4.1.8: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@3.0.0: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.0.1: + dependencies: + call-bind: 1.0.8 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + scheduler@0.26.0: {} + + semver@6.3.1: {} + + semver@7.7.2: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serialize-error@2.1.0: {} + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + set-blocking@2.0.0: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.1: + dependencies: + define-data-property: 1.1.4 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + setimmediate@1.0.5: {} + + setprototypeof@1.2.0: {} + + sf-symbols-typescript@2.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.3: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-swizzle@0.2.4: + dependencies: + is-arrayish: 0.3.4 + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + slice-ansi@2.1.0: + dependencies: + ansi-styles: 3.2.1 + astral-regex: 1.0.0 + is-fullwidth-code-point: 2.0.0 + + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + split-on-first@1.1.0: {} + + sprintf-js@1.0.3: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + stackframe@1.3.4: {} + + stacktrace-parser@0.1.10: + dependencies: + type-fest: 0.7.1 + + statuses@1.5.0: {} + + statuses@2.0.1: {} + + strict-uri-encode@2.0.0: {} + + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-natural-compare@3.0.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string.prototype.matchall@4.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + internal-slot: 1.0.6 + regexp.prototype.flags: 1.5.1 + set-function-name: 2.0.1 + side-channel: 1.1.0 + + string.prototype.trim@1.2.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.22.3 + + string.prototype.trimend@1.0.7: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.22.3 + + string.prototype.trimstart@1.0.7: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.22.3 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@3.1.1: {} + + strnum@1.1.2: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + symbol-observable@4.0.0: {} + + synckit@0.11.8: + dependencies: + '@pkgr/core': 0.2.7 + + terser@5.24.0: + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.11.2 + commander: 2.20.3 + source-map-support: 0.5.21 + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.5 + + text-table@0.2.0: {} + + throat@5.0.0: {} + + tmpl@1.0.5: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + ts-api-utils@1.4.3(typescript@5.9.2): + dependencies: + typescript: 5.9.2 + + ts-invariant@0.10.3: + dependencies: + tslib: 2.8.1 + + ts-jest@29.4.1(@babel/core@7.28.3)(@jest/transform@30.0.5)(@jest/types@30.0.5)(babel-jest@30.0.5(@babel/core@7.28.3))(jest-util@30.0.5)(jest@30.0.5(@types/node@20.9.3))(typescript@5.9.2): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + handlebars: 4.7.8 + jest: 30.0.5(@types/node@20.9.3) + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.7.2 + type-fest: 4.41.0 + typescript: 5.9.2 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.28.3 + '@jest/transform': 30.0.5 + '@jest/types': 30.0.5 + babel-jest: 30.0.5(@babel/core@7.28.3) + jest-util: 30.0.5 + + tslib@1.14.1: {} + + tslib@2.8.1: {} + + tsutils@3.21.0(typescript@5.9.2): + dependencies: + tslib: 1.14.1 + typescript: 5.9.2 + + turbo-darwin-64@1.13.4: + optional: true + + turbo-darwin-arm64@1.13.4: + optional: true + + turbo-linux-64@1.13.4: + optional: true + + turbo-linux-arm64@1.13.4: + optional: true + + turbo-windows-64@1.13.4: + optional: true + + turbo-windows-arm64@1.13.4: + optional: true + + turbo@1.13.4: + optionalDependencies: + turbo-darwin-64: 1.13.4 + turbo-darwin-arm64: 1.13.4 + turbo-linux-64: 1.13.4 + turbo-linux-arm64: 1.13.4 + turbo-windows-64: 1.13.4 + turbo-windows-arm64: 1.13.4 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.0.8: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@0.7.1: {} + + type-fest@4.41.0: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typed-array-buffer@1.0.0: + dependencies: + call-bind: 1.0.8 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.0: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + has-proto: 1.0.1 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.0: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + has-proto: 1.0.1 + is-typed-array: 1.1.15 + + typed-array-length@1.0.4: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + is-typed-array: 1.1.15 + + typescript@5.9.2: {} + + uglify-js@3.19.3: + optional: true + + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.8 + has-bigints: 1.0.2 + has-symbols: 1.1.0 + which-boxed-primitive: 1.0.2 + + unc-path-regex@0.1.2: {} + + undici-types@5.26.5: {} + + unicode-canonical-property-names-ecmascript@2.0.0: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.1.0: {} + + unicode-property-aliases-ecmascript@2.1.0: {} + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + unrs-resolver@1.9.2: + dependencies: + napi-postinstall: 0.2.5 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.9.2 + '@unrs/resolver-binding-android-arm64': 1.9.2 + '@unrs/resolver-binding-darwin-arm64': 1.9.2 + '@unrs/resolver-binding-darwin-x64': 1.9.2 + '@unrs/resolver-binding-freebsd-x64': 1.9.2 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.9.2 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.9.2 + '@unrs/resolver-binding-linux-arm64-gnu': 1.9.2 + '@unrs/resolver-binding-linux-arm64-musl': 1.9.2 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.9.2 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.9.2 + '@unrs/resolver-binding-linux-riscv64-musl': 1.9.2 + '@unrs/resolver-binding-linux-s390x-gnu': 1.9.2 + '@unrs/resolver-binding-linux-x64-gnu': 1.9.2 + '@unrs/resolver-binding-linux-x64-musl': 1.9.2 + '@unrs/resolver-binding-wasm32-wasi': 1.9.2 + '@unrs/resolver-binding-win32-arm64-msvc': 1.9.2 + '@unrs/resolver-binding-win32-ia32-msvc': 1.9.2 + '@unrs/resolver-binding-win32-x64-msvc': 1.9.2 + + update-browserslist-db@1.1.3(browserslist@4.25.3): + dependencies: + browserslist: 4.25.3 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-latest-callback@0.2.6(react@19.1.0): + dependencies: + react: 19.1.0 + + use-sync-external-store@1.6.0(react@19.1.0): + dependencies: + react: 19.1.0 + + util-deprecate@1.0.2: {} + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.2 + is-typed-array: 1.1.15 + which-typed-array: 1.1.20 + + utils-merge@1.0.1: {} + + v8-to-istanbul@9.1.3: + dependencies: + '@jridgewell/trace-mapping': 0.3.30 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + vary@1.1.2: {} + + vlq@1.0.1: {} + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + warn-once@0.1.1: {} + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + whatwg-fetch@3.6.19: {} + + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-builtin-type@1.1.3: + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.20 + + which-collection@1.0.1: + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + + which-module@2.0.1: {} + + which-typed-array@1.1.20: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wordwrap@1.0.0: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + ws@6.2.3: + dependencies: + async-limiter: 1.0.1 + + ws@7.5.10: {} + + y18n@4.0.3: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yaml@1.10.3: {} + + yaml@2.8.1: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + zen-observable-ts@1.2.5: + dependencies: + zen-observable: 0.8.15 + + zen-observable@0.8.15: {} diff --git a/react-native/pnpm-workspace.yaml b/react-native/pnpm-workspace.yaml new file mode 100644 index 00000000..98ea88fc --- /dev/null +++ b/react-native/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +packages: + - sample + - 'modules/**/*' diff --git a/react-native/sample/.bundle/config b/react-native/sample/.bundle/config new file mode 100644 index 00000000..848943bb --- /dev/null +++ b/react-native/sample/.bundle/config @@ -0,0 +1,2 @@ +BUNDLE_PATH: "vendor/bundle" +BUNDLE_FORCE_RUBY_PLATFORM: 1 diff --git a/react-native/sample/.env.example b/react-native/sample/.env.example new file mode 100644 index 00000000..adaf5d9f --- /dev/null +++ b/react-native/sample/.env.example @@ -0,0 +1,24 @@ +# Storefront Details +STOREFRONT_DOMAIN="YOUR_STORE.myshopify.com" +STOREFRONT_ACCESS_TOKEN="YOUR_PUBLIC_STOREFRONT_ACCESS_TOKEN" +STOREFRONT_MERCHANT_IDENTIFIER=example.merchant.com.shopify + +# Storefront API version +STOREFRONT_VERSION="2025-07" + +# Prefilled buyer information +EMAIL="checkout-kit@shopify.com" +ADDRESS_1="650 King Street" +ADDRESS_2="Shopify HQ" +CITY="Toronto" +COMPANY="Shopify" +COUNTRY="CA" +FIRST_NAME="Evelyn" +LAST_NAME="Hartley" +PROVINCE="ON" +ZIP="M5V 1M7" +PHONE="1-888-746-7439" + +# Customer Account API (for OAuth authentication) +CUSTOMER_ACCOUNT_API_CLIENT_ID="YOUR_CUSTOMER_ACCOUNT_API_CLIENT_ID" +CUSTOMER_ACCOUNT_API_SHOP_ID="YOUR_SHOP_ID" diff --git a/react-native/sample/.eslintignore b/react-native/sample/.eslintignore new file mode 100644 index 00000000..ba885ebe --- /dev/null +++ b/react-native/sample/.eslintignore @@ -0,0 +1,2 @@ +android/build +android/app/build diff --git a/react-native/sample/@types/env.d.ts b/react-native/sample/@types/env.d.ts new file mode 100644 index 00000000..d995b75e --- /dev/null +++ b/react-native/sample/@types/env.d.ts @@ -0,0 +1,20 @@ +declare module '@env' { + export const STOREFRONT_DOMAIN: string; + export const STOREFRONT_ACCESS_TOKEN: string; + export const STOREFRONT_VERSION: string; + + export const EMAIL: string; + export const ADDRESS_1: string; + export const ADDRESS_2: string; + export const CITY: string; + export const COMPANY: string; + export const COUNTRY: string; + export const FIRST_NAME: string; + export const LAST_NAME: string; + export const PROVINCE: string; + export const ZIP: string; + export const PHONE: string; + + export const CUSTOMER_ACCOUNT_API_CLIENT_ID: string; + export const CUSTOMER_ACCOUNT_API_SHOP_ID: string; +} diff --git a/react-native/sample/@types/index.d.ts b/react-native/sample/@types/index.d.ts new file mode 100644 index 00000000..d3afdf6c --- /dev/null +++ b/react-native/sample/@types/index.d.ts @@ -0,0 +1,66 @@ +export type Edges = { + edges: {node: T}[]; +}; + +interface Price { + amount: string; + currencyCode: string; +} + +interface CartCost { + subtotalAmount: Price; + totalAmount: Price; + totalTaxAmount: Price; +} + +export interface ProductVariant { + id: string; + price: Price; +} + +export interface ShopifyProduct { + id: string; + title: string; + description: string; + images: Edges<{ + id: string; + altText: string; + url: string; + thumbnailUrl: string; + }>; + variants: Edges; +} + +export interface CartItem { + id: string; + price: Price; + product: { + title: string; + }; + image: { + id: string; + width: number; + height: number; + url: string; + thumbnailUrl: string; + altText: string; + }; +} + +export interface CartLineItem { + id: string; + merchandise: CartItem; + quantity: number; + cost: { + totalAmount: { + currencyCode: string; + amount: string; + }; + }; +} + +export interface ShopifyCart { + cost: CartCost; + lines: Edges; + totalQuantity: number; +} diff --git a/react-native/sample/Gemfile b/react-native/sample/Gemfile new file mode 100644 index 00000000..d69241c4 --- /dev/null +++ b/react-native/sample/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' +gem 'cocoapods-check', '1.1.0' + +# Ruby 3.4.0 has removed some libraries from the standard library. +gem 'bigdecimal' +gem 'logger' +gem 'benchmark' +gem 'mutex_m' diff --git a/react-native/sample/Gemfile.lock b/react-native/sample/Gemfile.lock new file mode 100644 index 00000000..13b9ab76 --- /dev/null +++ b/react-native/sample/Gemfile.lock @@ -0,0 +1,127 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.7) + base64 + nkf + rexml + activesupport (7.2.2.2) + base64 + benchmark (>= 0.3) + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + logger (>= 1.4.2) + minitest (>= 5.1) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) + algoliasearch (1.27.5) + httpclient (~> 2.8, >= 2.8.3) + json (>= 1.5.1) + atomos (0.1.3) + base64 (0.3.0) + benchmark (0.4.1) + bigdecimal (3.2.3) + claide (1.1.0) + cocoapods (1.15.2) + addressable (~> 2.8) + claide (>= 1.0.2, < 2.0) + cocoapods-core (= 1.15.2) + cocoapods-deintegrate (>= 1.0.3, < 2.0) + cocoapods-downloader (>= 2.1, < 3.0) + cocoapods-plugins (>= 1.0.0, < 2.0) + cocoapods-search (>= 1.0.0, < 2.0) + cocoapods-trunk (>= 1.6.0, < 2.0) + cocoapods-try (>= 1.1.0, < 2.0) + colored2 (~> 3.1) + escape (~> 0.0.4) + fourflusher (>= 2.3.0, < 3.0) + gh_inspector (~> 1.0) + molinillo (~> 0.8.0) + nap (~> 1.0) + ruby-macho (>= 2.3.0, < 3.0) + xcodeproj (>= 1.23.0, < 2.0) + cocoapods-check (1.1.0) + cocoapods (~> 1.0) + cocoapods-core (1.15.2) + activesupport (>= 5.0, < 8) + addressable (~> 2.8) + algoliasearch (~> 1.0) + concurrent-ruby (~> 1.1) + fuzzy_match (~> 2.0.4) + nap (~> 1.0) + netrc (~> 0.11) + public_suffix (~> 4.0) + typhoeus (~> 1.0) + cocoapods-deintegrate (1.0.5) + cocoapods-downloader (2.1) + cocoapods-plugins (1.0.0) + nap + cocoapods-search (1.0.1) + cocoapods-trunk (1.6.0) + nap (>= 0.8, < 2.0) + netrc (~> 0.11) + cocoapods-try (1.2.0) + colored2 (3.1.2) + concurrent-ruby (1.3.3) + connection_pool (2.5.4) + drb (2.2.3) + escape (0.0.4) + ethon (0.15.0) + ffi (>= 1.15.0) + ffi (1.17.2) + fourflusher (2.3.1) + fuzzy_match (2.0.4) + gh_inspector (1.1.3) + httpclient (2.9.0) + mutex_m + i18n (1.14.7) + concurrent-ruby (~> 1.0) + json (2.15.0) + logger (1.7.0) + minitest (5.25.5) + molinillo (0.8.0) + mutex_m (0.3.0) + nanaimo (0.3.0) + nap (1.1.0) + netrc (0.11.0) + nkf (0.2.0) + public_suffix (4.0.7) + rexml (3.4.4) + ruby-macho (2.5.1) + securerandom (0.4.1) + typhoeus (1.5.0) + ethon (>= 0.9.0, < 0.16.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + xcodeproj (1.25.1) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.3.0) + rexml (>= 3.3.6, < 4.0) + +PLATFORMS + ruby + +DEPENDENCIES + activesupport (>= 6.1.7.5, != 7.1.0) + benchmark + bigdecimal + cocoapods (>= 1.13, != 1.15.1, != 1.15.0) + cocoapods-check (= 1.1.0) + concurrent-ruby (< 1.3.4) + logger + mutex_m + xcodeproj (< 1.26.0) + +RUBY VERSION + ruby 3.3.6p108 + +BUNDLED WITH + 2.5.23 diff --git a/react-native/sample/android/app/build.gradle b/react-native/sample/android/app/build.gradle new file mode 100644 index 00000000..9e54dfc0 --- /dev/null +++ b/react-native/sample/android/app/build.gradle @@ -0,0 +1,208 @@ +apply plugin: "com.android.application" +apply plugin: "org.jetbrains.kotlin.android" +apply plugin: "com.facebook.react" + +def resolveNodeModuleDir(String packageName) { + def output = new ByteArrayOutputStream() + def workspaceRoot = new File(rootProject.projectDir, "../..").canonicalFile + exec { + commandLine( + "node", + "--print", + "require.resolve('${packageName}/package.json', { paths: [process.argv[1], process.argv[2]] })", + workspaceRoot.getAbsolutePath(), + rootProject.projectDir.getAbsolutePath() + ) + standardOutput = output + } + return file(output.toString().trim()).parentFile +} + +def reactNativeDirPath = resolveNodeModuleDir("react-native") +def reactNativeCodegenDirPath = resolveNodeModuleDir("@react-native/codegen") +def vectorIconsDirPath = resolveNodeModuleDir("react-native-vector-icons") + +project.ext["REACT_NATIVE_NODE_MODULES_DIR"] = reactNativeDirPath + +/** + * This is the configuration block to customize your React Native Android app. + * By default you don't need to apply any configuration, just uncomment the lines you need. + */ +react { + /* Folders */ + // The root of your project, i.e. where "package.json" lives. Default is '..' + root = file("../../") + // The folder where the react-native NPM package is. Default is ../node_modules/react-native + reactNativeDir = reactNativeDirPath + // The folder where the react-native Codegen package is. Default is ../node_modules/@react-native/codegen + codegenDir = reactNativeCodegenDirPath + // The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js + cliFile = new File(reactNativeDirPath, "cli.js") + + /* Variants */ + // The list of variants to that are debuggable. For those we're going to + // skip the bundling of the JS bundle and the assets. By default is just 'debug'. + // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. + // debuggableVariants = ["liteDebug", "prodDebug"] + + /* Bundling */ + // A list containing the node command and its flags. Default is just 'node'. + nodeExecutableAndArgs = ["node"] + // + // The command to run when bundling. By default is 'bundle' + // bundleCommand = "ram-bundle" + // + // The path to the CLI configuration file. Default is empty. + // bundleConfig = file(../rn-cli.config.js) + // + // The name of the generated asset file containing your JS bundle + bundleAssetName = "ReactNative.android.bundle" + // + // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' + entryFile = file("../../index.js") + // + // A list of extra flags to pass to the 'bundle' commands. + // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle + // extraPackagerArgs = [] + + /* Hermes Commands */ + // The hermes compiler command to run. By default it is 'hermesc' + hermesCommand = new File(reactNativeDirPath, "sdks/hermesc/%OS-BIN%/hermesc").getAbsolutePath() + // + // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" + hermesFlags = ["-O", "-output-source-map"] + + /* Autolinking */ + autolinkLibrariesWithApp() +} + +/** + * The preferred build flavor of JavaScriptCore (JSC) + * + * For example, to use the international variant, you can use: + * `def jscFlavor = io.github.react-native-community:jsc-android-intl:2026004.+` + * + * The international variant includes ICU i18n library and necessary data + * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that + * give correct results when using with locales other than en-US. Note that + * this variant is about 6MiB larger per architecture than default. + */ +def jscFlavor = 'io.github.react-native-community:jsc-android:2026004.+' + +android { + ndkVersion rootProject.ext.ndkVersion + buildToolsVersion rootProject.ext.buildToolsVersion + compileSdk rootProject.ext.compileSdkVersion + + lintOptions { + checkDependencies false + } + tasks.configureEach { task -> + if (task.name == 'lintAnalyzeDebug' || task.name == 'generateReleaseLintVitalReportModel') { + task.dependsOn 'copyReactNativeVectorIconFonts' + } + } + + namespace "com.shopify.checkoutkitreactnative" + defaultConfig { + applicationId "com.shopify.checkoutkitreactnative" + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 11 + versionName "1.1" + } + signingConfigs { + debug { + storeFile file('debug.keystore') + storePassword 'android' + keyAlias 'androiddebugkey' + keyPassword 'android' + } + release { + if (project.hasProperty('CHECKOUT_KIT_UPLOAD_STORE_FILE')) { + storeFile file(CHECKOUT_KIT_UPLOAD_STORE_FILE) + storePassword CHECKOUT_KIT_UPLOAD_STORE_PASSWORD + keyAlias CHECKOUT_KIT_UPLOAD_STORE_ALIAS + keyPassword CHECKOUT_KIT_UPLOAD_KEY_PASSWORD + } + } + } + buildTypes { + debug { + signingConfig signingConfigs.debug + } + release { + signingConfig signingConfigs.release + minifyEnabled true + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + } + } + + testOptions { + unitTests { + all { + testLogging { + events "failed", "skipped" + exceptionFormat "full" + showExceptions true + showCauses true + showStackTraces true + } + } + } + } +} + +dependencies { + // The version of react-native is set by the React Native Gradle Plugin + implementation("com.facebook.react:react-android") + + implementation project(":react-native-config") + + // Test dependencies + testImplementation "junit:junit:4.13.2" + testImplementation "org.mockito:mockito-core:4.11.0" + androidTestImplementation "org.mockito:mockito-android:4.11.0" + testImplementation "org.mockito:mockito-inline:5.2.0" + testImplementation "org.assertj:assertj-core:3.27.6" + testImplementation("com.shopify:checkout-sheet-kit:${SHOPIFY_CHECKOUT_SDK_VERSION}") + + if (hermesEnabled.toBoolean()) { + implementation("com.facebook.react:hermes-android") + } else { + implementation jscFlavor + } +} + +project.ext.vectoricons = [ + iconFontNames: [ 'Entypo.ttf' ] +] + +apply from: new File(vectorIconsDirPath, "fonts.gradle") + +apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle" + +def stripSurroundingQuotes(String value) { + if (value == null) { + return null + } + return value.trim()?.replaceAll(/^['"]|['"]$/, '') +} + +def properties = loadProperties() +def storefrontDomain = stripSurroundingQuotes(properties.getProperty("STOREFRONT_DOMAIN")) + +if (!storefrontDomain) { + println("**** Please add a .env file with STOREFRONT_DOMAIN set *****") +} + +task generateAndroidManifestFromTemplate { + doLast { + def templateFile = file('src/main/AndroidManifest.template.xml') + def outputFile = file('src/main/AndroidManifest.xml') + def content = templateFile.getText('UTF-8').replace('{{STOREFRONT_DOMAIN}}', "$storefrontDomain") + outputFile.write(content, 'UTF-8') + } +} + +preBuild.dependsOn(generateAndroidManifestFromTemplate) diff --git a/react-native/sample/android/app/debug.keystore b/react-native/sample/android/app/debug.keystore new file mode 100644 index 0000000000000000000000000000000000000000..364e105ed39fbfd62001429a68140672b06ec0de GIT binary patch literal 2257 zcmchYXEfYt8;7T1^dLH$VOTZ%2NOdOH5j5LYLtZ0q7x-V8_6gU5)#7dkq{HTmsfNq zB3ZqcAxeY^G10@?efK?Q&)M(qInVv!xjx+IKEL}p*K@LYvIzo#AZG>st5|P)KF1_Z;y){W{<7K{nl!CPuE z_^(!C(Ol0n8 zK13*rzAtW>(wULKPRYLd7G18F8#1P`V*9`(Poj26eOXYyBVZPno~Cvvhx7vPjAuZo zF?VD!zB~QG(!zbw#qsxT8%BSpqMZ4f70ZPn-3y$L8{EVbbN9$H`B&Z1quk9tgp5FM zuxp3pJ0b8u|3+#5bkJ4SRnCF2l7#DyLYXYY8*?OuAwK4E6J{0N=O3QNVzQ$L#FKkR zi-c@&!nDvezOV$i$Lr}iF$XEcwnybQ6WZrMKuw8gCL^U#D;q3t&HpTbqyD%vG=TeDlzCT~MXUPC|Leb-Uk+ z=vnMd(|>ld?Fh>V8poP;q;;nc@en$|rnP0ytzD&fFkCeUE^kG9Kx4wUh!!rpjwKDP zyw_e|a^x_w3E zP}}@$g>*LLJ4i0`Gx)qltL}@;mDv}D*xR^oeWcWdPkW@Uu)B^X&4W1$p6}ze!zudJ zyiLg@uggoMIArBr*27EZV7djDg@W1MaL+rcZ-lrANJQ%%>u8)ZMWU@R2qtnmG(acP z0d_^!t>}5W zpT`*2NR+0+SpTHb+6Js4b;%LJB;B_-ChhnU5py}iJtku*hm5F0!iql8Hrpcy1aYbT z1*dKC5ua6pMX@@iONI?Hpr%h;&YaXp9n!ND7-=a%BD7v&g zOO41M6EbE24mJ#S$Ui0-brR5ML%@|ndz^)YLMMV1atna{Fw<;TF@>d&F|!Z>8eg>>hkFrV)W+uv=`^F9^e zzzM2*oOjT9%gLoub%(R57p-`TXFe#oh1_{&N-YN z<}artH|m=d8TQuKSWE)Z%puU|g|^^NFwC#N=@dPhasyYjoy(fdEVfKR@cXKHZV-`06HsP`|Ftx;8(YD$fFXumLWbGnu$GMqRncXYY9mwz9$ap zQtfZB^_BeNYITh^hA7+(XNFox5WMeG_LtJ%*Q}$8VKDI_p8^pqX)}NMb`0e|wgF7D zuQACY_Ua<1ri{;Jwt@_1sW9zzdgnyh_O#8y+C;LcZq6=4e^cs6KvmK@$vVpKFGbQ= z$)Eux5C|Fx;Gtmv9^#Y-g@7Rt7*eLp5n!gJmn7&B_L$G?NCN`AP>cXQEz}%F%K;vUs{+l4Q{}eWW;ATe2 zqvXzxoIDy(u;F2q1JH7Sf;{jy_j})F+cKlIOmNfjBGHoG^CN zM|Ho&&X|L-36f}Q-obEACz`sI%2f&k>z5c$2TyTSj~vmO)BW~+N^kt`Jt@R|s!){H ze1_eCrlNaPkJQhL$WG&iRvF*YG=gXd1IyYQ9ew|iYn7r~g!wOnw;@n42>enAxBv*A zEmV*N#sxdicyNM=A4|yaOC5MByts}s_Hpfj|y<6G=o=!3S@eIFKDdpR7|FY>L&Wat&oW&cm&X~ z5Bt>Fcq(fgnvlvLSYg&o6>&fY`ODg4`V^lWWD=%oJ#Kbad2u~! zLECFS*??>|vDsNR&pH=Ze0Eo`sC_G`OjoEKVHY|wmwlX&(XBE<@sx3Hd^gtd-fNwUHsylg06p`U2y_={u}Bc + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-native/sample/android/app/src/main/assets/drawable-hdpi/node_modules_reactnavigation_elements_src_assets_backicon.png b/react-native/sample/android/app/src/main/assets/drawable-hdpi/node_modules_reactnavigation_elements_src_assets_backicon.png new file mode 100644 index 0000000000000000000000000000000000000000..ad03a63bf3caba175695f5acca85a690dda2d02c GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K;ucwP+NCjiE#Ight69&c5o}c_J zydef`Jl72k0*^~vo0xKDg<-rzRAUa4zNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W> zdx@v7EBg~hW-b|X+fI&mK>3-TE{-7?_x9fO&K7YLVE=Hgcv6g5v(ug#3mpG2X~l^g z=?)jRW#8LT#}HWH+b8!|sEezKLr7ksgQH16e{<+n+u3K|wTS9}T$F9n`BriBYpL&s zwwFV#zyH1X`Ng_l(}U*KU#;EHaQ>^>t^L!(5AakXC4PMo>S zmG{@b!ud_d&X)NZyM-TeZd9&dwx6=iN;qyp!IZp1QYET33T6wU1CGvp=aP4Xtw6u0 zTG&!h`he`3ue$vTs7ZD2Sf7`0E}Q{v&)dm@5LS z6{-}TGTr;;T;h6)HTa5jU5B1WYM0o@)%uH+gJv#b|8X?exZLF$-y`QAY+}07o2+{K zFBorRUwP(1^q+ULf3Qc+JtltRgZ~!AXB~B&_7)vtLT6un-*D1d<-~KzzammGEKy5C zEV$1vXq@&w=%dPBwJ@f&i6FYf@ppS*D>*f2Rb9v59`RLSlXktfE5555;`r{`p^ziIX)a4v zg`eWP@NdFyd%>4mj#RlVe7F7TarZMF9!iQ+)~aY;EPOV_L*u=W*SjdmloLHFnOVK2 zzPZm1xvbe)@F_>nSpAMuP&2R5c$UjS%S+_~a>*m2vfi-K&BLtUD`4w>?{Cn8NdWPaP*On#R-0&WlZdFTM zBT7;dOH!?pi&B9UgOP!efv$m}u7Pogp@Ef=g_Wt1wt<0_fx++E&@dDYx%nxXX_dG& UbSb=j1=PUc>FVdQ&MBb@0A#a%=>Px# literal 0 HcmV?d00001 diff --git a/react-native/sample/android/app/src/main/assets/drawable-xhdpi/node_modules_reactnavigation_elements_src_assets_backicon.png b/react-native/sample/android/app/src/main/assets/drawable-xhdpi/node_modules_reactnavigation_elements_src_assets_backicon.png new file mode 100644 index 0000000000000000000000000000000000000000..6de0a1cbb365dfd5d9274890d243ca2321f32235 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}tUr!gukP61P(+)Bo5D;KluXOkB z|6f;`Uoa>nrTyP5;4+Jm;dJDxe#>oP@r$y*#>rHDd13s5eN)8##R;WH*ZD4M;?i1i i;i&z7`QNqd4J-@3aX4v+{p181%;4$j=d#Wzp$P!F!7nZV literal 0 HcmV?d00001 diff --git a/react-native/sample/android/app/src/main/assets/drawable-xxhdpi/node_modules_reactnavigation_elements_src_assets_backicon.png b/react-native/sample/android/app/src/main/assets/drawable-xxhdpi/node_modules_reactnavigation_elements_src_assets_backicon.png new file mode 100644 index 0000000000000000000000000000000000000000..15a983a67d97c9a6c39d91550a528c37c53a9e3e GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXhaw@;qG}Ln;{G-aN{9*nr0&aBl6p z15q2fw>DO<$f$_t-m`#N(R0!@qfL6}is!BA-aP5mqcux*S)AYDzOuXc@WF!zU-mWw z!RNIrdq3B7GJgpV3USMNx+#Bt3lxOZSlm}!I$z&?|8f=2ODy@*gQAaCs?P@6%;4$j K=d#Wzp$P!X&_+4{ literal 0 HcmV?d00001 diff --git a/react-native/sample/android/app/src/main/assets/drawable-xxxhdpi/node_modules_reactnavigation_elements_src_assets_backicon.png b/react-native/sample/android/app/src/main/assets/drawable-xxxhdpi/node_modules_reactnavigation_elements_src_assets_backicon.png new file mode 100644 index 0000000000000000000000000000000000000000..17e52e8550e5668f7117bcb755beb70c3a21c9e9 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%xcgrg^$JhEy=Vy>(TP*-+rv1Kz7M z%I*XNJ!(VLzdH4Ge@o8ai4)e^3vK%P+bZq#{MQci z?P`C0d3kxcKa^1~`zt>B;jiLd|K_aKfAEz>edFmDy)D6SUw`+o@R*?B*u=sqq~bB* zgRIJrKN^lr3+tD}bFTI}~XjubmVU5CWQ(LZ;AgeuH{an^LB{Ts5E|^v% literal 0 HcmV?d00001 diff --git a/react-native/sample/android/app/src/main/ic_launcher-playstore.png b/react-native/sample/android/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..9e198d570b5c5b9eff58127e3832ade008104e2d GIT binary patch literal 209004 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 G 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%0Dxn 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 z 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 Z>`y$o^V0_Qelvo9Aqygcehp;O{~t^+Dxd%W literal 0 HcmV?d00001 diff --git a/react-native/sample/android/app/src/main/java/com/shopify/checkoutkitreactnative/MainActivity.kt b/react-native/sample/android/app/src/main/java/com/shopify/checkoutkitreactnative/MainActivity.kt new file mode 100644 index 00000000..1893cc62 --- /dev/null +++ b/react-native/sample/android/app/src/main/java/com/shopify/checkoutkitreactnative/MainActivity.kt @@ -0,0 +1,22 @@ +package com.shopify.checkoutkitreactnative + +import com.facebook.react.ReactActivity +import com.facebook.react.ReactActivityDelegate +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled +import com.facebook.react.defaults.DefaultReactActivityDelegate + +class MainActivity : ReactActivity() { + + /** + * Returns the name of the main component registered from JavaScript. This is used to schedule + * rendering of the component. + */ + override fun getMainComponentName(): String = "ReactNative" + + /** + * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate] + * which allows you to enable New Architecture with a single boolean flags [fabricEnabled] + */ + override fun createReactActivityDelegate(): ReactActivityDelegate = + DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled) +} diff --git a/react-native/sample/android/app/src/main/java/com/shopify/checkoutkitreactnative/MainApplication.kt b/react-native/sample/android/app/src/main/java/com/shopify/checkoutkitreactnative/MainApplication.kt new file mode 100644 index 00000000..1a051402 --- /dev/null +++ b/react-native/sample/android/app/src/main/java/com/shopify/checkoutkitreactnative/MainApplication.kt @@ -0,0 +1,38 @@ +package com.shopify.checkoutkitreactnative + +import android.app.Application +import com.facebook.react.PackageList +import com.facebook.react.ReactApplication +import com.facebook.react.ReactHost +import com.facebook.react.ReactNativeHost +import com.facebook.react.ReactPackage +import com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative +import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost +import com.facebook.react.defaults.DefaultReactNativeHost + +class MainApplication : Application(), ReactApplication { + + override val reactNativeHost: ReactNativeHost = + object : DefaultReactNativeHost(this) { + override fun getPackages(): List = + PackageList(this).packages.apply { + // Packages that cannot be autolinked yet can be added manually here, for example: + // add(MyReactNativePackage()) + } + + override fun getJSMainModuleName(): String = "index" + + override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG + + override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED + override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED + } + + override val reactHost: ReactHost + get() = getDefaultReactHost(applicationContext, reactNativeHost) + + override fun onCreate() { + super.onCreate() + loadReactNative(this) + } +} diff --git a/react-native/sample/android/app/src/main/res/drawable/rn_edit_text_material.xml b/react-native/sample/android/app/src/main/res/drawable/rn_edit_text_material.xml new file mode 100644 index 00000000..73b37e4d --- /dev/null +++ b/react-native/sample/android/app/src/main/res/drawable/rn_edit_text_material.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + diff --git a/react-native/sample/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/react-native/sample/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..484e6f9b4c12e488c7dff4d83f7ffbd28b4afc5d GIT binary patch literal 6168 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

!J{wi{}x@rl8CM3J*ON^(XGcDJuobU6= z2(1B~1&QQW%V&`_H!+UhHfQL$O*f&7I)n$-VlA8xg*9`)zGGJ3pj18YS^CMH6a%o}i)pRoOM|T^@hIcn9+Z!%}pO3Dg3X|WARWg6d zolY)>MG8oTOXUf_>m+k~l~P$mJ2B>UdVPB_2oELHA^h%Tp!^@xpoBwj}EiE-HhCCpu7E;5sODUAUd%qxd zNNM*pl7vXH^I-JZgN!rj;un#L0=A*{%2{yk7F%MFoFK|L&h>sxT{lbdtH42csOaw* z%{>6RW{d5YXE>TJk$gSU-$K})=BQ5h54@x>n4c%V^KPKxuDx@6?NTkLguK_~(k_04 ziy#e+J0GHFPFEL}(Bd;73Vucac0uG~5bwD;-U8JGe7Zc`FT2ZLlB#f&}Dgy_UhoSl<9McEOnS-i&Xa97#pANYk!q zhXwLX8ltLTLh#V)jl<^!GjU&87J-DJx&(akF4sXJFgEWYS?CC3c^RJJ26R}GzKi^S z=OkQhA+q1#IvC&V;7&Q2_1epmL9_O{CJNgY2|!3^v!CikS7~KX(oM86d$@MTdrTdH z*uSuV2?M2LSr&5x^?!sd5XBC6{-c}NY6|Q)K}jM%`pNAm4jB9{{^4(4x;XXs#yC`~ z*IVgKQ!!)dU6NMyOHQZe_MUDaF+nMQ)c|smrT)3v(61v%wJj}#D39RsJFvxQ@6ONXv%LOJWOtN=p&(bIOlX~-CZXu4J}N~l_lIM zxGf6->2`F-w&~Q0D67sZ4wU9nS|22cPZ}3iT~IwtRk4b}I$qYHJv^<1MfuNOqB+AZ zKfFnm|0Xwe<91U0!(1o+6~XYjuvmRerY@6v^;1?yJ&YrWO~fTYEd;#~=M8Gzee`VO zGArpJRfAU`kng$^!5!>vPZrZ#;Vk8Hg+lKaCgbC{SD>Y9u2AdXelJDbOK!e9CV~5L zOHJ#G-Y?#I8&CbQc>5Tfg;u4j6T1oeuvlwMh6&K&K!cDq(M1lZfJz|KlbFQSKP}Bn zuz7K1-MX(X8^~F6fuq+t5BP5Gly!KCBuD>v#TX4gb|oK`=#+Co9+m_}o{6)y*55al zJ=we)F`-hMJcfHcJE{>wPWMyo7Kq)0&w&ucG9w?B-=p`%0m+zNe$WkGhFbo?!0oW> zn&@u6ajo>bpM8T8;at9R@KAluK&>y{QGj_Zt`E=O^b2gAS13_rn@Pec_4&yC!xOq> zfBaHM2!VY^_T(1P|Dzq+^_WC7KVn6Uyn1C9KarRSSgxo%t0D@l#U`7_Uhuf|OIFF_ zLyMLz`w1k3DyC~ve&;W-^`|=#_-6`>Rl|rU@^&QCmhd9tZ+{d5W8r(+Fqw5)v`L~p zp~Zymp8ZdnaFejIt1Q{f9HPQqk2EiYFO6%$jb8qFoel{gJRWOa5;}R&J~PQ*RbL=2 zk-tydQC;y?H`DJV>{}@z)__BKTDu3->_ICoEIQ|gjQt_{>mbsJ6kI&9@6-4ZOCX~F zF%D-AhPw+O^pfAmmPM@W-k<#C8(MISFT^%ciSPW92n}~e4OTdZBgdWM`Eya>BHjWs zL)WOF;agdUXVT#gpkQufkO(rzikiS|Af<(Y%?}pWQeb0k=09YkU~D$+6z`Wl@h*$P z+&w67umYhFi>tpw0w4uOiw`C`O}2P%uwqgKuPovS3yTKIH@Akbv-~I&7Ji^+cUU=} zQs(0+YX7KFi7i&uX;Yh+aUo^r6GwloLe(xxT>wJ+;V8$2;rJ~e4B8hYX70cjS3tvF zRt(ocB*{g4LcLYW&fy#R1^>bB%hN!$Eh_&@#pyBHoEnIV?VP6sA&#S*3H>>hP(X`= zT6sLu%I?#=o+_aZK!wlR)hATM6~OUR8;OJmo>$!JrPG8(V8l5cno4gHLYf7E<@ zZ4t6)6&Ld|rG}=8*o+h++0*JUXt%g3!Z&JS%R}Nkn)*6}6au@!1al83PyJ-A1R6t4 zjya!2-h{J}Nnjb_67st1$e*!dne{|!aV=f7wA!GrJ z7~kw&X%L2=`12|*^l7cvQ4wU}*L5a)Atz{I64VU)tE?<&O-vV(QJ^ysH<|amX4&V` z0&q`TkOg|0)Q^S|Bc_Fu&IePGU^3BQBD=yyq_;hYhWJCu3dwlC(0oRjOy z#Hqx$vHFOJcTP&?PPF_Dr87=SztMA@qq5w8LpziLj{6EL|a6fv)U&f z_?6TBSeHi&8gRnbPd5nkCHUHtoMaWSXXIbfT(=4{#i^OthdU}En{yYr*&+~j!5Z-Q z&f3OS)1(E=X8oV)B8R`cF0)~-dTG}qL^IrHS{B@9mFZ4Lx1iq2KV+_q$^2AlFr?B{ z>%$P8qIoVAJqJbjocmOqCZOAZHGNp)^;g)8x4z8er<#6>vxQzk0W$4xAP-;-gpQto z#?83zg^=<{#Vaq`XK?VyH{IGnFVx_=MfWk z2kI=|o;Kr#E{)uUqID|FL4}XNnMus4v9np;`Yy&BfP0>H=y55f;V+ z=NBC-XGIV&a)?-DnF^WXekgr06M@+rcr6e+_-RA$lr-=~8e_;oV^ARoHzEig7tC)$ ze=fA+3?{bg%=NOri|o(%;@>}4_8AU*B#)<+XD*}8KOXuNKXpHNd`CKjHsFDc5?C|Y zRL>XLTl$T;rPGVmK{JIZ3yq|4N5-^;CmKyL=HpnfAo-3zNVR(Xr37C70e(d zBERTm85%9T$dqln-Y>G~A6EIr3N59*=%LY?QhcSM>-G!m@ZtAw!_6m#5&>tMAxh%Q zrvayj^=AZPJtt*gK$gZ~^h5RQSp&!6cT@s5nPXF8g2v!_6D{`iG7fIDx3U+nTOv}@ z?_vckv+rSL=%QqU2zN+VsV_H056r3GF>$@PwA5j>k*gAwfp#R@j2;<|A-g?cGi&~k z`O?q_jIeSeANS|jG)a-~&e{e+pUz`plYC(xV$+1R4d5?G_M^G(%)}R-^sAokzVMAm z_hWV4+#Wym-R^u5pwGj@q^$o(`Y7G?674&sqpI{@ z6kP#nLUQL6r)TE7U<#9p+ro>wj_BloBvI!@IeEVNtf%KHI@3e+T4B~Fw@uKR=_$EZ~DAluy`ceE!v+~rx8$QOC^Ras7xJaSYV-ukj(sZDjqyuWsB;;IEF~X_`DajIIS`M9*3MF%B zi7{(PLPaq}QgcYk?>(RI@Av=j57g_$p67kP@B6y1`?~J)dv`l3%4y0;NJuE|*zVv0 zein(pmY~7+hM&u{BqU7rcR1L&o;)(17aO~5$HU=?)c3W)-{)#)(k+Pu;<(ntnIWw} zC!5m-DmdFE6L#C}?bYlD;!>Z3e=Re%Agp;bP{wV(bLT)&3i0;fjS-#|SNrcO{d{^e zbz!t%kZzE^@&D`Fzxs-?y@qRTxY14gHxp|pqsksztPlU(SIsOqpPt?L*0J^DHy@8z z=XYn-A6UKfQ~4E-+w|Sn8m`^m^|AG6ReKhDxv}fZA1@C%78Ee4vIV!*@?u5rWXkks z$Mnh9nS0igYZLaYkMukxSx~%hX~XIRI)8~tLe2e>^M7lY8DS^-xv3dpR&(z|%0_-X zwQ-0oXgpf_o&2T#=!814IjL?hvA89X4s^VDphCt#l*nm zHdUdn^kdn|vLdQ<-M!(m6=i3n>&nh7sVf^QyG@l?7_jYZ?h;A(uG7!>f+=UCIfh#z zRJJzE8lnwQc*&vVM*$2m3k%C}?4>v$%2+vke; zXC^n{vr8C!W5HSIjNf(PzLkU&6G1*VC&5gQHd(!lg!Wd0@hURNsonmfM!GLa5vluC zKfCc1WK37olcVDisqJ!unQ|DCO+juQV znq*Gsy%vOK+VobmA?NX?k*cTe^o%4_4JODLYZrf{7i+J$T*@CPusJ^BoC5QJ-XDY!(JM6xDzVc`wI8@?V#T1)sjmZO1aH%UNd zCZ%dstHMgH$KX`5-kX1#CUOKWth?a zO%(HXtoq{Zt(jS(vct_ujnv1MoLtE-xAA*2Ye0f1m`g<{-)gPXt8Owdg8bS;AHo)h( zIYxqmyqwz`UfN`U>L$9|gb zn4+y=O3V|T16-qrKHDwFC$O1?Ptl|h25B+%+{Ra`)PNX=o5hiQ7#35Ai@z_f2%aM_ zLC(vOI@t~a0$LMN8q%|G6iOH`rVbIlS9y+XEV$zuOc7;`zDxv(S%J@!P)$<(hV_HC zkSONYMw9ECZO!ZHQ%E2CChWa6Y!6Qy;ybs&Ds;1OErbrDkMNNM`-xx-pY-Vij?TTk~RJr8j5 z<+P0ie{zUfU3@^)c(-On)&4EgmdTnaA5$FPYN^+7uJX-=UrqKuVn$`$t6Uky2$ER$ zSc(0cwRz*=0ZI4#PWEkurXK*dddmWu@JtziMn;X`ld+3Q*!F~a(Ai7F_9s3B#dKjc zhEg`c-=7UA@M<`PG6|)O^7G|SI-9#InJ%&t*SKZj>Wy;!evcEq~e& za3IOc7rjaX6n_g`*n zxr6mpgQ+`DzL`h&HtXFeyIOwgtnN+{>(il`jh|2W#b#8u6n(`e-PZMsAQpa&7WFV4 zb%|qwD0vUgw*skevOC7r`Ld zn7$5~QbJyEK`xpguSLk)o#>l+^M$2GbmvErC#tLTELfcsu%sh(a_;HH1<=<$k ztoB*H+^MkJXW-4$zsolBj9dr+bUqMzHFI7j@;Lxb7Eko_gv!=NqbZ~tc6+GE9jNpV zEQrMwm+2PJJcH6oX#9G5O^^oZcza-sU>9NMr**HhjzAd)YURw~i`6vQ4+MSq@U%GJ zUiF$PCe)WqgI8=plTe@<9=VeWljg%q4}WND%-`kQ9QX=VgeJY`&Kgqf{S(a6d|#Ct zULsnLCLY}QOX)?;5$z?+ckGq;p+D!$?$9y;xO9iIz|};k5Mh&VwrdIAp@$R0hbpWC z3vyF;D-BM)vD++~-Wa5a{IvcNGXy_}7!mu0WXS{VAKedLbyFS8H!~9rT39q060+s}&8ndFNKfIpgP4Iby_AMeJ6KYMZ?9b9P2DgmkJondyaQ)}0(J1` z>J&tHIR)!WCDG@Y=Y5+1t~TSxT~x^Zn9IrJBN%T# z>xx_srKzRzy7-MUqP4W@mvM^mplsw+N?R~GDrvALmGd%{tTVnur8FO}viyV*EgPWC z?SQ5hb2;WVe^Exv{9+b;vrthfU4nd*^7@Qhm5Hqlonv8|p1iX<$)CzDy;SzcRO4jU z1pk+=<0+>hr)m#g303FI$t>qCOQl1)#4jx(;f{Fwj6bhDi25cuIpI%Xji#5Ive?wc zQeNfGie~DFJ5@hbNk5f;4Z9V}fngVwXIAvQCZgr@JioG;l6L0ddzvP1_PNEmzTE$M z|0i;_qo2nu4@3JakM?q>-Z1qucD`OXY4t)+!iIlms)eh;<2m{_%B2AQ)0L~p$yo2e7& z??B}|SC(j+`nGYAryd%x#Qii)Z?jKxfmlN2$`F-6#2Rq>-m`n8LU6 zMFEutV$h9)k_gPSTo&$vI$o}5Q$Xhwav0)oJ@4Re{%rIFe7!YFe-ZD#y;WIajBFy@ zQ%>afvW0P+_qrLArH$0atbh27Y+?SFagkG6S7QeHo z9eX9w3`YQj49n@05g|&8iHnxfziLUCqxkyO@a0Gw2xah_eDM4GH^5(VpdjJhHbkl! z2mQVg?zwZrXJsc_RQSl0N3?F2+Es+dPIsS@L-Yyx_rE$PY~1vTi~W5^oXfB`acHoy z3SK08#}BsIfjHg?Z~*Cu79mgNQ*ZL*_3bw& zk$9CKW8LyKf$5?AexM4sEW>#<$wm|ED%VkBO1yCgQvsMNBpGIXT}o)5|87vrO-;fR zx`hvsH#iKqz+aq8*Af+CB&e)1zg`LEYQnk=P|lU=`+au~?%FwVS>Q*q%;ScS|Dl=j z3G0?E-WN%(NEQUMiQ+JVY(!!WRjydwQ#_}tHNHJnEmf~_u0>Qjf8d1Z5Jtdrt#%#% zu`l0|_x_V(;e5>Oin=y3jX6;&r=xRfMWDoWQsvI!Xp} zu1g8 zj!-Y&#thoI{TkCAtA0}~0y#Pr5PTYqj<90=E8EQj^na#wJ@n&19ov7ht=>z2ruxo4j ze%qlNLnX%NqPh>xw3F{TZt&>x*sr@kV*g3k_WhjwU&*pdf5%=R{%ojPUAN+Ve)y;V z#Sf7PJZH88<#R$XlWzkqT2>`f5gB7mTvd8@zy^;*xPd-%8e_B09E#&yn8e0bUUBQi zv|du=x|9+89+# z_S5gx{+SjXz#IN=!4=`=C{ZouU<%{+vmph<+5h>>=^jkc!(4ycGWcHK0o40+3wHXI zv+iM_uuEQ+jd}WCauIw zT;dp1cqwXdm0Xbmvl)Sq)2K$}CDl{q_G2wb9kI}Ya^pCi^SU$gzFk)yJrI?|3r#6~@%ORE&dYzuCXdi6 z&efm1cL#G}wg1O&k8ZVe{ITO1^?la{quF||(JmLGf<0BETh|}HRTx{Sg9r=Hy<@{T z;$oA|HKwZ}7U&c(tAYvR?4^-}?OnFEuBijB8=+%DXWLEFC5POKb}`swlVrjQ<4EQUP9veYR}<$hH)`hJ~49VL@z+*!+Y`EO}X#P*Bq zU#Ex)9MoI)(*;fMBVH(ZVsuAvx;O^;J2p&CWnb%6&>#T&-BLGp!ftI|Za}E@J7wqp>+{MI`w@!8F zP;Y=E6^)cTG~~wF zNSpfGL%uU8Tdrz>~&8vp!*IFSW)UT+f zMq7>0>%;@#^xxP^M@+KHb(TAf+I1gTzVqf-|BYu#o7~=vMhfH*`4eC~&HSIFVcr1l zVk446tH%#Dj(MFV$SZJI13`Z6K#(y(o}fuFf`>F?t^5eP=WZ4^b$6=dH4owjKH(yu z(Pu%+n;tFASAXb&_Ff@rb}iAU4Qu(KY;v3xySenOQf)2#V*P(T{CAP!UMMpk#4R^} zlDteZT=Qd_f@DQ%qOfX|0$I^_uuGx^4%Iq7-$UofLv*}|h0~4ieNEc*C(LpUQ)f<~ zrC8j#eoyIM3wZDk@-yjv1A-b~%?ca6YWaC^hDqH9N-eE** zeK)%vW7>Yeu$bT8{$BAx-e&IQK2h@5rdD?1WRNeakpLQW5zv|fy(mD0R7UFq4GP)G z6DE;A5WJrS=^z>Sqm9CqFqHd@b<4^pNs8Gkma_IVJNeChy?AzcQyD*~?bg#{l+RqF zXF=nk*0-c}V=`)1`^E~{TAmoqmdZs*#L?#bfA~0u6{pD?!kkyrFmjT?!fiflZ+k-m z?GrgtIe9GLRlWblvy)4;_YBpDX6M+@2rkq-t_O*BY?XF=*n1AFZbW0^VGFV1g+Z~7kVt_^T16;AT7R+nC92bm%% zi%_>$#q7WF1OftHTdW{MuP&wHDVuV9G{qgzudUrTpL?%+f{z{pVF|=PQ$F&7YIW z5~azRN%Z=_7NF-kN;jEN;3t)P)fI6A4$V7o9I7l_4yLaZU`%Bh77&kfu3k}K|>I?NzE%-FmFZi(b{dACDVxk|d@ zSt6&ZKcj!HHqPhsu_rM)ZwHw=7bggZ8*_x%Em!(0Lm2IBFAcxLV%9ocfhsaZF3{{+ zqW1D~PGux)*W4`U6;a>QBz}jizQ=2YE6$3P>|xmJ$$QBAqQAjtx6M6c~JCnv1;^fLTEStvY(U|7V;& zJYb5AxF6GkS#`DWsRA<>n~6EJ3aSXBw(^ujux5)$YEhi^P&wt_S4Jbp2rL-nw}j2L zTWwb^yVlS%0FUQDz9?ogpK2KrZe&OCh_6zL&?NP%m3+drfQVJjqe;mXy5m6o<@JwGD%Q4ASA7bdR54F)o1>g|B}lzJqQHKv?})Wu zkNIe_Z;OX%jDw?%li}aJQ!(8#4;j8}Oq;=pXJ>QH^g2i!nx(#Z7_gQ^B_)B5@;tF| z)+=FFRT3oky?`vSE^S2N)|g4{`+VOCygg@&%@Be?3@o9hwq`} z-8r79N5i(JQCx1dpY_y^j7e~@;V<`G?J&0)$sXPJ?!JfRnIEAS?>mL9 zWFxdzStIzgIJ`btU`UiCk>3+~!N|-R3pRkAHP^}c1bnHCZ*NYhOyJi9fMI$9vo&se z^`{ZT52cjZ2N?WaQQE=N|+>a3@pcalbG!}{|p(k1G~ ze5+&H10T`&jm>d@?Hk+2{io?5>o*vM}k4js3*oU67zVqugH63 z`(YcZkr!&{f?j!#0HuQ%hOxZH8DEQ21{54LNb&xaqgdlb!ZE!?O=aP8LXJ6b)T*6U zQ$Z#>SRHVruyiOX?Afy8XdP;53nD*?jqSGUO*$gXIXRM)`LDOW@K?z94y`2M$Fv#( zDmD6k|JDwto6F!Qm)1Jf*+1EQYgHfG-wrrK`sl@zfKKP<&U(2FJ&FzKi`qS>m9rvV zRnF(YD1sNcc}3Y)0=bpYduUsWXs&kZ#H@#n_MUi|Kf52ZzY@>)n{QZeDTnTf8y$b8 zh4RWG72g`1!LuEr-kFsL`Uc}K5+7&d#rtl=&C$#A6=t$_BW8dEN|@oWc^<8c6)SvsjK5^p1LQlMksX9>{{b^?FJZdu9aGU z>REbEw7WSNic~~U`UAkB`1*oZYdeJFoTBiwc_b`sSN+eHd!pte5jW2FgH+=8O`AInez}mDY{MkE8u6jsQ5w7 ze!WEjS^ZJpw@G;uVd&_!x}@M&m=#H1n-s*{yptbE4xO?s>j-fi zDfuq4CAU_|8=&~2v5yj6gY4N21hX9tP{bnd->b3|c*S&fm8miG9!rmmW>dzDb0+oP zYVK~%Ity$I`V0P(00#?rMowJ|S`JEmMIXSAgZ@oaPO>H>rWYe&vUJxah(F3etZJ$g znJ`?vdxcp?2YjEdDha0x*4_s?-inA+ZtN0`JDLtM+vA*IglyR zGlTth8s|1+v*q0?y|=66nSa#lbfHO0co|%TMt{TZU$pn~>PA=KT$0c6yV*Eq-t%8! zlox0SspVPG^R1XY>?(k<%?Yks!XC!PX^AS^ALds8QTWY9MP_lBHkOgPuc;}p-&}88 z+H<^bjdn~N36$=T_cXAh>DfW@mSSfdR>2~#{Q(?hQL-%HQ>D^P$0+dhaNEtTVdeNX zueI$usZX2ye2W#?=p#k(8{f#H&P?3A7WgZBRbz+yg8U&V&L0^iy6c8B10R$=<5E&8 zT;2ier#CC;TfVBPKz8vIo^``GIp7vdW?Yo_8L*P_UJ65hr0F{vs{EYgktyz0&(UIh z!1FVam#RmvtbRtR6+5M-g7f*AiAH_qC_W*;_3S-o6w{eup;W5~_xh9OFRCqyy%-rY zNuZSwHzL{MpaDVsRK&S6_pdc<{1?$acMOvhKEkrF=r!hQ?^kd-wsXDK_>Dc|+Z2!+ zz+BZ)i8L9g0=oq5vR~e~zeeO?I27=XW=pu;8a^pZ(}XlQ%92e-t#F6^fa+?78uBIG zr&T`;WB>L7s}h_E%cw#v2qr`y01D(5q8~_=6-Bt{42d z7G3Z0`nkN%zu)9vh0>R?weUc#c~i!n`J%}%Q#WNV#Tl5nhQ(ewZ#DF~trk8iwGLs*Onej$ zOF$_6P{yAl^?yZPCr=M;DAxX#>>QjonNBsL)eCuud#t71sn&C0Iwyxl6Y#wipkWEI zliaG=MXgDpDSimIip;vYRdydw$RM~7w-CP0?=?#eXGQ5oxD2pk%Z~=dk+|&H)B&K^ z)zRv`d~rMdsIAkhs!lv!Zk^(P=Gka(zH!fkNA(-vpSPYm`#1H8QZHdk#Vb7h3%##w zMFAvd#_kreD=}UWV;{mfr%dW4w5uu(x7okHVjOr1FKfzh*t5FO>Y`Dc+I6r}r21vI zy^k(GvS@xspb^ewCDlxJYMaCQ)rI$RN_;P;#U5*=x2(ST#9QiE8NF=v&6<>w?2=Ha z>%A;W;OTswod{Qj?;|Va^Ztjzm~~H49+(Fp3xXVOE4bC1hqjCGHTJJg+CgrpP9GEj zM}~`i8s9CO9PsM2-}UMs>w!;O!zz?+1fNhc^shZ&6Y{TIXVQA_^W1LF@#l}LdJAE< z%%9JF;xB$>@#9EKf#(Y5(<|7DXq*yr3ju5(0A~V>b#X>?DFEfy!8VJDU+*%G1Mj4N zuwLZ=Bk{Kc^s*~`;@sM`NaH{ChvCwk>3r<=R$Qs zE9vq#pS`D(gu~GD=i8!kh3$|=|Cbs|^!o4WL>zS^Iyr-`n_>Uy3fZW6C3R=k2D#tw z9ITi>=CR~;jog|Ldf~@ypLR?y4>uHV0Cz|pzQFops`XD3t$g5;eBea(#TZOU0Nwe z{J&`zeCEv zMzEvA&Nq9f_fV7&Xb#si_%^*_>wEei?<@tD!+~aqPs8R&U&153_z*MEZgvli4c1u1 zCf-o^-NFEcbK!)4cXh_zyvG=z)LKC(db!XNATJLtngSGDN`l$DXxtN;><|kqe4Vun zStnQ~hT_M5y~F2_M(7}GJY_&^F`;7x$Na_HIMe?!Br!m*M-OkFWtt-27eCGCBdhyGPbNuP(*+Wb3}|~ z3LF_f&Wr@GFM(N+B1XE|>AFb3I<{U7az_cq6CgC{ZZ3z)@df;d3G~rB0UH0;12TgN zWsxKq(iO2=t)MWtXx)S@yqDMu)x8w^`Q6UnS}UK)IkZ+v17Uj_f;<`1^>hdt8|m%K z2R467ekKiq16&mqrq7VL&hG5McVIJw^!ER$BnsP=idGTO4ImYd6PVII2T_lj{&eaDsp;;OF2i*1#QceO45Qt z#8PzS2Dlq8TU;i9-?-du2%K>R3t3_cI#H(v+Pe03xgw!fQcEQaKX*;lqW-!AcGh&x zPbx|I?B#*+Mzl@#ILZfxU;B|{0U8)R1Y0u}41Vx`3SyBwu=tA5Bzd2r0EIBhG707i za0GB{Kw#$Bn^0 zh|B@Du&?s;V}nMJiGWa1n(oD%%Ux!BOi=;N+{UY-!w>IlU-`cUsul*{3~aj5>!AjA zAjLIhpkaqRZfk?kQ>NyfnX8zM`Ad_OyoFpKKZzehPT^1gr%cWiq-v`;i@VTWnpr(4 z&=-f8_}*}eC|-?6Bag7Y@YAJyDB?zMSD64-sjh573aO;Ut%;1k8V-^MGGr0hz|%|$ z&$NK`?0MjXSkmKwCPhRMImQ^qUGJ;(Zx2KY2eD;3h2BRs( z(woK2$)W|3#OrlezF|!%olp)=3@*xYMW~^@m*F?u=0^rn04UocNohcn_c;j0gk`s` z*Mn6)JhGh!ViCd%jO112z{eE1g@7_GumQ_3Au?Y%`)EO6L0}5GoU1g3HKs2?hQZ`- zCW{)PE#}3)d_ZhVj;`33I-u=vF`w^`Vv67S|8pG~>@I(ujYq4l`H+w8umMZc5<9l- KcDQFxN&G*uA5gsj literal 0 HcmV?d00001 diff --git a/react-native/sample/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/react-native/sample/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..cce0ead6d88a98be755a0fe00e99bbf276cb4174 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^i$Iuz4M-mPBqj}{YCT;XLn`9l9yDYG2`>2RpUWe^ f0LY|0XxPs<>mUQ8+_5(tAj>>m{an^LB{Ts5pY0W{ literal 0 HcmV?d00001 diff --git a/react-native/sample/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/react-native/sample/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..b99873491ab179fa41b0ce643bd36cac2f383d72 GIT binary patch literal 7854 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 M07*qoM6N<$f;Ae)+5i9m literal 0 HcmV?d00001 diff --git a/react-native/sample/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/react-native/sample/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..0114c656b12025cfe89e5c3334c3f09d14628c36 GIT binary patch literal 3920 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 eoIjl3qx0VrP->zvz|tQ80000 literal 0 HcmV?d00001 diff --git a/react-native/sample/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png b/react-native/sample/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png new file mode 100644 index 0000000000000000000000000000000000000000..d1795de41a7ea9969c1d04ffd6e3a03b9cf816dd GIT binary patch literal 6125 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 C=p^g_ literal 0 HcmV?d00001 diff --git a/react-native/sample/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/react-native/sample/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..39bda3c5f82fd579eec9265a89775edb15087271 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^IUvlz1|<8_!p{OJ7f%<*kczms2Mrm4yh97V`sZ@Q eF90%$2Nk^A)-W(mC~-Cb>G5>+b6Mw<&;$TJ!W3ix literal 0 HcmV?d00001 diff --git a/react-native/sample/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/react-native/sample/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..d31988ab870c5a41767c6b61d7c905bbb7638bdd GIT binary patch literal 4609 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 rk1Sx zKtP%l(I6nbDbmZ$``-IK-*bPQne$_2_C9B3?X~vI#F&}rGeUWwR8&-q23X7uO6~BU zhmM9){z?x}rlJxEGQenC1m4-qhM3tO1(6YIHZAI}eQI9Ch}>_Hec|`D# z-gKO`AKX!T*6L-O@zJv7x8)hsP(jfBT(kY}1y}oC;d_@&n~=%Z|63hBUyg|hyIM8y z`KX^qa7Wj*9iyj@FI8SpMAQh`Z>0Ds_?XeiW~MoW6Pd zCgt2sD^g(cA|8#8KgzaTIg?!)3tiq3{1tMi=%5W}pR&pfe_6I{xS=+LFFYr8IfA)evsuwj=HtBOcO`0~s=IcO2Bc4&{0GEkPfPVQuv;cbky zXYDy(_pH94`P444=q$d`G64;FBp6_;Tw~`jJm)<1g!!`@&Grd~HBi$PKgUecPpDRF zVDVq#Kf+LNh`HjjBe3SzHY6&e5Eui*hUnYy%_Nd+K`Tf7t?_QfUj~dG0HqNEuaqC z|F==mvj#h3QJi4Q2LjwkwCg_wz)kjlni)!O4n3651r>xnZ~@$~euQQbPQi`8G9y5A z)6EEOAvSL*FZC?!3c_rTf66cztmS(*ar1<6i&tiNh!9fXe=K@>mC1X0l-bXWi`gO} zm)zsjo(Cx`cy4W|!yp`hD>ce&ROcd#apxlJ9e*{2XfJ%@@eJHiA_8G~4ikd8KfYi~ z90j}L@;Wu(YaoGK-MyACl9q9Alv28?{(2SrxEz4NX5|K#p9e`Vlmki)-5hv|UN89E z?1U&nwXE^u)Nos{(1xQ>U86`C`+Pgd3dahWTy>2TLOj0mSr0wN%37FjYUq=qY1^=M zX@fhI#4&L?*RgKab)tQxf49>@D2Gm%+z7P4UL8v?3W2mzsX7tk$89#3X@tcYQAi@F zAeYkX+yuqz%Ri6PK}Azs6ofP&gaYXe$pVfCv8#Q4j{83Rjw%RA{q8hjmfFHX=w#~h z@cDg$`*@A=VWmURyrKyx->h2z5g~u)s2D7fbTzgN#ZyP}ww_(}|@) z4Fj_?93&l^gq00*GOFLVXH3uFfQDAuow=CQ`4Jg5Vl)s-$b`Gz)3BSN?SBPcapX$# z!bHLA;sSR-p_O_T>WJu3=zoUhzwz2%yx=gPUJzbj_=u1{;m!%a^H!LySWrsH<{PL= z6>diThP^5h2Vx_Z*m7vC_SxcJ`1;B=(2m#AkHpcAggumv1B>~|UIB9J*2qBw5S-OtP79+|| zI1P2!^tgI~`U>zu&i@HMu6tuDuXzgL7*KcNC64;GmeX~ZoJv$u2ZZp|RfuXU!|jU& zqp&%pO+}HrWjX-eawHPP1n$kp1+wdqI*SAWkV%raa0hd+%m?4A5?v9WsL3zezavyG zO(sKqy|1eS8&HDYFGR|pfxO6{R-UFlgiLX74tPa8*`&7SC4S}((u^ZoQ56Iw2nNwSPc7-MfU8@(1|q$TrJ z4xo$W4}HC7-S8(12S-Dl%v{o4gtAC`O&;cw5lx-XAl<8UrFsAb(VQFyb`Y-+z@1Jb zmaQD5+3ti-|E)h{XHSkL9RP^-v0-Nr1WCXeWAKPbvyEQ+HbFjYssyB1aA95pS-<~ zvdF=Su@RTu0PE&j^3dq7T37}sSpcvh*ww6-hb_?s^aRowQ_B(4<`~@qNFj4X!$ssl z3;$9m=PW{qm068{l_h!Lv4rU-Qj)`C6BLvrfIzX$v)RYrls3-`YrK(|pQJ!M#L(wG zrtaH)_)`FoHutq3-ab-ob!WhXlY~PLL#<7Li8(k|HrQK7{1v!0z+J3AaWy)Lpn3;~ zm0R*PseY4wdx8+YH4f^%Y6pB^`Y(&>-^~Vp{h?;T^^EFp@6^Qpwe-zYzv{;dAcCG7 zLoSLO9ZBI1i7p8=5{~Vp<3qDw?VRY{u)z0ZAtkzwHM*GBwU0{p*bd)6dO;Nh{?Sj` zabJyoxx)okFO5oQim1IDVy{&&2@A&1=b~^J>+7&GNDRU(38?o4_}$vBF}YJ}*XO;5 z*u7i}LhtX=uH}qgVfd+6LoG0+mFnb#kUC~Q_OL+Eq>~B0Q|-FH@T{C484Ggdjt3g* zR)E%ho$OfCz!v4jytWoE;S%K@rMlglY33{GcR>>aLMvo*fg20Jf;7MBg8XnBc;7ZR zEqDmwge~DD#E^1!U(W+3h*VuMHuLiEjVdKKJ?zt*@J00v zA~B`gq~y5%{tG1S;AnEz;3_) z4&CUQlYtZsYtE;6YtvcxCCj0)iT%E(D1RN% zI`*yDE|=YeESh?EX{r*=?(QGnf1@~;>Y&C&=3+Z1a%qB10VrZu2A5#prKN3|3feCrIo@^s7NHuok zF&yNMuJw;(9g*3T7O}p%gH9?(O5A32&+8K1=Qr+|llLI78Z|V_4vR z`a*%F3-0$gY#(H{TpujhEyq?J0uF8 z%Y@}0I+MW>GFLnA;QdgoqgkETquUGLeU};A>T~vdT#8`&X*K1mPg`{zxmd}|lz#Ud z?Hb3EKISDj-`S=JGajk|dW|Uheb|bANsI!c`Ht!bS{e{~U&L#kv`~ZdyhgevO z_mm;JJcD%v2ehx03IRzHe|%m4fMbwFKY3jW6tsTFFxj-#rfsQj-ov2b=;G1vG>S3)_6tK@0k8o z;4nX8Nl~VS-mLR21s~c#yjdqd8;;~4*dBY6EY(or zsHB>c0CEU$k{U$iFo6lq;t~-@88)~H-HU5;PwI^&pI6deuAucY9b`7p`YQ&Z(*lIe zQS3Kjth!d)HQ<3Wj&6T55FnkOTH)l$|~l45U$tASeqNsx_1`+|I0PFWL1uGRP7NWXvC6>0hxi1+G~kX*ZB&ip+k(bgTU<*ydfX3#TpGzo~} zn3yOW+B*3XAK)eD(e{o9c-qV;3NQmw!e5*XI$g^cHelAt3ni|-6mibQk{e38s`%%F zmtcF2*`)inv5k2?Q+e(Eg-iy~k~eft26X*Xv&|~~vRG?wWBarLNwyB_|0ZDM+56FZ z>wy1YkwPFE2!k0HhhUBlHKE{4#{>cXa}4KV+{c`PbMW=Y)cP!64}s82pK_|*7@&cF zGCz?W&*ZR;Gj6s0LlPTN?G!y8ytA}1T5|KJZK6Pptk8hlcDnOSnz zL_|#llx^8risx&zRR9HK==0ywpef8|Me>a6jL{2X_x>V3NEvE0P{khUn%!$LxC$ya z9%#uglc5IvNQJfsEbc{Nw%$wci7l2vwEi3Sl~WxOK`~QQ!PlrI-v&p;9PKRuh`!uf zKQspf1ZkYLW9$B6qq}Tif9v+R$=~xsGkw`YZ0N5A;>L@LmiKESjx6q6^__oX9)L-Y zQlOB6SpXEH0e|{rQcb70LGB0 zq~N?L>i~T=$mUy`^jBzrWN;KmY93P7gw{Mp{gW^372$c>;ETM7XbVP6fgAEv*#}J> zl~n$YZ)%dzvnsaodKqN@mg^q~|itY$a~ons$b)t-jo-P8-`9tf`M~EWwwQ zyDL9sxtKNrpIFs@d4{(%wl0;f+Cx|Cc4u2TKQa*yynP!C(BD7cN#xZ6XtXh0f>^<` zbn$hcsUjbzjoX5enzY_`d^EOsmF&_5bVJ^?xj)LK7oPk3q^77!15K(e$ z6xc%;aB}?r(1T9}&HJJ}ISL;=^rV9~@%X2+l({9`O8V%LL zqwlGNA=q=tq8KRM5`CYDs`4Mzk4Vm-lBY~Am}fBT6Z{;aw%ph0%3y<8=bYkBb1M{> zXVBTMp#?EwYdUI9UU$(~O$;g3EOzKFIr`v3wggg_EHBaCgtxJwqbUue$?`qR* zuYsAPnxSObP_IFw5T73@F$>!`{Si9lPf_0++|rosC9pS%lKR3S=BQ2+d@Bt&J_onP zO$kOah}8B>7n^C&{0tCpO`@DN1Ea{-oIguf0Bm&R(6?%NaU)aDdh@;iNBGgPn? zFTuR^nB1D?JlK4Hb-c*<2|nj^+Gz|)P9T&yUORC=jfGd(jaMi-Um$kHAUk@1kmLEj zA9o_-C}Pzk&RtO3+!NR2NQ1JJQO_cmOUMEfrMTzz{ zcOR*iL(JW58Jz&ZSyIc>C0TZ)!A~XB>*PkZoq&D! z425!kX!Bl4#%Hqd{wA;sgn^t$xc&*aG}YIZ<8-cgkO}Z*Y=w|@aeg9{ZKMZRckd&G zj+=Ga*AfF+hDJ$eSz6yR-_N*lb@c_BoeZvu&9)0uLgF{pT6)MW6@Z#Gfd4f+tc4Z4 zfdQzU{CCkOk{r@T%r)rgZ%_Sl6f;a%iy9X^Bcd^aGS7%lQv|Ot#cW3ufKcx^6A?Pe z!DMS6W>gWfbdH!l$q4xrWa6uH`dKPkGom0so0s$zqHp?yw`B^vshnkQDCYHS*S)HB zr+niZsrsUfpyEvp&idDg%e?$yi%Y(Diww@8i>0{)VPo`H(Eb<5!Qsa+xNao<_72|d z3*2axI3$$5p%?tpA&;5c8o!$>6exp_m+G3T6$(7(4SEL}7EU9tqGS`mR!LlG4o)00 z_lA=gb{YOKz@8iqJ4zKZl{Wg>lT$gD;oqA~t6w^lLT;hrhyVFcJ^nZbJQsmZB?9Z2 z(SuBPsKmQe;k;v{GB&X5yPi%9UjZMgM1B6R*g>j-4{$DaeUdVY&tN4y1%rwaY2r-2 zNwkQMmtR!Y`v6%)`9SmWSbbS(F_VDDS*!TPxH%+3)(2?&5#g^d?x(+Dy4ONV&8X%;_3F2%fZ28F$k@N-P;%pm%C zve{9hXZjS)`q`Ah7ia%BTd?NS1@7 z_DyAaVIk^%bhu93ni1L~keR{#PIp^{3oJ3)9AhoQ#@R;I^pqnn(O0Fu1o+4fgL2cx z16N{e>w@gPQ#UI?2ZCV{DuLYKtcr}Yz_uuGucscsF47vn2I+<$zeVkZZJaZtFDjE$ zhPC$qEpw!aUXN#`te3yiUk&D%|NfbOp!ezeM^V>_C$LMin@#~v;{3vvvit3cRY=^P*+wWpNk2V-~)$dHx?6p1~sW2 zP<_eQF6CE~JUMUOX%a>Db%NKZe6h~C%|6iX9^NR0brnh{*~hCa zh+p0N!P0iB`-uGYA#vE-R*Iz!R}z@56R>E6AM@QSgPY-gs<07%y8$%y0hcISW4)dj zict=T$8GXsetw!bALl7Li@UFYw{uyJ#eX~G`0yR;_VVso4r@PRyrD#UjS;)R>#M{s z`D7&GU(U^V>~Ad*U8g5GmPkajJJYzkVDzj@PEH_0a?-)f4-vXS$o{uXz8BsfC30r| z0^yVSI7XC1dM-A)A&u;eN^i-ZYNKOve|K_%{H=A_j`dzOQvc-7p=0j8J}{V!MNUQ| zU+Y*4;z=-69lZea0+}O{5P(+xRiWl{3qO`Y&Xb;P{o`Xhbod|-H$DN|nT`esX?o)Rhy9U&aB5D_Ax+lbDk4zuU6bXL17>IK~H4+_S2n;F<&#eGIJ}b~9L8tbU z8ZHza=SnF3PiZLmuhuHo46nA@=XK8+tc+cGeAFK|rsm8K0rq4JWRQ)zV^`_GS^R*B z+KXqmr!+^VgD{;%9hw(C1XF!sGhlDkWk*rC1e`F+BHpcvU~GL2DqlC|hYY+_twdSt zhTTRrW+r}5BMw2PvXL35Cl?DRH&t7%qHq`N!gr5;s9o&&e;1)f#H_zYcQ>=#>~_ho zmI!05t^wU5kz;%pZGkQIFs#0mQ0qO^Vc~!gfEzl+lUjB1cl+s%r)rDedOMCPxb=B( zSg66Y67}=1#8*4Bj>`30(*lNv*$D*7$xvXMt*Vb$moAEK64Wh)ut7CiKbS2R3|Izr zu-5!MDi-HpE>P@wwC{YUSni~>p<#)$wQawL{_tbe&$EePbm$fC_zS1#RM^Gp3cN7C z@t@A%SH`|&y84oLpdskHOxjo0SsC~1;nYU)->6vI7^f3AR$LM{7N;jZ@lGcM3WgBd z_I`1m>?1~dFbJ)u!7C9C!hal;SXbi?`Oj|~VW{BIAV1mpUVao8Q(_ks@ z=i@6LOwXiGe=utl0Z)G?O};&0-d{da9lm_F;<>K`e0K6ibE-pw%<0$jwPTggYpTz` zTkAq>J5S2+ee0w zo^c^gXpzTMVWjynW_{PB#o15rr6`9?9`+G>QWzHIQ$i~c?SLwv?bd1GKb1y5Wbm-; zp?nbvK06`0NM|a~vBrhsP>Ch6MD?;-m#`8si|I5>LXN?Pzv&FS`mnmA$|X8~3_K!@ zwGZ^q_unXa<<%aaA83ZY7#iA=xO;N65b*PqEO~m^#{A>#=wjxS`PTN~IeHv%+%a3! zb8hU;aF*(;xbbcCWA)FvOU!=>q1}J&Vr2Gi#>fz?qn-*Y(o`)^BNh2(Tt5^k-X}Xd zT`!mM7XLNj&Va0c&qZC|z;zaYRLe{_Z^=jq?e*$y`Mh#{LwjG5hZ%lCJY&?m{EI5d z^x7xw-iD!-gJPGaG{c8AhCI0S{r**QI;hK-bJM4bzYo1I* zUYssGKibTEzP~@bYP90o^{uxHuQ^ z{PNSYgD$(O?z?A8mmYN-FlB?YAV zJKfl^7IO7+%cbS8H-DzzY;tjSwE6$^*G9MJ!B2gk2OIvp-x)Y_{9rW6kJ?$F?s_O1 z@(bJ+=@Tdt>66~xbSTTY_@4PoonQIwnz#Zn!dg{|J+n*GEw+ zt6OqkA6j|WWAC{Vd?@<%c!bzpnZW~L<@9-cbsQq>rKYxTdXPV>-#qgDCNX+M>+}rYP;tP0Xa7wNesy$03`d!+EvJx7F?LOR0uChppR7*muNGj*!W36qnd z-5!pUV$mG(;P0m(>_O}b^Y7OYCJEvDxFv-s{}KmJg)={Jy*Y%|JT?3{6vB@&c9Tj&FomV85=?s^ z{@K7$z*4{I!TYwELyZJmD%1^l9FOZe*- zmhgpR7D^S=WEdWG`S*5TR{9ps)NmX^%VLxg(kg_OOy}Z-)iDlv{S6AfczBv()Wu91 zMaq;JFD0zLoi4!^=gba|e&GoPDTxL3p{?5+iu#%#Fd8U6=UIhxM~4Ja_4{N!QEdd| zmdSHK9?Q_qC6>Y@!@$3+9gd?ES_#=&j)meMqNID4-6fPaFu{%c!h9{XV4CRqzJ`1I zrn8SKama0S$6B!s%w*gJtYjeaG^fUe;u9;yrnSxW(i)*v&)8t1~gQ^Q?ny_$qy- z$vupIZ>L6-NU!X<>Qot~+z3Rj8n-Z%c5r=Xf-+=;u%o^~=60G<6TbQ?#cq>@JKjAeBjwt}_~@vqgCq@Nb(vIR<|F1wTv&?mMKX z2|33f5mA?bMy554u{nJWImfYH)h9F{jDv3(Rlz`c*YGv{g2$Yl!y}6y@>Uq?6;M+=J zC8@I?8tJuRdLj4<;!jIo_?U&D3ZEHuZ)b1jRHjSVt>mNUd609}xTM(^6E|as%{3t9 z)0f(9L{w6_dmZvB%$(3UzW8_CI!tI^gL0{`t}5%Nh}W?1;P9w{eAE+H`H;U=`10AU z5IDzx^n|gUEyrO!cR5_k-E1_!hxwQo=8Ny-%A`$b=rJVNEUT3GEpn`#+bmrFWytF@ zD~NZ`iDL9Kw1ru6*idw+;0)6PH<2DOzyT%W+-nozDAY(~UxP7mKc+rYDwFHfVS~_> z8%cajO`-b4^8ApNRjI~I=~P*kx#O&59`ze3Y9@}ihhg&2Zkix0700`vzZw6O7}dNN zD;dJ-4Aa|I7vW*E3u@)E37~AjIZ|iyncCWQSt?LDgUFEq4ay1A8zrQ`|M#oe!nM!^ z+cIe~X6Lc6iL#RKejHKq|W0#QnZ3zOFmP*2JwH=kNi1hYm`v)tE6;RL4habbVg!6xD9! zUabDd-F5>@$|0egim6SM#TWX7VLBYf;AH_-UxUJ%+9#QXt%fwsQmQgoCYs2+$@IOciTKGA!^8v=eaC%zf zGvwA`^N>cj#4;Y#GN(2RYs2t7uHfO=9T~pwy_B0ot=MHSr|UDce`QF?nmq}{mlA(k z*b>7nKX5nt{R3???LC4(?Pm1SubK2-k`;WLL(0F(#Zqtz4(p}bTVPC5VDfz< z`xv_WVu`nb~ zXl!u%PDqi)2hZw#40A*zSS)1u)*UFLib9)p!?fxZY>n!6p;(WIk2Io&A=_$kGO~Hq zMwk^e{h5gp?b!exQ`C2FGtR3C4QaQOP}cEyMy|zJDRtt5>_4rZ963Sd!Z|W&bYc?* zjQD&J^#k$h3Q>M+Iqc~9rC8Y!U(oj%Q=3O1VMt%P*kq@Q)^^Sl@QnC^;p69qLFl_> z;H)@N)7imV)Q$%2ZxA%=1sjV4ui%_}vMm0;CHUJ0acl{CPs26KF-n3lQNaTHkws4#>w0HACZ(DZYQY7#bkaM-4)p~W91glbRJGds9qA0uz;3zcIMn>t$ zV9b&*@@vmvoCVcTln8Ue_c|lD1(JdMX5nc2KARoHpEmrH96D3V6o40F=sI;f=Ze?* zXv6^!f0vSyg$)mc)U)>vm-@uw3 z&JpG~$0w}~$BW@lRddd)kBw%xXRs14VdoCeM`>xdbiM+Lr(FMD`yyWY-j`c%O2$SHrt#hPSrH zxO<%HlsWYA;IvWcbF*cSU4Jf2e+|&x&0aXaTdS|AG^Zvj+PSU4^?oq)JnEQ(m9HIt zg8_^=4dwEngJ3F6DZt%6L!GhbjUiD|Ej=^SpRybD-l-~aSbe*V=1(+6v#-Gb>rq*9 zE85YJvm+tvg<<1~f`>}h&9~C-sz~ovej4HY*g5b?qhr~_9oESSJMO+~#P)Q*mhI_B zs`Sjf-Rt`SG9(#7f40f5p+uC= z9NtcJe(-wEYj=NSS=Mf|EYftF*!z+8I&=+wEQYG)lgAy$F@8dqF)=p zmh?AF#1`Hij=O-r=wNHPkR!%o%Jeu%q{_ijA913Osjk%rENoxRd0CZ{BGsxtt(>6v z1ni(QA20=fC`{17V{rsT9;SNEJEN$&k6@j^gEm53LJIG+9_c{!i9@qq)?*YU>pWP! zMpSUsKbH1!yw!wIq7v!7iXX?-=^KQ??0iW4GV!@?`qxy~YrQV{=)3OI3BsNXdF2m{ zZUd>#Mfv0A&-I+oK6!UEH)n%&h4cX4`P>s;+u^mLtkkWT(W*_Wk-<9x?J)NHu%SeN zF~0iN(ux07P|Y~3N7Q3sf6H%_;t!DYApoSL;M&{x587>bT;HoF>d#4;d1baWaeS;? z|Ab{kUkbclWb%pU8|^v0pTEhkN_pc*PM}MtiQBUK$Bdb$J!6y8Q*SfnVW@#H&IbH36CT5iDfC0Bau+3$=Pv$iDbD)a5`0jx1WmO(Mp=!gzqYh!ym~&ig8IAa{kwh5g_;2` zstA?YDFIDOC$|!LqHbNG_;#)p8JQW%GO>Hw({Nj_755`h&C1B^iO%n#i)iaO*Fu+5&&{|g8)kW859-24ktv-WoH6wxU!$xf51rGOeqPlox$?vUGoMRkqK{2z zge%{)OfY2zTPoWtBie1wf3$)7p8H$lgC6oEPaI@BYiVg~!|zlw10&}*#i5)OxNq{J z9=A%Gy<;ZnMXyJIGynD`us_UX2AmPwA=VqSBYzjcMV7UCi|q2V#BF6q2xqT@ZIMfK zShZxlx_b9d`f*}x`7Bp_h^+UH8#SRpA;4{$p?t}@eEK$hCi!p4cof1E>AQX7c@=1a zrR@x^N`9@$u3E&?eRJ{j{zJ6Gi-fi7s)Yks!zn+SL?4+ zeLa$rEXLxN$Ah#yG&PfVX;f2+wG|9*(OB7^8H5q$osHf_{E4O0d$hutwL% z$)bivC%mJTA=la477MG>k%fudDB-jtERp{2oKU8R0aH&q3UnYeA00-V)(-r?h__0mUj>5M2{i288P7464{)5 zCP1Eo#-G<@j|H;5Ih9m^cF#lr$XB=R69JL(9ok(OHGEJ?xw~OO{y*J50TA)lXNoXI zgWdr=rH}CleQNkA#Eu^&jjg04=sAOtHTgcdC=8jSS6{ ziYt5+%DT)VKEjpXe1J1MEe@va-#%GUl4NFWenmQXtI&N zJ1~V1lVGJ~DVbPU8|u$U=AK}3VF+SW_Y_BffFnnrvJ*}8iCyLLA*U;hwNeV>SZ-Ft^_u}?HyEf=4`xCFL& za=tLuzOR74 zGsNnDjvR(Wp?HSNKWqcYC8DXPW*%{Sx%Xs|q*G)mPODF+vx$7_PG4@gTL88@dHZkTukGE<`?Jm`Z(B|+c(tc1CJzJaWgYt!LQ66;Kl+(q zE26#;@^VPQGj0R??cGA~&7}rttwRGL=@X)yf3S$eHWdRQR;hiu7ReLop3pX6GvtB{ z)Y2crFVST-ML9!h-1t0QMv>`&a7NHeQGzvjcx)>LthWGKZoq#xLnVV!eppTY2lA>- zRQ)@dYJdAS+E@VuM)9Jf97NH_roE+<0U!u;NtP$A%8*R!n$Xm%sr!Cs1l=*k&WorE z836c9$9+!>GX~p>BJ1m86?SYfePwG#EbZS}#!cC3;-jvotzmOw6#(W*Nt-zr0I+Kn z&tOhx3rHa)Ua&mHk?ts81Ct72nFvEs!EFI3FfXN36Q;6-2wQAN>5k^cUPUg<2R90E z#?V^5-zP3Um%0JJv6!)0w^D%LUO6NLMID{cAp6gEk9nqyWN0s$czpHVuFs5CZU+1m zYJF`AtlcYp%caEj{0DjJa7QjU(D3zaqlp-rPrHO0?YvS zo+u%FlosQmSdHs7E2Ttr3_XM``VX6SQx@hXq2K%Sxl669-plXV7RPY5LJ8BjWwbq$ z+m0!*PP!A9)EPGC6c9fnX(p(+GSV|4sZhLhsvcwY=Qk)kgzuOO>j2b<2|Z>7azk6o z<~(FL(qHqEUl7BdSNXAd;(w+U6?6lO0;;wc{c3^4{c#dfeA)ut6SeLAirN0%V)^&* z>GBG1%Im5ep=-P#jW=JP z!0yI&a8WelfrxdUg>^^6R|ANjdw9ZobFn2%xyJRYv>81y3=9$ZwHS}MVcovPt((m$ zgW(0{yNRB^&t`@zH^V(<&q|*t5WcaT@-(gFp1NcIPGf;b^g$Z_AgQ3LCBRYX9oGk z-R1yYRJl0Q)t;z(moW&}&D+$nk{^O0ZGDEd{W0KL3`n_F3Bu}L^pT0bwcBzFHVSYm z?;20a%(IncHOAyVT~TCLdb4#oG;$j<>aAXl$U09ZroM7c3OZR(wdALL(emQpNZNsq zb6y4_Zh2%qAFUjj960oVSbBz)UqKZG)SvD9aRGrNtg8++4~FTh(j_Gc?-H}zC?EH#pLu@8 zRj=%(>=%sM4*mg|oZzhwaxH9gsm=g?Xjuq49aAf|Y2;X~*uC|RtU<+m1+1R6;BCK$ zYosq}Mg?f;$H@vh@&ZF>3L8&bZXRz9Wo34+P#DdF#LP5Y_BZGlg*O8g6CVkdp?kPB zz(~C1!l3PckII`}DwH8b8Eb*MJW~d^x}e&OZd$Nu12*EQq?x&}7k95098CBd>0qrEEDiEvQWjmG zuh9^;mI+ymWSH9*XtxaMxCYzmc~#HE=Z)yl3@LkLb0{l(sDi=_if}XU4|{s^Y^Q1F z_<(*wOZkSgt)|$r`;&G>O66-&l95fF*ObZ~CN++i@T(V`LbKmH1(rTLzgwcHW=Glg zLzCe@S1`JKx)19b<#dI8bd+`-Q2PAI+fPLmj^SDWJb#9Hv4 z)`+Vc1AeU&(0{XGZ33_%RP3gpyAhwocvzd*fitbOQv#HnyHGJ-SLFxJ$-yw#?oi=2|sIzDDB2_W!qCQC@;AEBfOi zTinc;1a^Qj@Ccb3Qx41H2XR&4LhWHn)?@z2eGW=?eAlY+Qfj`uSz@6hm}JK&13nU@ z<0hoH?wc~Wcd|-!CZoLvXk@tLwV+=yzPb!A`oOC{2EQ_R!Z%}scDyN_2*pc*cj?Gv zBx6?dr|$9|iPYyr!WbUXl8hm|OkJ<|*Uw;~=#tnZN+>=|%OiCYUM4l3wudQ7m<-4f z;>GYH^wakAb|0TPVU$y1)#zfr9NRqTj`)UuMEr8*^q5yzZ@pgm=K`(#=c>6i{!nmW zbh_VCgr~IAkg91rJ4NE7q|U14gkScyrqb^{cSfCpLo$z==DWOC%DU5cp<2$XnTw5FA`?HJ4i76S8p~Ks^Y*s{1UbZ86fcQxp&iF)+Q$KM0f{~j_lTf z^%BaE4xf5YwVpcEFJ9e#|N5KFh2auyHqTn*$*d8K$BV~Y)sb|%TK=2hvr*2s%)l`4 zLLYqbS>bBpK4fye}l#vo9s3bAGlTzUTLG+_ zfX1}t_kUQVd>dB!k#9Z25V0HsJZLYVh%!#~eW7PY^WUa%Zw;Up&P5%qrgnUV7Eo?N zOw>B|v4?5hl>q|GsjBffUgmpGq%~|*fpUqAY#Xi@W5V6PySt#FS1zBTO6xC2+(wiy z7x*r>=OMu@fv?lp*!2EX3iZ?ly||=(&2igiaPD)_7V$@P#GB|14-T?R8S8Uuu0V$L z4|G-nLjQh%4%AYLk9O!X@Hcgf7Ve2g6i=$?dPlt23Z9PJv9yat0e1qB$JK&FlhSLh zX4jk28_|)Iq<#G^T}{3-&+0JLVfWuIYW*PvNv~hNak9*_(9fU^ZCfeKzSnH(9Al9J zTj;vsPRE_A>b*6EOA%s9t88H2nw7^=<76ML6Lt4s+6lA@D$6HcA815ES{Q_?I_4XM zBRNz(fp-AGh~1c|<`__Yfc5SAUYClOv5XW$5r<$-owta!-auw8hi@7=rO_0_8E7 z$BF#lyK~}KzfGIr`TUysnCmm<&!-R$z9++bqh71+=Tnb#DM;4IK&C{4`lO8V=A7ncdNenlWJlFv}GtF|-q= z5=4XCdZO{tz3C2B#=+M63SRH=-6wIT2EF;R^7LBI+vZyA)J+|h&#ON3fYtH04fo}X z=SIq@zw7cuX@`(U>?m_LWhHf+xZdoiD>sMh$t?4!oo9SLoIIhbeyV(E6UFVGp&Ccn zPaMhzgm8Qo?=;YMOU_J8fVn@A5S>f6=%77u{u=WDi*;_4S-Q!ZjB>ucON~lQCu2u7>|~WBS7KvkmO5_RgOlb}+?+i$L-$iIf6$NU3 zC@jF)UEZQ1UjtXB&@SLrS<1ygJhKvwO=61nsB2VK8k0JNnY$U+EE4jl@+38R(uWgL zz0G}1A@NB=v=$lE>$wpN-|1aWiEW+=rC;}?v!hu@93tY%b|~W4Hg7i9??2TDub0g^ z5|RJtMV;}^V~K5-CI4K!x0g0}tXEbeN~XIIkzA-1Akn-6?RmPwxhdO&Q*j_4g@Y$G zdcxb66W+)Al~uP;hd=*|-dW&CK_#|rgh*P92Z!6~9}_Ks!YvFvB?h5X zD_XcU&#S~1loUCFtJOY;bm7C%akYt;9LlF{jbK4*Mx7pfIo6j99;~?o2z*hkxNP|v z>GkiO@@ivk112;BY?Ls+KCnxil>_tc$#8vqArrA+5KG+|TUfZPXS@@k4lL~wx{$L3E=@vi)ziXD_bOle7 zW@g5nzC$xJQ_zh6^r6yAM#mF>S3kD)Q|vxzy<*za7(MN@(%)O%HY76h5xWA;N53t6{|#gEN1u0C?^Ied8}OO8=F3x z4gb?yx50o@pc%r*n^9;1$eU*Yp+G&)8cWeL#6N{mJqt4s2?JRDzJ^Qkp2q_cMptcc z^X+-tS5t2-Rpu|9R_w7Xb$vfBS?+6R|7nN!^yeFWVqIPa<~ynP;xa`>oUzvE^j~h9 z(%)31=dmo630kcQ>1usoDzI#tp@H0j%K(HA^ywxM}H{>@6kAtp5(l zq!N@*1DAr~)pma!@pQpraHK9-sIRvwv5PQfiaI4@Xk^BZ`I#Xb*j9jxO1!PU|4msz zOp#e9&rr?(On*z*i_Ci~J+&TjQ!C4nQ_d@zbE8*(%V+la)dX(Nf|?n8dzT-9E;Y!4 za?gqVvN;DiSF%I#8}VED0w2dc*i^)Z;-lD(d1VUFPlN%{f^d@*3yN=`Cm-M2*!@(B zGq_Uu-d%2OJ1{l9>?TTa$e9y}K$qaN!LZ}R1tLmr23LNV;J!k2-&^$!f9mPy?ECRx zyMuZBN8AUV-f+AEK0vGbq$$+$cM9je`APx%>49ov8*HHezc5u_J?Lx2Ccs(#AQ)ct zSFCp5w^xVmNC_#sb*rRok2{>?TUGhB-=X+T#0@`XURr{mB>bD^|4B*XM278B9JQQ{YN8K z>A!ObH}@XeJ#^-jvn)%^=k-*MedgyTt(53)_DRF?S$}~aC{oM*ns(eeOx`KVlVmon z+aZKOL6si_)}^rOp1ub#>f20hQD8p!nW24a&Lv6~SU3uBUGB*t`hCceUAe|wnAGsj%zu4p<_0#v3x0Eo>%Jx>2E%qS4#!bz?e?3*N zpBYpyTNKnVVq1Rx)X$lcoV3@=+cR+~KQ$@h;5CCWrNQp%_1tA0#P?pcC51H5O{TNW zu!{0ELe19*F|O|#6Xk?}de*h9XSl2@MB5oV<+?NqMZ9q46o#@I4}uXSDwV1ASvza*Oj(}YaTSu%&F)-oU0T|Tst8x*hb8pHHN!D$Igo?#B z6d$N~x0SRJ@&kSu0zwo$U*uBzP3$P=E_Ju<4@ijobnPLKs(`=>@ZwwkX5F7p?YXMz zBMu9ZKv#{tk;?tq><4o@G;3MpvTgb^0WoEyQ0&b4?Aq3iQ+WW#24-zMXIn}=uNCNZ zRLp)Mpm9x9i@+W@bBN0O#+*kQvR!%8{z)*0o|kgjHz(xG>KF=>Q`v_ zUB+P~RFhS5)5A7EEB)Cp!XLT&FX^z5e$Lm@w;7US2^(ne(H%g4hB+iyDCHNCY5QI_ zc>^wQ%*$W{YEF}~Y?RZ+qz%?Ro?*1nnYB$zd0vygVa=;&NTZqwybyfgXnhQL^ry<6 zhH*#*fG`v~Z0%c4bFNNB0e#JEU2iO#GB+k2dIsD}XsEVUi~<+{AssfiFF=F+gQd*s zH`)l8IhEp0X5kHSvy1P6fNaWyE5m!+JQfSTiS;!$_D&rxlf!=&@d_N(e9J9wcTh6l zN3jykKc4On7^Q3-_pLp;d393o6%6 zH1dD^_$+ksqX@9r0gl<2{~(iAbwsP(M%&91o0U-Aqpik^FO2lYyWV@~V6AqmFPZOE zs&qBdv7o`RN;H3rK=_g{EIE!&5(Q}5vZN56Gx zpyB3h^ckNX6XqqkXl8=&Sb=MnkPwycA3{gC}Da#5rdH9BP843MmFe z2&q7193}@C|4;;E^mKN7;p+g}J~c=W+SI+3WDKDMjHCBA=<*iLb{iS6t}c0n&G5JO z5Pxq+2S(f#WlE@Ay)yi9dXqSGi{Ylvlm;3`0#Hy1qM6$8vsyxV`%T=AR-Je%FmHKW z>)WZx&VKG}?HUs9tVP=j@t$$yzrRSHu*?CgTMO{+~Gpnrlz~@IP+c`U){R60PP)})}yPxV} zbJ`mUYnyIqMw235ga*Z`y@}4sd=kYr%{mO@;L4IX*sA23FYO<~>`Whp#|6^WI;%`L zGO0UMp~JtooA@Hgmq>TjUhR8}TQC=;Crg_%a0ylkV(M3WYTJ`9sDOglMxj!?vI=6WA?aSQuho$s1b#AD{Z$~`8<}b_RG8MUqoXAe9y-P`s?zt zLwVHx9lbA7#9*v#Vw3uhsedn)W{S1$w~+*MSwPeUF1^{ww!)NTXa{KlUjH}|I|>9= z12A~TB{$M-p1yhncx2!lxuSfy8Tz4gWeQBwX-HsO%orXeFDeEq{&D@l*y`py;oZPK zRzQ69$*}IXdFFmQfa3#Y$|xxz9kSD|@oz>B?DRu+tDp7Rb+r(D#T)@Eqxnm>4+g}M z2(1pvUxf$IhQe-*XMSNMi zhj#ZTw)w>;SsN08vm_yR-E($%W$1EGKMr~WwBfK9J4JQ&5~m2T`V3wNj+|nC`a^d9 zDQnkoN4W0~TtMsC1rrA?i=1{F?@?<6aNRn`?}|X0keZ$iAr=8S^{PqfYyd5K-^Ca2^I_`pA<8v=a)y*F7mi z2R(B++`y$!y(Y5ZDl*Ky*vQ2anMv1D(W0x~PMpKY6)kM<(`lWBX#BLdGW6Cx`J|j# z8y|L9IbD;^8@8TwZqh8ClNV-&I*dgC&$ldImw};gN3QcJ{ePaq5cF*npEw>&YJCtt zW|#)sQo>&-<0Vd90Be}7Ex!ZClph(L&fcq8eZq)fW=;aa9P7WB#da-G)az@f8d9bM zgmJ#_;%U|0{fR1VWlzx@VDLVGl*a;aGgnQ;L5V>BeN9UMX0ib}{Lqi=V9BiOvwMQ~ zQ^LXg{yv{Gtecj`EjBVM)QOTl0sCv;j7_qcOh4f=bF7m~Xgx>1#adF0Hp3{k5hitwU<#bo0j;!(St6%vOOTgQ z!hIOK^4zEBcY{lLn@)yezz$S`UN_K&y+6@z!i4wHgux9PC1~#@?$40&M{dUgg9@=* zuuXms%^4i9kpe~^i}9FTaDG}OIDL*8)H~)|KEGnNFz~h7D(mXd`@z0X!YOgc{SM{x z7uEaa{nzp?i>rJEhCRMXZ<=^15xLUykcBBX>wjFkiD z-HfqYKvk-?IMv$!OwpkkT+5}$_gxm=m*_p~k3P~fB^@pf<=XKv$BA2^cWrnc)SIQw zJ_A&l4078(8X1&*_rIqWz}?G%eQu6?TgnXBy2aE7j%U3xx2Zxbp^23FJzR9Or6(|}DUH*Y5~V+X`>PfnOx zUCl&$eX6V&*u!{8zZ5GA6eM6T#hqQ=(td-e{gxZs-te}WXY^MC{+zY4l>~wpDnf3X zqr_VkIN&uB2A;j;h#V1;4!B+1g<_u))1G#>>7a@9LnXN>Jjb+tt=+rYJm!;?O10dT z{T+9D6qZ%meAmg{rW17gsJ=(3K|4P8Yje=UuKvSLJJWiEo+Z2A465Cczf>SybfdI9 zrn$o%`)ecyw^7%W_~--ovw)a$dp%<*@Cj%85aIw$Bc{8PD3wS92?Xo*|Jj{|Fo3xJ7j(P2cft+LUVu`b~Se35_CO!_mjBP_vs>NAU}1R9xHlB1Ni>knX&$hdfBL@T z;TKb8|7#&yiF>3ysx7uYn+_*eE~cd zpK^dV@HaiItpn%#$K~F?3h4R{Pz0aDigW0#`qZ2t-7J6NC z&qh0`+buszI@`T$0J2L*%qNqV_qNOAA0h9UzO#HWLU!e1Qv2YR^5#yn{Gyer-mcYz znsHxslzMd+E)7!1L#G zefA+^oBS2Ns=5S8akH+7+cej4<_B;RM9AheT+jtB_lfLHLj}X9;c6p{Z_ryW160(L zu(`NsBD=xxhbw6Ql2}=dxfq^^<-Pb5B(b)m3j_{ z?!O-HnHps8|E;ukdN;$x`4-EipdSPEtO1XA+{O`s9|kCi#xyNJ31I5`8m1`&3wg zkDkDc9w8ry{6zqicMaFax_tWeNyE!_dDQM*w~9B}_uEug>ZUc3r^nAM{%{cIocpx- zAZ)$``hHVZQCAim_g0F(1e;d2V>8QLfmJ9lc+T4J?=sxvYY-|MP`Cfq|3~v3Y+*+^>xFXh*KrBCdDN`W(mX`Zk@2AYKI}bRnASkwy+e$O>3ASgN@a6t=$fgjO{NiLAVuUqjNHW zAz|Mm>$4*W&^m`htFGJfeffH$uoX99i!SgU3MH*eW<@SalV+Y?y zR2{qfc-Kwf`c*4uKUG)z3Cue+Ls->-OBk6P*{RL{p20_0@>|%I;%4OOsl{_62#zjR zpNzazUHPs0%4~XDU`4rnHC3FnO;jCd6e8-P0=tVjmg->(5^^d+z)22l=b7ub@LrgA z4oscGFvsdt2~;~S_M2D~UB0&I*S>loUFqKWcL&SIZvJRTD@x@2zKLJVC>&{2d@&a? z`bj(uSF?Dof**~)k2}}blU#Kzse*cofud)={?*#Itb9>#J1%HhDL(&H-=hre!1$R6 zK+?8802ck0E;}idFi#A%Za8sW4WdX0qH-VvcTQ;#r$R?PP#ctsK9@}RxBA4RVDm~b zrTFP#%^1)wpTg#5TlRb&XlScBSiUj}mjt!g=Vo8@JGXfu?~De2Hh4twxywXKoBt-{ zvjFdbq$VBq)5xsYdOs=rD`FUM1?V)dn;(1IZOowx3C=88K9dVz;~zG>1modv3G|$u zyGeQJ{@@2Xik-LYl16(h2FOM_8g7Rlb09Cahn9a%#)00j06R5-!&ka8sk1~_R9sv8 z{MB)x{@!BG%hR&GN556_qgl7d-~aiNbFy+SMv&j>z@@3GC*G2Mv9bYI6x=cZ7i?f@5Cm4!j*WB#kCK)m^~hAav2OJ-Amv-q21@62cE_fjo%j7 z$mHv@_WsD`|9M@&5Eawi$Rg;w!N5cnVioL3Kvg%xps!+fJ!#$5aH!L(bQ+S=H6rd0 zwq<;f<@eht7Jpdy^l`Ci? z^rat+3FhA;|Kk8(SiDYMACm3;HgZwQ4;=M--wj2S3@Uz501-cVD91-}>hm+ZsgAF! zQ`5)q3~T<@b+1BEq9Omx`pwX6hW3?D2G-T<_Oy?Gk`T5QAohjU z>~Hu&12LQ6%hlH{^JH>NAT@K^K~5!Y*xDNGyx+HZg*=veiCWFxx674n~l-R(+;+bkVzn^(zWA zCJC|Nn^{-SyMxL7RgjYX42=MLdvE`)@DhCwb=Dap5Q~lHRUQGUV0{t1w0qw?qQ&K& zGX9ykZU=XVs$Fl@;b}`%bvH~-T+#$>RvrxJ+&ror9&={2USO})l}EApDK_q`gT7?$-v;l83@sPH3>2 z1@xa@vL{Z}i>ywiA71Q9%Gw7VUz92-h}4{>mR?OIjx5Jc%2!_)mamS|ZO7!>pRzSA z{P|InJQtW7tP#C4e5Croke%s&N5_B5-oCX%Es}F(@3SzCc5dR-r|r2Nw_El?XEZZS ze^H`Wo7EQP9={Hn_^<2YC}N*x2c21z-G=kc;Ot1ZO)o29ArIrLAR*Dl^Ldw z#7nDO@>eXUj=9`3;IIVVINQ~y)Ft{YkzS#%zACy?x_vQHrL-}WngxGs0K5tfFU6zG%U%A>?xLQ?R z7gf*KcN0nzz__lpaAD;Ly(C8RAg=FR0VW0%Y zrFH;ecR{(r>RUkKH3w~f5O6OgV|XNM;t=vReZ&DM*)Ku`$;Q)gYm6!jEh%ZHz&VNy z?YEgzl~rR_z#jj%xy zfNvpx+obP}6Xlu}FnxM`gUYGBMmdiaffURpBv_0|ni)W7;up%n)?q@IVHuMLSZ;YU zc<+TI;GEAcd82GS27Cb{Vyo^hPeF;@rM^y)|NFqL7VII6KYyvv3am&qOexQBt}qkJ zM|VG^hk{E3EQLnYQ{X*%--T;GPK-awNt>UF0|tdMbRptJUF`ax+pMdK2j=+}E-=K^H-PA=6GpS&CW{en$$3k#6;|J7 z3C^R(GX=wk(Lu)00Hov^}DKng^{*{8+F}v%@idKx^64P zF<}~OMn3=dckbaG#LmA9gfK~k_2v$U;`y=w11?AlyfblAhCXo>j5GmuULqr3C$^O{ zZoJgqU3X9LaRy7jDZU^go4)<;omaha zrid6bjfkB0M98a?of5;gqXAzo4eVWxwTb)zzwQQ*%R-HG&}+#c zmHZXj%z99^1A(t1N{NF^tlyq>mduzma~|aDyL^FSG_rz52$JK*p6{Aj#wZE5#+$Np zvBl>6*<5OrR>@T(AW8r!%%8ustM_4znS@HFD2PEZ-#-yN1GR^e^%#z->L)o?0;9f^ zvLQpn8c@PpMi{kXfUV`wQh>+Nz|UberWyMERMHRG{8H)~$lb-Ak^?s0ctXWrO8wi1 z89gNa4MTbx-K{op1aQt!m0u-zmArA16e(k-j2R5N&PdL{Y0=?WO-$gtm941yTNBh8 z{nm1`Unf_Ne_H5!Kb)#Gm?FH@&u(S&j8ux)= zOlc2F0+j(m5QNr48-VD=S~CMz`yK{yJ$=R0GmU}z?`z_AkbV%GBe1x%*x#{96}VkK z;=LcpgV=-FYI@uL>hViO?;@0^^VWa=&mi>=5MT`5jgl+`WUfB?|Lx}6MeIhllYK>v z)=ySlFcG*5EszOV{E0<<+?yqC?Ciz>^uJN8Ppc0za7yg*3`iII@Bb+czUsim+Q2RS zza6Z_X z;c(if=|1Ygd2Dll%{MM!?K?r$uk9=_bdAjacr*e-@W04}!2a2Y-a z%e5c8c)*+CTRLaL#@U&`Js2z*EWkw5(IN*t?n9|YK4qrTpZfEY^ppha*iHafPxGe$ zXRW<~C!qk#o-MH<+=qav$8vgVnGy3Q&1KzJCKrIbdg}vlR+ulv(HQ7K;54_~=5*jj zT!u}Kzvci3>qLR&pMpBD1kntS1(k(7&r@Dxhe~ZwI3aU@Nx23%!MM==&~eZ>4{)LI zs@Nl9Eq8%Q1~@n~;qGa^NRJl&Il%Jd|Fu@&?s|!o#`F9)fahJrswme0k8p5Yrd(tE zqu{cuJaAT3{f7oCaJN8{gaHe1U~KWd*d>aKmHq^sJ9)s_O3EZ1ymTp?CnD^`ze6)m ziU7A)n*k49IB*g;ZNwOy2W+&xN-Rle$p_ZFu}}1XJAt^2lt3$JnbU!5NvG;Dse4y? zu-}gjX-IA8iCg_?f0(P~Oh{u}`rmGro)+M`e_%1c!`->fO7c+}2QV=KYe-=620ZQn zxS?alrUg7?D;5s;*D+%r=;CvO><}9WCS-4@W>0VpG$qMet1}e3id@^ kTB}x2pO_W+^*>|RQHg+chmOku&#q$dboFyt=akR{06t`>wEzGB literal 0 HcmV?d00001 diff --git a/react-native/sample/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/react-native/sample/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..89a0fb572cb5f56abc8f2b04b80bc112587ba46d GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^H$a$!4M=t>=)MI~XFOdTLn`9l9yDYG@(wNd>YvM2 fzW~S_dccnP<~Ih$qYtgTe~DWM4f*>4u* literal 0 HcmV?d00001 diff --git a/react-native/sample/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/react-native/sample/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..fe8e69a11ecf80fd0ee84f958ef9e5cae7fd2a05 GIT binary patch literal 11612 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

)of$fwP!sW|1!kg6pa;OG?6Uk0fF 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 Y-edUpN-lG`6#`!FE?&DII}@q@1E!LCpa1{> literal 0 HcmV?d00001 diff --git a/react-native/sample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png b/react-native/sample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png new file mode 100644 index 0000000000000000000000000000000000000000..a38a57abbb56728a8d12c9cffee187f4ec08bdec GIT binary patch literal 86366 zcmeEu`#+QYAOALo97a1xqm()AmZ=RX7CG0L$stWjbCGhYq)<|mu#2flG)3JhMBHse zL|I&fw8|pBZq!SWF ztCI3GRCd18zOz^;IGt@Zw|DZNq&;qyx~iv6IS@*5>B2j=t5@Av_4#5z_rmGR!|7S& ze8F+IWeul4x;0+@8n%1SubaQRy*4h)bp8J?|F7S{=U;E@-$ibEuwz&Hcdvj=ZJ9s+ zd6y7;-LUu``itju!H1LkJ-<9@k=!%>puF>K*XRD?r@v;eO#fI`c!&AoN%7N$Z`_K& zRfi+XV&8u&e6RDtp`yRw&Vux-&R?-p>uIdD$Hz`DNG1n1e)N60Q(~_d`E_RJe4E#h z-NL<#mv+ppKRk7B+IKGRZRx#+mpw_vKa(%bc|Dt-JJ2yzwnFav;l5pqP1omwMJ-cX zX66ghOMd;_l5qO%h7AkH6Xy1Q$mU#Tefgt1b7pz-XZrUi&-~6j_?}okb$9*8*z%pl z_ip|}^z-6QEZ;bN?fS1l8^%qcqK z3q9aj^u<+n^_P}@X|A2#U;k<9iC_F|F)fKt$Gu-Yvf<-L@|!p3cXd^t`^X zt~afp9{;$MQZht&cl-MJKiT$rA5J{BRr>O&tHrPDbJ>=!@wYE8DLnPEbp=! zW327)bT}Xli&KzdAQibXj^Sl6=ID=F)=Wg3@iq9IH0oB7L(T-lkOL zwHujrlfLUkQC}>m(gQHG)lMvo_9e9V)g2W5q?w^M>M?)1`t_GNv{-fB_d?ubk+Ia| z#q#!JNL)B#5L%)J5iF8*T3Qn{uyP#ULpZ_Vb5<>){dJ17I+e6kU;C08J$V}{>K`tu zi?1=QGu`}%=Zd&bgguY*4R8N>2bTNIUsr>!;KTxvGIgs0-CGcl#(Lp~%PGb$Q;{_3 zOGB45Vj`3!=TWqkk{$m&bml!>bl@d~5Neu@57P`%;W)|6*1>eH@6H1w!?s*C%jO%| zZ7yo+Ose6Si3Fo#s7?0ZtAdw;5eww^PI5FXHV0QhgcK{c12*9m*Tm=Am$!$iJ?5** zR++MjCCbnaXZK)XyNhl}d)_trB1wUiMQ}#k)qI6`jt%^**u|ije zV(99k6w=cB#e{rzFy3MjEf-M>RWOm9IS`{;ZJa|=$Wx#Ggk!Wfy**2Eo;?w(o4FSs zTF_iz(D?hw*C>vYif{5c?vP2caXU)ft7U>~X=+%gc(>z6ca3RMrRRZ44Lt3;-5Gi6 zuZIU}`rs9i+;oX znoEsoE&c|@l2hAOZ-!QLd2)s4Y-)6?8uY~|@8ct{+_oJEA?QlhJHs^QcqkHQpZ;dqeNB37uAs?7g&&^%ymO4u}AdPtj26^NzrtDm% zyt+PjFUpdy)ab5u10B`}E8YAdIG{nG|7hrcmcdpYzfsUA#?jNpo3Q~A6ig_mKw9$l zwdP?foNqj&((9S7{L1Z|kRGN&GO#wLB~jvNMN9NYwEQC}X?c)>7}G06`%buAY4T?vP^sKEp?GMM_cqv_<($Nbd7@qGYU4MEcOqf8tnzUbX{y;jn09EaoDY zDE!86je}5vF3#FiI1W;lIb+ejOcvKVox_BNSIbgm1L<}l{jd=EIJIx1nXS&6Tm%J* zGu)KGT~<%LY7~aLp|6eZ=P>B6(nqywQ5F~2FH8m7Gfm)!TG~DV1?(ARh8FkDY5~2P zDa&I)De&?s9LO=+7KKZ&!& z(_0vlUL%u5j7u+tuCg=@a+=W5Op-xzGV$S{WX@FQ*+U6FW^_+Vn9P>D=hu!OD~*#q z4`|R~n+Zgv_cc1Ni!_qkMZzfaTkoGX%~oo33G6^qYw%0Y$V+>Q6v2Dyhjr*|u8Jt9 zZQ#CU^2<`2WG12&c0~&+F8+haIlkH{N*pdTp$F_U>qrqiCz!WdTxk~`nG0S4omsOv z*cjGO;jn@me&FX(I>9xud?vP2ggkce-z3Pu=e9J@wqTp9^pfftuxSa-c}Z(v67pUzI;?(jqk`Spuq2bY8(A9!2! zE&1e7wpv#_M4%^8wDJA!?<2onzq2?*+6X=bi#&Vs6c&Bsns|#s3H^5NAARtNhrER) z3O&mui-jDYUcgL$+u9H)BvD>Jdts;q0zm zW~wqrDrSuJhb{l%eN8rmlAn{&;N9(nFwIat$=QUWwUk_I1sm6`hs(|v?!i@e!CQ_k z4GVsmHd9A8uWGTIo@?Go1Hh@7YnCZPWPCy}^se01o~gu6;Iuiye{gtMMN-Y8kN(O+fQo!_kzk)T8rGso}U!UqKbHa30f-Xbl)+EwhWY=iN zZRdiuY1z#ikh{Z9L`a|=?QU0DlgSaW5Un2f z5MA+oR34rvdV|H7Q4|nJC1Pc0 zRTdc(+M`1TcElj!-nH$t2=8n)|MnXbBZvDkTW-;xeaK{b|Fb z4yAYFZqyQ8^R?V|_rsnD_qyRwX0V#N&~BFxXEU@0`@xRBCTq7;ZEu(@o=jZE_@w?U z^DM`uLQRw|;xI-HK!NN2Hx{0@?h02hDJ2$OIqkQ8fPO7e5+J?j?ITK~YQ+2D8XV8a z)1&n~IytAJ_^qNEG|_NY15pghL@JeMHoik^%Q)`{wnJ|6`Q~8mg>>h8D4* z7R8>|P9@3=6&gvhN$R5;i@Pxdha(p%k%Bf7?PlRS0~0e(imhg%ZOe_1Vhp*#6I-YHa&VFQftFxIn^d@W>yTk8%e*KZij7h zgUvb`DPz|FazWLqNS>IaqC>Ot48Vx2-F1sF%#N~$qi5LEH@S3YsaEK%$`q6be~AnW zhVsKb%Kui}Q{!C$XL#l=RAc(uu>JioIe9HU^FXevR88D=$^g^GWZnHJ;M)juubdu@ zhu*$A%EQN^8g@2*tT;=$Qsa%3GX*7t?w->x+$-*l3rwjP6Sr|Qz8%VxRYP<&Xwh;L z)=ai6Z~rj|VA)U1>o`I+-)0U{qUTFd0Ek?3l`cWVxz{HV9GxBf;}(Bw4(D$1A83yh zJwbjZr%oMA&c<;8Z)+cHlIn`QX}811`E44HC3wt1WrZBKaSg6cmFE|KNP&Ksl9q6U zInFuqu-8>K?s=?)BCbBH#r@3J7_+CMdX|46IhoN1;A!PVbpQ->=pF8j&lOlkVvKxP zo9n!pt0rmdGfks`T>!d``Segzcw#N@ zVIqAUjOHF3^>Ys{s^oY=F*!+0=x98&7PjF}+~Rj6LfC*L+ZYPk-tEBG%=uf<0??_kZ+$%a%17jyZw>ohFMkwPjZPG}U$wo;fW#?j>V}2%Fs* zl0tyxNPoSz`5IYj4O^Auh$2i4xEMO==6-!^wDKIJOy3Os*Y7>n)LpGh7=yWST7Gd}d`^04G4C5c*Ca*=*g(-tcG+Ql$-s4Y8n2KU7=QxKH8?Oz6r23NgKY z=_OyaOs0S!+G}hJxK9NCiIe{zk?|6fRwkHg?%YH-hH5+Kq02?4tsj!)GbglHm5Q;P z0ZiN%0-v}w84?0EidVzBsX-v4l@DlHojIOld+YHF6AD$V;a()Mxp9stXz zPSyuv7sy1adc0TDUM zRa+DTq%1Tj338TdJ0?QTMy%Qr9>x{Tn`*N{3YurspB-28NT^@KNbG_!^j~a&nvW=* zv!qI|WysT%$~8e-3UiH2rkc6PC6Cv}lP!MHSzB?2w~k3a@M9jXVZ;(H>P@!uqF3Za zPduM+5wVxAf}{R4$|Hd3zQwe{Nc`bYQ8JaRO}?QS@4)D|MJTlTk1u)ib|b5JHhesn z4i`_s-}pQKAYb)|R*dr!>6xO<(5NqU*q&vmy)Itr_a;r5u`eS&*ke~*4}U8vHit9_ z+wflL5J|7H-oJM#FXl1ZX>g31S#;~crChQFOww#$2MMOjUu6dCdI&pqief2%k_+3Yp%d>B z#e6AX5BwOl*hz%2{Y$0Zno}7GuE?qhB+d-)%Rvjyit3jF92blcxF_MNvk~Rowz@*l zGgL$;W&0^_hF%@_KZNC?=^gBAiDI30m7BsgZ6nG0=fO)+iTs^^`hw@(G`_BNV4lY2 zdf?ULgNw@na@=!De*Dsw3PY3gD9f-|{{2bh?(XX?`fl&doUIk5q^j+@vFOKqIv3m> zBBwd>VIg2tfiOy^me}%UXy@oYFh6M{#?qgKa?PCP&djGKaJLWV`h*Q^ELDTvtd`}o z4*7E21ebm+1KoaiI^%~`3C=RS;xwR4o?q}1#kvc~i@kRT3+qr4Is23m7*?b9G9^Hb z52;x)v2^tW_?cLx{XhP6e#d@v!`H`naTvjj->NZ-uhND-?0%cDRQvMxK&YU-+!P=K z6`&)KQf?5ve9yaoo(Ac5@mmum8|2yBVHC$0e&6j& zpmq44%YjX^b)=tuB41~4X5mpZ9ylW2@9D2&Fe^&o?4zi)Ya7#*SuB(0Lee#w-3u~4 z<;v;%4$7tiWd=AXQL`dckA+O(Z{bvmg#u|fw_LwRIVv;4IIXY7=2%9t5{Ye+kqA0h zL0f@;QQM7Mgf8wTx5sGeq}Sg@VS`J$5;W|AE>j%NdTosVk7+1MeRfNu7%^kJ-(L9+ zu2V2Za<1K-keOg}IRu`{gojTHr3b`U^-GqbV|6bs8<)=06ne1`x+>pDyKTI?P@X&s z$g55$FTQG*9Kt|0P0EmtsoDmi*{LA?Z%CNQy1L)ygdae#>HXG>%6RIN)Z) z&IJ?b&6&rSNx!a;g&Tk8N8>DP!d9aCOBONw7%`cf!AA*Wc>m^v6Kt8jzy4#islc@!4svBq|d-p%y5 zBIOEf9HM1%R^&2HRF<4;b6Hi*WZfogB>?R9?(~tJQcZ++;Zjgc3qFT;4|YZ%0p(ABv-D9jrn)4uj>sVw45(QTUuUV$DaLUtbG-c|xD02w&8P}p!doNtnv^X*DkHB#TchAI*PgAOY zg($pU+isLL^5wifcLj8%_zzSdk5nv9Wm1jA>Rp2f0QU-LGdB0MCTa<@(6(Yi!a!0S5wjc$>uK6P52mM8LE+b=Mw z`zJO(KCzYIZD2x?WESz(S z+Rx_dTI4q$YnL5(a84>~fD%@kbjmwxd{t?m5AR`xuo)fK0QP@+R_aIa;1wJBuR7){ zKtC4dFNR9!i9DHSF!X0jB*lPh0{13LKDq!6I6~ZFB6-d}c0Zaj_RyuNaBmmqj}(p_ z9P^}>*nJ?~QZ8{s{0v&=#UX$-$E_~>sCIaPj@&S!9j4^DjhB93%-*emG{5D%W=CmD z27Fit;P}?%Qb=vY|IJy3WSI-*;-ZRib|XAoj#lR9#ue2O8$78CmHOJ#5delyAqaQT zt8_AClKMm;5C51c$e3!~J{NpwY035sRk59Ia=28v5Yf*@b7$Es>d(pn_z7mLhJdFn zmUOaDJ#AZzxw{ME=aK!~ z-D@4Z7Jt=zmaX<#pJ+N>e}AW4F^))t2iOH((6cz{)1HUCBYYdvid$MQ-2?Femf*K5 z=A)wUP>g~1ncjYb#)P^M8*ag)JhsVLw=Yc|V~=U$5BHUUnV-yAQ8{Pb%ix#!7rDqv z=wB|0_E88yv;jQ&@fy3AyW*_*u8oAfO7wW-=kgms*q-ZiWHZ?8YbdUEcgmG2a&)<%!h` zb0Hz7(i>@_3+#%cHEw|_)r3WI0=ZMXiJCj1CHZvXwq%sx|yO_ z4f-kUc38ElH||ZL`XtcC=#VWSFa}wpT6uvPrdc+8JK^*r;d>*0AI?6*PNKe9rAsyv zhV}@TVN87FVk>~bywygAK3o;qf^Uu6^;6g8kVN1eUwMFMUE8; zakH8je^2k=rN%`|RCM->mx{=cMb@ilH%kAWLmC-$HvlIs zxEe^5ndCI*Bz6+1Tg8+$5I^IHs~cHH{$63FL)Q@p~O9JDVWkbI7DR+(0xpmPTk#JcTkNOF54tKGTgfeXj1jR%>hCXmUQ>s z@~LJE?osps-ElD!C_%}xYm&A@Maw1I;vqigl-d4?1L({(jKKB_6Ua$<6@$)WU8C)3 zwEwBehpp21PihGDgrM$+E^iY7UuFdhIEqo#8|A@$aFLG(e%Oac23}TqIMsw+ub6N$ z^3NUvfXq;t!>70Ci8nr@^9mgq5+fihVybBQq>R@Q`z1?x8ZpT66#y(8LPa*3mEdA? zI7jaH0wiDq6rm^urtH;4IZr^*dVCw%&ID(jj!)F!)D((t%m1M#uB2H8oymc}3~TQB z@?ry2Td4AThy!uZVl#xX%p}zi(GprvQ|xOif1I;aA0Bn7h3UY0(iAaX4F4wm`_z1y zvRbVLt6Cd-G(D#o8)|jsk4fZumfS_)A&|c{8Y`C6DUMr2P||Q=9-yqdxpF9{FlVzlf~jm%W1JY^^zn4!2&>>}D4@ zQdy>BT0NT~HOWG4F2|YrDiz*?uDH||s;1twmU~cD{N2cd38`9?8bKe}tP=W4NdzHL z@N420p?eO|oj^WdxQl_>vnmVpTF+p7^>($8_T|!<*`xW0B6OTkoyv36jU~5?HdO=s zR;CC9UOorI8iGf^M=D}{Id_&-^I+KJ2t^tG4e^!$DSn>^9>@~dUz4-dMMP9AK2x=# zk8Q<^ncgXPn`~)*Sr|AMytaJ|N4(6%^EH&K>f_#EA?s9gML|D&P(0GuuW5~cEF=SX z(;WvH18`L24o$=r$+=!BdK(5Dh27}bPSR~H9V-VQyx#DVjMu7S^?^=GhLvPkZrQQ+ zAH$l9EEHv~QHyeeFw2Km#RIcPh?EP12{{Qz_&`iV1wHXzhsjFvl{vGx{*x_XfbnMD zbr6&iqk(duV!k=V9Fe^eImvV;pY!0+CJPu&q_4QSZo(x8=;O2YSX@Z^rzFw|4?#IL z0Tm=dj^iE=z{9@X+8b}$zMMpSK<^IAAzc}DsJ&Lm7e2HuddX%9 zZTMyJt$u`&v+=<@jx)TCEKn6OYsL)xJs~#3dl2rO{_dx)%=ld{`3(BaTot}jJ8<|p zC&%kQUJ?O05uX9u=*D7to9|H6X>h|(++<{H^b$rqyf0K z#ur#s0Y9o@5woGpC+IeQnb8WVw^uZDpa~7lt?tD#+uetOffhaO}lbJ}4GP0ld`M6f7ksQXbadIyS3VK{h zREM6sA3`Z000Zd#&vn@Cf%Xj-WIW$q#mGhxmyO#YIE#CWe7j&3j)tUOOPTK~EwCEX zk8_k4CS1Qp+X#cx|C_t%_%AF)Mns{~g zIs4F@$ zr_Y??Twl`~;grS?2D)CRDeFW=>+4Z{|5=mOCwc*(%qNeb{5M58S0Y;?ke@=d%p+tJ zcna2w?uWBk7#P^dRhPHm2xob8uhVPni*{TdMDa9hn_>Ryf9B`w^5p~|CzR->8 z@(qwBv%*0eZ@qX~K4+a@V26?9%Z35TG=rW@!T_$@`0(Dz zfC3-C31m0FxW;!Y5)n={jC<}0ZUXT2(?#pT&iwm=HAC+dZx+_zW6?MCOD3CDELBBa z?&o;n$ny48Ox6i6Y$veE@f=M+8GbV`po`NU^YGhgL0-Hk2HKay|1?}2&o!evyK&7I zs;Z@tjs&x-v(~Vw6dP&_j1Eho4G1Xc+|S)KaYU?u{)`)0fMY@)#MWnV0#Sm08GrqF zCXuttsPXgz|2Lg^2G_*fbsOZaQ3_KTqj7I!cSQ;urJG09K3n$^IV$-D?tkBrE@J&v zpj$qb@#^T_z33AAwD;sN{r)B_J&JOaUvrj})Db{#E5ioDY8IG^v&f2poQ;Abn)|EX zs-10rMO0Ibu_B3z`Ul(cTFw-FgpcOl+DJeC>WB{XJ_+F83sd|UU607p9f+=Q6racn*0#*#R2K7jKy_qq z#of3^iF=FAoP08 zU*ZhP$%Nh=gcd~;lwo5O!yCBckwfXKK*Qt!V_K`N2~W>Qeov9zV0`f8ECzn6rJ%-F znU*4IyOF_BstQ0}ucrP;)B0~B=D*f0=SS1v(KyH@l7rz`f_|h_2gW$5N?ewbk%tN) z#Ogo3%G3YMT=Cxc8i4pxcLM;eXdrtaMb zynPaRv52l})d*5P?z&(StI{M-j^iPNtY9dfBJfusv0TaXUmST`5m=s-r=>1$x z#kfh=C#U8Wu_2vXp2D_)_b%Ch#~pcm;&v2pnKcmQQ>Uqer77}4 z%+2TSJLGIXbJu)?z@6VaeRKQIi>Rx6R@}a61QaNyByZiGVGVdM#^Rff_F>BG z-+x^JxIok-N!bn`*Yz-!IhoK}hBeWgpXUAi9S6lNp24dC58HthHXjh~fxOwnKKJ5~*Wlea=0GkC=iVgDQe;Wy&mupnwLs}fK z4_Ke>&9`xHmUDNFkw_v%d zbe_x+JJo6rGqF?1CHY!8KJj9k{ZpZ_bZlK5OBI04^53^|ALZx}(JYa;+svD%Z0?F; z8PStL=H{+dS`I7_F+((vv6t*(2EDMk^YPOU#d|gff7Q`$Di&?$8^GvLZSgt8N7pR= zfBqwiQ@$$nK_1ye|M6U~N`4Bk_$!aE9McD$<%;SiImUYHu}y+YCAl2^E)O2Q%9Rfc znsr&OjWZAEmRtZGO;zQ}_8IwZ|0wL$p&z$3m0e{2ke!n6!L7L&s+J@4R&$nGfKbJ| ztlnjaO6351d5g!>6`_LsXyfk_$e}d=c%bNwi${!MAKOz2`iQ3AyvBNmA##!jW4eBc-c(2SVB|9 z;*VM)V6~@K+#>ig@c*K`5!Bdiyf5Lie#4|(AKzePXuS}>n7+8`>)BWq7kFp{Ce@ST ze>)DbhBk8}>RJ|Iw`ZV4=Mh}hfE#wny7;fWtsvi~9Nj9q*ZfM9(0k-Mc~+;ikc1Bu zwi$(XYt?QvqG^btj5Cr?N2sODi?Jek=zd&mAIyK*B5KxxQZ6DZhIUTg$3h0FOWM;` zL4${iHbdX`fndu?0a4^YMQa}qQH#_Mn?jBOtuQR*E)RPa9Hr8ldy9zt=*vGZZVq1g zO0xU9L0ib|H#WA5R6^SyU$i-d?GfW3EeE>l%w5pFuhB2K9qRngW8H+dPT?$}td+R@Z_W8vq^mAP{hijmA!R zfjrVaMz;O^s!+sUI!XZ;a@r=DQ=GfG$y3dYSpo6^39IL~!7pL5Ke6h*D;UX=!u9Q- z7GY+4iK5BI)+(-3w!XUP$?@KNA5k((Gmal&ME{i{>N*jNyQ-*-zZ&lH^%4j>IRh-2 z;}CVf5a4<@>4iYXzKt}aMkA1h6X`Q>C}7s10v7D(n}e|dv0?>O*T@$E2-D0aLPr|y z4cyF1-PJqL8Lg)g4x&EqXAy4T!4)DdXopcs=Iw*?swJH`hZpbFY=AjhA zKprGOH@1Z6X-2mXQ6rj_{zouX#gCh4_rIi$_}Rh>7w-~tm=*PLs}z){GInmPj&ooA zvl5->%c+<3kE8L5YOv2@S_y{s~-_|KMf)tPmV36X1=EgV>#Q@LhfCa)J zeeJ+-4RM+c;(eK zj%(nRJ<;Qf>Xtr^4^fuv#NYH+v*b_E!m&e3h|H*VelVb#q7+d*(c_}6{cQ8>m9vOU zlob2t)srGcsxxrlDfI02W70!`;HHZZC-3j>OsZ1}0mMa86BdWzx`e98%mZ5e|D?uW z|9~siM1UkQr)+VB=TZQ!-DlngCx zpiPSNwM;rWM6n3rT1a|)T%`L5{r}j3h{utONy-3_rKEFs*eMV&V=*KefaiT+M*;Od z&S2@jiG&0D2YbjsC#E>*UcG5+2}QVfcm>}n{$u))k|`EfJ%JP!ASzWF2FjH#OX;tC zmOp+}HWNiw7CrQbYJdmxd9oEJ-Xd&P44vdIGN$c`FY5PkX~*n%uj4CXLTX}nHIP1B z&4Ns`4ojc@%tvJ=q#DIRoYSP61w|B$KkjjhUd*2(BrnrX4Ui_+8h+?G8)=*6t>(+` zDCD?MM`}=Dtb(9WK4NxFY$bP$b_L<+CC-uAgG4j4(gLHgTT8&5tZ--02eUzXcC|~z z+27eF!cDoGRca-o9QthmL?ii6esj7XI(aYHtk&pOm2HU==Z1U^l@L{Leq;c zg^JEKTC(WKChBbhITa1f+DX(xS8#PCFZ@sWLwhM>tD;*KIeS-rcy<#A;tHHqNtBYo zCC<{1#&3=J#d!u4$%jJDUc-Z!9EBCn*|(T1gOYyO7VZXgNpNp``4B$Q{#csv0Id2y z8=9OvdV%{0@S1iix1|^(ab3p1a;L*_v1BtQmAB;5KlnB4;BNcYD($KJtN8UyEMN&+ zOMXi|h+^o{gq5v-H_()HFkxh0bJr}8hbJ>QK7cZ6)DqsJS`40tr89Q4`=~i1>ywtW zziC>Tu^XK-1*;;>U7pY$lqd&CT+WBlVjeaqVFgkM`te~zF)V>nLatU7_{yn}QdQmk z6*%=dh%cHmm-G~JHV4m~GZp;G;^%{RPOw7`h*R*sDS9g4l-Z2mNdDRAFN^!G#^jNi z;!cu*e;-`z#PA;9a!RXBxTG;6MNe7m6Hyo9$cV9qZOmI$&gZkO`0q!X_Ni63no_+$ z%v^{#1rw?h%5r@_v4K^5hxh(`VR+ys1&f?!l!a5|EL(9_UU?nTp<8m3hu2UnIn zV*k;T0~`_nZ2x3ReFE_y;DQ6xsD+*gvhvbAgA%YKG5QL|)9nVllUYkJ$`dY&={ZQF zRoj6wqqJ~YubhlqRt|tlH9(hP+hH~#QzK--+YR1z0g3klZArZXv4$a%k8{;W2rXy=qy5{ejfRv zg3L&gbR6tF9Jp?XjeCKA{JT5EtOF{MFA$r97(h5|Tx@3Ux*3F%O<{JWMLIb#$ zGk*{9MT_zm%U>Jz?4>{iuu~yL(SO+sN|yWsVm$aA1aYNxst#fu%kXyA?&$MD`2q(% zP5&zSj8Y{cAfdG{mlev<^OnouZ4rifZ%_VqiW?WFn9sh{TRC8rS4vzKIIaQh&{?zB z(4VXz4b#swE45Yw-SOU{kyTAPVu4PH_;*xbEAI2}>?KBQ=~{uwXLIK-f;|F-`^BA{ zh23wH?OTdKMnVL1~B_b3|0>V^^vX-HmGB#lO24P^z<}p)8P9G6Lc}NlYvJ z>hv{@bGR|+HZi^Fn#PLf?#RD;9e*o^>4zZq4ix1fGVOWL|KGdhG^;^R;);^7%C^=* zq%$Gu%kH-)IRk~F>GIpeFUpC3sjmLgY?++OWN93hayPjLe_G8Vr={q{1*Rusb3lZ7 zfQ_6lG~Q*OtF_=0MzHVu#CS+KJ&7x`fOY0 zA%j79>u(&|0rC(T+O$Hj{iDehA%CQr@1-E0xLAQt5({0P(T|HOsF;7jqc(ng+4nccOl#` zNBuPG06OO=;MiDjuK!7t-`;8jrKFB0Tw+&%Ons*CzUXcgr3WOhIZCwn#vqjTtntB} z$c<707rhoy_u(`H!Sx_{+3MGEMHkq93Dd$w24Dq21L!b-$xZ{uZmiE~Q7vwu(= z0H49CK;dCRih0$Fa!kqX!|R>(zS~JEF?4q>7L18sY!-++M;Z6%=R_k|Q5_K&!AvTo zjkbgZ0FeRT8S^g*y9~YOE!eP8RQ=hrr_6q~8Kr^f@G1W^s%Ao6BzQ-E<-`a3g201w zd%~9&Zhi16kUZZPEdzq; zSU-GA5u|1sLylVGu6Fxg`2?~cqt||CkW5*Xg=!NndriMjxLg3atdftA^o2>{B5``_ zPSKsEhEmMlW;2*o^`44CtUTCTvH6AXvM#KBtmo5fM->!We33V$kCuu z`rPh4jf*|P1uwm9%w5yW$Ze*8Q&$?N>PS1ei?mv{zTyJs&uLjqZ87KL*^t=?cRXJG za)_z$KOycf8c!7nLc|umU7YV#mM?)YO;4S6*rWmCQ}=;@DQd1G?9j0Uiw1c?ai8zK7W*-_Jv_;;# zcv)dV^YGA}%K4C;SzjE=Yo^P~{yHv$A3=1(Xi(PBmXnvJ9pD$Oxc#r~g&Y z*FDYu6k|xkyQfO&;-w$ziMTw}DmhC!&*EZecEuuJ;A9HIsm-H}<1!w6|McvjOMoVK zMd)u|C$pa4I`QRbik+cyTa1vPrkCn*45D}z-w*9aK>wfshq8fd}Tg}Sz z))3l)9&|YZ#J~Zpu>?@YC2w6EHJV}qB*|q?U~~eI078%B9}^yCZF;cma$@wrm+Cpp zc8a6J-@W$P^O>|!7eM{>wq59&uO)40XNnThyu?t=e{crIU#ktP+cL2c+WBzm@ zz@3dX3g}pWFJN%{ZQlKo0aK&Ji+3H$<5zwISd%oxwhCnYJ?S!K50o!s>E6UmN>%$; z=&b(UlRbT7=)~@Ug`TOlZKWGa{P-`I11VSahHjXOoPabs)s3NUkb9c3)8*(q0tX~e z%u4CrUiZFSoUVRW`FRilOG2is63ML^L;bV_pth)rPErl?tmWsY;BG+jK$=NIiC(uj z1aUEoc|Jr8kzsZ~bs=3diDc+Q5Ge1bg`xtMAY_*Puhq(o3TJdgnwBW~D^RuWD*=4T z`%k(kMYVl7l6-y<$swS7C(T)Y4KuQLqx z&qEvLI+Efd(|0ghFGJb!5a4s@6eTG(e~2B56j;^%0R|p0!JQb{<;ej1YeF-QtZc+0 zj86hdr1zD2s%y~so1riGL^MdKt^{he_1o$1Zj9`8y-N{42A*uWEAG;!|Bdk0wWoOo$h6l)f;TA8AA-C|e8`inha8$XQm3ET^&Lv;;D= zV(*F|QQM`3(ZrD@UV3GN>G-fuZ0h-!?ueGZGgvCC)%twC&^R<$m~u&V&Ce{;3Wv79 zac6?1um+vOk6yEkL83QEt`;I6B1=`M4G#yEu<;bzaM|hJ{rYgMC+Uk)`5Zqc+~CmG%9t z9-tNA#Hu&XE8JHCAbRgULHM zATc%jX5}xd#SKIm?Xh;C7&% zNp&p2x4cKHYErgmDv28z-YD%$Iv{5Z&QPaaT=-5Selu90rKK{ZouwRP4)HMn8(m9* zIOZmE07CJz2bFpv1gu_8`JpqrU}xRQy@r4rutT5)Kg4W`-KeEM^4=wja|+mfyLF&i zgrAfwJMM+O9p^WFkbG53dysh5bGD`OS(E*xpWOC@hex+=kmMP-Z6R@|ZEbMl#~s@BV^6 zJ%{}8huk5X?EL$hsES*}Z~}c_^#iRoV_#8k;dLL5o+Lu;21+>`8%Oyr{Klk`K^8Yn zwhM#hjqb68UE3|V^CJe_{~{*2s^BicU(cCVz#{5&)#s&0eCQN0@z6?bdWuz;b?-&1 zJo_dB9xTvG=r7Qw)V~V06HQsSmYDG#`oDQ{F=*wkZwE*xthP7iU6c5&@%pvDVqwy2 zbFCzup)zTj>JY&E4%~&P_i@zP1nFe(>wZ{lyQS4JI9H{Mf(g?^2HJ zL)k}1*8T~tic1+6$HTj|_DSO1C%vxa`UWrfC5`&^UH-$KZ&MdI9=xDcS@>v3t0D21 z_#IFlGZzLw$;?V;H7?)VKa?;^-1Ok)_y)Vdxle&3nN257IP;797Je=oS^Mm-UVnpo zeATvjt{&%(7Bsm|tFBIjhr|(l{;Ou ztoiZNxX49+U4j~|Z*BBW(y~M=Uk*kiz;e>$pMgGgp=IFpSoijiHnr^Ooc->nA^jRl z{T5*V0MbUK+s-8?jWq2)apc&CiTFJrpIAH;SQ;Atb7Vd^GTl`cZS01)n{_w}P@i)| zO0r~@)|KKe`Kgz*Od#rDxr8cO_GYi_<{gL+Aw;?y!EFB>b_8jR&p42xOckA=g!!|9 zJ$DMI>>8R2MW5Gmvw(?+=QMG=Ms=;`lkA8uR{XE40B ziQ(;OvYHh8SegB81bB|}b{r~tjryO$F#1J`4CY$4(5g~=e9nqq+jg*i|ITn+! zIg}DjMRy7b*@P4^j1=WAVa}COX-OZM#07>$+Zt=eu+C?_`HG zZ{|#37g-oL=^A_{Md$5Dq=IaT9)Zc)XPpSJ0Z{B^BKXj2g|6m=!%jcrL}(?q28Bmx zzB`o3?|I{H3dVl+bd%}WAhXJY6}G{=fZebKQYiZW-&QkN`SKz1qs^8`4GLnPNqUa9 zsJ$wZjTuW|9lhHeq@&DReXJx)f;l^QFSQ|>^}bgf(o#QyNlYl90v2QN%fjeZsg{DUSj|QrguO^C?*P0dfX( zNKd(}78|=e*$ffx|Kc{PO$PGsJrkvdFN z`-ohLhC=mesgr&?&I!UEJ~7Q(`YkpZ)V0BC(|MPkFE(qnc5U=^IP%V=Q#1ZmzrGMF z8OnuHN`RPv1LIWlrVKe>mEZEIfRvyxuyIlzJ^RrfhArL(ui^z=G6I#*Ex%eLkFX=D ziC*tx;?{S@m~Ixz6Cw>JpOA3L=UDl-Eq1?C+Sa6~*-O2OTJsaPZCv%!kR>wVZQ+`QgsO8A z5RQf4y}$T8+1p0Pon;q%_>8eH)p)nAag>p$K6Dle2r>!Vpywv9A3uZnqsDwZtRKIf zYo5(p!#RKTLE|u@)u0FueFBA}P7+Xz23b~WHO8Xu_>WFop&gf`>@vZt%Bc5U9!(y- zh}`TTNbcIuJ~g=%xLgqyG9j-^I4#p-D>ws*lLS?1+O0B1Ae33@q=)j`gI;OE_2JPP zuurbJO6lV~&q<-ltuED=TwzhhE~ns{#SdDfEL4EvGWcYE?g0(G}1u*JzI{HXS?0F1PnOfVj~`Mhb4raei5}p!{_b z6WutB@cf4GO&SpU?LbuL0Nez!kea%j;y(_|-dJ-THu*}^n_Rw4?)q{1D-#V}35|AE zi(=j`q8zd-qa~DS_!x6rvql)|a*k;h5qIDby6C6riy$itA|pF}cGaONoi~@~BA;3G zHr;*l@Z>#F@{+X->zKZ|EGDC6<`x2kbx>Z<|^@st{YAI1; zCQF&)=G0Ma^)DxMjebW0Nj-ene(~wyxaEPd^E73_&tJ52AK19Iv%I|XhfRvHU zIimMmeESbqT<`>&k+?{(NnBecuYkx5T=gR(P?Rl+xq-w>Z?D1C75sF41yp+iJc%K1 zZ?ncdaFXhNb+5$;*C%)y$nb@@vWrh+XJZk#b?>)tzdd)e_P5S&$dE!t(=J$Of=31G z@HPKX#Cp~8CsX9o#oTE6QR_EmGV4`7kM#aKB^GkvcgFpo!pEN{?M2w$M7b{3BN=-z zMLt>+qV#&;3A%Z9j9;^oAX7pwh#t?4Xnx51zJs8s!$CnfCWD9Ce@OheGN)YA3t2ks zT6#vd3%qf(5ch5Yc^CDK^A!e!mb_CKWV%7Dl!;%G{{MnNk7V(W!c#n0=R3CJrXVt1 zV(*2{;Sa{^|CilGx_GL$JCStR5|qmDP51NA^lmwo&CrIr!5bUKNdBO__w5*DZm;3h z(!O%EK~_!M`x6`R>qUsef+@s$7Wjqa=8Vd4m^ zdWclFQ=WdWmjb)3uJ)o zfEc7(+9q?+EFf`YW(+k%)U9Mayl!OWA#ppDd0^qqtF*mIt8ZDxN7$)7)k_)-bZ1V= zN^WTO=b}0?HO{ktrQfe=H$I>o`Z7x*CK^M=Eq{*9tK&985IGkiu{km)D#hw2Lw z{>IGW7=j{!MB4(Jqmp4Qab{60ZfpJITOA~EdB7&Uckoo*MXv}JsRgN=k zXXW!0k*xtyM2+|@TJw9CTyPG!k;G?Dm|yk@;m*jL6mZt`o#Y8q)+il=Lfs}Ks~v5+ zTnW_pXELe!)buPK|SJQcYC5Fx$;$u?kQUFzvR)gU3A^7Ec+jd>-B*ru%U zmV+zQy6O9T=Sm=+%rg4mFV*MGr)1|}S7L0I^^(< zLK*N8qpud9m{W(jtw1}b_lt3;EkM@AsUvv87C!#&LVPOUxJ?+OZB1Gfn^R`q{Tgx+&cr!!a~D zle$u;SdG0HbUCf#8FBjt^*&Ei5{`@F*kP}o?XKD^nRN^H`czeqE zj&CKU_nFWxmNr=DDKB-hZ|DQ*?AKXAGqo;cL?!EsgIy5Fonm-B<_YM`I3C#&7>r7r z*Q=h+?_VC?@D!9so2BLiP!`FkG@EAk>fV?#2N@1RsZj@S5BWp@F?gq_`A7eA`!WPh zg>pvROGlX0RYOlBpr1*N%jX%Oz$_3cHx4MjjI|*oK4Jv6eK=w*)Ozz^qqeTP7F*Vs zL{;LPQ~I9)lRW)6rCnVi<>^=P2c3TIet#C&WY=6tPLS0x^tFdBE!${2 zpc$lTD_!9<<>{UD-%o|gFWBTQPrGnsAB;}b+xSK`6H>1x@bhP)>7{A?Ds{p7T;~I) z+TYC>telNrn$PY%6=HZgAu_4ov2#Pq;myAyN<%|>=MwdNl{>ZA$3}lN-@CK z{ZtgUqhJ5p-wv?CHb)8mjbvB6@YM|O%S`q|xnv{IYM_`TN=z|cWezZ+Qmv)Kxj-IS2o0LMa>h++M6US<@9p+akT}oQ zm<6B)7}i$6ms*qKOszCJF)pm-EOdDc@6@ z=}g0UV`kqM2OB8ISIhA>GAEA9K@|8LYyBi1(!1i^^=*zIonQM~J`zO4t^RAdNoiy; zfgrEs{>Sfg7mJd9mTF{QhAQdvZwC{V3fNb1@IpVz^OcD>pRM`6KsJ?$8%lmrh50z? zu*J9BH!|EElB3p@Ukwu!blFd3>ijJDTA-X&$tzZ4)=^C0sSW?jRj&!kW~KA@L8NSg=x0MZ4J_lqGxSK=!hB)> zzkIwXn2=XkS@L6gklINjH?=olgt$lHLm_E%jnZ^dAwF7@vKDHIawW$6-8)EyfT+@h zujo&RUYOO?E<~zEuP~nqBVYy~`(TtgD=~e@j z!g4y8iy|OKIHRF7RHYq&gkXTnW!6r=_XVG%_||%H=8K7+RF0r$V#V-|9fj=ubuC*J z%C0+$lTd{{ySmjeba7six67-M>vu0hDd~t@ki7za)*GmNtR`cce&S51Z3m!^{J`5+ z_Gds@cAz5=3RSK&QDfWxRLJhCqE<43CDWH7>tmUV^f#{z%L2( zNdOHwl%n=2k55C;g%GT7zSm8IHry&L47NWca1cHz04Mo2$*X)Z>_%H`C0=+^jF^?J zoteI<1;w~0qIh`U=|cumz&Lx(rOp7#d&`t$kzj?2E%2JXF~l^E?-SpiO7@0y6lASU z_>EQFZnTLQFu;+zwwWM4)=c|KA%*_Ss%pgVq9@kk?>j521QTcO+=NmECl{hR|G<8i z097bynpBP`Zql8nU8wH!&o(0E=n{5!tlCG4gd33kLmXt5rrt!P)+M~{^CYQ4N@YY!X>xA zre*oUTmgL|9Rjgsyvwa?Krv2WIs3iSIlR-4@9Gb2sK01383l{@Zujr?I`jVLOLBP1 z`W<3vH(k--n29-%hEsFk%pQR3+5o4Ig+L(Pcr$OT!pz|7{X?O01_~pzORO<8|W3cta5=a_H9ak_l&dqUl)MBs$Xn zm_&&-=lh{g5P*dThq~G?2a!iGIPH`zLGxJ6^44Nh+ei|b5wyxD!$>JbL|224IPUjm z@wC+~bO-LLGZm0f{=nJ;!l&N8HRY}CP;Xhs3(r0|$&1`{;$OzZ#&rk`Q%b``KNu96 zAbsdUHAx|_?<0OJ#CNa4_%u>)`fr1}=z=vt2&?rcTK#DJnlSmUMz#>E*Ij<~wT;u5 zfBoLVc`5`GMk~OO_;)dse_$5o3aZQ_f z%_w%`+*QnLR)~q*o5r;RY=;WAykLSi=onmyMslW=vd@9LmeX`nxmkSsTI|}BA0Q@R znxrB?5&$`+gLl9o!VjWwo~ndC*Hao{i1x@s+AoMwZuRg6#K^ynEeg{k?co@5Q{wR!-6cYGi(h&b2&89ig z_PcnwiE}Sl0(9k=1l_3)VhFZgvIA=;c$PF}<4fH4PasZNiC!3G)wa4lmxo3VU>bXJ zA?9#g&wOLYYDdsNKNVYv5u%~+Vii#TpQ{KnOy6ceXj*5Jvamb)RiFK;eZctRQ_54e zq_=qG6LT5*!S@W_UZUrx;rfMoQEB z6f}G8_r|Ks>%^|SB^F3Ci#B?1@hoeeO1o%pt($jIb>{2thr<_6f1jASBr-Sc{X{L_ z`^VR9`<{MY==pvpKdxvbG+l+T?~-;Z|K{D+uR)9#dVmaAe{X{KRf|$3tm}bQ zxPSd};!SGf<%1EfbM{5P>)cBB{^QylTK@W)etGu&8~4g`n{t`O7c9oXv3~SnYERJn zFYC5}8|Hkv>(+*=ot#0NZPoZhachnwCSxu1Otk!Vbcx=qbs@;n=;TlXum$>O2yRQYLk=jr9 zN;KjRgdN>D!OM(dH)|8@BsC1WmiwRyo<*5r~)p_qJ$#pU%(%}gI$!{YP zv@f?=#|#Jvg(K;XGmUi)8C`DujflU8N?Qd0=2u$9+N0o@@sF@kUvZ<+ia^hDquP zIkqIM)Z2|0Mo*O1i?Vk41=MKi;P)}EfG>g4YwcBDZEJC#ATDvx4&KHOVNHFIxGX# zmQ0?k5fZ|5mB%)f-H1*~{tLZdjaC%5(ipj9F;%<$;K});Pj&}oSvq${6zRQ@o3R4F ze<3IKs-@t~Eoas9BgNAH&OV&U0nl{puh6B^?t15m++ypj{sYB|Dpf)Egr?#s({^Aw z)d^!W0Vg$$RDleti9Xa9t^?KYlW*F;=R#D?6IXxDCW!ND>*60wL6rkXd;c5%shMTY zWG>>ZZ++J0San=-hfO$G#|}LU;91sA3aDn{xI2)}`cI_lMW&YVQ2WmEhF$ffzp&OUbjF?0NQr0-wWVMA8G7XzYC4!Mt?^N~(h9E^^vdFvIO^6P@f!xqbx z>V%me6J1jSGX0N*#$WCcYn?6p6cwTR*7C0pBN55UHLbIgTkv@*N8?IkWTZX~ySUw- zn%pqy9rxf`>wfSqmWYJqrIbW?Lmyhmc=f9|3~~{HIHdXSo9$ju5QvV@q;-PH!ALmO0&KQ!=pd?kw=Qc{`w2~y+14(uY$;7%^{M-TPoa`ZTuC00_4!CNJ z*8VM*s1hE5xO0xI-KdzbUkQ#M-)(OQjrq0q_cqecLhOa!>pyr$>eNQ$!W;!dPyq9r zk2*|??u)vuHUGWzLaz)pls0kb@cMF)eBqD%rRwEo*7|iwE=H~F;B-aUl5qQSqYv@) zr|9*!L$e_G3gC+jce3ycCmNl6KJD!{q+}$ZQ1V>isOQ6^vh9(&a$%Rrz5o&%_%gzL z7EXiIQOcZGelq{5r^NMLejh>j72@?v(!Y$dpxhn^hb=m=`<{Ez{&y8BkKH1aP0*^8 zH5O-Cyt##eif|Fz+XaG*Q4yMMy6&5rwM8?acz;61T&V9nUtJMl6bSWuN4n}f`08?$ zzzEGOTU>1SJ}rfVr=$V(buws2qszpu4th60ORifMD*wFAYEE2(RS&OUxc7i;(|t}b zX5Z}S8~$=Npqs`@&KZ1jDK<3HPb_pIgI?Am+~Z8OP>r@O&-*5O`x)+q%{S^2 z()lAP<(5V5X%y3J6Ij z!RLSNa3Npc%Fv`w1SQWlnG~`a`<$qi=OmD+jJ4km9kz3saytdlzvDj13D~k5?)0de z)Icq;Ch9(0iDA26h>5c+Y+h|o6Say2GFSE0cg~&XSoJbKJ+61W^3O>XVF*k}$*7NA z$!y9NxcYNxs0R}cHtE}Io}Yz6eLPSp`fkE?3I*<_r?LSg$UB0+-nAX8!kAHf!1Vtr zOWAwStN`x*ifQ8rpgse2aCc-bUE_Rg$@#<=>q7I=RQ-aiu z8<~HjawtyI2>H?pJj6=GPtDM|E0W~+;CDL+_7a%l(kxz+=G$p1iBqPv1l$%I3< zmjf55X0jYd1A>;qYq%7%%bM>HB!L?*!n#P#am5vvn)Br*TR-1s73MO4viQ-9=IR%z zH?|E>7J$XbVs$}E^W7=Uy}-wjokd*VMMHCdlol|j?Wmt7Mm%Z2>38jL>QD!0v?jzQ z6d<*-3R6-t+6_OMJVAMK&6iZTCv9Pb{FB=@l_p+;hKqp<-OLEod(&j&W2FPK5kJRR~LjLUFg^HRmN{l?5%IC#kkOmvuPy1s2VMe zLU=o<3vo%r-39pAmtbjvr~6pZgwc&KAj%5``~@OSA`!oV-MEXY$t>8EvHO>19TvY{ zU|UB+tJHnrS$Q9{$Gz2gO&0pEcHX@g4X6r#CHB>1bJ%%fCBn?Zc~@_AS6}ef;YH4r zABB7wGh9Fy^sVqdWI4zfU~dmsKnS8EV9oS zdF8t9$;etHh_IZg`e)&j7kqITg3fEPmu7YXoX@2IcexxxL$K&Lq1MFzu=YsW8%L5; z@IK-tND>zd!+m(NmPR<8wL9jOd)~p>&>=mTHiT62h+Ia+RG9vE*DQZ^$V}ZcxP9`Hr z*9C_!uXY2jkvbY?d_fgf{o6B3_z&a`dGnI9& z6nLdjX-6rojkpuBn%r6NhsR1B-{;uT#oWI)sBI1Vq>;H83oF=J#@lmDBBAjDt4aB$ zAA#OtT0Nufm7IoH3=}E)fR$H$Uk?+aJg^gu*?y$)2k#WxgHaH}X|-sP z0$}P1Ne+?~s6zve_q_zwEcrq?gUG~C08ZTowr`IeeD#cX5iOd&kF!|)%tL<3z*JBF z644?Ijk7j*D?)xy{tl?QIjjAd6k+pjy|?fUr58VQa6N=1Sm%B&!aIl7&{q&rb@2cR4~nPN@&=4VJ1!&?Sib;GS1rGmVg~Xqung@_8*_42 zdtAm502^!3R!~41#dmBd{~CJKxWC!FiXd-BSl3cd{jpR+0M$>=So%YK9K`hPJ2+y^CQj zG*-Z7V6TYfcx3Q2_tS!&!r5M)BEs3W4O*f=!>h>sYxS=1NWWu)AR`d^UI?hfsD0BY z(K5dq(XxpFJsNSN_Od{;npFA4?)=be7E^us$e;j>7Dl)8^4%_zw-G6(_@7GQjv08@w@s0Wied|fyv zH^8QnOgzJby9v<{q~40$yB=hvNq`?h1ljmU;^Fmz>B|rcC}fAM^6Ktu0E09ihy$6- zM}zXZ8sM!e2gqSEo)I}xSAz{U@!tN%=eB|!I+sjnK1)9H?$H+76jE0f_DZ?h-(sP> zLtMtH{F~*C;O}iteL3p{*5NxMZP2TSTg;ApjBPn3^YJZ2@rjIEw+# z#RN}ENr!M>f)-tqfGnxRP$TlyKL0a9^Vwm-H0x(7u|@v-k=C#wM{xz_!Eo6HM>ZKQ z&xsKQtzFt zcl%uTgLw8gitUZ|dF}lDGJkF0-O*`V`hk<}mu9}YHCPVEeLg&@6%;z)9T#(^X7~5g zpQf$6#)q42R2#l^e3@w?N`LXn7h_!o+zEkZ2G`(+9mw#D7H{5Z6{@e^Xn9S#i{JDW zY)O>X_BaDNT$rP{g0onAuWh(`BLGHCHr8o-?V?r$6XhcGvb9^qNzfJSkb^z$UO|o7 z#a;u@T6yg+|ES_pkp30Qaiw{3HEFjtF(7xI^S7x}Z~-IhYVLI?S2cx3?+}b=QiRuO ztd9C2X4^cwyegW)|7PW*W<ZVJj%NKR+Xo<+oz$wv3$;oBAiTnrrx><*gO61) z&UlhY0_0g0W`jQC%S^Pb6l6|1p74`oOSB2A$+a%`4tlX%Od{(X>AmOhx)QC{j8}Ve zm5lcj4?TCH?c!C3sJf&7L|pcVJwmMFA|eU?0hSz5rTcjj$BQr0%wO{z5vfL2C0`uQ zcPNcBjvM|gWCd#(Q_Skzhn5p=e(3i2`1PfWEJTHYCeYzR)r{ZQ2KQIMI>Q6BkJxhD z2?$x6>%X+s%$EHKut{NVX#DGa}CZ!l){NOZLeGL zMZcFC0k6p-#$iSZGu}U&!s=uoXf&Vt@@U<%PvG1Y2gn8PnycDSXIXEx)Y&jDfIVH1 z>Xs+p#mr}Ct(o8%^W_MOOPPADbGI(^zLH6vdEi!h9mrGoqgwa8Xh-#453#ldFC~Ak zD~BTJ)u?AtzYN{U^@_0JYFFzWD^E5J(C~wW3OsGaJR}740?|QLm@tV48LuK*uttY@ zd6EOn>*0|;g7(NKCVVOa1aPy#TRu!7>p$s5q>&w|Nhb(N0hB@ph@I=Wf2BWy$u0~< zRI4N%A}qigsATNz&*iTl|JSgET0jTqB@l>Nbv7rQfPPW}a<8*gxOUso2-=SgKXV#O zM3nNYgxPx@PDCY$S*^LB4%^T^66Moy6y?lP*1@|F@QL~ShB*2tV(Ox}0MzmfCEgp< z+six$O^`0uk8fm%cWC=oxp62Gv#UV5+SOOT4ttMzBJ>*pn%uV^4i?Y$A(j#xJR8Jl*-EeAi{-EA`(}HM(1eyAQ8?esfY)4W&_ z)@V@rk24+A7y54tumw};j|{ilx!CGvuUvy+0PmEbCa2&V9-av|%U|iusv<^@h`U28 z^te3A(?kz+%)6?Q^DsY!X4rN#ksh-ACG_d+$3;l?bez&u*HuI)w$YAD@1WMI}u*I0H{27OhpM>;x#lVcJ1AKcsO|$pV#>L=xqeF5~?tvUAW(m~?<}@28FNGqz&ZNVb7&c^q>@F7@`DctwqH4FZz%@1)bF zzri>S5iSq)R>9wt2K-Y(qD}`$UrOb-3v!Q$5@9&ly@E*Xhv*5G^%VrJz14{uxQDb1> zF$V7Q=L8-~c#^-eaXgEj8Ye`#`Qfw&Og9*YsQOW^kWI7kfcqVEq~~Od@&3stEI@(k zpEP&{EJi}ri+XLaz_d9P2!29vdo}ymCXN5tdy!O$gm79U4N#wJk@z~Gb=&Pmxv<_* zcBmRVr2TtR4n~QQsJGVh_DGECZ_ngm3F73n6@VkT#TrM~Db_CY!4iFM)NGra3@3@2 z#JiKNviL;uQ3EtEg+yv7art%vHVW6RsAjcgxZ>m7%*z8dN>ltT>#T1bbDPV*U;E=p zAjmNnmft1JTqa&%m8ljK@OSz>+_2u?g;OWMp&=mEN92gC28q?RYW^u$0}MAHA!$;g z>V~!9Fa-7JBv|ju=@Y!fK+b`|^?y7SWP>Jwv@yl$!(@!AALwN2ja-i||#X@zGA!6diBcNbvl**0C^NW$cu zZE0M%gskJraug`~iO;<9l?2D#SJk0tBLxg!5NWMGwiz)G4;Mrl8|yybcpmj?Us+yL zC;Rw;Z@F5dzl5&<1~u3@a_`^+FEO0D?)10U*ums=JOr2{tD<$bdMn-RGV95z-1MPQ zdc~In$_C`#bYWJF9V$%j0sWcwSP@$|XBRcnD8QYcwCeVM+e&iP8FLng;G#yM2kSbI z_TOFL(J54lvj$89u-1=)s0@rxv&9WFKg!Tj2#e;FFRp?s00svI1&l*$H|beMi zI@`UF?<0LNCT>p5BJtU;B`v+dA?6DrFpbae)sJ6==wkHHqeDPziutkDGSM&yg6;W_ zFeSFxPl1?mhIeYU&kPB7VP#!#U0>#|Y5?C?r)7ocS<;!NV?x;;IZo6EPHA%O1C}K8 zz;gyj$`K%;<_0OTgLL2v`VyYs1e9z!lL$b$K|q$SWbb&y%qPXDPuuIdD^FfQ{kCw= zPoNM%y~Dt;MHw#i2p0b)c54Qc4mk9k6giUzC+}Trb$8*=17Ja(BwkW?IkLrv_;YJ; z0^?(q$5_crXg-2yn!J{xIC$#F;IFYzxMLO9e|z&~9QAg8nHNx*PDxx3)PF9la1Y74 zYkaGwH&o}PotIcgrF_YRLoAvs^VRG9mdFib8Za*dwtH#ca3tQw05I+fNCO|DEIxsJ zuHA)3W8dy~{g7Yf@og(EWa797*wz1El|UL9B`UQ+7~L%WS-iCCp@0rGIS(jTJ=jFq zPl(U5t2>&(lCdzk5H1;pL%AEL znssZAhHNKMU1WiqcraW#;|1tQM?yF&jb9GFM1_x5Z}0(2AiEONbt*p*;KQ-^h(N#{ z+f1_Sam3XNNRd?Ht78>LFlg$@JLyc`hyLP!y-&$qf8C$2UD$=S1GdAhTo_Tf2HRKw z)2GhBG3!wviF*ineL-Gw5TXw3aEbqgpzR}{!LTEm6o1cNEyx5q`{kE07-ky8eH%DC zI!+QfgQ;dnjJ@i@*3t{uJ$0Cv$+zXL4^?aADQ?T!rMb=cqdJw zZeg~3`bOlKh2FK-BP3!AI9i9ND<05G(qR%uEgcy%-RAS+nZv!>9}Qdb4lY)h*m{|V zn?e^z*nh^FBTC5^#L(z)e`LYB%7o|hK^c_SHcdE4vg$BhKq}6DKWZc`e6;~llh?XB zxMP*rTLaW7$BY*`1m-FjWMKDX3jjV*pdJB7pkc@q49%b&$W>t*8!T9p2q6;*O8aFn z=ki`hK<6Ea>vrsC8X4}QqAEtCCgiJR#i2MV!X8zE2TinMj_=J2&lgjIF-weh2Vk@K zolRTIsj2dNg{C-2X*3I)TX%jMVeyWQ%mKr-Hf~{YCPpvr*!YQi9uv`|p7vO4@8TVw zqoSj)MeDt3eqTJEMV2ue-!>yPckjNK^63?sLr)CzIFq+OU3@>g6|AJqy}3nkmc9)? zKF*ko4EXFQeeGJ=tU4zTLeT@pHsw)=9#>i#D_+VcC1aKS;E1|Ca!dmA|1!jr?^!d~ zTr_>V7un~@k!YGYyX&JW2WDfaE5O;un5NhMTz_gSoHo3di8pz7HTO$!l>Idm3xq-5 zLMimR9k|x}w;?@v5`07ghjZKVjfT3*2pTRRjpN0-G`Ug+i;RF$5}e$yX{TfZVhk3uRWHbxh>%h4^AxikHrN091LEqZFxYpeTos?4x?uPD1Y53^|%2qn=255O9%3(CP$K@qefl6QsF1_ya~VoOU;vy$4T3<0EK$>#S@g zB#pL|fREM&gnBxNYw&blzx^#q&tWLRq33+(}p6gLl%3 zP+>8s4-a1I@heZiSod@O=g;8?JL~Gu=#=Q-k%8*@r_rYh)oxi*zAjtasH}`~_JZRX z^=3QHuC+7tm1L($#>^f~jrqQqi$?wZ@gRq|P&E7*3Q%TAqEx-T_paMc>fJT_QW52R zGcmFq&bp!I>z&yO6C0EL(KXFd;p+bAa`@>WDQKqA9RB_#8?2n*0JfIR(5(xvojb}} zr1^a|N=Au%1D#76z6$slBd9+*`%)vI^_ao6g3C%3a+C%G;!Nm|7|d6{ywQHVyii28 ztOxvfNPyKri^*0n`|yVHkChJ*qhFiq36sTn=&K?WZ zn4vyC(h%OrtAOD3ZEqwy-6oa28TxG>&O(X=AVsSIyhkuFR;x~y00@||zhSHu5L*9~ zE~^wV`#lbj7$?NJ|KyVU`eC@}Dh3cMAXkPN4v z?K-`#ufzyil<{VkFu%oOgVM#iAInNbYz2QtZ;rZ`P_Q^0IV1_ZAaP2GgJ9sR&Acuq z83jIjJk}0YGwiU=6y0ga#pXMsRDN!ScHWQ6@NZqIv{21BS-MX>_P#- z6ej2({ZX9wypdQz)oLtH=O2yzW_8{fzmGf94%SUwd8}Cb&uiE3;d(UUOp}Vt#oFQJ zq4&@_h7YpZ6{du-{`cQAbSgiD@+2f@n(W}sbN0li6~C$ak?$KTtX{3;MohgF2m~E3 zD;rhfGa4hh)+k@pwnfFuw$Wwp&#cLi{dUiN!QJy&%#^2l>kG^Y&G$8J9W>{#xTx8v zmzhRkG0`#e!#+0`^8SjVX{Yl)$ye*_L3ON7ynQ+`P>-24+}`JUWrJmJcjQf|!Bk?( zw0jV&Bl=@@HM|_GwMu4OL`)~nT8&Lc8ozcG&{;#SrT>t)^6<{Fwu-1bDwO7```m={ zZPMW&6$YJVMiz(DcGAXu2uQMcIav)qn9G+Sw~KZDu(mfpy|lJLPRl8{x!Oa5J(9rU zm55iMDSx-eS>eQppFMFOwF5M~ir7;!`|%I?9vz5cb1tq;+xLKa=8Nc%(-rNld z8ZBr5W6qvcx;JAbC1;?^sS)NQNE)q$K9N=P92Uh=4iS=S zULX*3gp#J~@;c zG8asB)kmFzF?OO4t-fj(B7&T0>5O-^V*H7?u^}xurEN2ii))v6RCmctF;2Xcu1ZKO zzL>jRLNY;hOX5Oki#Fxf(gB(jASyqKaHA|=_1+fY`70ajXDs}7m1cFj`qQ)2Z!>_R%?BGzY;|HOj+TBzH`#W)qIc zT!(0uXjaY7{Y%kNfPsg;xRVkiJ3V_pN7B zYg+n7K9o8a;tiPkFxn8yc`EPKd*hSXPnxFiq>2 zPGO_;kJi?N^oNkXJ(!mJf+&A=>~TW&K?~2`>$L`96K{NK4dUbi_`U~oBA7}+Mf_oh zhQ?w3%^F(KW7*6J*DJm3(!t%&syx_B5xRRhyeG`@O$rqza^_*CRqK%K2*->4DuOa? zuV9@dxtK-2!$No=&Y8{CIkuvaa*%fYMS|%QzB5*7TJX_eya++L*(uBi2=RsDJHjIZ%)NY-D0IUk<#in#X47PZu^t4Jd!8lhk{_|~^tmHkD zcJwJ|} zwNTGSs6eFlHbBwPTI*(! z?Yz&ASV*#5MF!Wkcg4oy3eO;0EN%Z&bS5iKh%D-_w%HpE6AwhD7TH-lZ6YUO)=POV z+DGtl*r6(VlW(&-dCQ?mR}eEaGQsaoqFXP`+kzvYOZeJgJfTJ&9uX#I#hUPB4Oi}G zDhKKr^Rg3Z8BW~n!*$;jV)~qMdxk0SETuSc|0!sz=0DvvZ%(PlQU(U=%EbonE8o@S zRu9&EnIty|A%h%Av3jk#m|Kb15mEoTf+I!jnli2B0D3`qer~JfMgH|NhkdI3Oku*G z1>#XuF3fU}8WuOj5H7XuL8tzco*XY7tXHx6LX~NJt}oFSsrLDZgVbA1MxPVO&ktjnJF-{IU5<*zK-|SQ?tm@yUw$nH$fx->vDjlSc2!O$>j3GhI8tx259DULCp7 z!!!{%&j+9}`W6u?<}*cZeb~^vZEV_SG!nivD$>! zUh+<*OPmL5p_P8wg<$5-ew0vv7tImv2>l9!)L%BO`EQ>*ygXz^iEul=$<|94W|);| z7h;soXtg3A$Z36|A@-gTt80p>b7yeURe!!qIxN3mht{7;4`oY1=+8U5m*Fq z^e@P;%a9*;E4gEPLDwm2Qqw)9p_|@IO6$X%TBAN`F!jW>YKMRfLZwj6E*%G@wXT zB+0h|XM^hxb-aN4xz2~FGr5^qC+Y`W2cWq*=apIv)`m|%VSXc#K-9K=@Liq4fzwb+ zxTYIT7>3rTXw93ZznaCX7+-EeY({yvO4ch$jzG!muK)==yfbq7=KS5Lj-8ZsPSgcb znl@f&6>Lv8Q*Z4ei?ge>t2aXQo+6Zm>Tu}T36tq1`r3bc)~6IKAFvawi<9=+mbl3K zHP}1)iNrl(xG-b;7{bQ}g$OOif;=b~e+As^Y`g{qeb$N-M%6I(GV@2wUIm zc9imAbgKr1*Sy$!%v8v$yLdiXBfR#(4$_by&67^jO8P_<=ZqMGm&U?3zt)#RmPDcr zv=lI`{vN8U?&Y=f2a~N+%>5C)g%Zwr%x4X?PY!3RAz6K{d-QQv__?sOtbz5`1%C2R zPh70=rE`w2ukuO&xDO-E^qMp&_0NWz!Hd<=fT=G{Qa}eiEf1Lge^Equrv7qxhh28_%k%e=O7dC1 zUmex&fnfqsaaDf5yheL2lyzAQoxM5f8VP5hV|re>azZt)CwVXeg#ic^B6EA)Qm8l_ z^*Rh&oNq95K2cAko=x|vk$PZHB-kp*CS3k={GXk=O#cFwmch1G7!aP`^2H&m^$fas z7LVL#SE|n}mUo=jbM6qP$TXuVOjhDPe$S-{J!Pg~2a0vR1VJXzO5aD&1p7%yN6F4s zZHfZz8>!R z52j9szl4E$_SW$G$lAkEzeg5(CN-h?A;f+>8T)Yg2ci;1Sr@8@?l7gTQys4f^ZXsx z*;`@IcYGhlfk7sJP`d{Cs& zaB1;UokS7dz1rcyi5{7oCz~H`did#iWz2m0i~pAXp;P>>n#3E(_Ht;)`9!3wV%u;q`~)~%;>&rSzxI9`TF4-N?`M9UjYvnkgP863HoZdc(NQ~%(9n(aD@2v3NF z_j7S%lvc*22l$_cAj0PDi?-T-i;|IWht1$?7vj%^@pzB0+5I$|#woc6hzGJTe{00_ zYRotY1l0?CNEoJ2OE7Da>f$u|ZF?6J z&3^3rGx~A}d*sB-7)h;F+u!1&%cYll3#n6X(4sR3f*h!^( z;Vw6wB);P3u5p6hDp>FNCeSq#hM0@IeOQpP%#-$V)^w~cucn7ECvA7^W?cmF>t8?v z(E%3!twgdzS~Z3cUj>gybT$l}NVDtFNF0(BQr*g2`$2p=_ntlRm7?l{tMqlUCNr8< z(?irO?mvk8KZno0dtAHnBDVV3vg=(IPd)xLJ$Ru!nXkKe>-xjN-v+--DW>U(VQhT* z=b)=GL0>gQ`4rDbi+ks08l`WxuJKhS{P-0rhNaXV8$2Zw`=$sPtOq!|QpUyCjRH3=*m@{eb{j3#hk*5WI|@3DA)`7bvg=BAz1)6K-%iR$C3 z(F;#s{v5EyNuNGH@~B&9%JdpQK(*2QBGKL%e?&UV@fp^{%q$(<+e-fpJs@Dxs48~!&h{LU<7agP}si}+DKGFsicqV`Qf;aAKK zXr0?1{671edEheHnbM*?_H^>J0Y{1zrIxL3UxV_cvV;tD2|dpKP9*zmL?#?(*U+RM znErcd3iJOm4Bi1guLmnm&AXMHl_GLhiz!DR*leRU!k$9n3MMzbm0_lLee{++1p*K_L1iM*nd}AT! zUq^v)?oO8wfh}(`s;YCX@1x@Be6!s`7Ar#Rx%SQvb)( zm&Zf7xBt(KExVbq3?l1DrWjj`l5B;c6VXU9ZlbJhwiHvsjHN8msBlWCkQvGnF)^fw z)5er!D=K>mCHyYWIp5!Z=kMKxe=e$AFb7SA@9z4zqMu-SB97)$ntP{{M`~Mx>Efpll3X%G?O`UZi|MBJ8 zaqgLa=p^u?$rfd!W=#<}ecstmE#8e!Vx9zQ{@NI@JoeyQ?9!0;=KecT4%Qp9Og@b~ z-q+YqkGQiNd7Km2Idq=R3exQs9nVwZ1nZQa;a-!89x0fqUqjWXirkykAdP4A*~l2- zsghJeCA52#6mO>`?x11e*Mdq`fRy$i$)dDrVeUxjn0^ZXs(P~S_}k#cw>B(XrT%5F zJ$ewo7%j@mYMtIrD$Rd?53Q+7I=4W|WbJksce+CVHAHtG^g{8T4~I$)`#P@{Pq%CwW{7(mtNt0>hJq#as?>#1zg**zAof$s8h<#6UXW z90u`2Mr1?3{!2jb|DH7n(!JKKGIj3Un|_7xj`(E#vWy7kGqV=oXN%3(Cb5BaE+o&C z+R)$G(G%@Ur+;2qnf_II-blhgoKqcZK0bKir;9vd@aFt6i9|DF1VuQMp^G-E=AYv7 zg`>p?`?2r|!civ5{`17hLio67n-(qXTO;jf7xec`oZ$#PNaz*H^5I0C99{CA>`_XtB$i_TK`iKicoB`|(6HKQ|21p7wI) z44!jZHQ{LC#<_~D^;O}r#rPe*TmDHGHk;#QBQu9cMQlF+>^0NS2P+DXKEQ3p(5hhr z;$-C?hg#8HVsTXnmRwNy#UqguPqif-x?raxE9AL%qhf?e=!fr-FEi)>>3S1qD(;DU zVh!#*X@5OASQsa&e@8mT?4ua}{b8LOUOTlXWnb&2Xv!DKZl!T>v_Ug+#hH63#Ujp; zMmdy+ABreb;4!WcI!K?8r@!!x7&^Re@^tTg$7ncMCho7C+O!a$Hst!!agLPwWdALp z9Ey)2Gm7`zj-qLMZw(cSa88k#3L>RqaVl8-3_yz8=`+zh9HMC0_)rrCC3inib?3S) z_W-0N`RhOU}=oqO_hxl~-oY-r|pesp> z>8-Si6RZ24xT6W3uGh`hAj;MG5u@v&BkE38{#qZfSW0GQYwS>VVGPclSx|X8hAqbd zM*s4y3zjY2xYJZG(w%OyiD&)3}}M%=hSD_kHCjk+)1fBj59v9JWNucZLFU z7b>U{&F@t-2rD^dnetJm8w2<3p_W_DRErM5px~W-e5`uONn9oN`brDE*QI!R4U2>d z3Y7e?W8H+2TTiOy7uGzyU+K!LDrmmhmf1Dd8ID zJDiY>6V~}nXXt%ZPlvOTiVapmf_0qKeAjZiOTg#w;s8g6$ID^a)9z*wu*xfk?MSiH zL7G)3dbdimc9*6>gO(^{6;eQgyj6+3ZzE$cilA>1)Mho;QuP{G0Rcq|6J-Djh5ssB z_`1fk8KYa;c;;)RZv54Y<5!!nE`*Uxkqyk3Mx5&FsN^HNOfvf5UZ@H4gMqB0q!Jx&jC6gapmcE9M)_INL=|5)#{T|4o4X9Ed))2CD zd6sAz`-Q-B>60j$-r~=1x=h0Ppd$J%y>zLFKXz(W$iSUmkCkW(J1$a|x1|Lw4)?O! z`MbtM7b>((q6KXu!#=JmjRrFwLUfW0EW$r=Zk#;rIN z2#v}Bm@$yzBf&wv8!k_+wTcvWv!o1}^fI#41lU@BaaTiX60b^(OtpLyG@XC(#FqQF z@TR?WTSKK75JQ6HDP>ak(1^589^`90dw--|lB+7n&2C9m0j0ViXANKGPrs-eh7>zq zs#f4Y*QI%>ZtWN22lh%&_c7N6m1`lY6;-l+=3rW8SU!0)4eJ~8{8oOFSJ)V-R0s`Xpql~6icSdb@GyQVJ1AjI(-HfBTAZ) zpBH&Ynd0Q7&@f4HA&LIO8E~SuLbrR+aQCUnvx4w;%hHq#DG18FHN_&kXYXA%#G+K0 z_REYT=cRfgF*HG!S5$!tya4=(dLYJ8!xkO)a`Aw9Z~4yfnA(2FH!Ht10reYxUHw6` z9p;vBGmeut(4G*KsnLoulBx62<;F9fY$dGz!RMl+2ZUeWbOj8ogPvu_se-9QpcGC1 zl}iY!05k*3#vyxS%r4a7ZN!XTQB}Y3<#DWdRv3|ph17{dX|2wfX6gLv3ELhKA%9`N zt^~yOO&E8l@OS?2%NB6!!K`Nz%{y+%obk3(?^}%}@D=JiyL-*1TLpc!MvoeQiQI z@wcW#7$p9^b(W>?N)_aOCr0NqIpcVcvSb88c3P zjM-G@ZkXCn-x*%|`Sj2GyEQxa$?YOZL_D~`wBs41&d8bu9b(w&#psxR88P2EE?;l_ zEpXXE^Jg^gMeMsf2hO@Kv?_(qdZ~oZdaB$N|41#LIV1S(=kNKkY1O8CvHA&0&mU^N zi7S_q?Q!Z$O$*+7G6z1zxu)VwQG-}1c|5`GsE)ide@vS@7hanr1WXPsluzF!PL9!s ze2^K#4ntpu7|6NNgtsYq)SH~TW44db+-^C3RlMgzzT3o}z~WbRXm%vATaKL9G_W?s zf{0E&M#)|~E|azteFDw4E#1yXA9;Y=IjUP4%(nXXchcfs%iyOt6S9MJzGWj+D{URw z7WqXeu&@cr_u7$#Bkb3snVdd#^O}sZOwsYBQBr)p2P%3EYIdDj z@>>^MT=LJ6POD@2x2#E)Rf7ZWJInS=$+q`!9;ju5jT5pTgyFK&NVnr1H6yEo&y~8X z(1m($?;Z^!nZ@e8)eG9(7jY`K>Yk4vA_Sr^|C^r{bk4()l;wo1H4fvcYNz5dlN=-wI0vx zE0%>R%+=%4-7%^xq8^{act`(PlByD%whNO?FBBA}r|(;gl$ZZ#wj>3Wme1)emvetE zTMM}#&Zp!a6AE(gA3R=QbUzoFXPRh1Q$<#5iq=T=>1nNm$Skan3ljrc-2iP3+FCN* z!NN9^?_c}q0X~>VbLIdvb`IiGdtF$2k!`8!o>39EE_MvdeLOZH8>*coYl?NIUI@Bn z*wq|qMlQW!2`4>aug~%Z`S(sg(sb)(3@QW{iZ_n-#joK@W;Ctwor+zH5{E`$6Poz$ z4XK1~3G8fp>=Cnl7~$jEJX8t$@#;MUHL`HAYNmnlQl?$OrwC^3rE{SzuUJp@JfGZB zJEa$E{@iwABhS1y`dVrquHC?a;4?iztY!o(n7PD5C< zLtsumW}1>g-HsQhr)O(mMj~{<8tW#){c{_Uq}C8J2V5HmP5s6A`lI(N0^PM}exgKN{-vfg(a^Yc%aWrPBa z^3MPN%_&yWPj5P^1Y}BDVK{OO%?{BXiUPz9rO-^eP2ToqS7(bvn$?~AnGm%Q|SwJJJNv3wV4Xkq6*{Jtpn^UYO{>NBB_%^ zVb>2xzKr+*4okO#f(Wph=7ihw6pl$u<2KrOHRQrKFbkwn)u(kL$@G@r-rp}s63&-8 zA*M)qJiIzB-{~9sldq3Ua)a7F^a`^1mcF7ASn{8140I0m()vt^sQuxP0q=ecd^4c?Ec_swKpa{|dv8?CyF{rP??&8P)QLV02Y!Qf-1)9kcDq^aVj- zg(K$E@?bcY6K_zK@%TNvONw9iyl;L^Rf=_iQjPUmjM^y>6tR>)`b1g~!UpzCYtVPh zd}jB02#EPC;5bx|OLtMai#0U$3ssX34J+E%vI){17&~@%IQh(M zr)WY0Fymb&6M*roa%3>=C#o*Et7)etrdgHDssIw~4?2dF$cNQ{EbV>~6y{bk8;ffr&zxKG9KD1~D6LyqUg|*EZK)Yd^ z>hkgO-k7hpnDOD4E?)dk~zku!CDgCO6Q zB&Yn%0PA2!sm4pTL6%)v-YqkHs;q5Si>$9O?Zk%k8%)=KhuNnBbGzY~f+?8HwBa^Q z^4xf0cBS=ZFAorEb;@|GhUdBx{SUH^YRJRX>BGt5Pd}+_OcKKJ<4ZQF2}ibUKBjHR zCHM-0xjFYT$4w(>@(T#rNK)Z!$GNrT1}E2vYy)l_r7*vzg<3@S1mYG zex`AiR%nGZed4YLBK^3!=W*@VwCJzBx)Jl&>w53|?DI#koUQA|!yKyDp4MMB_&RyU zKO)cBnhPAlC2B7B+x)lm%pjF4Yl(o*|IBF6wljmfnpJRYIuvZS%@f}PhcvLUv&GOC z)$MlYf!WLQ>l&bZIckP|pC}K7=TzLH$rTX^mmE|_kWSG&$Dt-?yK>udOIxK=quzwO5jEF9X`meABq#ZC*QFlNnO6m(e0yRs1>v ziTb(!@agDtXbzOYn(e#9_ec|hfqrqBSLnv|d~f^=V%Huw7HIe*w<)|xrAnECw6b?2 zT}=lQ&3wfwvBSM%W@>Y>=WuxFdv203Ol9r6ox1*CB11Km4w(h(CXe3uODovgOOSmC zb=4LQpQ#r|iaCrPK`Y8boU4+NOeJbI^b%`#yOpVDOTYQ~xAem`7XWpSj_o6dNhVVe z(0wU5c&{ak=3r9Prv^-aHGv&mY3R z-@D+TF*kngT+GimeGShUQT1zlmq{IPCiOE5jT7KG`s(ciYy4eVAki02BSwg7`9Dsj zmJTNp>t-Jx4mpqt#=K~~QTZ5iMjgI|7@f|;_!%=5%d7>+4V$s*1rt1zuqML{>M}p4 z7$Bw{xqF-eCaS_U*I~($tn++@>w0HYiU0lUKJPwZEu^>;KlbD1DR5a$opWuc?N%x)#wUsD3qm+JEHuIsJaH`hk=t9kJG2QQ zVLP@3RAUuE-eOJhE<(41EYW@(G~m*?;&!C7n!@-b0mlhml4f=nZ=0ID@U~^u41Sl3 z!rSj&qJ$6HBRzZ3G;`))3#tR;EndCd0Tkj{)+xp8 z+>qtpyQ=5i2m|Zi&Xv5LY%qy#>XypkO0@mCsG%}`)Xw`ZRSd+hQN-*7vrml2>8-E! zYv^4Dp^Nw5nw0h5!!?9D8eBST#}63A!$F)12l1ONyY6Zcv9IkYW%*+M-lb(n1^jf# zr|wu4vPJW_8Z>!d99a)mfRs?E+~M5M->gnEj%R8K(>c%v%fV*xG-yFfvVRw<#aa8E z{Xude#09l2^W8D68H7BhJ4g=(bEr`r=EGU)*PparqRzju8*hK?{{};I*E3c1PNt*F z)7nr*0szKZcWf|%@g}UVu#+eDdFI-a9M&IOpi?9i19c{k>;KtulbdlYX!vXU(6($0 zh~r-xLbdfq%~VdXN=5GaPF|#5I?Zj5_lDFKBXV6XwMCYQQ?&D0<9^i`(8T{fgR+?m z_pl}4uCaib)(>n{2Kb6J-j^s=P7}_LZyUsN`oThb%KHlH-*EZ_ISxG9wi)k!TZuAj zVZwQmBhk|c$FeMS@^^aL z=emfJu`?@+K9jZcI(L0< z3Yq(K66n9YrSzb5rW;Fs`0OK!)MNv%2&e~IL|a(g9~W<>QkA~YCU``i0h1#*Qt}Nw z*FUYrJ&7CsAJ!JQmgB$CCY zAIn`Yd+6-3tooglkDA0O+2r{Il}E0%>k_)^YW1Z{w6dR$ivy(O`OCM_9^|7h5;t+Q zxe>)$py!k|EHF6V*T?2qVdSws{s^w3unzJ$9KAuOfC``g-WSsOJZ5w3#NW{;n;Fq_ zB`4;ex9ZN1WLt%N&hwcpNOze`zI$qN(MO@LeDwaKz5~UF`%|xn=m&kgvof`P$i@LP z_v1jpNl^okW*vTje-?Uz=r-)iSz-o5=BDi{*pM_*?LfXnznTj4(W<`GP?Tz!g7Q;u zRU6Z0uVjzDT=@jp1Y~juQHUH{?iS=^$46^QUb0<%sTMRo;b5huAPd(&Ob6Xy#&?5C zrvVa%4r|e)z>8+phM^5QQ!qIN^GP{YDl-&FxSh>g8@42Jzozoi@Xu(V-jf+G1mPmG zp`H@?ujxcKL3ha-K${M?Ja`R|?ygc8L(Cg^ig3}p)X8NZBe zQFSG@;+vkH{j`LhUwH35-y`WW8DFl`mys`36H%pdqGZvjM$*Us!)B4LIxi>BaI;OG z5$Ae}`aUY%K7YOXkL3VXAtbU$Zs*A=`ymLSQ1Cs;ZF46eMVYKk*LY`@0uwrX{G`Hz zN_>@E7$&#bejsYVkuzG880bR_MRoXJIaH`T_*bVR#&6oW_Re$oPZssE+xFlbm_fpj z>+?yKtZX2bvrV}mEvlZljYv*np0uP$GfrY2Jyq0<Rs@lY7fl z!jjGVMm?9p8$IUQ)vE)ZlB;6|t}H%nI2AHHm^@i+bl~v14-5&-iOnIu-a4Otd&QM4 zNX>@S^KL)PzpSF{7lifikXK0c9 zKvn=Khnyx7@72>zNvJC3+=E3uMs=x6pz|ulo58vO614Bv)!fYS$!U(?9y9;K8O-ET zM~%q8IF%4k(P0_1?soY<2lq2ha1khD*pwkFk1n{1oB?(I!m2WT*=n@hH1`q=)c^&GJGT?jjtHLSzO0Y4= z@*;Z;;ZHW`4{alKMldyCn<}4vK_$mCrSkwN#R4{1*5!*ELx=a~34*gZAzY)OtWydh^_76Et=NDvz1!8YO`GhD(~qYH>g`j{27Qhi#1lErVGV=8hKiuc(3HZB z**Y8=IrsURdS>L(iln=Xk`LTqCQ{*VOim9bnC)L#w6Lp3l%l^qCQGqk;E9-Tcr}%M z_S`>9;p0ilj|?Yl%ll6+hPaJi;@B0S?k*H*4+dD3N*ak$@xG3BlqR{c+`ir4yQM4~ z5ZjsWHm|N8)%{k-djyrpwS3dcto5%6JMn=|An})0M3>U3=J>_8wiFAZe#@1AbzO&1 zkg_Y&>~>2S78YiY%B|EruRxIY)`{XXr?_d@&7ah7e^J9O#oP2g)Kjv^$jV>2+?adl zx&cd3NL*Q0N~CM^*7(l4@lT+?;OU8r3}J|HDtg}Q8Fb+h zGvO4g8nkIjoTN?YO;vbp zUkQClf}{6|8qGhK;Ea<;#Mp0O_lt31EPecHZSfy&9mz#Zv^hH&m2B$Z_R=8+;Dn|J znMC9t%l&kr8mdMz15MqK3U@I3$7a&993#Gjx*n-HV-HR6v{3Q$eEaEz;r>Jf&?>L?HO+2b_FChfAS7II5&c54PkY z?snsG(vmRtE6Mn5Y>C>NQmd^eRlB#r?5lZyDu6swUKR?Xi70T_7T>pk7yX}-v5?uElF2$v zg+BjG|GsNCGbeL%cYo+_P>qOq`z(1A$`o6vrm33}s{^JCL9*04Q%_0yj1d{*js`fz zS3qUvMSJWt={4(OsU&+&tGiBmJbZ@)xK$Jx={Kb^c!*N7wI2p_K{ZyTSk4;v4Rk#V zVllp*@fDgJA;oqf3Yf9itxD`uil9rqYEMts<|>g5`ReG*W2BUxMeJhhLzjS`SE$R2 zygh~8PU!&1|J;Abq{VITvn-dO2#t^9L4A{lsAgeai{}tu^zj?^7vGP4Tp0S>Y~1*e zEIU8o1`v&Zkd8x+pu~CS>tI)7ANddz(Io+CMWMCJft&j#+c$rh6YuHM*V$ATDs>}5 zxz(vodU5Z<)KkxuU-ZSr&G^Z$UABEqVOGny4iUGx+Pc9>_7StxK4wk$bAIlYQ@kWQ zi6Y#)?n``oQp`BX1tNh`_zE%}8=VP(IvLgwPi@hCTGh`Y!5_hJ7*{<}q<;r{Sx-^$ zTQn`?66h_NR97ctQST(NH8f%qDAoY+u8`ZW8$bBq78F~XVl%07Jx(V1Ou1F5H=5lp z3(71aS(rf2!p>erMr4Ki8E=KCpt(B5iT|Zc7CIn~Afd<+&4g%t-AA45s-CA2g9ruB zsd;8Txz`wLWi4Bc3a9Ju1~aJI&y3NWLebxR>HM;AY2uDk3e zZoc-rg3rhK@cg=2#|ks7{r%jgw=Thti3ena!jXlH%wMFASk2ZO~6mx)UEhN zltaRaL?pK6k~Z26q8}yPoF32o+*LjN$u+ij_UPg19sEi7AzZf)itU7#A zw0dY%GvwK3kv{Q!r$>$V6(cT}uRU?O{_slI!BS- zEWvx*YQr@@|FB;td)k?i9&j;8?#nr?B0YO_LV zQ5^(OwT!$b1Z!7>Yp5mIpur-vQYDjlOu~h*GEjS!8?tDHo-OQb@;wGjTt1fyi6wl@ zwbt)1I>W{4GPMl0tjnbT((nh6Z+zaO)rE!5*-Kl*(EQgxtJWIo;dS>dxkI@KXciIjwlKE?o{uP)5cMoEag}8A+%<3IU=5^zGw!4ZIX|BBM2i0bTNUw7 zIAVVU2jrZU_&$qP(Bt~NV0?XYDXr;WJz$s5$|jhNNjFk={obHil_n8!l)Fb68;F*r z3Dex6|2oDVB3}GQH>VNk@3ggbXTx#KA4jID8$x`twbxc*5;+LHEySt2X;%9fBnF1iIX+ zB-xRnIO^@Dx9?wCKa#s05m5wK^;!0ax(>NmzFo?Dj?TmAMv2KIfF8t`7YhUQy!O&bm zyc}<$-fH?TQ8~BS<4}?!E+@Tdk5aSb+%1FnUCR6NlI1eN(q9y=G2~j~0=UV}Mw{tx zbXH^EJ9{6xTPx{Ca^Vx03ye|tV<|Dyr7nbHdas`GSdg@KEEb9MfY2N_cScJnz<<9E zNla^`+3~sq|I>)>#iVGFr6KM@$>0(pE(J9bt8frdn?9$MwDhSKL~oxqXTL%CR4=1- zl4pp>R)`RTKswa>XDKQ|2!&_74A&3|>d-OBZvqEa70%u4MCqBft6+2VmM_K)=MXN$ zKPyH4E}S)xQdE9et!~8|sz#z}nknAjDdXigbB|^-sq~J5BNlTr*_knQk9o=6zk_vt zX$&ynTtjnSZAJ`JTdcD)soeIOONGv9ztER85O7MoqW01fw@Z(~2v-7@aWdF;t17{t zmBN3zp~&E!^TlVp>HDaSvmRs&b%Q7&5r&)BsVchXLE@&H`ox{8f4;A3loPx24$5c3 zT9gncaWHwYx#lsTc@u!R4nDuTU$%U|Ew1jh4x~*(=C!|f_i2rdoXzBH_*X{ZJ8me) z^L60})aibB=B;QhcPNxF!VTb&QhPR^9lzm1UCSwl95oaXPp~3cK|WxJ4zB)t&11s& zU;WG-J8s}v7zo~#>KyR#pSf9SG2Rz?smQFA)TVa++~%`R!4;QvQy$2=E6x6WqTW&| zE@HcaxW5m0cdUVB2+>tym^_d*qD9}+pi!gl6euIh9-K`R*01a-6V{gr-C}}{dCB|0 zu3HcZt*hn%xh6EG9Fd+N+f1=^N zs1&s#HM6!xX_%GNin?0F81czucctWD>p#I~^=#42`(e!15BP8p zK9R<{f%|XhyTlyqNC>P;3+6;N{0`4`43k(qJx$?t+eS}ue%UI4ZDMFYl0X?OlxY_8 zhZ@Frx+%LLAwjHlTzsQVZj*+e>iwIbW3?^a@DT5{^aZsl<*AOl`eKYq0Ld!dA!a&A z77c%$H+M|biI5>jjx}xdNERd4yv(rxlTjAMr&bAD@+uVE@@bDBS7yYir14%w?$`^B zY35c{JF4V97qTQOx>HpQIM3X_dP0r(4E0fO}!4XYw=fA({P{bi}Wqsp}4w}jB z3?B(B7A~=wa$FF4;;37?^1~!zrGG5;v0#T~N42adcwFOTyUEO7g5jG7KDVPN8dX~k zkeN(lTkw!k#WK^$5*KU05`I@0hF0LJj81wLA*Ro;#E|p zV8YZI>J||nMhiJwfGo-)aH^pWjhzX51xc8Cxa5EmeTVgX2ExlDk}nbRoo-K9Ycdt% zR2nw?Og}}APZuo0R=#JdXL*YS{{F|ENItcVLx)X91KCSbIVBPrz+LZKaJ8uK!-2#< zzwbIRp2-4+jMmhgD`ON2j`WKftVlH)d7kLVlhx?H(YhT_5<6~bI1->c`H9()0F$;n zPp14wDhp`#VIhB-tCKg2x9v9B-1G8SF#+jy#=spV>t{twGy^?pXbUgu|90+38?IXV zi8c+|Ts0!ZJ?gO!`oCIVL!x4E%NkZH;h1(+9+N4%Dw1}x*kbhOq|)UOPKLXI?oa6&NsyGvZ+td!$b6jJx!OH z9*zhgQJ>%Z9sOm>DrDuShlBxB@y&Uq+NIZzijF>!?6?iigO`6DPp)(wwoUbZ+5cAo z^~dHiY(c^^W%-rKN2i;YjxXGbjvXb>|44Y*{g`?0OAg`iZx0L7z*_^pcNLBU9M)=~ z&?P!YOE`WMc`@oOmqXE_2Y(h#5pbK)BI4Yo*}aQ*1hWmS>fu$6&yuNB%LITifu#ru zPq$E|_nXckwKz{j&T&=KX9t{gdA!KSg5wuY9T1|;9FmZkrMC!iA$}x88^Hne`KlHi z*YY3;P}0;b#X^P!#utvMQ+n8$S9Tq1IkBjnF(HmX3)6c7*Qp#gllIzo)Sdn;L$CPg zGmqSxw3nfGKXqEWpNvIbV`#MtSF=AL{Z%i_57#-nhRoj8o6MRj{-Z&=3`(R!W^cFg zcgZ*u{Ol&eJJ@Z1oAK4SwE;goVa;`rh!Ety+THc}a;_YLE?;xdmXyM857*cs0(WF? zGJM{TyM|4ue<>N}18v`65byn2U7E?F(1?i3O$}eVyy7Igmx<-*{^8dOAQFZEGRUE? zPe>p?LO}5@iwZiqTW6ntr=)zMU@=aeD|D-1_zZL*W4~t9hhBocaBj0jVi6nGuOX zZ8sV(d`_1ZHl`iUfQi`ATd<-#d`N7J(jiCzEe7xhTEJpK%ovMD;<@S6<9xS+MPb;k zqfyAWHfv7?6`t$-_T|_B?%!I7N+<7+2a)sOVSz+WfKHKYf?djO&L#%axHZuX~xSto+A-Z5$J3j^^CBAtkrfw&}fYpyj?| z7}}Ml@Xena8LWdl3sK5V=Pym0?j9HQ>>~A#+IIHQjsq&hva9zKqbmF2?wfM2sbxa! z4M;E=5MMsV-}Zwst8M`AX-+ymaM%LmR@Yx-?M zI~`F2Bm7q8lI=%7rD0_=E!w(yIH#qBAor#VZ#MF|yMDo4JMV?hBpDOpq^R^ZUW{h8+qKFj1rBWRkW zWU!usVCco=+?%Tp9P}_Q)Gh0hBei)%L)udrgCr2t|E$vi<}96e5Q~otvw-8hTaJAZ zwwZ^x*~oK$+~8xQXVfFh*VYs9hT` za>p?p`AJ+dRDPbtRIU#3@bkh~bMGQyxoFgTJ2QSzYOCjE`mS>gKaCwcfe23Mnc7t< zm}BjbEjT`J37!VPaoIy=Ragf|S>2Ko66pqje~>T)<6q~a6rI+O)bXxmPzmMpnsaN} zh#5JU(*>p&VH&pF_~v>Ye0#G>>$khBNC#7t^ycP|Uf~oCNDMe(xi3b~Ppt@DP?$-z z2ld1`RZ#4Ki=GqppbQ=yOt#=1&ZL7mma5A=Do2z(f-_RP9;Nq^Fh0PD52RY^y{wi_ zedt0;-ND8EPm4L?hLq|kT&`<=o%QtIa^sK_J?u#brc@MoS7krkeIhqTAJBKv9PkX# zJ}u8&PH69EVtL=As17(E#soVPQeL);Yfec}x2C?79f>`~{Q?qwZHKE*q!K_VUjWZ9 z#q$4811krcTh#P!8wi2gF34sa6{sVRHByTUq*5LBVY1bd88g8uLq7iSCl$u%{Bp0i z^tZ7p#!~}tuRYWLl=Bu?3L1PYD+qqyyP##~3A}qDN z3(}Jslg`~ib6mtHez@A(6FRpzOKVB~cU4^)-F9cWs|} zbgy}1^1W4Q(;J!YhTl7TZjVXv_ej1vzO*w|)Ihup#%%c5w12a z#~Q*iK%QfOR)k8^3F{9u={S`wAJA!8XrotzDp{=YdDhzUtN+qUX#LUzH^_SbOp(C8 z)|_KC*>7ywIRZkH6yqXws~S+7c_bOf&m@y|j3E#aos!4Y<~oalHK@i6>aE|~%dXp| z@QP}YQV1d>Y4-)bVikX}f6aj=3T8wPAXjYV!KCp+K{a1DWS=Fr%4inMtu=_Tq~@x!HiK*Y*)rFT;`S(w$$zRVL$6VHy@R(jS7|eyt%B}a))K0;v2Q@zp`TV*PT8!c5S{htv77)U?5JQ)O20rxaV@f z^B2+O%TwiJ@%lP_`cF6M)sVOY1*41oU&mGrisMdXaq_t&cNwgPTq!0 z^g)f(hw81Jtpud?xQIv!X{FE(T+)M)=U~D6FM|w#=?6F;ITz|#|N8B|hVfz66sfT7 z?=P_QdCBK~1f}pRjfwPCrHXb|+T|Qu>HT`G zV=w0u`lz{gh=+}6{f@a2^NsJi!gZRy_eb}CIpvj-?;7czw&Ulsqr#;^74>GE<{W~Z zkI@eNa6fZjn-~KN@&}xO8FR*nldUx(vfWt>xQV`Rl=sYkf00q<%DFqhcmASCIBZ%D z4%U{J(WHmvI8ly)N7F^=wOt2coGY6UdRgHqyqwj41kjp{XGRc}Y0vOB`u}vRt3}M zMBVn_Dj8j*ytH@SoVNMqf&LNUXmN7=-jv|V&1yc3sJ3enIt>f&Zi_hNrS7X2hMQ}* zn}m|bcr$D@{U67EkHw~5)EkoP5B+m8ZHhu#UA~~!4crv?jV+3|$!TKy1zSX$T)BcNnCm%XX&_&>a>*H@T#sF;J(8R@l9B-e1Q1 z{c;On_joMjeK%GwgtKzu%UKB0(ref{Gw^4Q$a265T|qgZ0r)^W-mqFIZ-2kT0Hrq^dl`FCH~O+%V_{HP*njvCk|mKXg!J! zEZ;HXDROvfQ>i2j@T%jC<2eU7SFnLBCtoHdm9Jdb)eM$G{r^(PW;Uo3UqOi6@*#>g z`5bYCJch|RL4=tEwJE*zs8|6c{cexf<>7pxDh)HNn*wz{GX7dGVfY6Ia1K>k8X|6+ri5z-Z3Ux4R7fyuj!|bo6|0fhs$#3B{JkX==9^&ue@tkF*!EG|p$q zc+3qCc9R#o61%QULEB}w^bP0NNjSE&!FkTD9;lo5yUjUEv{eff2ufglPE`>`a0Vxd z*;V0tz=N|8fvmYED1mk8-G=e~vCua!ZYiG70+~pt%k0xd4e3 zklP0`Q+uBWsjSZC?S9_&FYSTgW>6!aK4zl$Kdl&7&$C3vC(^jQ7M3t1BdynwmGdN} zn%qdfD=R-E7J7>3nG3;VCzbRp{i^WFC?7_ADDTVryVR0~Z6i*P{J6GVeaB~)&7B2< z2K5R;{y1+DsN8_5id;fdXt&RbY5K1!0N*o93)iFdw8`8QwYl%3E@GRQ)RjWzkj{$p z8i>IMPVsWj6;yI#|NGN>`o<-W7YdpR@cgdvw#DlBfeg_|ZFr*%y;PBm2eHXGNy4Cj zp6>RawK{6ZE8y>C8?{!oILPE;d2N+*z_hBpK1K>*>w_KH2wC$kf4;ZO8nXD{c~)la z!Q%aqc{Q3y?(URbwlW@zb9NZQM?F7Hw_m2W2$M8_I|3%-( zQ_ejCxDrLJTlk#|=+ixtyz7@g&(D8`SwjrJUyeyK5=P7wf@Sk@UP4R}V4+%|K zRd1O8isGUp+R&@8c1_{f6soe$)AOvMBB6 zVqVL+kfo0g~}W1I%ATA%lUY9akql-V1(R`(iR_ z>&-i;WSyz^_+

xZS#AB$(sOx#%v|Gs_Ejp9b3ox2*kh2{3+s1Og{ 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\cd_tE z$G~Szz!CE1w~Hm5x?Y%3T{$(t^4N}#Q~8gv%CGT^XR)pg^DHnl_)jqTi2frL61rlF z_ZWzI-V&d*&Dpv5HjAZldUP(*$UpMQ@r!F`who-gcx(&IQ6{urOFRi?NF(vrY|seC zYc$wb2Z!y0VgoE0k1#^D{nN}&`D&l$HKrP?G|FoI8?q z^6+I#+H11Hp+VppjMNZQb;5U#db+$^Ev?I4+buZzP1)X{lUe8BKgqurjg3E8LiiiT z(K0tK2?@$EXX7$85F<>5yhz7v+bH~TE(9{U7cjm8V?6k}7==NyP~S7R6$!KrHpxt1 z{p4;^<{dLbIBA;7qhVHD8_>AI=GCLk{^5B7TqRFS%8Id_O=VpWa7@#oh@b?w4xm)Q z-qiU82;M}&T>|P7b^1=dL?)wYywadOM8z%=y=05dUcJ z*N^(|*(uiUzpW1nf`i(C1>$}zGREe{0>@Yq*ZQU))wvSC3dnF##n%B#j3TdkqLA zyn+oA#0?ZhK-NFWx8u@L0dYvH%Lo{@3c=Ccg9hJ5GYI^hHLwg?aj4cBL8~hjOBF6} z^{XK*Rvo+6khGL^{zTNNvi9Ov&oH@77ul4)@I(vviCwL#av9LKo+~5neqUk(9?RmH z8Rr)U4^-=tR+nYry-3R_x;7Nv1xz}LLiDR(Z$}d`G2k4*Z1-;!P|WtJq{(}>tVe(IzT0n6u8Y`RHC+qkCKt!4 zN-&d2G-gRW%1kVm%;b9>$$$`eo^t0)js<@M7Y$*RLoyI~)FD!qdpLlkW_3K9*Ri0; zAzS^Drra0a+s^l^bPJd%O!RXF5-Y`IwtN5Njyv7UtgIdU4)fYZjG!acfBr!|9S&Rw zR>`ZL(m(V+765XI_5QmpakqE$Bqo>`almb5;{?SHxUA}RuXU~~Ono_?6w2hb+3hpw zQ;(^;gIIgRp!HdCgh%1!9>dJQY2E|`jYyX=bfvliMjGZ$rYr0yAOmAYb>gp1^gp?3 z2SLwV@~I>Z1sgw0#;r%h39&)*J4_D+TUsi4&3vkk1g9v*l?NVmO9FMy^IroY^+`#AW zj$lI{!lw{J7himpiJau-&uQ_x1er#($?5R|EtED2QEj53fndVB0J!@QW8D5WB`L?h z`|ET70ta!z0`CFT;OD59su!3@Odyh8a~!s-IO8vSqi=s~x+$r2&0^8RGtiKUvP^6G zPjumgd>jjU&cgks$r*f{juYge^*L>2Ag53GA2QbpSIizD2L;KvD*M9i>Q=q(r;U}E z$hD{48*919;N+uw8@1Y8w1|&$5;qwS%Tn^+pryey2VjQo;I<-(UiXea_^Sa5~~Vs z4thg&HDSdIiUOE;UDLN=qH@5LVmH;$(mw3POymHjqX#h zVKaRBbZ6w|O^?pOzEJTH$mM0QC#YE5W>;!bUtT(B*t>Kh=05M?oc|mnh`0`h(q_FO zt-w$krT>BRcoG)?9u!LijQFem!!nlGtIkC2^Cbv!4}#iN814J@(yJR9y5gn0qtZEp zlD1tvM;-D)SuU!H-~$57)F7#?NH>4H;y%ZV_c|6XKbGxr9FBRM&o@L|?WR0F3%$(2 zx6j!Mmdg=J``CEOstsq(|M{xVLU~D)fm7;A@*;HCpDGpvZmpO^J(zppv31X9^(aMU zcj$Dj6>4L*<Vz)Lszl2Fgr?lOS3As&I}?bH;gAh}kXRO&_n-XS5l@yO|t z0p?hcj33~C!vRGo*l3~p?5?q*s@MZGQMOtr=S;3xxolp*)9+NMWz)+ZKtNrVcvcjt z8uoDWMf;-k0<925Mj*vszazc$Ab5c1=lQGLqqa>EaCHBjt-Iv4P7;h8Rhq``;&;^?swz(VkViyRH557w;Z{1 zs99h21)Csf=DvUgdw44%szA2@NtZNXfUErT$RK#}??>OF9fVCOR0C8&o8W`_Ac6B% z=Lb@Thu9<&H@r>;SYqY1&v}|Bm@cYlHJ@VwJ5ty_U28YXggMdjqB2+K)~m6uBk^)< zMDgvp_m_vU#MWHrqQCOh)31ZlKWm6B#^K^*xdSPeT=JY{*E$oH z*T##x|0&1hiR+67M-psN{$NE=U)ft5seIr?DipzN2v7(DB9N(4+!b#e-od|M!a_fW z0K7=-G2nZ?Fatj@1P5&&CM6xSt$ZjU#~QL$i@$s}!T8B)-sy01Db}CMWZ}GqCn7v+Q#RV{;Hc zgaTz2GY3IDiX8BWxQMwkaT=5;Xr))j9}1EAL=pZMg51f^vQ+@LH56T!IJy;V4j{>^ z%fk(f;18#L)qdS|L^6K9jh(R6U*!->)w@F=Iur&QA7-UfiLwb6T6KY_<9Cm!fwi07 zSSwb#Nb$m+Rs5+>Qr}CG*`Z(mpsawaE1l=M2)D(qU9U2lw76Gtj--+L?2w&@t?97k zX7pOF`{`QSEUbK@K}lm7`irev`0bLHgw`eG2hIxj9z>>qi(6xHd%mvvejO7KMj3-y zET~ej$ya_9^qAV5N1Qs48&JjjxAf%Z?X+*{Wml4F+3~)h<}_$rEt_OjO3JP0b=&$m zm-p6TMGzFQ(S;c&r%B99$D?^zQKjovFu?0shTRw_a2Ol+d?;%L%S;J_(aS; zY~{Kqc;5b~TnCcQP4(qvq8-Fm1jPBI+yEC*U>G86mUB`&jv@dzauNALdxWIiia^dn zH{Wkry+6j*>apH(a50T`KXs9L*u(ZnaZGVzwOGxST($FKT1U8I`n#Wu7aV}>W=1dg zB`K|_*~{eQ0t9{fA)2hJQZpjW-vvzkk=C!!U`#;{PU#%ISZakreX=E+s}OnYt6EP* zABN&jm>CjNg{8k_c;CHF{{Hhh0~L{5|8m{2e{at(>HA&aJAVJvU?fz#zYzSbMNH#G zqmQkLMiNJvI>I-KULu`5D5(dHgix(T$=T;cAU41T!HN1240XDodl?zXfFX8&>KbD8Fgj)KDv_jntqmWpYniD_o{E-G2n7HrZ z{10|N#>s16W~F-vU;U%P2{4|xZ<_)}kKTqCvwU&U)U7|)pn0Li+i(>!OSBDuEx8Ei zr_z8i_uPNv(cTC4$?&Mki4?<3Cf^ga0<*imGiwQ*)~y_5h8a6Jfs(TYUf8sqDlBSJ z5~39^64WID90GXR2S9lwBvBoU%6V;c(E>|&=#fC7Ornq9k&S(9hNN?{fJicvtL`cK zg9QjR@!II-k!m#v*5-AU@3XqsTzKd=mwe-A#>a{z3VDvLJz*G(W(bl0PpUpq$PePxnu z@)cyK^v7*z@DR^^xN0+zdpMCy&|G|_9j+L! z4CGLt^gJ7kw`J#4li=}(dHa%gj|Br0u~t~8_c%c&H31YB80^5^x$cekT=SpPR93-ek>!>Q5hV1Kx4T0`GX5bG{)NTiP0T0a0Kk)A ziuv>c9yNay7OcJ416aUG%*aPf%9z}n_XE(RWT={$>gOj$b8~HR>CxEgL5E!0s*0wh zRWAO91tMKX*`EwP=C1{Y*uK_5u!1kP_x=7A-5Bp^`*qIUyKOHV=80bZN2i=Nn-M^= z&^3|t-FM3^KQw;a6YM?JG`6XjWL8ZPzfh~LC@s(uT|6H!#&h*5KGAN%nXk*yDlAPoE{_eHn zx(_}~K*P9v8XM<>uRT$C;UNbiy}iObhPZ;sf5H5kgP=qwkRb5IS#ugRKkw65 z$q<;&xqIfE!k{{i+*}Os%AQmUY2e)w*3UvD&LQ>R+R&7mw!gk~xg%^pX$UhQ*nFIW zA}x{#!Pc*VKJ@WBmw^)wT;&F^R`nu_$VC-_`Z!@~xdbf;_R1~sSUI*oAs z*-8j{orJ&}(Q}C(#a`mOf?~*27@Zr!oN5*B8%NwbPb;9#SS6P-$Dq1!1%gIsv)X8Mls15MOc2-Sv}j8>C#oq9&dtUWg%Tr@_= z6mj(QC@s`+@+%g8_Gw9~bnaQq*<#L^q8HDi)`Ujbn zTu?{Q3T6mSl7OZS>&RE1*j1J(F|YdPF*C_ED`wIq#_lve+4IBieJc$=bJ_ zM58k^q>ijG!Rlu0MNNT^o4BxwTG7j*&kCO7dOunkI;{we+20cXGpa$_{dC!+X##mx zYPH|PJJK+9udBA-`?)q3sq!pLK(N9lgmu;HZdp6jEA$SJnEMvOsGj?$f=n0_IYbQ7Vr)UjAeybK$hLL zJO{xi(*4h<_uqN_O|qez3Ev3q>%bT|Sttl9eE(YA70kgjxhBTl}!5jKk6~s^JO4XWpx2vYI92!wSax&m1E^zB;ji%%y`GeRbCwr*( z+o`tBUuqQx?}h0;aE{u_>P-%tmAmA8EgH$wRk+0>%+vMtjiZyqcSRc^h?|UDZ_(0g zZqrx5(9sikU(pPmVJKS=%xnyMcv{}x9E}KLbE`K3NB6WRv$qB}n>W|Bj&sNzNx-Bc zT-RAis04Tlgu#krBXT1cFGpEOX2MLw&k`4XTQ z0RY#&9Q?P>oN;4mPt6k*P|91(0$8H2XNufHa-Q8{xX8!G+nQ2sF49WRw?-v)zlI9- z-qZUdA6~-B0t`5eez^{jzp6v7zpyOe0h+>06-Vw{;!h==xR(YK&{p8M3NS{c-6HSm zd_|69)Z0vLm}t11gY_X#Xs?8GxudGd#Y9geuTQ$P{dr0zb79$}6 z*~h))rEb;imdE&z!}+JpcBo4N$s{X0evR(}dm1_J%kIODz>I>CBkii(KuczREr(vI ztSL$xeT`cij5@Y06|;Y*bN&9Qui=hxA%8qgiQ8k2)dt4O=h!L9Jj`sAdE{UYKpa+R z#JsaOf0Z9^Vww)H_zFIl(};5Y`pe9r?zK37X-RB!vBTNG3SVzAc}Bu3&pkrJto3kP zQ{I28xH9g1NIDGxx_NtABr&&AT}JjgragAusZ@4T%I#-SZ;WT4jC)O|rJ# zntO2v^DKHE&rZI_0UI3=h+qm_W)QHO(bKza?&fxegTQ=HY=;hIDT(fGNiTYHmp#Di zV&C_dN&WW@=v>jB2r#Kx)3iS)kxiq0a6%4$q z8$-&@m9_fW014^9c5xd6uO2=2=ciA#e{~B~-XQXsf3m}Tt4X65a~@MZPzDaHNiS-I zU>oHgG{4io8WIHjk!ZMLTmFai@C;xwDanTTXTJHzArN{bp>tcHQ#sN7=r^7LsZ1nU zt1YF!oMSbGpm7U@a5cGu0QZqZyauU)d-ob43J5C0@rDI#W$nW!rM9dgq%vRnR5OK%(@%e3qTeZy zhu>NnUD)8fHPAeBOXQNvRZ79>Gt(x=a6jbgh%Vz*glS%ReH+$So5S=fv2YqGeL3Dch9(*IuSGt2+KJfilg)11+hBea<3Ak#*=_GFD>e z45gLc3WhV{Wt1~?A$m))pT94A@aHD+7m4GTAm05W^^ zg62Rml>q}AEZJHV2q9I(ZY*GAEnTzubtly?bp0o$SLjBymOItAkzB8^T|#v#DMVhg z(TaO3Ux{(RMPzaIt-lbN&&0VVs`EA&hgr>P%lB^7bM_{^(aGUM0TZTIt>HnjIXU!& zDakU#b5qg}B*ot%*^)HyNWMK!t8i!PY#n>Jt`v(>SJQs>DZOB&PW43Z7A|H+w@gF6 z_r&PNu*LNgT+$fj%ppYNb0HXx1z>H3Z}=k-NdG`X2>%S(vyKJ=jVw?f+U7nQ9IUYG z0m&rny)y(uybc-FCfLrLlS5wNj9*A*LDp{K1TE>GA0r`^M6>+5g_s-f1ry!;uE`tG zk12f%bk1gAlk+sNuz5-67M#w=k$5D28FLnY6<~8|M%SyZ0A;O;JT=RW6kgO+PQ&o# z{;gzb-$Jx3}MXxxHragw@WOgfdwRm4#uB=wN=no&Fh^7QZOh z0r$l-+~9qvH?}}p67U7slOJ67fZ>I4lKh6wC^Vvxgjq-qeBFmZG(03I%UI!IvphHT z!-g4tsW0$*O?+guKy(O+a$V4n)Km)$6~FuY@Smu+wrchh9T` z>W8eA)T3vh5QQ%RhNK*CJ013e${0*hMC!9!Wou==K4#ugpdmydU4U@#Wj1MZ2Fnn#Xqq#Z4OZ|)!|DaB1jI|R_}RWnVSio z*7zvo_WLMoymPUDb&UcFS>R2FSmW){L+!n*N(R5j?uEzCQC4qnO+VcdHYNgwQTWeq z+8pf!hReYnUeROVIM<6mN#X^puodX31xlgY_T0Og4jWnl)g zhioKWd;NW|@VIS}Q!dRa;)upcIEhbxOk|i$ANt;t-ngNFJ=#QMhNq_01=gRj2ZZP| zBMqJp#jq=5XKcFykQVU$(oEywd5%@+-`8T?&0D1emIzS|t;mj*C+aa0q4Eq#!H6}1 zkD-*VIiuD|wT!z$QDEq196Js6K~$t2HX##F3y#AE^ymV(5hjZ=0d8s)ga96iX%f%k zZSVuy6k9>v5$HzZP`>tFvBKa07yE_a&XDg@`OijzZuNG=;I6nDwFx;W$$c0glu0#w zO%>)i(~A&+lrzt!*mRBL__DYvZt;_|tNHxk54I=<_SH=w0ZRg;q35KOGY z)`{2&xPvGNopQVZ9&!EiRqIqtoF>P*?zXz@M(?bIvhB~7V{ZPl8p|XFV)ZIIPf#Te zk;uRykYa-y@Tf#kzwyg50RwLGx)+l81OfP%T-BSO*}WplNIXk%CKLXfz;GGNXCktY zmLMwoVM}`1#UT=rSFiT}N;u1aCcnRp-x~uqa`foYilovxI-~^!r7@6@mWB;UL0Uuv z87UnqEihUXBt%6J7@>4`Klktd@PgO7&wY0GJ=b-8F4)f=S1=p(EV7H#W(ik?&(^#k$B#I523W1`Keq1cc5n091R;#kVkkX`h z(DmMp(3wI2rUaX(%^_8C7=Usu9mMp6bKSrn2sUH(2rktKa9eV~zzF0m-VNvgqE{0I zSgWo|qwUd!ITC=UiZLPjej?HtNWNESgpOSX&cP4%nk7w6Dx04Wc=txKD!kiV7f|zpj7|88Ljc>{=DhVs z)%&5ePKOtL+v)dn-K{AekrG2HX^6!~zWZ8G4h(3pFa<&>6X2l-N_t4yt@$uF(aJuQVkCF1)Op z-z~lm2;gxP+yFwK^=@?0I+0%?GG7UIzLvgpptBK3Zzpw7tudpZzzT`wGFgr1!nojY z(v~1?Ag5+utbQH#hguUrf%h{5GAy8WA_)b&$Q2|gS)SnMk-9lNl?*U*l4&dO} z6rK4#UGC4{Hxtq>L7BZg0&~DvYI|bZys+9!wpoW@)4$dMx3TcUNX=Q+2>m1q9P1eu zZF-7FFc=~dje3y?jDxa|sT(z@$x*<}^!dkNa7_ESFSi#k)3SR&@OjoJ)|>f2yua(o z!tRPZte+0(Ah<<6Wum3scmXqhwmiAqQ``#-z@0+LAW650x6;4DXlWjj9OMT z12;r^egPaHPOdd9=6;yISC1x-7VnQ541DpCk6+#7&rceL`dX>a4wlR&4r?Y1nYWw< zy94aqiW_ExQ!kUOf_6r@&*xYZe&1UMwquw(Y5fC_s;X?7!=ld4_KAn14ZTz)1vK_h z2`mK7(#s2Pmd7EWWbLF8)Yvpz%82ivR&s%a68~`S)+E3L53yZl!qfCFCkZ>9%~ZUEOt& zH?<8E`jczRCWzzt<-q~yISf*b16`DFC2#vWyq+|_m}zpNknbU* zM#u4OQtZ*3AiU>8@0wDFXF9w?w91gk?ph;*jCWGHRkPsS`d+5?N?YPj5=VywAf)k~ z`V=?)cb+DAPym0o}G!;iLG zo@G*E=tSEgh-MtPQNTA86B8UWnGcXb`~{F+P`Gwob{i26{UY1Wo-( zC?@BX`tTR<3K}a2d~VTrDpay%#{y~|;G3d=kf@Pk?cfy_D@>EdomW5Q#;Ot2N?hGz z3Ze{a{vKJ$-5rC~RsM8+BL_$?3=PiQbyc->v=2}s*M%ZvAsqV(NZ9u}?B4HW+PJc77fC&6`rQs8^tz0}}b zp`z<_kg*$nF|2@H`c^$iMU~5SHUB-!RsBRm+{MO(?-z9NQwzH$EE|vF!?fA% zlc3RX7|SpQ$zVop0moF50$*Sl%Qv0|F`1NC(7t%Z1rNsxf9T`86`~384u5GF##|`h)uYTS%LQsgIZTO;d#RIMgeN;e?wA_R8^Z`4baPT@xOela3QvdS+z2id{! zx7;%4&MbWA$1bl+kuF0HsG+ZY_zu{qI=x~o4Q-+ z*;^0;#5=7aE605(I#ul5%_y+{zAz!6MG`V6YHZ0%pN0_0uqrnsaVLCb=F?0O@af|$In7Cn+hln=#g7>hU4^={9jr_NDf}vM7(Y(NBerU zjq-9{=k_T4w%;#n=*$C}tQ25p2PpF`8_#GVwqBJ)Nz*DHoaZ{ZJzdxTo|`mwF{Ug< z&AW0!ATd@lP`PZ~{Mxc;!m@P77y|!H%E5yXvVTGVN{sjcb1MMY3zse9XoL^G}Ff_<@jGc4^ST?;sM1k z!Z*~l^09w;Y?N5K8~W(>+Mb_WgYrI8wTkzR5)`4hWE%MynGT*|0Hjv|Tqhn!xRUsq z(wV}kKno0AZ#{S0#1=i?a@kw?x2bx%Q;tfrJ6X9SsdZ`jo%v#hWGd z;E4Du(T#noB?}fB8tgm622;agnfniXb#F10AkFUq=3v<6KDPvr>>ncnHXq>?AnGO# zeld)oT+gu@VR}VKNCE?1nueH5*VkYENA~JzNyLYo=63tD22|3Ravsk=uC+*v+SYjr zojP_T!<`-IlftH0ooG7e?s-CYKh{#T4X&FrEva>@JZ>{_$#yPo`C20og~frk1!#jo~d)~TATDHg_;GS#H5QOLPC95SMVRyyns}TeeMRd45j8o zJ+d(@SG=7ni0TX?jA<6@MgIXjMH5~#fbjb;uU`z1gPG#3`;P=WYI5(K`Fl?gcJ%P{ zuhrYPA80x#H69kGq0Yo!XjzAyW=7i?(Ozf_Iv!oKJEpN!JRfXVQEa`8>n<}o7P�%<{S!PfE1%(9 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 literal 0 HcmV?d00001 diff --git a/react-native/sample/android/app/src/main/res/values/strings.xml b/react-native/sample/android/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..a543a232 --- /dev/null +++ b/react-native/sample/android/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + ReactNative + Checkout + diff --git a/react-native/sample/android/app/src/main/res/values/styles.xml b/react-native/sample/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..7ba83a2a --- /dev/null +++ b/react-native/sample/android/app/src/main/res/values/styles.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/react-native/sample/android/app/src/main/res/xml/network_security_config.xml b/react-native/sample/android/app/src/main/res/xml/network_security_config.xml new file mode 100644 index 00000000..ec4e0a64 --- /dev/null +++ b/react-native/sample/android/app/src/main/res/xml/network_security_config.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/react-native/sample/android/app/src/test/java/com/shopify/checkoutkitreactnative/ShopifyCheckoutSheetKitModuleTest.java b/react-native/sample/android/app/src/test/java/com/shopify/checkoutkitreactnative/ShopifyCheckoutSheetKitModuleTest.java new file mode 100644 index 00000000..790c02dc --- /dev/null +++ b/react-native/sample/android/app/src/test/java/com/shopify/checkoutkitreactnative/ShopifyCheckoutSheetKitModuleTest.java @@ -0,0 +1,743 @@ +package com.shopify.checkoutkitreactnative; + +import androidx.activity.ComponentActivity; + +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.JavaOnlyMap; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.WritableMap; +import com.facebook.react.modules.core.DeviceEventManagerModule; +import com.shopify.checkoutsheetkit.CheckoutException; +import com.shopify.checkoutsheetkit.CheckoutExpiredException; +import com.shopify.checkoutsheetkit.CheckoutSheetKitException; +import com.shopify.checkoutsheetkit.ClientException; +import com.shopify.checkoutsheetkit.ConfigurationException; +import com.shopify.checkoutsheetkit.HttpException; +import com.shopify.checkoutsheetkit.ShopifyCheckoutSheetKit; +import com.shopify.checkoutsheetkit.Preloading; +import com.shopify.checkoutsheetkit.ColorScheme; +import com.shopify.checkoutsheetkit.LogLevel; +import com.shopify.checkoutsheetkit.pixelevents.PixelEvent; +import com.shopify.checkoutsheetkit.pixelevents.StandardPixelEvent; +import com.shopify.checkoutsheetkit.pixelevents.CustomPixelEvent; +import com.shopify.checkoutsheetkit.pixelevents.EventType; +import com.shopify.checkoutsheetkit.lifecycleevents.CheckoutCompletedEvent; +import com.shopify.checkoutsheetkit.lifecycleevents.OrderDetails; +import com.shopify.checkoutsheetkit.lifecycleevents.CartInfo; +import com.shopify.checkoutsheetkit.lifecycleevents.Price; +import com.shopify.reactnative.checkoutsheetkit.ShopifyCheckoutSheetKitModule; +import com.shopify.reactnative.checkoutsheetkit.CustomCheckoutEventProcessor; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; + +import android.content.Context; + +import java.util.ArrayList; +import java.util.List; + +@RunWith(MockitoJUnitRunner.class) +public class ShopifyCheckoutSheetKitModuleTest { + @Mock + private ReactApplicationContext mockReactContext; + @Mock + private ComponentActivity mockComponentActivity; + @Mock + private DeviceEventManagerModule.RCTDeviceEventEmitter mockEventEmitter; + @Mock + private Context mockContext; + + @Captor + ArgumentCaptor runnableCaptor; + @Captor + private ArgumentCaptor stringCaptor; + + private ShopifyCheckoutSheetKitModule shopifyCheckoutSheetKitModule; + + // Store initial configuration to restore after each test + private Preloading initialPreloading; + private ColorScheme initialColorScheme; + private LogLevel initialLogLevel; + + // Mock for Arguments.createMap() to avoid native library loading + private MockedStatic mockedArguments; + + // Test constants for color configuration + private static final String BACKGROUND_COLOR = "#FFFFFF"; + private static final String PROGRESS_INDICATOR = "#000000"; + private static final String HEADER_BACKGROUND_COLOR = "#FFFFFF"; + private static final String HEADER_TEXT_COLOR = "#000000"; + + // Dark theme colors + private static final String DARK_BACKGROUND_COLOR = "#000000"; + private static final String DARK_PROGRESS_INDICATOR = "#FFFFFF"; + private static final String DARK_HEADER_BACKGROUND_COLOR = "#000000"; + private static final String DARK_HEADER_TEXT_COLOR = "#FFFFFF"; + + @Before + public void setup() { + mockedArguments = Mockito.mockStatic(Arguments.class); + mockedArguments.when(Arguments::createMap).thenAnswer(invocation -> new JavaOnlyMap()); + + when(mockReactContext.getCurrentActivity()).thenReturn(mockComponentActivity); + when(mockReactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)) + .thenReturn(mockEventEmitter); + shopifyCheckoutSheetKitModule = new ShopifyCheckoutSheetKitModule(mockReactContext); + + // Capture initial configuration state to restore after each test + initialPreloading = ShopifyCheckoutSheetKitModule.checkoutConfig.getPreloading(); + initialColorScheme = ShopifyCheckoutSheetKitModule.checkoutConfig.getColorScheme(); + initialLogLevel = ShopifyCheckoutSheetKitModule.checkoutConfig.getLogLevel(); + } + + @After + public void tearDown() { + // Close mocked static + if (mockedArguments != null) { + mockedArguments.close(); + } + + // Reset configuration to initial state after each test + ShopifyCheckoutSheetKit.configure(configuration -> { + configuration.setPreloading(initialPreloading); + configuration.setColorScheme(initialColorScheme); + configuration.setLogLevel(initialLogLevel); + ShopifyCheckoutSheetKitModule.checkoutConfig = configuration; + }); + } + + /** + * Core Methods + */ + + @Test + public void testCanPresentCheckout() { + try (MockedStatic mockedShopifyCheckoutSheetKit = Mockito + .mockStatic(ShopifyCheckoutSheetKit.class)) { + String checkoutUrl = "https://shopify.com"; + shopifyCheckoutSheetKitModule.present(checkoutUrl); + + verify(mockComponentActivity).runOnUiThread(runnableCaptor.capture()); + runnableCaptor.getValue().run(); + + mockedShopifyCheckoutSheetKit.verify(() -> { + ShopifyCheckoutSheetKit.present(eq(checkoutUrl), any(), any()); + }); + } + } + + @Test + public void testCanPreloadCheckout() { + try (MockedStatic mockedShopifyCheckoutSheetKit = Mockito + .mockStatic(ShopifyCheckoutSheetKit.class)) { + String checkoutUrl = "https://shopify.com"; + shopifyCheckoutSheetKitModule.preload(checkoutUrl); + + mockedShopifyCheckoutSheetKit.verify(() -> { + ShopifyCheckoutSheetKit.preload(eq(checkoutUrl), any()); + }); + } + } + + /** + * Module name and version + */ + + @Test + public void testModuleName() { + assertThat(shopifyCheckoutSheetKitModule.getName()) + .isEqualTo("ShopifyCheckoutSheetKit"); + } + + @Test + public void testConstants() { + assertThat(shopifyCheckoutSheetKitModule.getConstants()) + .isNotNull() + .containsKey("version"); + } + + /** + * Configuration + */ + + @Test + public void testHasCorrectDefaultConfiguration() { + // Test that the module starts with sensible defaults + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getPreloading().getEnabled()) + .isTrue(); + + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getColorScheme().getId()) + .isEqualTo("automatic"); + } + + @Test + public void testCanDisablePreloading() { + JavaOnlyMap config = new JavaOnlyMap(); + config.putBoolean("preloading", false); + + shopifyCheckoutSheetKitModule.setConfig(config); + + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getPreloading().getEnabled()) + .isFalse(); + } + + @Test + public void testCanSetDarkColorScheme() { + JavaOnlyMap config = new JavaOnlyMap(); + config.putString("colorScheme", "dark"); + + shopifyCheckoutSheetKitModule.setConfig(config); + + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getColorScheme().getId()) + .isEqualTo("dark"); + } + + @Test + public void testCanConfigureLightColorSchemeWithValidColors() { + JavaOnlyMap androidColors = createValidLightColors(); + JavaOnlyMap config = createConfigWithAndroidColors("light", androidColors); + + shopifyCheckoutSheetKitModule.setConfig(config); + + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getColorScheme().getId()) + .isEqualTo("light"); + } + + @Test + public void testCanConfigureDarkColorSchemeWithValidColors() { + JavaOnlyMap androidColors = createValidDarkColors(); + JavaOnlyMap config = createConfigWithAndroidColors("dark", androidColors); + + shopifyCheckoutSheetKitModule.setConfig(config); + + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getColorScheme().getId()) + .isEqualTo("dark"); + } + + @Test + public void testCanConfigureAutomaticColorSchemeWithLightAndDarkColors() { + JavaOnlyMap lightColors = createValidLightColors(); + JavaOnlyMap darkColors = createValidDarkColors(); + + JavaOnlyMap androidColors = new JavaOnlyMap(); + androidColors.putMap("light", lightColors); + androidColors.putMap("dark", darkColors); + + JavaOnlyMap colorsConfig = new JavaOnlyMap(); + colorsConfig.putMap("android", androidColors); + + JavaOnlyMap config = new JavaOnlyMap(); + config.putString("colorScheme", "automatic"); + config.putMap("colors", colorsConfig); + + shopifyCheckoutSheetKitModule.setConfig(config); + + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getColorScheme().getId()) + .isEqualTo("automatic"); + } + + @Test + public void testInvalidColorConfigurationFallsBackToBasicScheme() { + JavaOnlyMap androidColors = new JavaOnlyMap(); + androidColors.putString("backgroundColor", "invalid-color"); + androidColors.putString("progressIndicator", PROGRESS_INDICATOR); + androidColors.putString("headerBackgroundColor", HEADER_BACKGROUND_COLOR); + androidColors.putString("headerTextColor", HEADER_TEXT_COLOR); + + JavaOnlyMap config = createConfigWithAndroidColors("light", androidColors); + + // Should not throw exception + shopifyCheckoutSheetKitModule.setConfig(config); + + // Should fall back to basic light scheme without custom colors + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getColorScheme().getId()) + .isEqualTo("light"); + } + + @Test + public void testPartialColorConfigurationIsRejected() { + JavaOnlyMap androidColors = new JavaOnlyMap(); + androidColors.putString("backgroundColor", BACKGROUND_COLOR); + // Missing other required colors + + JavaOnlyMap config = createConfigWithAndroidColors("light", androidColors); + + shopifyCheckoutSheetKitModule.setConfig(config); + + // Should fall back to basic scheme since colors are incomplete + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getColorScheme().getId()) + .isEqualTo("light"); + } + + @Test + public void testCanSetConfigWithCloseButtonColor() { + JavaOnlyMap androidColors = createValidLightColors(); + androidColors.putString("closeButtonColor", "#FF0000"); + + JavaOnlyMap config = createConfigWithAndroidColors("light", androidColors); + + shopifyCheckoutSheetKitModule.setConfig(config); + + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getColorScheme().getId()) + .isEqualTo("light"); + } + + @Test + public void testCanSetConfigWithMissingCloseButtonColor() { + // Missing closeButtonColor - should not crash + JavaOnlyMap androidColors = createValidLightColors(); + JavaOnlyMap config = createConfigWithAndroidColors("light", androidColors); + + shopifyCheckoutSheetKitModule.setConfig(config); + + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getColorScheme().getId()) + .isEqualTo("light"); + } + + @Test + public void testCanSetConfigWithInvalidCloseButtonColor() { + JavaOnlyMap androidColors = createValidLightColors(); + androidColors.putString("closeButtonColor", "invalid-color"); + JavaOnlyMap config = createConfigWithAndroidColors("light", androidColors); + + // The method should not throw an exception when given invalid close button + // color + shopifyCheckoutSheetKitModule.setConfig(config); + + // Verify the color scheme was set correctly despite invalid close button color + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getColorScheme().getId()) + .isEqualTo("light"); + } + + /** + * Log Level Configuration + */ + + @Test + public void testCanSetLogLevelDebug() { + JavaOnlyMap config = new JavaOnlyMap(); + config.putString("logLevel", "debug"); + + shopifyCheckoutSheetKitModule.setConfig(config); + + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getLogLevel()) + .isEqualTo(LogLevel.DEBUG); + } + + @Test + public void testCanSetLogLevelError() { + JavaOnlyMap config = new JavaOnlyMap(); + config.putString("logLevel", "error"); + + shopifyCheckoutSheetKitModule.setConfig(config); + + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getLogLevel()) + .isEqualTo(LogLevel.ERROR); + } + + @Test + public void testCanSetLogLevelNone() { + JavaOnlyMap config = new JavaOnlyMap(); + config.putString("logLevel", "none"); + + shopifyCheckoutSheetKitModule.setConfig(config); + + // "none" maps to ERROR on Android (closest equivalent) + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getLogLevel()) + .isEqualTo(LogLevel.ERROR); + } + + @Test + public void testInvalidLogLevelDefaultsToError() { + JavaOnlyMap config = new JavaOnlyMap(); + config.putString("logLevel", "invalid"); + + shopifyCheckoutSheetKitModule.setConfig(config); + + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getLogLevel()) + .isEqualTo(LogLevel.ERROR); + } + + @Test + public void testLogLevelHandlesUppercaseDebug() { + JavaOnlyMap config = new JavaOnlyMap(); + config.putString("logLevel", "DEBUG"); + + shopifyCheckoutSheetKitModule.setConfig(config); + + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getLogLevel()) + .isEqualTo(LogLevel.DEBUG); + } + + @Test + public void testLogLevelHandlesMixedCaseDebug() { + JavaOnlyMap config = new JavaOnlyMap(); + config.putString("logLevel", "Debug"); + + shopifyCheckoutSheetKitModule.setConfig(config); + + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getLogLevel()) + .isEqualTo(LogLevel.DEBUG); + } + + @Test + public void testLogLevelHandlesUppercaseError() { + JavaOnlyMap config = new JavaOnlyMap(); + config.putString("logLevel", "ERROR"); + + shopifyCheckoutSheetKitModule.setConfig(config); + + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getLogLevel()) + .isEqualTo(LogLevel.ERROR); + } + + @Test + public void testSetConfigWithoutLogLevelDefaultsToError() { + JavaOnlyMap config = new JavaOnlyMap(); + config.putBoolean("preloading", true); + + shopifyCheckoutSheetKitModule.setConfig(config); + + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getLogLevel()) + .isEqualTo(LogLevel.ERROR); + } + + @Test + public void testGetConfigReturnsDebugForDebugLogLevel() { + JavaOnlyMap config = new JavaOnlyMap(); + config.putString("logLevel", "debug"); + + shopifyCheckoutSheetKitModule.setConfig(config); + + PromiseMock promise = new PromiseMock(); + shopifyCheckoutSheetKitModule.getConfig(promise); + + assertThat(promise.resolvedValue).isNotNull(); + JavaOnlyMap result = (JavaOnlyMap) promise.resolvedValue; + assertThat(result.getString("logLevel")).isEqualTo("debug"); + } + + @Test + public void testGetConfigReturnsErrorForErrorLogLevel() { + JavaOnlyMap config = new JavaOnlyMap(); + config.putString("logLevel", "error"); + + shopifyCheckoutSheetKitModule.setConfig(config); + + PromiseMock promise = new PromiseMock(); + shopifyCheckoutSheetKitModule.getConfig(promise); + + assertThat(promise.resolvedValue).isNotNull(); + JavaOnlyMap result = (JavaOnlyMap) promise.resolvedValue; + assertThat(result.getString("logLevel")).isEqualTo("error"); + } + + @Test + public void testGetConfigReturnsErrorForNoneLogLevel() { + JavaOnlyMap config = new JavaOnlyMap(); + config.putString("logLevel", "none"); + + shopifyCheckoutSheetKitModule.setConfig(config); + + PromiseMock promise = new PromiseMock(); + shopifyCheckoutSheetKitModule.getConfig(promise); + + assertThat(promise.resolvedValue).isNotNull(); + JavaOnlyMap result = (JavaOnlyMap) promise.resolvedValue; + assertThat(result.getString("logLevel")).isEqualTo("error"); + } + + @Test + public void testGetConfigReturnsErrorForInvalidLogLevel() { + JavaOnlyMap config = new JavaOnlyMap(); + config.putString("logLevel", "invalid"); + + shopifyCheckoutSheetKitModule.setConfig(config); + + PromiseMock promise = new PromiseMock(); + shopifyCheckoutSheetKitModule.getConfig(promise); + + assertThat(promise.resolvedValue).isNotNull(); + JavaOnlyMap result = (JavaOnlyMap) promise.resolvedValue; + assertThat(result.getString("logLevel")).isEqualTo("error"); + } + + @Test + public void testGetConfigReturnsDefaultLogLevel() { + PromiseMock promise = new PromiseMock(); + shopifyCheckoutSheetKitModule.getConfig(promise); + + assertThat(promise.resolvedValue).isNotNull(); + JavaOnlyMap result = (JavaOnlyMap) promise.resolvedValue; + assertThat(result.getString("logLevel")).isEqualTo("error"); + } + + /** + * Events + */ + + @Test + public void testCanProcessStandardPixelEvents() { + CustomCheckoutEventProcessor processor = new CustomCheckoutEventProcessor(mockContext, mockReactContext); + + PixelEvent standardEvent = new StandardPixelEvent( + "test-id", + "page_viewed", + "2023-01-01T00:00:00Z", + EventType.STANDARD, + null, + null); + + processor.onWebPixelEvent(standardEvent); + + verify(mockEventEmitter).emit(eq("pixel"), stringCaptor.capture()); + + assertThat(stringCaptor.getValue()) + .contains("test-id", "page_viewed", "STANDARD"); + } + + @Test + public void testCanProcessCustomPixelEvents() { + CustomCheckoutEventProcessor processor = new CustomCheckoutEventProcessor(mockContext, mockReactContext); + + PixelEvent customEvent = new CustomPixelEvent( + "custom-id", + "custom_event", + "2023-01-01T00:00:00Z", + EventType.CUSTOM, + null, + "{\"customAttribute\":\"value\"}"); + + processor.onWebPixelEvent(customEvent); + + verify(mockEventEmitter).emit(eq("pixel"), stringCaptor.capture()); + + assertThat(stringCaptor.getValue()) + .contains("custom-id", "custom_event", "CUSTOM", "customAttribute"); + } + + @Test + public void testCanProcessCheckoutCompletedEvents() { + CustomCheckoutEventProcessor processor = new CustomCheckoutEventProcessor(mockContext, mockReactContext); + + CartInfo cartInfo = new CartInfo(new ArrayList<>(), new Price(), "cart-token"); + OrderDetails orderDetails = new OrderDetails( + null, // billingAddress + cartInfo, + new ArrayList<>(), // deliveries + "test@example.com", // email + "order-123", // id + new ArrayList<>(), // paymentMethods + "+1234567890" // phone + ); + + CheckoutCompletedEvent completedEvent = new CheckoutCompletedEvent(orderDetails); + + processor.onCheckoutCompleted(completedEvent); + + verify(mockEventEmitter).emit(eq("completed"), stringCaptor.capture()); + + assertThat(stringCaptor.getValue()) + .contains("order-123", "test@example.com", "cart-token"); + } + + /** + * Errors + */ + + @Test + public void testCanProcessCheckoutExpiredErrors() { + CustomCheckoutEventProcessor processor = new CustomCheckoutEventProcessor(mockContext, mockReactContext); + + // Use minimal mocking - just enough to test the processing logic + CheckoutExpiredException mockException = mock(CheckoutExpiredException.class); + when(mockException.getErrorDescription()).thenReturn("Cart has expired"); + when(mockException.getErrorCode()).thenReturn("cart_expired"); + when(mockException.isRecoverable()).thenReturn(false); + + processor.onCheckoutFailed(mockException); + + verify(mockEventEmitter).emit(eq("error"), stringCaptor.capture()); + + assertThat(stringCaptor.getValue()) + .contains("CheckoutExpiredError", "Cart has expired", "cart_expired", "\"recoverable\":false"); + } + + @Test + public void testCanProcessClientErrors() { + CustomCheckoutEventProcessor processor = new CustomCheckoutEventProcessor(mockContext, mockReactContext); + + ClientException mockException = mock(ClientException.class); + when(mockException.getErrorDescription()).thenReturn("Customer account required"); + when(mockException.getErrorCode()).thenReturn("customer_account_required"); + when(mockException.isRecoverable()).thenReturn(true); + + processor.onCheckoutFailed(mockException); + + verify(mockEventEmitter).emit(eq("error"), stringCaptor.capture()); + + assertThat(stringCaptor.getValue()) + .contains("CheckoutClientError", "Customer account required", "customer_account_required", + "\"recoverable\":true"); + } + + @Test + public void testCanProcessHttpErrors() { + CustomCheckoutEventProcessor processor = new CustomCheckoutEventProcessor(mockContext, mockReactContext); + + HttpException mockException = mock(HttpException.class); + when(mockException.getErrorDescription()).thenReturn("Not Found"); + when(mockException.getErrorCode()).thenReturn("http_error"); + when(mockException.isRecoverable()).thenReturn(false); + when(mockException.getStatusCode()).thenReturn(404); + + processor.onCheckoutFailed(mockException); + + verify(mockEventEmitter).emit(eq("error"), stringCaptor.capture()); + + assertThat(stringCaptor.getValue()) + .contains("CheckoutHTTPError", "Not Found", "http_error", "\"statusCode\":404", "\"recoverable\":false"); + } + + /** + * Integration + */ + + @Test + public void testCompleteConfigurationAndEventFlow() { + // Set up configuration + JavaOnlyMap config = new JavaOnlyMap(); + config.putBoolean("preloading", true); + config.putString("colorScheme", "dark"); + + shopifyCheckoutSheetKitModule.setConfig(config); + + // Verify configuration was applied + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getPreloading().getEnabled()) + .isTrue(); + assertThat(ShopifyCheckoutSheetKitModule.checkoutConfig.getColorScheme().getId()) + .isEqualTo("dark"); + + // Test event processing with the configured module + CustomCheckoutEventProcessor processor = new CustomCheckoutEventProcessor(mockContext, mockReactContext); + + PixelEvent event = new StandardPixelEvent("test", "page_viewed", "timestamp", EventType.STANDARD, null, null); + processor.onWebPixelEvent(event); + + verify(mockEventEmitter).emit(eq("pixel"), any(String.class)); + } + + /** + * Helpers + */ + + private JavaOnlyMap createValidLightColors() { + JavaOnlyMap colors = new JavaOnlyMap(); + colors.putString("backgroundColor", BACKGROUND_COLOR); + colors.putString("progressIndicator", PROGRESS_INDICATOR); + colors.putString("headerBackgroundColor", HEADER_BACKGROUND_COLOR); + colors.putString("headerTextColor", HEADER_TEXT_COLOR); + return colors; + } + + private JavaOnlyMap createValidDarkColors() { + JavaOnlyMap colors = new JavaOnlyMap(); + colors.putString("backgroundColor", DARK_BACKGROUND_COLOR); + colors.putString("progressIndicator", DARK_PROGRESS_INDICATOR); + colors.putString("headerBackgroundColor", DARK_HEADER_BACKGROUND_COLOR); + colors.putString("headerTextColor", DARK_HEADER_TEXT_COLOR); + return colors; + } + + private JavaOnlyMap createConfigWithAndroidColors(String colorScheme, JavaOnlyMap androidColors) { + JavaOnlyMap colorsConfig = new JavaOnlyMap(); + colorsConfig.putMap("android", androidColors); + + JavaOnlyMap config = new JavaOnlyMap(); + config.putString("colorScheme", colorScheme); + config.putMap("colors", colorsConfig); + return config; + } + + private static class PromiseMock implements Promise { + public Object resolvedValue; + public String rejectedCode; + public String rejectedMessage; + public Throwable rejectedThrowable; + + @Override + public void resolve(Object value) { + resolvedValue = value; + } + + @Override + public void reject(String code, String message) { + rejectedCode = code; + rejectedMessage = message; + } + + @Override + public void reject(String code, Throwable throwable) { + rejectedCode = code; + rejectedThrowable = throwable; + } + + @Override + public void reject(String code, String message, Throwable throwable) { + rejectedCode = code; + rejectedMessage = message; + rejectedThrowable = throwable; + } + + @Override + public void reject(Throwable throwable) { + rejectedThrowable = throwable; + } + + @Override + public void reject(Throwable throwable, WritableMap userInfo) { + rejectedThrowable = throwable; + } + + @Override + public void reject(String code, WritableMap userInfo) { + rejectedCode = code; + } + + @Override + public void reject(String code, Throwable throwable, WritableMap userInfo) { + rejectedCode = code; + rejectedThrowable = throwable; + } + + @Override + public void reject(String code, String message, WritableMap userInfo) { + rejectedCode = code; + rejectedMessage = message; + } + + @Override + public void reject(String code, String message, Throwable throwable, WritableMap userInfo) { + rejectedCode = code; + rejectedMessage = message; + rejectedThrowable = throwable; + } + + @Override + public void reject(String message) { + rejectedMessage = message; + } + } +} diff --git a/react-native/sample/android/build.gradle b/react-native/sample/android/build.gradle new file mode 100644 index 00000000..d895aa1d --- /dev/null +++ b/react-native/sample/android/build.gradle @@ -0,0 +1,38 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + ext { + buildToolsVersion = "35.0.0" + minSdkVersion = 24 + compileSdkVersion = 36 + targetSdkVersion = 35 + ndkVersion = "27.1.12297006" + kotlinVersion = "2.1.20" + } + repositories { + google() + mavenCentral() + } + dependencies { + classpath("com.android.tools.build:gradle:8.6.0") + classpath("com.facebook.react:react-native-gradle-plugin") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") + } +} + +def loadProperties() { + def props = new Properties() + file('../.env').withInputStream { + props.load(it) + } + return props +} + +apply plugin: "com.facebook.react.rootproject" + +// Configure memory for forked test JVMs to avoid OOMs in CI +subprojects { + tasks.withType(Test).configureEach { + maxHeapSize = "1536m" + jvmArgs "-XX:MaxMetaspaceSize=512m" + } +} diff --git a/react-native/sample/android/gradle.properties b/react-native/sample/android/gradle.properties new file mode 100644 index 00000000..fcae32ff --- /dev/null +++ b/react-native/sample/android/gradle.properties @@ -0,0 +1,44 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# IMPORTANT: This config applies ONLY to the Gradle daemon (local development). +# CI runs tests with `--no-daemon`, so this setting is IGNORED in CI. +# CI memory is configured in `.github/workflows/ci.yml` (GRADLE_OPTS) and +# forked test JVM memory is configured in `sample/android/build.gradle` (Test tasks). +org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m + + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true + +# Use this property to specify which architecture you want to build. +# You can also override it from the CLI using +# ./gradlew -PreactNativeArchitectures=x86_64 +reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 + +# Use this property to enable support to the new architecture. +# This will allow you to use TurboModules and the Fabric render in +# your application. You should enable this flag either if you want +# to write custom TurboModules/Fabric components OR use libraries that +# are providing them. +newArchEnabled=true + +# Use this property to enable or disable the Hermes JS engine. +# If set to false, you will be using JSC instead. +hermesEnabled=true + +# Note: only used here for testing +SHOPIFY_CHECKOUT_SDK_VERSION=3.5.3 diff --git a/react-native/sample/android/gradle/wrapper/gradle-wrapper.jar b/react-native/sample/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..1b33c55baabb587c669f562ae36f953de2481846 GIT binary patch literal 43764 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 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH="\\\"\\\"" + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/react-native/sample/android/gradlew.bat b/react-native/sample/android/gradlew.bat new file mode 100644 index 00000000..dd2b8eed --- /dev/null +++ b/react-native/sample/android/gradlew.bat @@ -0,0 +1,99 @@ +@REM Copyright (c) Meta Platforms, Inc. and affiliates. +@REM +@REM This source code is licensed under the MIT license found in the +@REM LICENSE file in the root directory of this source tree. + +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH= + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/react-native/sample/android/settings.gradle b/react-native/sample/android/settings.gradle new file mode 100644 index 00000000..4d29763b --- /dev/null +++ b/react-native/sample/android/settings.gradle @@ -0,0 +1,43 @@ +pluginManagement { + repositories { + gradlePluginPortal() + google() + mavenCentral() + } + includeBuild("../../node_modules/@react-native/gradle-plugin") +} +plugins { id("com.facebook.react.settings") } +extensions.configure(com.facebook.react.ReactSettingsExtension) { ex -> + ex.autolinkLibrariesFromCommand( + ["pnpm", "exec", "react-native", "config"], + file(".."), + files("../package.json", "../react-native.config.js", "../../package.json", "../../pnpm-lock.yaml") + ) +} + +rootProject.name = 'ReactNative' + +include ':app' +include ':react-native-config' + +includeBuild('../../node_modules/@react-native/gradle-plugin') + +def resolveNodeModuleDir(String packageName) { + def workspaceRoot = new File(rootProject.projectDir, "../..").canonicalFile + def process = [ + "node", + "--print", + "require.resolve('${packageName}/package.json', { paths: [process.argv[1], process.argv[2]] })", + workspaceRoot.getAbsolutePath(), + rootProject.projectDir.getAbsolutePath() + ].execute(null, rootProject.projectDir) + def output = new StringBuffer() + def error = new StringBuffer() + process.consumeProcessOutput(output, error) + if (process.waitFor() != 0) { + throw new GradleException("Failed to resolve ${packageName}: ${error}") + } + return new File(output.toString().trim()).parentFile +} + +project(':react-native-config').projectDir = new File(resolveNodeModuleDir('react-native-config'), 'android') diff --git a/react-native/sample/app.json b/react-native/sample/app.json new file mode 100644 index 00000000..8782677f --- /dev/null +++ b/react-native/sample/app.json @@ -0,0 +1,4 @@ +{ + "name": "ReactNative", + "displayName": "Shopify Checkout" +} diff --git a/react-native/sample/babel.config.js b/react-native/sample/babel.config.js new file mode 100644 index 00000000..f7b3da3b --- /dev/null +++ b/react-native/sample/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ['module:@react-native/babel-preset'], +}; diff --git a/react-native/sample/index.js b/react-native/sample/index.js new file mode 100644 index 00000000..ea6ad53d --- /dev/null +++ b/react-native/sample/index.js @@ -0,0 +1,42 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +import {install} from 'react-native-quick-crypto'; +install(); + +import 'setimmediate'; +import 'react-native-gesture-handler'; + +import SampleApp from './src/App'; +import {name} from './app.json'; +import {AppRegistry, LogBox} from 'react-native'; + +/** + * Suppress the RCTImageView topError warning + * This is a known React Native issue that doesn't affect functionality + */ +LogBox.ignoreLogs([ + "Component 'RCTImageView' re-registered bubbling event 'topError' as a direct event", +]); + +AppRegistry.registerComponent(name, () => SampleApp); diff --git a/react-native/sample/ios/.xcode.env b/react-native/sample/ios/.xcode.env new file mode 100644 index 00000000..3d5782c7 --- /dev/null +++ b/react-native/sample/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/react-native/sample/ios/AppDelegate.swift b/react-native/sample/ios/AppDelegate.swift new file mode 100644 index 00000000..331d8544 --- /dev/null +++ b/react-native/sample/ios/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: "ReactNative", + 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/react-native/sample/ios/Podfile b/react-native/sample/ios/Podfile new file mode 100644 index 00000000..3911a0bf --- /dev/null +++ b/react-native/sample/ios/Podfile @@ -0,0 +1,46 @@ +# Resolve react_native_pods.rb with node to allow for hoisting +require Pod::Executable.execute_command('node', ['-p', + 'require.resolve( + "react-native/scripts/react_native_pods.rb", + {paths: [process.argv[1]]}, + )', __dir__]).strip + +platform :ios, '16.6' + +prepare_react_native_project! + +# Suppress warnings in dependencies when building the sample app +inhibit_all_warnings! + +linkage = ENV['USE_FRAMEWORKS'] +if linkage != nil + Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green + use_frameworks! :linkage => linkage.to_sym +end + +target 'ReactNative' do + config = use_native_modules! + + pod "RNShopifyCheckoutSheetKit", :path => "../../modules/@shopify/checkout-sheet-kit" + + use_react_native!( + :path => config[:reactNativePath], + # An absolute path to your application root. + :app_path => "#{Pod::Config.instance.installation_root}/..", + :new_arch_enabled => true + ) + + target 'ReactNativeTests' do + inherit! :search_paths + end + + post_install do |installer| + # https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202 + react_native_post_install( + installer, + config[:reactNativePath], + :mac_catalyst_enabled => false, + :ccache_enabled => false + ) + end +end diff --git a/react-native/sample/ios/Podfile.lock b/react-native/sample/ios/Podfile.lock new file mode 100644 index 00000000..742b336c --- /dev/null +++ b/react-native/sample/ios/Podfile.lock @@ -0,0 +1,3007 @@ +PODS: + - boost (1.84.0) + - DoubleConversion (1.1.6) + - fast_float (8.0.0) + - FBLazyVector (0.80.2) + - fmt (11.0.2) + - glog (0.3.5) + - hermes-engine (0.80.2): + - hermes-engine/Pre-built (= 0.80.2) + - hermes-engine/Pre-built (0.80.2) + - NitroModules (0.33.9): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-callinvoker + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - QuickCrypto (1.0.9): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - NitroModules + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-callinvoker + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RCT-Folly (2024.11.18.00): + - boost + - DoubleConversion + - fast_float (= 8.0.0) + - fmt (= 11.0.2) + - glog + - RCT-Folly/Default (= 2024.11.18.00) + - RCT-Folly/Default (2024.11.18.00): + - boost + - DoubleConversion + - fast_float (= 8.0.0) + - fmt (= 11.0.2) + - glog + - RCT-Folly/Fabric (2024.11.18.00): + - boost + - DoubleConversion + - fast_float (= 8.0.0) + - fmt (= 11.0.2) + - glog + - RCTDeprecation (0.80.2) + - RCTRequired (0.80.2) + - RCTTypeSafety (0.80.2): + - FBLazyVector (= 0.80.2) + - RCTRequired (= 0.80.2) + - React-Core (= 0.80.2) + - React (0.80.2): + - React-Core (= 0.80.2) + - React-Core/DevSupport (= 0.80.2) + - React-Core/RCTWebSocket (= 0.80.2) + - React-RCTActionSheet (= 0.80.2) + - React-RCTAnimation (= 0.80.2) + - React-RCTBlob (= 0.80.2) + - React-RCTImage (= 0.80.2) + - React-RCTLinking (= 0.80.2) + - React-RCTNetwork (= 0.80.2) + - React-RCTSettings (= 0.80.2) + - React-RCTText (= 0.80.2) + - React-RCTVibration (= 0.80.2) + - React-callinvoker (0.80.2) + - React-Core (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default (= 0.80.2) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/CoreModulesHeaders (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/Default (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/DevSupport (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default (= 0.80.2) + - React-Core/RCTWebSocket (= 0.80.2) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTActionSheetHeaders (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTAnimationHeaders (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTBlobHeaders (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTImageHeaders (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTLinkingHeaders (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTNetworkHeaders (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTSettingsHeaders (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTTextHeaders (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTVibrationHeaders (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTWebSocket (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default (= 0.80.2) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-CoreModules (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety (= 0.80.2) + - React-Core/CoreModulesHeaders (= 0.80.2) + - React-jsi (= 0.80.2) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-NativeModulesApple + - React-RCTBlob + - React-RCTFBReactNativeSpec + - React-RCTImage (= 0.80.2) + - ReactCommon + - SocketRocket + - React-cxxreact (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker (= 0.80.2) + - React-debug (= 0.80.2) + - React-jsi (= 0.80.2) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-logger (= 0.80.2) + - React-perflogger (= 0.80.2) + - React-runtimeexecutor (= 0.80.2) + - React-timing (= 0.80.2) + - SocketRocket + - React-debug (0.80.2) + - React-defaultsnativemodule (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-domnativemodule + - React-featureflagsnativemodule + - React-hermes + - React-idlecallbacksnativemodule + - React-jsi + - React-jsiexecutor + - React-microtasksnativemodule + - React-RCTFBReactNativeSpec + - SocketRocket + - React-domnativemodule (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Fabric + - React-FabricComponents + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-Fabric (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/animations (= 0.80.2) + - React-Fabric/attributedstring (= 0.80.2) + - React-Fabric/componentregistry (= 0.80.2) + - React-Fabric/componentregistrynative (= 0.80.2) + - React-Fabric/components (= 0.80.2) + - React-Fabric/consistency (= 0.80.2) + - React-Fabric/core (= 0.80.2) + - React-Fabric/dom (= 0.80.2) + - React-Fabric/imagemanager (= 0.80.2) + - React-Fabric/leakchecker (= 0.80.2) + - React-Fabric/mounting (= 0.80.2) + - React-Fabric/observers (= 0.80.2) + - React-Fabric/scheduler (= 0.80.2) + - React-Fabric/telemetry (= 0.80.2) + - React-Fabric/templateprocessor (= 0.80.2) + - React-Fabric/uimanager (= 0.80.2) + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/animations (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/attributedstring (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/componentregistry (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/componentregistrynative (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/components/legacyviewmanagerinterop (= 0.80.2) + - React-Fabric/components/root (= 0.80.2) + - React-Fabric/components/scrollview (= 0.80.2) + - React-Fabric/components/view (= 0.80.2) + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components/legacyviewmanagerinterop (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components/root (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components/scrollview (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components/view (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-renderercss + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-Fabric/consistency (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/core (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/dom (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/imagemanager (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/leakchecker (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/mounting (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/observers (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events (= 0.80.2) + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/observers/events (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/scheduler (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-performancetimeline + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/telemetry (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/templateprocessor (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/uimanager (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/uimanager/consistency (= 0.80.2) + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/uimanager/consistency (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-FabricComponents (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components (= 0.80.2) + - React-FabricComponents/textlayoutmanager (= 0.80.2) + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components/inputaccessory (= 0.80.2) + - React-FabricComponents/components/iostextinput (= 0.80.2) + - React-FabricComponents/components/modal (= 0.80.2) + - React-FabricComponents/components/rncore (= 0.80.2) + - React-FabricComponents/components/safeareaview (= 0.80.2) + - React-FabricComponents/components/scrollview (= 0.80.2) + - React-FabricComponents/components/text (= 0.80.2) + - React-FabricComponents/components/textinput (= 0.80.2) + - React-FabricComponents/components/unimplementedview (= 0.80.2) + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/inputaccessory (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/iostextinput (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/modal (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/rncore (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/safeareaview (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/scrollview (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/text (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/textinput (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/unimplementedview (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/textlayoutmanager (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricImage (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired (= 0.80.2) + - RCTTypeSafety (= 0.80.2) + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-jsiexecutor (= 0.80.2) + - React-logger + - React-rendererdebug + - React-utils + - ReactCommon + - SocketRocket + - Yoga + - React-featureflags (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-featureflagsnativemodule (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - ReactCommon/turbomodule/core + - SocketRocket + - React-graphics (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-hermes + - React-jsi + - React-jsiexecutor + - React-utils + - SocketRocket + - React-hermes (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact (= 0.80.2) + - React-jsi + - React-jsiexecutor (= 0.80.2) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-perflogger (= 0.80.2) + - React-runtimeexecutor + - SocketRocket + - React-idlecallbacksnativemodule (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-hermes + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimescheduler + - ReactCommon/turbomodule/core + - SocketRocket + - React-ImageManager (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-Core/Default + - React-debug + - React-Fabric + - React-graphics + - React-rendererdebug + - React-utils + - SocketRocket + - React-jserrorhandler (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact + - React-debug + - React-featureflags + - React-jsi + - ReactCommon/turbomodule/bridging + - SocketRocket + - React-jsi (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-jsiexecutor (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact (= 0.80.2) + - React-jsi (= 0.80.2) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-perflogger (= 0.80.2) + - SocketRocket + - React-jsinspector (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsi + - React-jsinspectorcdp + - React-jsinspectornetwork + - React-jsinspectortracing + - React-perflogger (= 0.80.2) + - React-runtimeexecutor (= 0.80.2) + - SocketRocket + - React-jsinspectorcdp (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-jsinspectornetwork (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-jsinspectorcdp + - SocketRocket + - React-jsinspectortracing (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-oscompat + - SocketRocket + - React-jsitooling (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact (= 0.80.2) + - React-jsi (= 0.80.2) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - SocketRocket + - React-jsitracing (0.80.2): + - React-jsi + - React-logger (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-Mapbuffer (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - SocketRocket + - React-microtasksnativemodule (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-hermes + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - ReactCommon/turbomodule/core + - SocketRocket + - react-native-config (1.5.6): + - react-native-config/App (= 1.5.6) + - react-native-config/App (1.5.6): + - React-Core + - react-native-encrypted-storage (4.0.3): + - React-Core + - react-native-quick-base64 (2.2.2): + - React-Core + - react-native-safe-area-context (5.7.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - react-native-safe-area-context/common (= 5.7.0) + - react-native-safe-area-context/fabric (= 5.7.0) + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-safe-area-context/common (5.7.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-safe-area-context/fabric (5.7.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - react-native-safe-area-context/common + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-webview (13.16.1): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-NativeModulesApple (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker + - React-Core + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-runtimeexecutor + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - React-oscompat (0.80.2) + - React-perflogger (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-performancetimeline (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsinspectortracing + - React-perflogger + - React-timing + - SocketRocket + - React-RCTActionSheet (0.80.2): + - React-Core/RCTActionSheetHeaders (= 0.80.2) + - React-RCTAnimation (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTAnimationHeaders + - React-featureflags + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-RCTAppDelegate (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-CoreModules + - React-debug + - React-defaultsnativemodule + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsitooling + - React-NativeModulesApple + - React-RCTFabric + - React-RCTFBReactNativeSpec + - React-RCTImage + - React-RCTNetwork + - React-RCTRuntime + - React-rendererdebug + - React-RuntimeApple + - React-RuntimeCore + - React-runtimescheduler + - React-utils + - ReactCommon + - SocketRocket + - React-RCTBlob (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Core/RCTBlobHeaders + - React-Core/RCTWebSocket + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - React-RCTNetwork + - ReactCommon + - SocketRocket + - React-RCTFabric (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Core + - React-debug + - React-Fabric + - React-FabricComponents + - React-FabricImage + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectornetwork + - React-jsinspectortracing + - React-performancetimeline + - React-RCTAnimation + - React-RCTImage + - React-RCTText + - React-rendererconsistency + - React-renderercss + - React-rendererdebug + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-RCTFBReactNativeSpec (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-hermes + - React-jsi + - React-jsiexecutor + - React-NativeModulesApple + - ReactCommon + - SocketRocket + - React-RCTImage (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTImageHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - React-RCTNetwork + - ReactCommon + - SocketRocket + - React-RCTLinking (0.80.2): + - React-Core/RCTLinkingHeaders (= 0.80.2) + - React-jsi (= 0.80.2) + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - ReactCommon/turbomodule/core (= 0.80.2) + - React-RCTNetwork (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTNetworkHeaders + - React-featureflags + - React-jsi + - React-jsinspectorcdp + - React-jsinspectornetwork + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-RCTRuntime (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Core + - React-hermes + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-jsitooling + - React-RuntimeApple + - React-RuntimeCore + - React-RuntimeHermes + - SocketRocket + - React-RCTSettings (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTSettingsHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-RCTText (0.80.2): + - React-Core/RCTTextHeaders (= 0.80.2) + - Yoga + - React-RCTVibration (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-Core/RCTVibrationHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-rendererconsistency (0.80.2) + - React-renderercss (0.80.2): + - React-debug + - React-utils + - React-rendererdebug (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - SocketRocket + - React-rncore (0.80.2) + - React-RuntimeApple (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker + - React-Core/Default + - React-CoreModules + - React-cxxreact + - React-featureflags + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-Mapbuffer + - React-NativeModulesApple + - React-RCTFabric + - React-RCTFBReactNativeSpec + - React-RuntimeCore + - React-runtimeexecutor + - React-RuntimeHermes + - React-runtimescheduler + - React-utils + - SocketRocket + - React-RuntimeCore (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact + - React-Fabric + - React-featureflags + - React-hermes + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-performancetimeline + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - React-runtimeexecutor (0.80.2): + - React-jsi (= 0.80.2) + - React-RuntimeHermes (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-hermes + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-jsitooling + - React-jsitracing + - React-RuntimeCore + - React-utils + - SocketRocket + - React-runtimescheduler (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker + - React-cxxreact + - React-debug + - React-featureflags + - React-hermes + - React-jsi + - React-jsinspectortracing + - React-performancetimeline + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-timing + - React-utils + - SocketRocket + - React-timing (0.80.2) + - React-utils (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - React-hermes + - React-jsi (= 0.80.2) + - SocketRocket + - ReactAppDependencyProvider (0.80.2): + - ReactCodegen + - ReactCodegen (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-FabricImage + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-NativeModulesApple + - React-RCTAppDelegate + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - ReactCommon (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - ReactCommon/turbomodule (= 0.80.2) + - SocketRocket + - ReactCommon/turbomodule (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker (= 0.80.2) + - React-cxxreact (= 0.80.2) + - React-jsi (= 0.80.2) + - React-logger (= 0.80.2) + - React-perflogger (= 0.80.2) + - ReactCommon/turbomodule/bridging (= 0.80.2) + - ReactCommon/turbomodule/core (= 0.80.2) + - SocketRocket + - ReactCommon/turbomodule/bridging (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker (= 0.80.2) + - React-cxxreact (= 0.80.2) + - React-jsi (= 0.80.2) + - React-logger (= 0.80.2) + - React-perflogger (= 0.80.2) + - SocketRocket + - ReactCommon/turbomodule/core (0.80.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker (= 0.80.2) + - React-cxxreact (= 0.80.2) + - React-debug (= 0.80.2) + - React-featureflags (= 0.80.2) + - React-jsi (= 0.80.2) + - React-logger (= 0.80.2) + - React-perflogger (= 0.80.2) + - React-utils (= 0.80.2) + - SocketRocket + - RNCMaskedView (0.3.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNGestureHandler (2.26.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNReanimated (3.18.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/reanimated (= 3.18.0) + - RNReanimated/worklets (= 3.18.0) + - SocketRocket + - Yoga + - RNReanimated/reanimated (3.18.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/reanimated/apple (= 3.18.0) + - SocketRocket + - Yoga + - RNReanimated/reanimated/apple (3.18.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNReanimated/worklets (3.18.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/worklets/apple (= 3.18.0) + - SocketRocket + - Yoga + - RNReanimated/worklets/apple (3.18.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNScreens (4.16.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNScreens/common (= 4.16.0) + - SocketRocket + - Yoga + - RNScreens/common (4.16.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNShopifyCheckoutSheetKit (3.8.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - ShopifyCheckoutSheetKit (~> 3.8.0) + - ShopifyCheckoutSheetKit/AcceleratedCheckouts (~> 3.8.0) + - SocketRocket + - Yoga + - RNVectorIcons (10.3.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - ShopifyCheckoutSheetKit (3.8.0): + - ShopifyCheckoutSheetKit/Core (= 3.8.0) + - ShopifyCheckoutSheetKit/AcceleratedCheckouts (3.8.0): + - ShopifyCheckoutSheetKit/Core + - ShopifyCheckoutSheetKit/Core (3.8.0) + - SocketRocket (0.7.1) + - Yoga (0.0.0) + +DEPENDENCIES: + - boost (from `../../node_modules/react-native/third-party-podspecs/boost.podspec`) + - DoubleConversion (from `../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - fast_float (from `../../node_modules/react-native/third-party-podspecs/fast_float.podspec`) + - FBLazyVector (from `../../node_modules/react-native/Libraries/FBLazyVector`) + - fmt (from `../../node_modules/react-native/third-party-podspecs/fmt.podspec`) + - glog (from `../../node_modules/react-native/third-party-podspecs/glog.podspec`) + - hermes-engine (from `../../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) + - NitroModules (from `../../node_modules/react-native-nitro-modules`) + - QuickCrypto (from `../../node_modules/react-native-quick-crypto`) + - RCT-Folly (from `../../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) + - RCTDeprecation (from `../../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) + - RCTRequired (from `../../node_modules/react-native/Libraries/Required`) + - RCTTypeSafety (from `../../node_modules/react-native/Libraries/TypeSafety`) + - React (from `../../node_modules/react-native/`) + - React-callinvoker (from `../../node_modules/react-native/ReactCommon/callinvoker`) + - React-Core (from `../../node_modules/react-native/`) + - React-Core/RCTWebSocket (from `../../node_modules/react-native/`) + - React-CoreModules (from `../../node_modules/react-native/React/CoreModules`) + - React-cxxreact (from `../../node_modules/react-native/ReactCommon/cxxreact`) + - React-debug (from `../../node_modules/react-native/ReactCommon/react/debug`) + - React-defaultsnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/defaults`) + - React-domnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/dom`) + - React-Fabric (from `../../node_modules/react-native/ReactCommon`) + - React-FabricComponents (from `../../node_modules/react-native/ReactCommon`) + - React-FabricImage (from `../../node_modules/react-native/ReactCommon`) + - React-featureflags (from `../../node_modules/react-native/ReactCommon/react/featureflags`) + - React-featureflagsnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`) + - React-graphics (from `../../node_modules/react-native/ReactCommon/react/renderer/graphics`) + - React-hermes (from `../../node_modules/react-native/ReactCommon/hermes`) + - React-idlecallbacksnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) + - React-ImageManager (from `../../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) + - React-jserrorhandler (from `../../node_modules/react-native/ReactCommon/jserrorhandler`) + - React-jsi (from `../../node_modules/react-native/ReactCommon/jsi`) + - React-jsiexecutor (from `../../node_modules/react-native/ReactCommon/jsiexecutor`) + - React-jsinspector (from `../../node_modules/react-native/ReactCommon/jsinspector-modern`) + - React-jsinspectorcdp (from `../../node_modules/react-native/ReactCommon/jsinspector-modern/cdp`) + - React-jsinspectornetwork (from `../../node_modules/react-native/ReactCommon/jsinspector-modern/network`) + - React-jsinspectortracing (from `../../node_modules/react-native/ReactCommon/jsinspector-modern/tracing`) + - React-jsitooling (from `../../node_modules/react-native/ReactCommon/jsitooling`) + - React-jsitracing (from `../../node_modules/react-native/ReactCommon/hermes/executor/`) + - React-logger (from `../../node_modules/react-native/ReactCommon/logger`) + - React-Mapbuffer (from `../../node_modules/react-native/ReactCommon`) + - React-microtasksnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) + - react-native-config (from `../../node_modules/react-native-config`) + - react-native-encrypted-storage (from `../../node_modules/react-native-encrypted-storage`) + - react-native-quick-base64 (from `../../node_modules/react-native-quick-base64`) + - react-native-safe-area-context (from `../../node_modules/react-native-safe-area-context`) + - react-native-webview (from `../../node_modules/react-native-webview`) + - React-NativeModulesApple (from `../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) + - React-oscompat (from `../../node_modules/react-native/ReactCommon/oscompat`) + - React-perflogger (from `../../node_modules/react-native/ReactCommon/reactperflogger`) + - React-performancetimeline (from `../../node_modules/react-native/ReactCommon/react/performance/timeline`) + - React-RCTActionSheet (from `../../node_modules/react-native/Libraries/ActionSheetIOS`) + - React-RCTAnimation (from `../../node_modules/react-native/Libraries/NativeAnimation`) + - React-RCTAppDelegate (from `../../node_modules/react-native/Libraries/AppDelegate`) + - React-RCTBlob (from `../../node_modules/react-native/Libraries/Blob`) + - React-RCTFabric (from `../../node_modules/react-native/React`) + - React-RCTFBReactNativeSpec (from `../../node_modules/react-native/React`) + - React-RCTImage (from `../../node_modules/react-native/Libraries/Image`) + - React-RCTLinking (from `../../node_modules/react-native/Libraries/LinkingIOS`) + - React-RCTNetwork (from `../../node_modules/react-native/Libraries/Network`) + - React-RCTRuntime (from `../../node_modules/react-native/React/Runtime`) + - React-RCTSettings (from `../../node_modules/react-native/Libraries/Settings`) + - React-RCTText (from `../../node_modules/react-native/Libraries/Text`) + - React-RCTVibration (from `../../node_modules/react-native/Libraries/Vibration`) + - React-rendererconsistency (from `../../node_modules/react-native/ReactCommon/react/renderer/consistency`) + - React-renderercss (from `../../node_modules/react-native/ReactCommon/react/renderer/css`) + - React-rendererdebug (from `../../node_modules/react-native/ReactCommon/react/renderer/debug`) + - React-rncore (from `../../node_modules/react-native/ReactCommon`) + - React-RuntimeApple (from `../../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) + - React-RuntimeCore (from `../../node_modules/react-native/ReactCommon/react/runtime`) + - React-runtimeexecutor (from `../../node_modules/react-native/ReactCommon/runtimeexecutor`) + - React-RuntimeHermes (from `../../node_modules/react-native/ReactCommon/react/runtime`) + - React-runtimescheduler (from `../../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) + - React-timing (from `../../node_modules/react-native/ReactCommon/react/timing`) + - React-utils (from `../../node_modules/react-native/ReactCommon/react/utils`) + - ReactAppDependencyProvider (from `build/generated/ios`) + - ReactCodegen (from `build/generated/ios`) + - ReactCommon/turbomodule/core (from `../../node_modules/react-native/ReactCommon`) + - "RNCMaskedView (from `../../node_modules/@react-native-masked-view/masked-view`)" + - RNGestureHandler (from `../../node_modules/react-native-gesture-handler`) + - RNReanimated (from `../../node_modules/react-native-reanimated`) + - RNScreens (from `../../node_modules/react-native-screens`) + - "RNShopifyCheckoutSheetKit (from `../../modules/@shopify/checkout-sheet-kit`)" + - RNVectorIcons (from `../../node_modules/react-native-vector-icons`) + - SocketRocket (~> 0.7.1) + - Yoga (from `../../node_modules/react-native/ReactCommon/yoga`) + +SPEC REPOS: + trunk: + - ShopifyCheckoutSheetKit + - SocketRocket + +EXTERNAL SOURCES: + boost: + :podspec: "../../node_modules/react-native/third-party-podspecs/boost.podspec" + DoubleConversion: + :podspec: "../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + fast_float: + :podspec: "../../node_modules/react-native/third-party-podspecs/fast_float.podspec" + FBLazyVector: + :path: "../../node_modules/react-native/Libraries/FBLazyVector" + fmt: + :podspec: "../../node_modules/react-native/third-party-podspecs/fmt.podspec" + glog: + :podspec: "../../node_modules/react-native/third-party-podspecs/glog.podspec" + hermes-engine: + :podspec: "../../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + :tag: hermes-2025-07-24-RNv0.80.2-5c7dbc0a78cb2d2a8bc81c41c617c3abecf209ff + NitroModules: + :path: "../../node_modules/react-native-nitro-modules" + QuickCrypto: + :path: "../../node_modules/react-native-quick-crypto" + RCT-Folly: + :podspec: "../../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + RCTDeprecation: + :path: "../../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" + RCTRequired: + :path: "../../node_modules/react-native/Libraries/Required" + RCTTypeSafety: + :path: "../../node_modules/react-native/Libraries/TypeSafety" + React: + :path: "../../node_modules/react-native/" + React-callinvoker: + :path: "../../node_modules/react-native/ReactCommon/callinvoker" + React-Core: + :path: "../../node_modules/react-native/" + React-CoreModules: + :path: "../../node_modules/react-native/React/CoreModules" + React-cxxreact: + :path: "../../node_modules/react-native/ReactCommon/cxxreact" + React-debug: + :path: "../../node_modules/react-native/ReactCommon/react/debug" + React-defaultsnativemodule: + :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/defaults" + React-domnativemodule: + :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/dom" + React-Fabric: + :path: "../../node_modules/react-native/ReactCommon" + React-FabricComponents: + :path: "../../node_modules/react-native/ReactCommon" + React-FabricImage: + :path: "../../node_modules/react-native/ReactCommon" + React-featureflags: + :path: "../../node_modules/react-native/ReactCommon/react/featureflags" + React-featureflagsnativemodule: + :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" + React-graphics: + :path: "../../node_modules/react-native/ReactCommon/react/renderer/graphics" + React-hermes: + :path: "../../node_modules/react-native/ReactCommon/hermes" + React-idlecallbacksnativemodule: + :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" + React-ImageManager: + :path: "../../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" + React-jserrorhandler: + :path: "../../node_modules/react-native/ReactCommon/jserrorhandler" + React-jsi: + :path: "../../node_modules/react-native/ReactCommon/jsi" + React-jsiexecutor: + :path: "../../node_modules/react-native/ReactCommon/jsiexecutor" + React-jsinspector: + :path: "../../node_modules/react-native/ReactCommon/jsinspector-modern" + React-jsinspectorcdp: + :path: "../../node_modules/react-native/ReactCommon/jsinspector-modern/cdp" + React-jsinspectornetwork: + :path: "../../node_modules/react-native/ReactCommon/jsinspector-modern/network" + React-jsinspectortracing: + :path: "../../node_modules/react-native/ReactCommon/jsinspector-modern/tracing" + React-jsitooling: + :path: "../../node_modules/react-native/ReactCommon/jsitooling" + React-jsitracing: + :path: "../../node_modules/react-native/ReactCommon/hermes/executor/" + React-logger: + :path: "../../node_modules/react-native/ReactCommon/logger" + React-Mapbuffer: + :path: "../../node_modules/react-native/ReactCommon" + React-microtasksnativemodule: + :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" + react-native-config: + :path: "../../node_modules/react-native-config" + react-native-encrypted-storage: + :path: "../../node_modules/react-native-encrypted-storage" + react-native-quick-base64: + :path: "../../node_modules/react-native-quick-base64" + react-native-safe-area-context: + :path: "../../node_modules/react-native-safe-area-context" + react-native-webview: + :path: "../../node_modules/react-native-webview" + React-NativeModulesApple: + :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" + React-oscompat: + :path: "../../node_modules/react-native/ReactCommon/oscompat" + React-perflogger: + :path: "../../node_modules/react-native/ReactCommon/reactperflogger" + React-performancetimeline: + :path: "../../node_modules/react-native/ReactCommon/react/performance/timeline" + React-RCTActionSheet: + :path: "../../node_modules/react-native/Libraries/ActionSheetIOS" + React-RCTAnimation: + :path: "../../node_modules/react-native/Libraries/NativeAnimation" + React-RCTAppDelegate: + :path: "../../node_modules/react-native/Libraries/AppDelegate" + React-RCTBlob: + :path: "../../node_modules/react-native/Libraries/Blob" + React-RCTFabric: + :path: "../../node_modules/react-native/React" + React-RCTFBReactNativeSpec: + :path: "../../node_modules/react-native/React" + React-RCTImage: + :path: "../../node_modules/react-native/Libraries/Image" + React-RCTLinking: + :path: "../../node_modules/react-native/Libraries/LinkingIOS" + React-RCTNetwork: + :path: "../../node_modules/react-native/Libraries/Network" + React-RCTRuntime: + :path: "../../node_modules/react-native/React/Runtime" + React-RCTSettings: + :path: "../../node_modules/react-native/Libraries/Settings" + React-RCTText: + :path: "../../node_modules/react-native/Libraries/Text" + React-RCTVibration: + :path: "../../node_modules/react-native/Libraries/Vibration" + React-rendererconsistency: + :path: "../../node_modules/react-native/ReactCommon/react/renderer/consistency" + React-renderercss: + :path: "../../node_modules/react-native/ReactCommon/react/renderer/css" + React-rendererdebug: + :path: "../../node_modules/react-native/ReactCommon/react/renderer/debug" + React-rncore: + :path: "../../node_modules/react-native/ReactCommon" + React-RuntimeApple: + :path: "../../node_modules/react-native/ReactCommon/react/runtime/platform/ios" + React-RuntimeCore: + :path: "../../node_modules/react-native/ReactCommon/react/runtime" + React-runtimeexecutor: + :path: "../../node_modules/react-native/ReactCommon/runtimeexecutor" + React-RuntimeHermes: + :path: "../../node_modules/react-native/ReactCommon/react/runtime" + React-runtimescheduler: + :path: "../../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" + React-timing: + :path: "../../node_modules/react-native/ReactCommon/react/timing" + React-utils: + :path: "../../node_modules/react-native/ReactCommon/react/utils" + ReactAppDependencyProvider: + :path: build/generated/ios + ReactCodegen: + :path: build/generated/ios + ReactCommon: + :path: "../../node_modules/react-native/ReactCommon" + RNCMaskedView: + :path: "../../node_modules/@react-native-masked-view/masked-view" + RNGestureHandler: + :path: "../../node_modules/react-native-gesture-handler" + RNReanimated: + :path: "../../node_modules/react-native-reanimated" + RNScreens: + :path: "../../node_modules/react-native-screens" + RNShopifyCheckoutSheetKit: + :path: "../../modules/@shopify/checkout-sheet-kit" + RNVectorIcons: + :path: "../../node_modules/react-native-vector-icons" + Yoga: + :path: "../../node_modules/react-native/ReactCommon/yoga" + +SPEC CHECKSUMS: + boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 + DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb + fast_float: b32c788ed9c6a8c584d114d0047beda9664e7cc6 + FBLazyVector: 86588b5a1547e7a417942a08f49559b184e002c8 + fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd + glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 + hermes-engine: bbc1152da7d2d40f9e59c28acc6576fcf5d28e2a + NitroModules: 30c376f96874896e2ebf2ef16c5d84019c06d93b + QuickCrypto: be031b34e1004b427bdaca1be5283a3288bf6ce4 + RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669 + RCTDeprecation: 300c5eb91114d4339b0bb39505d0f4824d7299b7 + RCTRequired: e0446b01093475b7082fbeee5d1ef4ad1fe20ac4 + RCTTypeSafety: cb974efcdc6695deedf7bf1eb942f2a0603a063f + React: e7a4655b09d0e17e54be188cc34c2f3e2087318a + React-callinvoker: 62192daaa2f30c3321fc531e4f776f7b09cf892b + React-Core: b23cdaaa9d76389d958c06af3c57aa6ad611c542 + React-CoreModules: 8e0f562e5695991e455abbebe1e968af71d52553 + React-cxxreact: 6ccbe0cc2c652b29409b14b23cfb3cd74e084691 + React-debug: 1834225a63b420b16e9b8b01ba5870aee96d0610 + React-defaultsnativemodule: dd88d445d542d58ab61a8a29a7c1d2272dfed577 + React-domnativemodule: fc3c24f4d3bb92770727ea48b4133dab77ded7f7 + React-Fabric: 00fe76339e568da0d0497cc72daeeb01e463871a + React-FabricComponents: 7bb179ee55db68f88c007800b0ac62c930115a85 + React-FabricImage: 21e01118011dd1e4ff3cdab20dbf57839cff52ee + React-featureflags: 6e67f2e252bc8ebb1d538c2ae8c14df432fe5fc0 + React-featureflagsnativemodule: eff5216a5cde5df5d09243d15db1bc401474deef + React-graphics: 8539372da8754118a565251ed08a88fc70f69340 + React-hermes: cc8c77acee1406c258622cd8abbee9049f6b5761 + React-idlecallbacksnativemodule: 7349675d1ccbec876c29b0e206ac08c762baaa36 + React-ImageManager: 4089d8ad52c86a8ae1d7591282fff1665ff5518b + React-jserrorhandler: 89a7a5fa8d04791e729119d1db03bf0ee85a9e29 + React-jsi: ea5c640ea63c127080f158dac7f4f393d13d415c + React-jsiexecutor: cf7920f82e46fe9a484c15c9f31e67d7179aa826 + React-jsinspector: 69e974b6313dbbb635ba503f2f4f2c389b30edbf + React-jsinspectorcdp: 231ddd5b7164c37589dcde3b8b6960136c891d6d + React-jsinspectornetwork: ff74911f79cf0a407a7f0ad0eeb0be64687ed815 + React-jsinspectortracing: df2aa2d944bb3fa280d9c920b9a06664bca8a7e8 + React-jsitooling: 77849c27e374a028ed8106e434a35267f6c6600b + React-jsitracing: 0dc6978e5b38c6e5e01e6aed484e4aec3f5f581b + React-logger: 7cfc7b1ae1f8e5fe5097f9c746137cc3a8fad4ce + React-Mapbuffer: 7018c5b7da5b13ed22fe55dae51d50187a00b2d7 + React-microtasksnativemodule: 8ff9cb220a8efa625b5885996bd69e69db9edf02 + react-native-config: f1dde39f8468ad922fc7e8bd4308c8e6223d5ee8 + react-native-encrypted-storage: 569d114e329b1c2c2d9f8c84bcdbe4478dda2258 + react-native-quick-base64: 6568199bb2ac8e72ecdfdc73a230fbc5c1d3aac4 + react-native-safe-area-context: 1792c367881ef3be64cc01df775c19c6d217a015 + react-native-webview: a5f4076e4e0c1c84d8fe1ffe4ff720df685bbbcd + React-NativeModulesApple: 37c08c3c54db55854de816b0df0f3683832be35a + React-oscompat: 56d6de59f9ae95cd006a1c40be2cde83bc06a4e1 + React-perflogger: 4008bd05a8b6c157b06608c0ea0b8bd5d9c5e6c9 + React-performancetimeline: 9321ba7605abcfb3a2b497fd7cbaf5cfd8c7cf67 + React-RCTActionSheet: 49138012280ec3bbb35193d8d09adb8bc61c982e + React-RCTAnimation: ebfe7c62016d4c17b56b2cab3a221908ae46288d + React-RCTAppDelegate: 0108657ba9a19f6a1cd62dcd19c2c0485b3fc251 + React-RCTBlob: 6cc309d1623f3c2679125a04a7425685b7219e6b + React-RCTFabric: 0a9ff5c9d1e1d7fc026bda6671180cbf56861c15 + React-RCTFBReactNativeSpec: ff3e37e2456afc04211334e86d07bf20488df0ae + React-RCTImage: bb98a59aeed953a48be3f917b9b745b213b340ab + React-RCTLinking: d6e9795d4d75d154c1dd821fd0746cc3e05d6670 + React-RCTNetwork: 5c8a7a2dd26728323189362f149e788548ac72bc + React-RCTRuntime: 96808e8fdce300a26c82d8c24174e33ba5210a7c + React-RCTSettings: b6a02d545ce10dd936b39914b32674db6e865307 + React-RCTText: c7d9232da0e9b5082a99a617483d9164a9cd46e9 + React-RCTVibration: fe636c985c1bf25e4a5b5b4d9315a3b882468a72 + React-rendererconsistency: d20fcb77173861cc7d8356239823e3b36966fc31 + React-renderercss: 56461d1e18db6a325048fdd04a51d68bd7ddb5a8 + React-rendererdebug: fcd44d3eb8a02d74beee778bb142e724016c7375 + React-rncore: bafb76fc01b78757a9592e92dbc227f9260bf0ac + React-RuntimeApple: 01e3ad08793efaa54cf85276457fa4a1f103d5b4 + React-RuntimeCore: 5c4bec5bf402a99b134e55972f2f4e676c70b9ab + React-runtimeexecutor: b35de9cb7f5d19c66ea9b067235f95b947697ba5 + React-RuntimeHermes: ba549a5834a6592d243b9a605530ecd7b6f5e79c + React-runtimescheduler: 9a9914d58caec7976aaae381cd2d997408f2260f + React-timing: 4f97958cc918f0af9444f93e4a7083415e6f5daf + React-utils: f491e2726eb8ced8af13893e1f77317f0fa9a954 + ReactAppDependencyProvider: 8df342c127fd0c1e30e8b9f71ff814c22414a7c0 + ReactCodegen: 37cf3321221b0c4f89b0750dbaf466bc99de7a57 + ReactCommon: 592ef441605638b95e533653259254b4bd35ff4f + RNCMaskedView: 7e0ce15656772a939ff0d269100bca3a182163c8 + RNGestureHandler: eeb622199ef1fb3a076243131095df1c797072f0 + RNReanimated: 237d420b7bb4378ef1dacc7d7a5c674fddb4b5d2 + RNScreens: 3fc29af06302e1f1c18a7829fe57cbc2c0259912 + RNShopifyCheckoutSheetKit: 5587e0fc360607d832f7f10f8436883d1db4b5ef + RNVectorIcons: be4d047a76ad307ffe54732208fb0498fcb8477f + ShopifyCheckoutSheetKit: 5253ca4da4c4f31069286509693930d02b4150d8 + SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 + Yoga: a742cc68e8366fcfc681808162492bc0aa7a9498 + +PODFILE CHECKSUM: 81acd7bd19af2e0a9570ba0704d5dee4fb230eca + +COCOAPODS: 1.15.2 diff --git a/react-native/sample/ios/ReactNative-Bridging-Header.h b/react-native/sample/ios/ReactNative-Bridging-Header.h new file mode 100644 index 00000000..24db3c47 --- /dev/null +++ b/react-native/sample/ios/ReactNative-Bridging-Header.h @@ -0,0 +1,24 @@ +/* + MIT License + + Copyright 2023 - Present, Shopify Inc. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#import diff --git a/react-native/sample/ios/ReactNative.xcodeproj/project.pbxproj b/react-native/sample/ios/ReactNative.xcodeproj/project.pbxproj new file mode 100644 index 00000000..e7e5f976 --- /dev/null +++ b/react-native/sample/ios/ReactNative.xcodeproj/project.pbxproj @@ -0,0 +1,1009 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 0A018AC7205EBA49E1E67311 /* libPods-ReactNative.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9E0AC43398437CA0E3D05DDF /* libPods-ReactNative.a */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 37C6EE1EB87AA54212E67EDE /* libPods-ReactNativeTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 591887D86C91BE07EFFC9303 /* libPods-ReactNativeTests.a */; }; + 6A1F48E72B16900600BA591C /* ShopifyCheckoutSheetKitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A1F48E62B16900600BA591C /* ShopifyCheckoutSheetKitTests.swift */; }; + 6A58AAE82E607E0200A6AA85 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A58AAE72E607DFB00A6AA85 /* AppDelegate.swift */; }; + 6A86196D2BF36EB900E5EE1A /* CheckoutDidFailTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A86196C2BF36EB900E5EE1A /* CheckoutDidFailTests.swift */; }; + 6AEEAAB22C00010100E5EE1B /* AcceleratedCheckouts_SupportedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AEEAAB02C00010100E5EE1B /* AcceleratedCheckouts_SupportedTests.swift */; }; + 6AEEAAB32C00010100E5EE1B /* AcceleratedCheckouts_UnsupportedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AEEAAB12C00010100E5EE1B /* AcceleratedCheckouts_UnsupportedTests.swift */; }; + 6AF1E0032C00010100E5EE1B /* EventSerializationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF1E0022C00010100E5EE1B /* EventSerializationTests.swift */; }; + 6AFAD2D22BA9DEF8001F9644 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 6AFAD2D12BA9DEF8001F9644 /* Localizable.xcstrings */; }; + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; + 9403907249B4B6D988902B48 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 1939D329B2C035D1A15E316B /* PrivacyInfo.xcprivacy */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 13B07F861A680F5B00A75B9A; + remoteInfo = ReactNative; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 00E356EE1AD99517003FC87E /* ReactNativeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ReactNativeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07F961A680F5B00A75B9A /* ReactNative.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ReactNative.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ReactNative/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = ReactNative/Info.plist; sourceTree = ""; }; + 1939D329B2C035D1A15E316B /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = ReactNative/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 39099806D4750FF73C4975E3 /* Pods-ReactNativeTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeTests.release.xcconfig"; path = "Target Support Files/Pods-ReactNativeTests/Pods-ReactNativeTests.release.xcconfig"; sourceTree = ""; }; + 4EF1B8B6CA16C991C5BEE2F2 /* Pods-ReactNative.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNative.release.xcconfig"; path = "Target Support Files/Pods-ReactNative/Pods-ReactNative.release.xcconfig"; sourceTree = ""; }; + 591887D86C91BE07EFFC9303 /* libPods-ReactNativeTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ReactNativeTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 6A1F48E62B16900600BA591C /* ShopifyCheckoutSheetKitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShopifyCheckoutSheetKitTests.swift; sourceTree = ""; }; + 6A58AAE72E607DFB00A6AA85 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 6A86196C2BF36EB900E5EE1A /* CheckoutDidFailTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckoutDidFailTests.swift; sourceTree = ""; }; + 6A8D64CF2AF25C1200FE4E4A /* ReactNative.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = ReactNative.entitlements; path = ReactNative/ReactNative.entitlements; sourceTree = ""; }; + 6AABC1942B17417E008240EB /* OpenSSL.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = OpenSSL.xcframework; path = "Pods/OpenSSL-Universal/Frameworks/OpenSSL.xcframework"; sourceTree = ""; }; + 6AAEC3572B067AD500C7099B /* Entypo.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = Entypo.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = ""; }; + 6AEEAAB02C00010100E5EE1B /* AcceleratedCheckouts_SupportedTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcceleratedCheckouts_SupportedTests.swift; sourceTree = ""; }; + 6AEEAAB12C00010100E5EE1B /* AcceleratedCheckouts_UnsupportedTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcceleratedCheckouts_UnsupportedTests.swift; sourceTree = ""; }; + 6AF1E0022C00010100E5EE1B /* EventSerializationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventSerializationTests.swift; sourceTree = ""; }; + 6AF2B3762B0BCA6600C6CE4F /* ReactNative-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ReactNative-Bridging-Header.h"; sourceTree = ""; }; + 6AFAD2D12BA9DEF8001F9644 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = Localizable.xcstrings; path = ReactNative/Localizable.xcstrings; sourceTree = ""; }; + 6AFC2CB62B0D5814003B5A63 /* libShopifyCheckoutSheetKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libShopifyCheckoutSheetKit.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 7959053DABE1E06BE5CF1255 /* Pods-ReactNative-ReactNativeTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNative-ReactNativeTests.release.xcconfig"; path = "Target Support Files/Pods-ReactNative-ReactNativeTests/Pods-ReactNative-ReactNativeTests.release.xcconfig"; sourceTree = ""; }; + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = ReactNative/LaunchScreen.storyboard; sourceTree = ""; }; + 9E0AC43398437CA0E3D05DDF /* libPods-ReactNative.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ReactNative.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + DF9E097D026528607DDCD7B7 /* Pods-ReactNative-ReactNativeTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNative-ReactNativeTests.debug.xcconfig"; path = "Target Support Files/Pods-ReactNative-ReactNativeTests/Pods-ReactNative-ReactNativeTests.debug.xcconfig"; sourceTree = ""; }; + E22D02A7C54F90741A3D90E9 /* Pods-ReactNativeTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeTests.debug.xcconfig"; path = "Target Support Files/Pods-ReactNativeTests/Pods-ReactNativeTests.debug.xcconfig"; sourceTree = ""; }; + ED728EF8BB9B5E9BA9D50EBE /* Pods-ReactNative.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNative.debug.xcconfig"; path = "Target Support Files/Pods-ReactNative/Pods-ReactNative.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 00E356EB1AD99517003FC87E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 37C6EE1EB87AA54212E67EDE /* libPods-ReactNativeTests.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0A018AC7205EBA49E1E67311 /* libPods-ReactNative.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 00E356EF1AD99517003FC87E /* ReactNativeTests */ = { + isa = PBXGroup; + children = ( + 00E356F01AD99517003FC87E /* Supporting Files */, + 6A1F48E62B16900600BA591C /* ShopifyCheckoutSheetKitTests.swift */, + 6A86196C2BF36EB900E5EE1A /* CheckoutDidFailTests.swift */, + 6AEEAAB02C00010100E5EE1B /* AcceleratedCheckouts_SupportedTests.swift */, + 6AEEAAB12C00010100E5EE1B /* AcceleratedCheckouts_UnsupportedTests.swift */, + 6AF1E0022C00010100E5EE1B /* EventSerializationTests.swift */, + ); + path = ReactNativeTests; + sourceTree = ""; + }; + 00E356F01AD99517003FC87E /* Supporting Files */ = { + isa = PBXGroup; + children = ( + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 13B07FAE1A68108700A75B9A /* ReactNative */ = { + isa = PBXGroup; + children = ( + 6A58AAE72E607DFB00A6AA85 /* AppDelegate.swift */, + 6AF2B3762B0BCA6600C6CE4F /* ReactNative-Bridging-Header.h */, + 6AAEC3572B067AD500C7099B /* Entypo.ttf */, + 6A8D64CF2AF25C1200FE4E4A /* ReactNative.entitlements */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, + 6AFAD2D12BA9DEF8001F9644 /* Localizable.xcstrings */, + 1939D329B2C035D1A15E316B /* PrivacyInfo.xcprivacy */, + ); + name = ReactNative; + sourceTree = ""; + }; + 6A18CE262AF1B119007B1B08 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 6AABC1942B17417E008240EB /* OpenSSL.xcframework */, + 6AFC2CB62B0D5814003B5A63 /* libShopifyCheckoutSheetKit.a */, + 9E0AC43398437CA0E3D05DDF /* libPods-ReactNative.a */, + 591887D86C91BE07EFFC9303 /* libPods-ReactNativeTests.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 6AB7C68F2AF197BE000DB11B /* Packages */ = { + isa = PBXGroup; + children = ( + ); + name = Packages; + sourceTree = ""; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + ); + name = Libraries; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 6AB7C68F2AF197BE000DB11B /* Packages */, + 13B07FAE1A68108700A75B9A /* ReactNative */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 00E356EF1AD99517003FC87E /* ReactNativeTests */, + 83CBBA001A601CBA00E9B192 /* Products */, + BBD78D7AC51CEA395F1C20DB /* Pods */, + 6A18CE262AF1B119007B1B08 /* Frameworks */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + usesTabs = 0; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* ReactNative.app */, + 00E356EE1AD99517003FC87E /* ReactNativeTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + BBD78D7AC51CEA395F1C20DB /* Pods */ = { + isa = PBXGroup; + children = ( + ED728EF8BB9B5E9BA9D50EBE /* Pods-ReactNative.debug.xcconfig */, + 4EF1B8B6CA16C991C5BEE2F2 /* Pods-ReactNative.release.xcconfig */, + DF9E097D026528607DDCD7B7 /* Pods-ReactNative-ReactNativeTests.debug.xcconfig */, + 7959053DABE1E06BE5CF1255 /* Pods-ReactNative-ReactNativeTests.release.xcconfig */, + E22D02A7C54F90741A3D90E9 /* Pods-ReactNativeTests.debug.xcconfig */, + 39099806D4750FF73C4975E3 /* Pods-ReactNativeTests.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 00E356ED1AD99517003FC87E /* ReactNativeTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ReactNativeTests" */; + buildPhases = ( + 13CD11EE2D19D04D273718C4 /* [CP] Check Pods Manifest.lock */, + 00E356EA1AD99517003FC87E /* Sources */, + 00E356EB1AD99517003FC87E /* Frameworks */, + 00E356EC1AD99517003FC87E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 00E356F51AD99517003FC87E /* PBXTargetDependency */, + ); + name = ReactNativeTests; + productName = ReactNativeTests; + productReference = 00E356EE1AD99517003FC87E /* ReactNativeTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 13B07F861A680F5B00A75B9A /* ReactNative */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ReactNative" */; + buildPhases = ( + EC9AFE111A4C07A98A76F332 /* [CP] Check Pods Manifest.lock */, + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 1F1EB8B45BFDA1305B3ACC48 /* [CP] Copy Pods Resources */, + 1EF77979E16522DC120150A8 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ReactNative; + productName = ReactNative; + productReference = 13B07F961A680F5B00A75B9A /* ReactNative.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1430; + TargetAttributes = { + 00E356ED1AD99517003FC87E = { + CreatedOnToolsVersion = 6.2; + LastSwiftMigration = 1430; + TestTargetID = 13B07F861A680F5B00A75B9A; + }; + 13B07F861A680F5B00A75B9A = { + LastSwiftMigration = 1430; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "ReactNative" */; + compatibilityVersion = "Xcode 12.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* ReactNative */, + 00E356ED1AD99517003FC87E /* ReactNativeTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 00E356EC1AD99517003FC87E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + 6AFAD2D22BA9DEF8001F9644 /* Localizable.xcstrings in Resources */, + 9403907249B4B6D988902B48 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 12; + 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=\"../../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; + }; + 13CD11EE2D19D04D273718C4 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-ReactNativeTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 1EF77979E16522DC120150A8 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-ReactNative/Pods-ReactNative-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-ReactNative/Pods-ReactNative-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ReactNative/Pods-ReactNative-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 1F1EB8B45BFDA1305B3ACC48 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-ReactNative/Pods-ReactNative-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-ReactNative/Pods-ReactNative-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ReactNative/Pods-ReactNative-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + EC9AFE111A4C07A98A76F332 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-ReactNative-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 00E356EA1AD99517003FC87E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6A1F48E72B16900600BA591C /* ShopifyCheckoutSheetKitTests.swift in Sources */, + 6A86196D2BF36EB900E5EE1A /* CheckoutDidFailTests.swift in Sources */, + 6AEEAAB22C00010100E5EE1B /* AcceleratedCheckouts_SupportedTests.swift in Sources */, + 6AEEAAB32C00010100E5EE1B /* AcceleratedCheckouts_UnsupportedTests.swift in Sources */, + 6AF1E0032C00010100E5EE1B /* EventSerializationTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6A58AAE82E607E0200A6AA85 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 13B07F861A680F5B00A75B9A /* ReactNative */; + targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 00E356F61AD99517003FC87E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E22D02A7C54F90741A3D90E9 /* Pods-ReactNativeTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ENABLE_MODULES = YES; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"${PODS_ROOT}/Headers/Public\"", + "\"${PODS_ROOT}/Headers/Public/CocoaAsyncSocket\"", + "\"${PODS_ROOT}/Headers/Public/DoubleConversion\"", + "\"${PODS_ROOT}/Headers/Public/FBLazyVector\"", + "\"${PODS_ROOT}/Headers/Public/RCT-Folly\"", + "\"${PODS_ROOT}/Headers/Public/RCTRequired\"", + "\"${PODS_ROOT}/Headers/Public/RCTTypeSafety\"", + "\"${PODS_ROOT}/Headers/Public/RNCMaskedView\"", + "\"${PODS_ROOT}/Headers/Public/RNGestureHandler\"", + "\"${PODS_ROOT}/Headers/Public/RNReanimated\"", + "\"${PODS_ROOT}/Headers/Public/RNScreens\"", + "\"${PODS_ROOT}/Headers/Public/RNVectorIcons\"", + "\"${PODS_ROOT}/Headers/Public/React-Codegen\"", + "\"${PODS_ROOT}/Headers/Public/React-Core\"", + "\"${PODS_ROOT}/Headers/Public/React-NativeModulesApple\"", + "\"${PODS_ROOT}/Headers/Public/React-RCTAnimation\"", + "\"${PODS_ROOT}/Headers/Public/React-RCTAppDelegate\"", + "\"${PODS_ROOT}/Headers/Public/React-RCTBlob\"", + "\"${PODS_ROOT}/Headers/Public/React-RCTText\"", + "\"${PODS_ROOT}/Headers/Public/React-callinvoker\"", + "\"${PODS_ROOT}/Headers/Public/React-cxxreact\"", + "\"${PODS_ROOT}/Headers/Public/React-debug\"", + "\"${PODS_ROOT}/Headers/Public/React-hermes\"", + "\"${PODS_ROOT}/Headers/Public/React-jsi\"", + "\"${PODS_ROOT}/Headers/Public/React-jsiexecutor\"", + "\"${PODS_ROOT}/Headers/Public/React-jsinspector\"", + "\"${PODS_ROOT}/Headers/Public/React-logger\"", + "\"${PODS_ROOT}/Headers/Public/React-perflogger\"", + "\"${PODS_ROOT}/Headers/Public/React-runtimeexecutor\"", + "\"${PODS_ROOT}/Headers/Public/React-runtimescheduler\"", + "\"${PODS_ROOT}/Headers/Public/React-utils\"", + "\"${PODS_ROOT}/Headers/Public/ReactCommon\"", + "\"${PODS_ROOT}/Headers/Public/SocketRocket\"", + "\"${PODS_ROOT}/Headers/Public/Yoga\"", + "\"${PODS_ROOT}/Headers/Public/YogaKit\"", + "\"${PODS_ROOT}/Headers/Public/fmt\"", + "\"${PODS_ROOT}/Headers/Public/glog\"", + "\"${PODS_ROOT}/Headers/Public/hermes-engine\"", + "\"${PODS_ROOT}/Headers/Public/libevent\"", + "\"${PODS_ROOT}/Headers/Public/react-native-safe-area-context\"", + "\"${PODS_ROOT}/Headers/Public/RNShopifyCheckoutSheetKit\"", + "\"$(PODS_ROOT)/DoubleConversion\"", + "\"$(PODS_ROOT)/boost\"", + "\"$(PODS_ROOT)/Headers/Private/React-Core\"", + "\"$(PODS_TARGET_SRCROOT)/include/\"", + "\"$(PODS_ROOT)/boost\"", + "\"$(PODS_ROOT)/boost-for-react-native\"", + "\"$(PODS_ROOT)/glog\"", + "\"$(PODS_ROOT)/RCT-Folly\"", + "\"$(PODS_ROOT)/Headers/Public/React-hermes\"", + "\"$(PODS_ROOT)/Headers/Public/hermes-engine\"", + "\"$(PODS_ROOT)/../../node_modules/react-native/ReactCommon\"", + "\"${PODS_ROOT}/Headers/Public/RNShopifyCheckoutSheetKit\"/**", + ); + INFOPLIST_FILE = ReactNativeTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(SDKROOT)/usr/lib/swift", + "$(inherited)", + "\"${PODS_CONFIGURATION_BUILD_DIR}/CocoaAsyncSocket\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/DoubleConversion\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/RCT-Folly\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/RCTTypeSafety\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/RNCMaskedView\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/RNGestureHandler\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/RNReanimated\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/RNScreens\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/RNVectorIcons\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-Codegen\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-Core-60309c9c\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-CoreModules\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-NativeModulesApple\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTAnimation\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTAppDelegate\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTBlob\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTImage\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTLinking\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTNetwork\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTSettings\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTText\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-RCTVibration\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-debug\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-hermes\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-jsi\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-jsiexecutor\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-jsinspector\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-logger\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-perflogger\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-runtimescheduler\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/React-utils\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/ShopifyCheckoutSheetKit\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/Yoga\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/YogaKit\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/fmt\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/glog\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/libevent\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/react-native-safe-area-context\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/RNShopifyCheckoutSheetKit\"", + "\"${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"", + /usr/lib/swift, + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + "$(inherited)", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.shopify.example.CheckoutKitReactNative; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_INCLUDE_PATHS = "$(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/ShopifyCheckoutSheetKit\" \"${PODS_CONFIGURATION_BUILD_DIR}/YogaKit\" \"${PODS_CONFIGURATION_BUILD_DIR}/RNShopifyCheckoutSheetKit\"/**"; + SWIFT_OBJC_BRIDGING_HEADER = "ReactNativeTests-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ReactNative.app/ReactNative"; + }; + name = Debug; + }; + 00E356F71AD99517003FC87E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 39099806D4750FF73C4975E3 /* Pods-ReactNativeTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ENABLE_MODULES = YES; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"${PODS_ROOT}/Headers/Public\"", + "\"${PODS_ROOT}/Headers/Public/CocoaAsyncSocket\"", + "\"${PODS_ROOT}/Headers/Public/DoubleConversion\"", + "\"${PODS_ROOT}/Headers/Public/FBLazyVector\"", + "\"${PODS_ROOT}/Headers/Public/RCT-Folly\"", + "\"${PODS_ROOT}/Headers/Public/RCTRequired\"", + "\"${PODS_ROOT}/Headers/Public/RCTTypeSafety\"", + "\"${PODS_ROOT}/Headers/Public/RNCMaskedView\"", + "\"${PODS_ROOT}/Headers/Public/RNGestureHandler\"", + "\"${PODS_ROOT}/Headers/Public/RNReanimated\"", + "\"${PODS_ROOT}/Headers/Public/RNScreens\"", + "\"${PODS_ROOT}/Headers/Public/RNVectorIcons\"", + "\"${PODS_ROOT}/Headers/Public/React-Codegen\"", + "\"${PODS_ROOT}/Headers/Public/React-Core\"", + "\"${PODS_ROOT}/Headers/Public/React-NativeModulesApple\"", + "\"${PODS_ROOT}/Headers/Public/React-RCTAnimation\"", + "\"${PODS_ROOT}/Headers/Public/React-RCTAppDelegate\"", + "\"${PODS_ROOT}/Headers/Public/React-RCTBlob\"", + "\"${PODS_ROOT}/Headers/Public/React-RCTText\"", + "\"${PODS_ROOT}/Headers/Public/React-callinvoker\"", + "\"${PODS_ROOT}/Headers/Public/React-cxxreact\"", + "\"${PODS_ROOT}/Headers/Public/React-debug\"", + "\"${PODS_ROOT}/Headers/Public/React-hermes\"", + "\"${PODS_ROOT}/Headers/Public/React-jsi\"", + "\"${PODS_ROOT}/Headers/Public/React-jsiexecutor\"", + "\"${PODS_ROOT}/Headers/Public/React-jsinspector\"", + "\"${PODS_ROOT}/Headers/Public/React-logger\"", + "\"${PODS_ROOT}/Headers/Public/React-perflogger\"", + "\"${PODS_ROOT}/Headers/Public/React-runtimeexecutor\"", + "\"${PODS_ROOT}/Headers/Public/React-runtimescheduler\"", + "\"${PODS_ROOT}/Headers/Public/React-utils\"", + "\"${PODS_ROOT}/Headers/Public/ReactCommon\"", + "\"${PODS_ROOT}/Headers/Public/SocketRocket\"", + "\"${PODS_ROOT}/Headers/Public/Yoga\"", + "\"${PODS_ROOT}/Headers/Public/YogaKit\"", + "\"${PODS_ROOT}/Headers/Public/fmt\"", + "\"${PODS_ROOT}/Headers/Public/glog\"", + "\"${PODS_ROOT}/Headers/Public/hermes-engine\"", + "\"${PODS_ROOT}/Headers/Public/libevent\"", + "\"${PODS_ROOT}/Headers/Public/react-native-safe-area-context\"", + "\"${PODS_ROOT}/Headers/Public/RNShopifyCheckoutSheetKit\"", + "\"$(PODS_ROOT)/DoubleConversion\"", + "\"$(PODS_ROOT)/boost\"", + "\"$(PODS_ROOT)/Headers/Private/React-Core\"", + "\"$(PODS_TARGET_SRCROOT)/include/\"", + "\"$(PODS_ROOT)/boost\"", + "\"$(PODS_ROOT)/boost-for-react-native\"", + "\"$(PODS_ROOT)/glog\"", + "\"$(PODS_ROOT)/RCT-Folly\"", + "\"$(PODS_ROOT)/Headers/Public/React-hermes\"", + "\"$(PODS_ROOT)/Headers/Public/hermes-engine\"", + "\"$(PODS_ROOT)/../../node_modules/react-native/ReactCommon\"", + "\"${PODS_ROOT}/Headers/Public/RNShopifyCheckoutSheetKit\"/**", + ); + INFOPLIST_FILE = ReactNativeTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + "$(inherited)", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.shopify.example.CheckoutKitReactNative; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_INCLUDE_PATHS = "$(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/ShopifyCheckoutSheetKit\" \"${PODS_CONFIGURATION_BUILD_DIR}/YogaKit\" \"${PODS_CONFIGURATION_BUILD_DIR}/RNShopifyCheckoutSheetKit\"/**"; + SWIFT_OBJC_BRIDGING_HEADER = "ReactNativeTests-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ReactNative.app/ReactNative"; + }; + name = Release; + }; + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = ED728EF8BB9B5E9BA9D50EBE /* Pods-ReactNative.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = ReactNative/ReactNative.entitlements; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = A7XGC83MZE; + ENABLE_BITCODE = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"${PODS_ROOT}/Headers/Public\"", + "\"${PODS_ROOT}/Headers/Public/CocoaAsyncSocket\"", + "\"${PODS_ROOT}/Headers/Public/DoubleConversion\"", + "\"${PODS_ROOT}/Headers/Public/FBLazyVector\"", + "\"${PODS_ROOT}/Headers/Public/RCT-Folly\"", + "\"${PODS_ROOT}/Headers/Public/RCTRequired\"", + "\"${PODS_ROOT}/Headers/Public/RCTTypeSafety\"", + "\"${PODS_ROOT}/Headers/Public/RNCMaskedView\"", + "\"${PODS_ROOT}/Headers/Public/RNGestureHandler\"", + "\"${PODS_ROOT}/Headers/Public/RNReanimated\"", + "\"${PODS_ROOT}/Headers/Public/RNScreens\"", + "\"${PODS_ROOT}/Headers/Public/RNVectorIcons\"", + "\"${PODS_ROOT}/Headers/Public/React-Codegen\"", + "\"${PODS_ROOT}/Headers/Public/React-Core\"", + "\"${PODS_ROOT}/Headers/Public/React-NativeModulesApple\"", + "\"${PODS_ROOT}/Headers/Public/React-RCTAnimation\"", + "\"$(SRCROOT)/Pods/ShopifyCheckoutSheetKit\"/**", + "\"${PODS_ROOT}/Headers/Public/React-RCTAppDelegate\"", + "\"${PODS_ROOT}/Headers/Public/React-RCTBlob\"", + "\"${PODS_ROOT}/Headers/Public/React-RCTText\"", + "\"${PODS_ROOT}/Headers/Public/React-callinvoker\"", + "\"${PODS_ROOT}/Headers/Public/React-cxxreact\"", + "\"${PODS_ROOT}/Headers/Public/React-debug\"", + "\"${PODS_ROOT}/Headers/Public/React-hermes\"", + "\"${PODS_ROOT}/Headers/Public/React-jsi\"", + "\"${PODS_ROOT}/Headers/Public/React-jsiexecutor\"", + "\"${PODS_ROOT}/Headers/Public/React-jsinspector\"", + "\"${PODS_ROOT}/Headers/Public/React-logger\"", + "\"${PODS_ROOT}/Headers/Public/React-perflogger\"", + "\"${PODS_ROOT}/Headers/Public/React-runtimeexecutor\"", + "\"${PODS_ROOT}/Headers/Public/React-runtimescheduler\"", + "\"${PODS_ROOT}/Headers/Public/React-utils\"", + "\"${PODS_ROOT}/Headers/Public/ReactCommon\"", + "\"${PODS_ROOT}/Headers/Public/SocketRocket\"", + "\"${PODS_ROOT}/Headers/Public/Yoga\"", + "\"${PODS_ROOT}/Headers/Public/YogaKit\"", + "\"${PODS_ROOT}/Headers/Public/fmt\"", + "\"${PODS_ROOT}/Headers/Public/glog\"", + "\"${PODS_ROOT}/Headers/Public/hermes-engine\"", + "\"${PODS_ROOT}/Headers/Public/libevent\"", + "\"${PODS_ROOT}/Headers/Public/react-native-safe-area-context\"", + "\"${PODS_ROOT}/Headers/Public/RNShopifyCheckoutSheetKit\"/**", + "\"$(PODS_ROOT)/DoubleConversion\"", + "\"$(PODS_ROOT)/boost\"", + "\"$(PODS_ROOT)/Headers/Private/React-Core\"", + "\"$(PODS_TARGET_SRCROOT)/include/\"", + "\"$(PODS_ROOT)/boost\"", + "\"$(PODS_ROOT)/boost-for-react-native\"", + "\"$(PODS_ROOT)/glog\"", + "\"$(PODS_ROOT)/RCT-Folly\"", + "\"$(PODS_ROOT)/Headers/Public/React-hermes\"", + "\"$(PODS_ROOT)/Headers/Public/hermes-engine\"", + "\"$(PODS_ROOT)/../../node_modules/react-native/ReactCommon\"", + ); + INFOPLIST_FILE = ReactNative/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "Checkout Kit React Native Demo"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.shopify.example.CheckoutKitReactNative; + PRODUCT_NAME = ReactNative; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SWIFT_OBJC_BRIDGING_HEADER = "ReactNative-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4EF1B8B6CA16C991C5BEE2F2 /* Pods-ReactNative.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = ReactNative/ReactNative.entitlements; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = A7XGC83MZE; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"${PODS_ROOT}/Headers/Public\"", + "\"${PODS_ROOT}/Headers/Public/CocoaAsyncSocket\"", + "\"${PODS_ROOT}/Headers/Public/DoubleConversion\"", + "\"${PODS_ROOT}/Headers/Public/FBLazyVector\"", + "\"${PODS_ROOT}/Headers/Public/RCT-Folly\"", + "\"${PODS_ROOT}/Headers/Public/RCTRequired\"", + "\"${PODS_ROOT}/Headers/Public/RCTTypeSafety\"", + "\"${PODS_ROOT}/Headers/Public/RNCMaskedView\"", + "\"${PODS_ROOT}/Headers/Public/RNGestureHandler\"", + "\"${PODS_ROOT}/Headers/Public/RNReanimated\"", + "\"${PODS_ROOT}/Headers/Public/RNScreens\"", + "\"${PODS_ROOT}/Headers/Public/RNVectorIcons\"", + "\"${PODS_ROOT}/Headers/Public/React-Codegen\"", + "\"${PODS_ROOT}/Headers/Public/React-Core\"", + "\"${PODS_ROOT}/Headers/Public/React-NativeModulesApple\"", + "\"${PODS_ROOT}/Headers/Public/React-RCTAnimation\"", + "\"$(SRCROOT)/Pods/ShopifyCheckoutSheetKit\"/**", + "\"${PODS_ROOT}/Headers/Public/React-RCTAppDelegate\"", + "\"${PODS_ROOT}/Headers/Public/React-RCTBlob\"", + "\"${PODS_ROOT}/Headers/Public/React-RCTText\"", + "\"${PODS_ROOT}/Headers/Public/React-callinvoker\"", + "\"${PODS_ROOT}/Headers/Public/React-cxxreact\"", + "\"${PODS_ROOT}/Headers/Public/React-debug\"", + "\"${PODS_ROOT}/Headers/Public/React-hermes\"", + "\"${PODS_ROOT}/Headers/Public/React-jsi\"", + "\"${PODS_ROOT}/Headers/Public/React-jsiexecutor\"", + "\"${PODS_ROOT}/Headers/Public/React-jsinspector\"", + "\"${PODS_ROOT}/Headers/Public/React-logger\"", + "\"${PODS_ROOT}/Headers/Public/React-perflogger\"", + "\"${PODS_ROOT}/Headers/Public/React-runtimeexecutor\"", + "\"${PODS_ROOT}/Headers/Public/React-runtimescheduler\"", + "\"${PODS_ROOT}/Headers/Public/React-utils\"", + "\"${PODS_ROOT}/Headers/Public/ReactCommon\"", + "\"${PODS_ROOT}/Headers/Public/SocketRocket\"", + "\"${PODS_ROOT}/Headers/Public/Yoga\"", + "\"${PODS_ROOT}/Headers/Public/YogaKit\"", + "\"${PODS_ROOT}/Headers/Public/fmt\"", + "\"${PODS_ROOT}/Headers/Public/glog\"", + "\"${PODS_ROOT}/Headers/Public/hermes-engine\"", + "\"${PODS_ROOT}/Headers/Public/libevent\"", + "\"${PODS_ROOT}/Headers/Public/react-native-safe-area-context\"", + "\"${PODS_ROOT}/Headers/Public/RNShopifyCheckoutSheetKit\"/**", + "\"$(PODS_ROOT)/DoubleConversion\"", + "\"$(PODS_ROOT)/boost\"", + "\"$(PODS_ROOT)/Headers/Private/React-Core\"", + "\"$(PODS_TARGET_SRCROOT)/include/\"", + "\"$(PODS_ROOT)/boost\"", + "\"$(PODS_ROOT)/boost-for-react-native\"", + "\"$(PODS_ROOT)/glog\"", + "\"$(PODS_ROOT)/RCT-Folly\"", + "\"$(PODS_ROOT)/Headers/Public/React-hermes\"", + "\"$(PODS_ROOT)/Headers/Public/hermes-engine\"", + "\"$(PODS_ROOT)/../../node_modules/react-native/ReactCommon\"", + ); + INFOPLIST_FILE = ReactNative/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "Checkout Kit React Native Demo"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.shopify.example.CheckoutKitReactNative; + PRODUCT_NAME = ReactNative; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SWIFT_OBJC_BRIDGING_HEADER = "ReactNative-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CC = ""; + 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; + CXX = ""; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; + 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)", + _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION, + ); + 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 = 16.6; + LD = ""; + LDPLUSPLUS = ""; + 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_CFLAGS = "$(inherited)"; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + "-DFOLLY_CFG_NO_COROUTINES=1", + ); + OTHER_LDFLAGS = "$(inherited)"; + REACT_NATIVE_PATH = "${PODS_ROOT}/../../../node_modules/react-native"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_OBJC_BRIDGING_HEADER = "ReactNative-Bridging-Header.h"; + USE_HERMES = true; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CC = ""; + 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; + CXX = ""; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION, + ); + 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 = 16.6; + LD = ""; + LDPLUSPLUS = ""; + 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_CFLAGS = "$(inherited)"; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + "-DFOLLY_CFG_NO_COROUTINES=1", + ); + OTHER_LDFLAGS = "$(inherited)"; + REACT_NATIVE_PATH = "${PODS_ROOT}/../../../node_modules/react-native"; + SDKROOT = iphoneos; + SWIFT_OBJC_BRIDGING_HEADER = "ReactNative-Bridging-Header.h"; + USE_HERMES = true; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ReactNativeTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 00E356F61AD99517003FC87E /* Debug */, + 00E356F71AD99517003FC87E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ReactNative" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "ReactNative" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/react-native/sample/ios/ReactNative.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/react-native/sample/ios/ReactNative.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/react-native/sample/ios/ReactNative.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/react-native/sample/ios/ReactNative.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/react-native/sample/ios/ReactNative.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/react-native/sample/ios/ReactNative.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/react-native/sample/ios/ReactNative.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/react-native/sample/ios/ReactNative.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 00000000..58fc765d --- /dev/null +++ b/react-native/sample/ios/ReactNative.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,14 @@ +{ + "pins" : [ + { + "identity" : "checkout-kit-swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/shopify/checkout-kit-swift", + "state" : { + "revision" : "3125cee51f53ec838d1d443f65cabdc14ff5e891", + "version" : "0.6.0" + } + } + ], + "version" : 2 +} diff --git a/react-native/sample/ios/ReactNative.xcodeproj/xcshareddata/xcschemes/ReactNative.xcscheme b/react-native/sample/ios/ReactNative.xcodeproj/xcshareddata/xcschemes/ReactNative.xcscheme new file mode 100644 index 00000000..e3e30f2e --- /dev/null +++ b/react-native/sample/ios/ReactNative.xcodeproj/xcshareddata/xcschemes/ReactNative.xcscheme @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-native/sample/ios/ReactNative.xcworkspace/contents.xcworkspacedata b/react-native/sample/ios/ReactNative.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..9b3933a9 --- /dev/null +++ b/react-native/sample/ios/ReactNative.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/react-native/sample/ios/ReactNative.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/react-native/sample/ios/ReactNative.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/react-native/sample/ios/ReactNative.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/react-native/sample/ios/ReactNative/Images.xcassets/AppIcon.appiconset/1024.jpg b/react-native/sample/ios/ReactNative/Images.xcassets/AppIcon.appiconset/1024.jpg new file mode 100644 index 0000000000000000000000000000000000000000..014b4f245d0195fa9bf5df925d13ce696b6abec8 GIT binary patch literal 261393 zcmbrm2~<<(+BO`;mex~s<=V9wGD16>UKCkZkTtq%E@B4gSx@KOq64%_q=Z{y!EnA7tFY)=a<^S97SO0IH z*M7T^yqEkTGkx#Bzx(EE{C^n!^OQ}Kt&y#lCCR>(Et74QeJq=AnS~K@#l5JAM5wo|NJh~ zB$EX*y}iAc{^xfy7@6$MUu3d@7yjpW;{s)}!GDs;u3t!6wr-j9I2Zigf7L3PtgA#O zb6X^n4ZVwd7O!75@eAque(!xLlfCu0x7R*KCUe~_lL@+rxkrGUu?-K zd}rjBXRZv7zSl8o;_`JrygTsy4?g_JWAvD@<31VhA28`Jfs>~wr%nGVEIeYy*Ym!a zzW@urV YS{=70e*K1xn^ICYr)BJN}Qe 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ࣰ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

pK*wI=x=|DZ*EXP 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 BH{1XK literal 0 HcmV?d00001 diff --git a/react-native/sample/ios/ReactNative/Images.xcassets/AppIcon.appiconset/Contents.json b/react-native/sample/ios/ReactNative/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..0fae87d5 --- /dev/null +++ b/react-native/sample/ios/ReactNative/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "1024.jpg", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/react-native/sample/ios/ReactNative/Images.xcassets/Contents.json b/react-native/sample/ios/ReactNative/Images.xcassets/Contents.json new file mode 100644 index 00000000..2d92bd53 --- /dev/null +++ b/react-native/sample/ios/ReactNative/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/react-native/sample/ios/ReactNative/Info.plist b/react-native/sample/ios/ReactNative/Info.plist new file mode 100644 index 00000000..eb830f68 --- /dev/null +++ b/react-native/sample/ios/ReactNative/Info.plist @@ -0,0 +1,74 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ReactNative + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleURLName + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleURLSchemes + + rn + + + + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + LSApplicationQueriesSchemes + + rn + + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSAllowsArbitraryLoadsForMedia + + NSAllowsLocalNetworking + + + NSLocationWhenInUseUsageDescription + Your location is required to locate pickup points near you. + RCTNewArchEnabled + + UIAppFonts + + Entypo.ttf + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/react-native/sample/ios/ReactNative/LaunchScreen.storyboard b/react-native/sample/ios/ReactNative/LaunchScreen.storyboard new file mode 100644 index 00000000..b954db79 --- /dev/null +++ b/react-native/sample/ios/ReactNative/LaunchScreen.storyboard @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-native/sample/ios/ReactNative/Localizable.xcstrings b/react-native/sample/ios/ReactNative/Localizable.xcstrings new file mode 100644 index 00000000..a06d4388 --- /dev/null +++ b/react-native/sample/ios/ReactNative/Localizable.xcstrings @@ -0,0 +1,18 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "shopify_checkout_sheet_title" : { + "comment" : "Checkout title", + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Checkout" + } + } + } + } + }, + "version" : "1.0" +} diff --git a/react-native/sample/ios/ReactNative/PrivacyInfo.xcprivacy b/react-native/sample/ios/ReactNative/PrivacyInfo.xcprivacy new file mode 100644 index 00000000..41b8317f --- /dev/null +++ b/react-native/sample/ios/ReactNative/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/react-native/sample/ios/ReactNativeTests-Bridging-Header.h b/react-native/sample/ios/ReactNativeTests-Bridging-Header.h new file mode 100644 index 00000000..1b2cb5d6 --- /dev/null +++ b/react-native/sample/ios/ReactNativeTests-Bridging-Header.h @@ -0,0 +1,4 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + diff --git a/react-native/sample/ios/ReactNativeTests/AcceleratedCheckouts_SupportedTests.swift b/react-native/sample/ios/ReactNativeTests/AcceleratedCheckouts_SupportedTests.swift new file mode 100644 index 00000000..1bca9fac --- /dev/null +++ b/react-native/sample/ios/ReactNativeTests/AcceleratedCheckouts_SupportedTests.swift @@ -0,0 +1,428 @@ +/* + MIT License + + Copyright 2023 - Present, Shopify Inc. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import Foundation +import PassKit +import SwiftUI +@testable import RNShopifyCheckoutSheetKit +@testable import ShopifyCheckoutSheetKit +import XCTest + +struct WalletButtons { + static let zero = Double(0) + static let one = Double(48) + static let two = Double(104) +} + +@available(iOS 16.0, *) +class AcceleratedCheckouts_SupportedTests: XCTestCase { + private var shopifyCheckoutSheetKit: RCTShopifyCheckoutSheetKit! + + override func setUp() { + super.setUp() + shopifyCheckoutSheetKit = RCTShopifyCheckoutSheetKit() + resetSharedConfigurations() + resetCheckoutKitDefaults() + } + + override func tearDown() { + resetSharedConfigurations() + shopifyCheckoutSheetKit = nil + super.tearDown() + } + + private func resetSharedConfigurations() { + AcceleratedCheckoutConfiguration.shared.configuration = nil + AcceleratedCheckoutConfiguration.shared.applePayConfiguration = nil + } + + private func resetCheckoutKitDefaults() { + ShopifyCheckoutSheetKit.configuration.preloading = Configuration.Preloading(enabled: true) + ShopifyCheckoutSheetKit.configuration.colorScheme = .automatic + ShopifyCheckoutSheetKit.configuration.closeButtonTintColor = nil + } + + private func configureAcceleratedCheckouts(includeApplePay: Bool, customerAccessToken: String? = nil) { + let expectation = self.expectation(description: "configureAcceleratedCheckouts") + + let storefrontDomain = "example.myshopify.com" + let accessToken = "shpat_test_token" + let email = "buyer@example.com" + let phone = "+12223334444" + let merchantIdentifier: String? = includeApplePay ? "merchant.com.shopify.reactnative.tests" : nil + let contactFields: [String]? = includeApplePay ? ["email", "phone"] : nil + let supportedShippingCountries: [String]? = includeApplePay ? ["IE", "CA"] : nil + + shopifyCheckoutSheetKit.configureAcceleratedCheckouts( + storefrontDomain, + storefrontAccessToken: accessToken, + customerEmail: email, + customerPhoneNumber: phone, + customerAccessToken: customerAccessToken, + applePayMerchantIdentifier: merchantIdentifier, + applyPayContactFields: contactFields, + supportedShippingCountries: supportedShippingCountries, + resolve: { _ in expectation.fulfill() }, + reject: { _, _, _ in } + ) + + wait(for: [expectation], timeout: 2) + } + + func testConfigureAcceleratedCheckoutsSetsSharedConfigsOnIOS16() throws { + let notificationExpectation = expectation(forNotification: Notification.Name("AcceleratedCheckoutConfigurationUpdated"), object: nil, handler: nil) + configureAcceleratedCheckouts(includeApplePay: true) + wait(for: [notificationExpectation], timeout: 2) + XCTAssertNotNil(AcceleratedCheckoutConfiguration.shared.configuration) + XCTAssertNotNil(AcceleratedCheckoutConfiguration.shared.applePayConfiguration) + } + + func testIsAcceleratedCheckoutAvailableBeforeAndAfterConfig() throws { + let beforeExpectation = expectation(description: "isAcceleratedCheckoutAvailable before") + var beforeValue: Bool = true + shopifyCheckoutSheetKit.isAcceleratedCheckoutAvailable({ value in + beforeValue = (value as? Bool) ?? true + beforeExpectation.fulfill() + }, reject: { _, _, _ in }) + wait(for: [beforeExpectation], timeout: 2) + XCTAssertEqual(beforeValue, false) + + configureAcceleratedCheckouts(includeApplePay: false) + + let afterExpectation = expectation(description: "isAcceleratedCheckoutAvailable after") + var afterValue: Bool = false + shopifyCheckoutSheetKit.isAcceleratedCheckoutAvailable({ value in + afterValue = (value as? Bool) ?? false + afterExpectation.fulfill() + }, reject: { _, _, _ in }) + wait(for: [afterExpectation], timeout: 2) + XCTAssertEqual(afterValue, true) + } + + func testIsApplePayAvailableRequiresApplePayConfig() throws { + let beforeExpectation = expectation(description: "isApplePayAvailable before") + var beforeValue: Bool = true + shopifyCheckoutSheetKit.isApplePayAvailable({ value in + beforeValue = (value as? Bool) ?? true + beforeExpectation.fulfill() + }, reject: { _, _, _ in }) + wait(for: [beforeExpectation], timeout: 2) + XCTAssertEqual(beforeValue, false) + + configureAcceleratedCheckouts(includeApplePay: false) + + let withoutApplePayExpectation = expectation(description: "isApplePayAvailable without Apple Pay") + var withoutApplePayValue: Bool = true + shopifyCheckoutSheetKit.isApplePayAvailable({ value in + withoutApplePayValue = (value as? Bool) ?? true + withoutApplePayExpectation.fulfill() + }, reject: { _, _, _ in }) + wait(for: [withoutApplePayExpectation], timeout: 2) + XCTAssertEqual(withoutApplePayValue, false) + + configureAcceleratedCheckouts(includeApplePay: true) + + let afterExpectation = expectation(description: "isApplePayAvailable after") + var afterValue: Bool = false + shopifyCheckoutSheetKit.isApplePayAvailable({ value in + afterValue = (value as? Bool) ?? false + afterExpectation.fulfill() + }, reject: { _, _, _ in }) + wait(for: [afterExpectation], timeout: 2) + XCTAssertEqual(afterValue, true) + } + + func testConfigureAcceleratedCheckoutsStoresCustomerAccessToken() throws { + let token = "customer-access-token-123" + configureAcceleratedCheckouts(includeApplePay: false, customerAccessToken: token) + guard let config = AcceleratedCheckoutConfiguration.shared.configuration else { + return XCTFail("configuration missing") + } + XCTAssertEqual(config.customer?.copy().customerAccessToken, token) + } + + func testConfigureAcceleratedCheckoutsWithNilCustomerAccessToken() throws { + configureAcceleratedCheckouts(includeApplePay: false, customerAccessToken: nil) + guard let config = AcceleratedCheckoutConfiguration.shared.configuration else { + return XCTFail("configuration missing") + } + XCTAssertNil(config.customer?.copy().customerAccessToken) + } + + func testButtonsViewHeightZeroWhenWalletsExplicitEmpty() throws { + configureAcceleratedCheckouts(includeApplePay: false) + + let viewExpectation = expectation(description: "onSizeChange height 0 for empty wallets") + + let view = RCTAcceleratedCheckoutButtonsView() + view.checkoutIdentifier = ["cartId": "gid://shopify/Cart/1"] + view.onSizeChange = { payload in + guard let payload = payload else { return } + let height = (payload["height"] as? NSNumber)?.doubleValue ?? 0 + if height == WalletButtons.zero { + viewExpectation.fulfill() + } + } + view.wallets = [] + + wait(for: [viewExpectation], timeout: 2) + } + + func testButtonsViewHeightReflectsWalletCountWhenWalletsProvided() throws { + configureAcceleratedCheckouts(includeApplePay: false) + + let viewExpectation = expectation(description: "onSizeChange height for two wallets") + var fulfilled = false + + let view = RCTAcceleratedCheckoutButtonsView() + view.checkoutIdentifier = ["cartId": "gid://shopify/Cart/1"] + view.onSizeChange = { payload in + if fulfilled { return } + guard let payload = payload else { return } + + let height = (payload["height"] as? NSNumber)?.doubleValue ?? -1 + + if height == WalletButtons.two { + fulfilled = true + viewExpectation.fulfill() + } + } + view.wallets = ["applePay", "shopPay"] + + wait(for: [viewExpectation], timeout: 2) + } + + func testButtonsViewEmptyWhenContainingUnknownWallets() throws { + configureAcceleratedCheckouts(includeApplePay: false) + + let viewExpectation = expectation(description: "onSizeChange height 0 when contains unknown wallet") + var fulfilled = false + + let view = RCTAcceleratedCheckoutButtonsView() + view.checkoutIdentifier = ["cartId": "gid://shopify/Cart/1"] + view.onSizeChange = { payload in + if fulfilled { return } + guard let payload = payload else { return } + + let height = (payload["height"] as? NSNumber)?.doubleValue ?? -1 + + if height == WalletButtons.zero { + fulfilled = true + viewExpectation.fulfill() + } + } + view.wallets = ["applePay", "bogus", "shopPay"] + + wait(for: [viewExpectation], timeout: 2) + XCTAssertNil(view.instance) + } + + func testButtonsViewEmptyWhenCheckoutIdentifierMissingOrInvalid() throws { + configureAcceleratedCheckouts(includeApplePay: false) + + let missingExpectation = expectation(description: "height 0 when identifier missing") + let missing = RCTAcceleratedCheckoutButtonsView() + missing.onSizeChange = { payload in + guard let payload = payload else { return } + let height = (payload["height"] as? NSNumber)?.doubleValue ?? -1 + if height == 0 { missingExpectation.fulfill() } + } + _ = missing + NotificationCenter.default.post(name: Notification.Name("AcceleratedCheckoutConfigurationUpdated"), object: nil) + + wait(for: [missingExpectation], timeout: 2) + + let invalidExpectation = expectation(description: "height 0 when identifier invalid") + let invalid = RCTAcceleratedCheckoutButtonsView() + invalid.onSizeChange = { payload in + guard let payload = payload else { return } + let height = (payload["height"] as? NSNumber)?.doubleValue ?? -1 + if height == 0 { + invalidExpectation.fulfill() + } + } + invalid.checkoutIdentifier = ["variantId": "gid://shopify/ProductVariant/1", "quantity": 0] + + wait(for: [invalidExpectation], timeout: 2) + } + + func testButtonsViewAcceptsCartIdWithWhitespace() throws { + configureAcceleratedCheckouts(includeApplePay: false) + + let viewExpectation = expectation(description: "trimmed cartId renders non-zero height") + var fulfilledCart = false + + let view = RCTAcceleratedCheckoutButtonsView() + view.wallets = ["applePay", "shopPay"] + view.onSizeChange = { payload in + if fulfilledCart { return } + guard let payload = payload else { return } + let height = (payload["height"] as? NSNumber)?.doubleValue ?? -1 + if height == WalletButtons.two { + fulfilledCart = true + viewExpectation.fulfill() + } + } + view.checkoutIdentifier = ["cartId": " gid://shopify/Cart/1 "] + + wait(for: [viewExpectation], timeout: 2) + XCTAssertNotNil(view.instance) + } + + func testButtonsViewAcceptsVariantAndQuantity_withDefaultWallets() throws { + configureAcceleratedCheckouts(includeApplePay: false) + + let viewExpectation = expectation(description: "variant + quantity renders non-zero height") + var fulfilledVariant = false + + let view = RCTAcceleratedCheckoutButtonsView() + view.onSizeChange = { payload in + if fulfilledVariant { return } + guard let payload = payload else { return } + + let height = (payload["height"] as? NSNumber)?.doubleValue ?? -1 + + /// "Wallets" prop is nil, so default rendered (2 buttons) + if height == WalletButtons.two { + fulfilledVariant = true + viewExpectation.fulfill() + } + } + view.checkoutIdentifier = [ + "variantId": "gid://shopify/ProductVariant/123", + "quantity": NSNumber(value: 2) + ] + + wait(for: [viewExpectation], timeout: 2) + XCTAssertNotNil(view.instance) + } + + func testButtonsViewAcceptsVariantAndQuantity_withExplicitWallets() throws { + configureAcceleratedCheckouts(includeApplePay: false) + + let viewExpectation = expectation(description: "variant + quantity renders non-zero height") + var fulfilledVariant = false + + let view = RCTAcceleratedCheckoutButtonsView() + view.wallets = ["shopPay"] + view.onSizeChange = { payload in + if fulfilledVariant { return } + guard let payload = payload else { return } + + let height = (payload["height"] as? NSNumber)?.doubleValue ?? -1 + + /// Wallets prop is explicitly set, so must be respected + if height == WalletButtons.one { + fulfilledVariant = true + viewExpectation.fulfill() + } + } + view.checkoutIdentifier = [ + "variantId": "gid://shopify/ProductVariant/123", + "quantity": NSNumber(value: 2) + ] + + wait(for: [viewExpectation], timeout: 2) + XCTAssertNotNil(view.instance) + } + + func testButtonsViewRendersEmptyWhenWalletsArrayIsEmpty() throws { + configureAcceleratedCheckouts(includeApplePay: false) + + let viewExpectation = expectation(description: "variant + quantity renders non-zero height") + var fulfilledVariant = false + + let view = RCTAcceleratedCheckoutButtonsView() + view.wallets = [] + view.onSizeChange = { payload in + if fulfilledVariant { return } + guard let payload = payload else { return } + + let height = (payload["height"] as? NSNumber)?.doubleValue ?? -1 + + /// Wallets prop is explicitly set, so must be respected + if height == WalletButtons.zero { + fulfilledVariant = true + viewExpectation.fulfill() + } + } + view.checkoutIdentifier = [ + "variantId": "gid://shopify/ProductVariant/123", + "quantity": NSNumber(value: 2) + ] + + wait(for: [viewExpectation], timeout: 2) + XCTAssertNil(view.instance) + } + + func testButtonsViewHeightZeroWhenWalletsMapToEmptyUnknowns() throws { + configureAcceleratedCheckouts(includeApplePay: false) + + let view = RCTAcceleratedCheckoutButtonsView() + view.wallets = ["bogus", "unknown", "invalid"] + + let height = view.intrinsicContentSize.height + XCTAssertEqual(height, WalletButtons.zero) + XCTAssertNil(view.instance) + } + + func testApplePayLabelMapping_knownAndUnknownKeys() throws { + XCTAssertTrue(PayWithApplePayButtonLabel.from("buy") == .buy) + XCTAssertTrue(PayWithApplePayButtonLabel.from("checkout") == .checkout) + XCTAssertTrue(PayWithApplePayButtonLabel.from("continue") == .continue) + XCTAssertTrue(PayWithApplePayButtonLabel.from("plain") == .plain) + XCTAssertTrue(PayWithApplePayButtonLabel.from("unknown") == .plain) + XCTAssertTrue(PayWithApplePayButtonLabel.from("unknown", fallback: .buy) == .buy) + } + + func testConfigureAcceleratedCheckoutsResolvesFalseForInvalidApplePayContactField() throws { + let expectation = self.expectation(description: "configureAcceleratedCheckouts invalid contact field resolves false") + var resolved: Bool = true + + let storefrontDomain = "example.myshopify.com" + let accessToken = "shpat_test_token" + + shopifyCheckoutSheetKit.configureAcceleratedCheckouts( + storefrontDomain, + storefrontAccessToken: accessToken, + customerEmail: nil, + customerPhoneNumber: nil, + customerAccessToken: nil, + applePayMerchantIdentifier: "merchant.com.shopify.reactnative.tests", + applyPayContactFields: ["email", "not_a_field"], + supportedShippingCountries: [], + resolve: { value in + resolved = (value as? Bool) ?? true + expectation.fulfill() + }, + reject: { _, _, _ in } + ) + + wait(for: [expectation], timeout: 2) + XCTAssertEqual(resolved, false) + } +} + +private extension BinaryInteger { + var doubleValue: Double { Double(self) } +} diff --git a/react-native/sample/ios/ReactNativeTests/AcceleratedCheckouts_UnsupportedTests.swift b/react-native/sample/ios/ReactNativeTests/AcceleratedCheckouts_UnsupportedTests.swift new file mode 100644 index 00000000..2c5d7d67 --- /dev/null +++ b/react-native/sample/ios/ReactNativeTests/AcceleratedCheckouts_UnsupportedTests.swift @@ -0,0 +1,65 @@ +/* + MIT License + + Copyright 2023 - Present, Shopify Inc. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import Foundation +@testable import RNShopifyCheckoutSheetKit +import XCTest + +class AcceleratedCheckouts_UnsupportedTests: XCTestCase { + private var module: RCTShopifyCheckoutSheetKit! + private var manager: RCTAcceleratedCheckoutButtonsManager! + + override func setUp() { + super.setUp() + module = RCTShopifyCheckoutSheetKit() + manager = RCTAcceleratedCheckoutButtonsManager() + manager.supported = false + } + + override func tearDown() { + module = nil + manager = nil + super.tearDown() + } + + func testManagerReturnsFallbackViewOnPreIOS16() throws { + let view = manager.view() + XCTAssertEqual(String(describing: type(of: view!)), "UIView") + } + + func testAvailabilityAPIsReturnFalseOnPreIOS16() throws { + let accelExpectation = expectation(description: "isAcceleratedCheckoutAvailable false on <16") + module.isAcceleratedCheckoutAvailable({ value in + XCTAssertEqual(value as? Bool, false) + accelExpectation.fulfill() + }, reject: { _, _, _ in }) + + let applePayExpectation = expectation(description: "isApplePayAvailable false on <16") + module.isApplePayAvailable({ value in + XCTAssertEqual(value as? Bool, false) + applePayExpectation.fulfill() + }, reject: { _, _, _ in }) + + wait(for: [accelExpectation, applePayExpectation], timeout: 2) + } +} diff --git a/react-native/sample/ios/ReactNativeTests/CheckoutDidFailTests.swift b/react-native/sample/ios/ReactNativeTests/CheckoutDidFailTests.swift new file mode 100644 index 00000000..a8243e2d --- /dev/null +++ b/react-native/sample/ios/ReactNativeTests/CheckoutDidFailTests.swift @@ -0,0 +1,201 @@ +/* + MIT License + + Copyright 2023 - Present, Shopify Inc. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import Foundation +@testable import RNShopifyCheckoutSheetKit +@testable import ShopifyCheckoutSheetKit +import XCTest + +class CheckoutDidFailTests: XCTestCase { + private var shopifyCheckoutSheetKit: RCTShopifyCheckoutSheetKit! + + override func setUp() { + super.setUp() + shopifyCheckoutSheetKit = getShopifyCheckoutSheetKit() + resetShopifyCheckoutSheetKitDefaults() + } + + private func resetShopifyCheckoutSheetKitDefaults() { + ShopifyCheckoutSheetKit.configuration.preloading = Configuration.Preloading(enabled: true) + ShopifyCheckoutSheetKit.configuration.colorScheme = .automatic + } + + override func tearDown() { + shopifyCheckoutSheetKit = nil + super.tearDown() + } + + private func getShopifyCheckoutSheetKit() -> RCTShopifyCheckoutSheetKit { + return RCTShopifyCheckoutSheetKit() + } + + func testCheckoutDidFailEmitsCheckoutExpiredError() { + let mock = mockSendEvent(eventName: "error") + mock.startObserving() + + let error = CheckoutError.checkoutExpired( + message: "expired", + code: CheckoutErrorCode.cartExpired, + recoverable: false + ) + + mock.checkoutDidFail(error: error) + + XCTAssertTrue(mock.didSendEvent, "Event should have been sent when checkout fails") + + guard let eventBody = mock.eventBody as? [String: Any] else { + return XCTFail("Event body was not available or not in the correct format") + } + + if case .checkoutExpired = error { + XCTAssertEqual(eventBody["__typename"] as? String, "CheckoutExpiredError") + XCTAssertEqual(eventBody["message"] as? String, "expired") + XCTAssertEqual(eventBody["code"] as? String, CheckoutErrorCode.cartExpired.rawValue) + XCTAssertEqual(eventBody["recoverable"] as? Bool, false) + } else { + XCTFail("Expected checkoutExpiredError but found different error") + } + } + + func testCheckoutDidFailEmitsCheckoutClientError() { + let mock = mockSendEvent(eventName: "error") + mock.startObserving() + + let error = CheckoutError.checkoutUnavailable( + message: "expired", + code: .clientError(code: CheckoutErrorCode.cartExpired), + recoverable: false + ) + + mock.checkoutDidFail(error: error) + + XCTAssertTrue(mock.didSendEvent, "Event should have been sent when checkout fails") + + guard let eventBody = mock.eventBody as? [String: Any] else { + return XCTFail("Event body was not available or not in the correct format") + } + + if case .checkoutUnavailable = error { + XCTAssertEqual(eventBody["__typename"] as? String, "CheckoutClientError") + XCTAssertEqual(eventBody["message"] as? String, "expired") + XCTAssertEqual(eventBody["code"] as? String, CheckoutErrorCode.cartExpired.rawValue) + XCTAssertEqual(eventBody["recoverable"] as? Bool, false) + } else { + XCTFail("Expected checkoutClientError but found different error") + } + } + + func testCheckoutDidFailEmitsCheckoutHTTPError() { + let mock = mockSendEvent(eventName: "error") + mock.startObserving() + + let error = CheckoutError.checkoutUnavailable( + message: "internal server error", + code: .httpError(statusCode: 500), + recoverable: true + ) + + mock.checkoutDidFail(error: error) + + XCTAssertTrue(mock.didSendEvent, "Event should have been sent when checkout fails") + + guard let eventBody = mock.eventBody as? [String: Any] else { + return XCTFail("Event body was not available or not in the correct format") + } + + if case .checkoutUnavailable = error { + XCTAssertEqual(eventBody["__typename"] as? String, "CheckoutHTTPError") + XCTAssertEqual(eventBody["message"] as? String, "internal server error") + XCTAssertEqual(eventBody["statusCode"] as? Int, 500) + XCTAssertEqual(eventBody["recoverable"] as? Bool, true) + } else { + XCTFail("Expected checkoutClientError but found different error") + } + } + + func testCheckoutDidFailEmitsConfigurationError() { + let mock = mockSendEvent(eventName: "error") + mock.startObserving() + + let error = CheckoutError.configurationError( + message: "storefront password required", + code: CheckoutErrorCode.storefrontPasswordRequired, + recoverable: false + ) + + mock.checkoutDidFail(error: error) + + XCTAssertTrue(mock.didSendEvent, "Event should have been sent when checkout fails") + + guard let eventBody = mock.eventBody as? [String: Any] else { + return XCTFail("Event body was not available or not in the correct format") + } + + if case .configurationError = error { + XCTAssertEqual(eventBody["__typename"] as? String, "ConfigurationError") + XCTAssertEqual(eventBody["message"] as? String, "storefront password required") + XCTAssertEqual(eventBody["code"] as? String, CheckoutErrorCode.storefrontPasswordRequired.rawValue) + XCTAssertEqual(eventBody["recoverable"] as? Bool, false) + } else { + XCTFail("Expected CheckoutConfigurationError but found different error") + } + } + + func testCheckoutDidFailEmitsInternalError() { + let mock = mockSendEvent(eventName: "error") + mock.startObserving() + + let error = CheckoutError.sdkError( + underlying: NSError(domain: "com.shopify", code: 1001, userInfo: [NSLocalizedDescriptionKey: "failed"]), + recoverable: true + ) + + mock.checkoutDidFail(error: error) + + XCTAssertTrue(mock.didSendEvent, "Event should have been sent when checkout fails") + + guard let eventBody = mock.eventBody as? [String: Any] else { + return XCTFail("Event body was not available or not in the correct format") + } + + if case .sdkError = error { + XCTAssertEqual(eventBody["__typename"] as? String, "InternalError") + XCTAssertEqual(eventBody["message"] as? String, "failed") + XCTAssertEqual(eventBody["recoverable"] as? Bool, true) + } else { + XCTFail("Expected InternalError but found different error") + } + } + + private func mockSendEvent(eventName: String) -> RCTShopifyCheckoutSheetKitMock { + let mock = RCTShopifyCheckoutSheetKitMock() + mock.eventName = eventName + return mock + } + + private func mockAsyncSendEvent(eventName: String) -> AsyncRCTShopifyCheckoutSheetKitMock { + let mock = AsyncRCTShopifyCheckoutSheetKitMock() + mock.eventName = eventName + return mock + } +} diff --git a/react-native/sample/ios/ReactNativeTests/EventSerializationTests.swift b/react-native/sample/ios/ReactNativeTests/EventSerializationTests.swift new file mode 100644 index 00000000..bcecbfa9 --- /dev/null +++ b/react-native/sample/ios/ReactNativeTests/EventSerializationTests.swift @@ -0,0 +1,63 @@ +/* + MIT License + + Copyright 2023 - Present, Shopify Inc. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import Foundation +@testable import RNShopifyCheckoutSheetKit +import ShopifyCheckoutSheetKit +import XCTest + +@available(iOS 16.0, *) +class EventSerializationTests: XCTestCase { + + // MARK: - RenderState + + func testRenderStateSerialization_includesErrorReason() throws { + let serialized = ShopifyEventSerialization.serialize(renderState: .error(reason: "invariant_violation")) + XCTAssertEqual(serialized["state"], "error") + XCTAssertEqual(serialized["reason"], "invariant_violation") + } + + func testRenderStateSerialization_includesEmptyErrorReason() throws { + let serialized = ShopifyEventSerialization.serialize(renderState: .error(reason: "")) + XCTAssertEqual(serialized["state"], "error") + XCTAssertEqual(serialized["reason"], "") + } + + func testRenderStateSerialization_loadingAndRendered() throws { + let loading = ShopifyEventSerialization.serialize(renderState: .loading) + XCTAssertEqual(loading["state"], "loading") + XCTAssertNil(loading["reason"]) + + let rendered = ShopifyEventSerialization.serialize(renderState: .rendered) + XCTAssertEqual(rendered["state"], "rendered") + XCTAssertNil(rendered["reason"]) + } + + // MARK: - Click event + + func testClickEventSerialization() throws { + let url = URL(string: "https://shopify.dev/test")! + let serialized = ShopifyEventSerialization.serialize(clickEvent: url) + XCTAssertEqual(serialized["url"], url) + } +} diff --git a/react-native/sample/ios/ReactNativeTests/Info.plist b/react-native/sample/ios/ReactNativeTests/Info.plist new file mode 100644 index 00000000..ba72822e --- /dev/null +++ b/react-native/sample/ios/ReactNativeTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/react-native/sample/ios/ReactNativeTests/ShopifyCheckoutSheetKitTests.swift b/react-native/sample/ios/ReactNativeTests/ShopifyCheckoutSheetKitTests.swift new file mode 100644 index 00000000..1a246d0e --- /dev/null +++ b/react-native/sample/ios/ReactNativeTests/ShopifyCheckoutSheetKitTests.swift @@ -0,0 +1,524 @@ +/* + MIT License + + Copyright 2023 - Present, Shopify Inc. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import Foundation +@testable import RNShopifyCheckoutSheetKit +@testable import ShopifyCheckoutSheetKit +import XCTest + +class ShopifyCheckoutSheetKitTests: XCTestCase { + private var shopifyCheckoutSheetKit: RCTShopifyCheckoutSheetKit! + + override func setUp() { + super.setUp() + shopifyCheckoutSheetKit = getShopifyCheckoutSheetKit() + resetShopifyCheckoutSheetKitDefaults() + } + + override func tearDown() { + shopifyCheckoutSheetKit = nil + super.tearDown() + } + + private func resetShopifyCheckoutSheetKitDefaults() { + ShopifyCheckoutSheetKit.configuration.preloading = Configuration.Preloading(enabled: true) + ShopifyCheckoutSheetKit.configuration.colorScheme = .automatic + ShopifyCheckoutSheetKit.configuration.closeButtonTintColor = nil + ShopifyCheckoutSheetKit.configuration.logLevel = LogLevel.error + } + + private func getShopifyCheckoutSheetKit() -> RCTShopifyCheckoutSheetKit { + return RCTShopifyCheckoutSheetKit() + } + + /// getConfig + func testReturnsDefaultConfig() { + // Call getConfig and capture the result + var result: [String: Any]? + shopifyCheckoutSheetKit.getConfig({ config in result = config as? [String: Any] }, reject: { _, _, _ in }) + + // Verify that getConfig returned the expected result + XCTAssertEqual(result?["preloading"] as? Bool, true) + XCTAssertEqual(result?["colorScheme"] as? String, "automatic") + } + + /// configure + func testConfigure() { + let configuration: [AnyHashable: Any] = [ + "preloading": true, + "colorScheme": "dark", + "colors": [ + "ios": [ + "tintColor": "#FF0000", + "backgroundColor": "#0000FF" + ] + ] + ] + + shopifyCheckoutSheetKit.setConfig(configuration) + + XCTAssertTrue(ShopifyCheckoutSheetKit.configuration.preloading.enabled) + XCTAssertEqual(ShopifyCheckoutSheetKit.configuration.colorScheme, .dark) + XCTAssertEqual(ShopifyCheckoutSheetKit.configuration.tintColor, UIColor(hex: "#FF0000")) + XCTAssertEqual(ShopifyCheckoutSheetKit.configuration.backgroundColor, UIColor(hex: "#0000FF")) + } + + func testConfigureWithPartialConfig() { + let configuration: [AnyHashable: Any] = [ + "preloading": false + ] + + shopifyCheckoutSheetKit.setConfig(configuration) + + XCTAssertFalse(ShopifyCheckoutSheetKit.configuration.preloading.enabled) + } + + func testConfigureWithInvalidColors() { + let configuration: [AnyHashable: Any] = [ + "colors": [ + "ios": [ + "tintColor": "invalid" + ] + ] + ] + + let defaultColorFallback = UIColor(red: 0, green: 0, blue: 0, alpha: 1) + shopifyCheckoutSheetKit.setConfig(configuration) + + XCTAssertEqual(ShopifyCheckoutSheetKit.configuration.tintColor, defaultColorFallback) + } + + func testConfigureWithCloseButtonColor() { + let configuration: [AnyHashable: Any] = [ + "colors": [ + "ios": [ + "closeButtonColor": "#FF0000" + ] + ] + ] + + shopifyCheckoutSheetKit.setConfig(configuration) + + XCTAssertEqual(ShopifyCheckoutSheetKit.configuration.closeButtonTintColor, UIColor(hex: "#FF0000")) + } + + func testConfigureWithInvalidCloseButtonColor() { + let configuration: [AnyHashable: Any] = [ + "colors": [ + "ios": [ + "closeButtonColor": "invalid" + ] + ] + ] + + let defaultColorFallback = UIColor(red: 0, green: 0, blue: 0, alpha: 1) + shopifyCheckoutSheetKit.setConfig(configuration) + + XCTAssertEqual(ShopifyCheckoutSheetKit.configuration.closeButtonTintColor, defaultColorFallback) + } + + func testConfigureWithoutCloseButtonColor() { + let configuration: [AnyHashable: Any] = [ + "colors": [ + "ios": [ + "tintColor": "#FF0000" + ] + ] + ] + + shopifyCheckoutSheetKit.setConfig(configuration) + + // closeButtonTintColor should remain nil when not specified (uses system default) + XCTAssertNil(ShopifyCheckoutSheetKit.configuration.closeButtonTintColor) + } + + func testGetConfigIncludesCloseButtonColor() { + // Set a close button color + let configuration: [AnyHashable: Any] = [ + "colors": [ + "ios": [ + "closeButtonColor": "#00FF00" + ] + ] + ] + shopifyCheckoutSheetKit.setConfig(configuration) + + // Call getConfig and capture the result + var result: [String: Any]? + shopifyCheckoutSheetKit.getConfig({ config in result = config as? [String: Any] }, reject: { _, _, _ in }) + + // Verify that getConfig returned the close button color + XCTAssertNotNil(result?["closeButtonColor"]) + let returnedColor = result?["closeButtonColor"] as? UIColor + XCTAssertEqual(returnedColor, UIColor(hex: "#00FF00")) + } + + func testConfigureWithLogLevelDebug() { + let configuration: [AnyHashable: Any] = [ + "logLevel": "debug" + ] + + shopifyCheckoutSheetKit.setConfig(configuration) + + XCTAssertEqual(ShopifyCheckoutSheetKit.configuration.logLevel, LogLevel.debug) + } + + func testConfigureWithLogLevelError() { + let configuration: [AnyHashable: Any] = [ + "logLevel": "error" + ] + + shopifyCheckoutSheetKit.setConfig(configuration) + + XCTAssertEqual(ShopifyCheckoutSheetKit.configuration.logLevel, LogLevel.error) + } + + func testConfigureWithLogLevelNone() { + let configuration: [AnyHashable: Any] = [ + "logLevel": "none" + ] + + shopifyCheckoutSheetKit.setConfig(configuration) + + XCTAssertEqual(ShopifyCheckoutSheetKit.configuration.logLevel, LogLevel.none) + } + + func testConfigureWithInvalidLogLevelDefaultsToError() { + let configuration: [AnyHashable: Any] = [ + "logLevel": "invalid" + ] + + shopifyCheckoutSheetKit.setConfig(configuration) + + XCTAssertEqual(ShopifyCheckoutSheetKit.configuration.logLevel, LogLevel.error) + } + + func testLogLevelHandlesUppercaseDebug() { + let configuration: [AnyHashable: Any] = [ + "logLevel": "DEBUG" + ] + + shopifyCheckoutSheetKit.setConfig(configuration) + + XCTAssertEqual(ShopifyCheckoutSheetKit.configuration.logLevel, LogLevel.debug) + } + + func testLogLevelHandlesMixedCaseDebug() { + let configuration: [AnyHashable: Any] = [ + "logLevel": "Debug" + ] + + shopifyCheckoutSheetKit.setConfig(configuration) + + XCTAssertEqual(ShopifyCheckoutSheetKit.configuration.logLevel, LogLevel.debug) + } + + func testLogLevelHandlesUppercaseError() { + let configuration: [AnyHashable: Any] = [ + "logLevel": "ERROR" + ] + + shopifyCheckoutSheetKit.setConfig(configuration) + + XCTAssertEqual(ShopifyCheckoutSheetKit.configuration.logLevel, LogLevel.error) + } + + func testSetConfigWithoutLogLevelDefaultsToError() { + let configuration: [AnyHashable: Any] = [ + "preloading": true + ] + + shopifyCheckoutSheetKit.setConfig(configuration) + + XCTAssertEqual(ShopifyCheckoutSheetKit.configuration.logLevel, LogLevel.error) + } + + func testGetConfigIncludesLogLevel() { + let configuration: [AnyHashable: Any] = [ + "logLevel": "debug" + ] + shopifyCheckoutSheetKit.setConfig(configuration) + + var result: [String: Any]? + shopifyCheckoutSheetKit.getConfig({ config in result = config as? [String: Any] }, reject: { _, _, _ in }) + + XCTAssertEqual(result?["logLevel"] as? String, "debug") + } + + func testGetConfigReturnsDefaultLogLevel() { + var result: [String: Any]? + shopifyCheckoutSheetKit.getConfig({ config in result = config as? [String: Any] }, reject: { _, _, _ in }) + + XCTAssertEqual(result?["logLevel"] as? String, "error") + } + + func testGetConfigReturnsDebugForDebugLogLevel() { + let configuration: [AnyHashable: Any] = [ + "logLevel": "debug" + ] + shopifyCheckoutSheetKit.setConfig(configuration) + + var result: [String: Any]? + shopifyCheckoutSheetKit.getConfig({ config in result = config as? [String: Any] }, reject: { _, _, _ in }) + + XCTAssertEqual(result?["logLevel"] as? String, "debug") + } + + func testGetConfigReturnsErrorForErrorLogLevel() { + let configuration: [AnyHashable: Any] = [ + "logLevel": "error" + ] + shopifyCheckoutSheetKit.setConfig(configuration) + + var result: [String: Any]? + shopifyCheckoutSheetKit.getConfig({ config in result = config as? [String: Any] }, reject: { _, _, _ in }) + + XCTAssertEqual(result?["logLevel"] as? String, "error") + } + + func testGetConfigReturnsErrorForNoneLogLevel() { + let configuration: [AnyHashable: Any] = [ + "logLevel": "none" + ] + shopifyCheckoutSheetKit.setConfig(configuration) + + var result: [String: Any]? + shopifyCheckoutSheetKit.getConfig({ config in result = config as? [String: Any] }, reject: { _, _, _ in }) + + XCTAssertEqual(result?["logLevel"] as? String, "error") + } + + func testGetConfigReturnsErrorForInvalidLogLevel() { + let configuration: [AnyHashable: Any] = [ + "logLevel": "invalid" + ] + shopifyCheckoutSheetKit.setConfig(configuration) + + var result: [String: Any]? + shopifyCheckoutSheetKit.getConfig({ config in result = config as? [String: Any] }, reject: { _, _, _ in }) + + XCTAssertEqual(result?["logLevel"] as? String, "error") + } + + /// checkoutDidComplete + func testCheckoutDidCompleteSendsEvent() { + let event = CheckoutCompletedEvent( + orderDetails: CheckoutCompletedEvent.OrderDetails( + billingAddress: CheckoutCompletedEvent.Address( + address1: "650 King Street", + address2: nil, + city: "Toronto", + countryCode: "CA", + firstName: "Evelyn", + lastName: "Hartley", + name: "Shopify", + phone: nil, + postalCode: nil, + referenceId: nil, + zoneCode: "ON" + ), + cart: CheckoutCompletedEvent.CartInfo( + lines: [], + price: CheckoutCompletedEvent.Price( + discounts: nil, + shipping: CheckoutCompletedEvent.Money(amount: nil, currencyCode: nil), + subtotal: CheckoutCompletedEvent.Money(amount: nil, currencyCode: nil), + taxes: CheckoutCompletedEvent.Money(amount: nil, currencyCode: nil), + total: CheckoutCompletedEvent.Money(amount: nil, currencyCode: nil) + ), + token: "token" + ), + deliveries: nil, + email: "test@shopify.com", + id: "test-order-id", + paymentMethods: nil, + phone: nil + ) + ) + let mock = mockSendEvent(eventName: "completed") + + mock.startObserving() + mock.checkoutDidComplete(event: event) + + XCTAssertTrue(mock.didSendEvent) + if let eventBody = mock.eventBody as? CheckoutCompletedEvent { + XCTAssertEqual(eventBody.orderDetails.id, "test-order-id") + XCTAssertEqual(eventBody.orderDetails.billingAddress?.address1, "650 King Street") + XCTAssertEqual(eventBody.orderDetails.billingAddress?.name, "Shopify") + XCTAssertEqual(eventBody.orderDetails.email, "test@shopify.com") + XCTAssertEqual(eventBody.orderDetails.cart.token, "token") + } + } + + /// checkoutDidCancel + func testCheckoutDidCancelSendsEvent() { + let mock = mockAsyncSendEvent(eventName: "close") + + let expectation = self.expectation(description: "CheckoutDidCancel") + + mock.sendEventImplementation = { name, _ in + if name == "close" { + mock.didSendEvent = true + expectation.fulfill() + } + } + + mock.checkoutSheet = MockCheckoutSheet() + mock.startObserving() + mock.checkoutDidCancel() + + // Wait for the expectation to be fulfilled + waitForExpectations(timeout: 1, handler: nil) + + XCTAssertTrue(mock.didSendEvent) + + // swiftlint:disable:next force_cast + XCTAssertTrue((mock.checkoutSheet as! MockCheckoutSheet).dismissWasCalled) + } + + /// checkoutDidEmitWebPixelEvent + func testCheckoutDidEmitStandardWebPixelEvent() { + let mock = mockSendEvent(eventName: "pixel") + + let context = Context( + document: WebPixelsDocument( + characterSet: "utf8", + location: nil, + referrer: "test", + title: nil + ), + navigator: nil, + window: nil + ) + let event = StandardEvent(context: context, id: "test", name: "test", timestamp: "test", data: nil) + let pixelEvent = PixelEvent.standardEvent(event) + + mock.startObserving() + mock.checkoutDidEmitWebPixelEvent(event: pixelEvent) + + XCTAssertTrue(mock.didSendEvent) + if let eventBody = mock.eventBody as? [String: Any] { + XCTAssertEqual(eventBody["type"] as? String, "STANDARD") + XCTAssertEqual(eventBody["id"] as? String, "test") + XCTAssertEqual(eventBody["name"] as? String, "test") + XCTAssertEqual(eventBody["timestamp"] as? String, "test") + // swiftlint:disable:next force_cast + XCTAssertEqual(eventBody["context"] as! [String: [String: String?]], [ + "document": [ + "characterSet": "utf8", + "referrer": "test" + ] + ]) + } else { + XCTFail("Failed to parse standard event") + } + } + + func testCheckoutDidEmitCustomWebPixelEvent() { + let mock = mockSendEvent(eventName: "pixel") + + let context = Context( + document: WebPixelsDocument( + characterSet: "utf8", + location: nil, + referrer: "test", + title: nil + ), + navigator: nil, + window: nil + ) + let customData = "{\"nestedData\": {\"someAttribute\": \"456\"}}" + let event = CustomEvent(context: context, customData: customData, id: "test", name: "test", timestamp: "test") + let pixelEvent = PixelEvent.customEvent(event) + + mock.startObserving() + mock.checkoutDidEmitWebPixelEvent(event: pixelEvent) + + XCTAssertTrue(mock.didSendEvent) + if let eventBody = mock.eventBody as? [String: Any] { + XCTAssertEqual(eventBody["type"] as? String, "CUSTOM") + XCTAssertEqual(eventBody["id"] as? String, "test") + XCTAssertEqual(eventBody["name"] as? String, "test") + XCTAssertEqual(eventBody["timestamp"] as? String, "test") + // swiftlint:disable:next force_cast + XCTAssertEqual(eventBody["context"] as! [String: [String: String?]], [ + "document": [ + "characterSet": "utf8", + "referrer": "test" + ] + ]) + // swiftlint:disable:next force_cast + XCTAssertEqual(eventBody["customData"] as! [String: [String: String]], [ + "nestedData": [ + "someAttribute": "456" + ] + ]) + } else { + XCTFail("Failed to parse custom event") + } + } + + private func mockSendEvent(eventName: String) -> RCTShopifyCheckoutSheetKitMock { + let mock = RCTShopifyCheckoutSheetKitMock() + mock.eventName = eventName + return mock + } + + private func mockAsyncSendEvent(eventName: String) -> AsyncRCTShopifyCheckoutSheetKitMock { + let mock = AsyncRCTShopifyCheckoutSheetKitMock() + mock.eventName = eventName + return mock + } +} + +class RCTShopifyCheckoutSheetKitMock: RCTShopifyCheckoutSheetKit { + var didSendEvent = false + var eventName: String? + var eventBody: Any! + + override func sendEvent(withName name: String!, body: Any!) { + if name == eventName { + didSendEvent = true + eventBody = body + } + } +} + +class AsyncRCTShopifyCheckoutSheetKitMock: RCTShopifyCheckoutSheetKit { + var didSendEvent = false + var eventName: String? + var sendEventImplementation: ((String?, Any?) -> Void)? + + override func sendEvent(withName name: String!, body: Any!) { + sendEventImplementation?(name, body) + } +} + +class MockCheckoutSheet: UIViewController { + var dismissWasCalled = false + + override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) { + dismissWasCalled = true + super.dismiss(animated: flag, completion: completion) + } +} diff --git a/react-native/sample/package.json b/react-native/sample/package.json new file mode 100644 index 00000000..0a793a38 --- /dev/null +++ b/react-native/sample/package.json @@ -0,0 +1,84 @@ +{ + "name": "sample", + "version": "0.6.0", + "private": true, + "scripts": { + "android": "sh ./scripts/android", + "clean": "rm -rf node_modules ios/build ios/pods vendor", + "clean:android": "(cd android && ./gradlew clean)", + "build:android": "sh ./scripts/build_android", + "release:android": "sh ./scripts/release_android", + "build:ios": "sh ./scripts/build_ios", + "lint": "pnpm run typecheck && eslint .", + "ios": "react-native run-ios", + "start": "react-native start -- --reset-cache", + "typecheck": "tsc --noEmit", + "test:ios": "sh ./scripts/test_ios", + "test:android": "sh ./scripts/test_android" + }, + "dependencies": { + "@apollo/client": "^3.13.9", + "@react-navigation/bottom-tabs": "^7.4.6", + "@react-navigation/native": "^7.1.17", + "@react-navigation/native-stack": "^7.3.25", + "@react-navigation/stack": "^7.4.8", + "@shopify/checkout-sheet-kit": "workspace:*", + "graphql": "^16.8.2", + "jotai": "^2.13.1", + "react-native-config": "1.5.6", + "react-native-dotenv": "^3.4.11", + "react-native-encrypted-storage": "^4.0.3", + "react-native-nitro-modules": "^0.33.7", + "react-native-quick-base64": "^2.2.2", + "react-native-quick-crypto": "1.0.9", + "react-native-reanimated": "3.18.0", + "react-native-safe-area-context": "^5.6.1", + "react-native-screens": "4.16.0", + "react-native-vector-icons": "^10.3.0", + "react-native-webview": "^13.16.0" + }, + "peerDependencies": { + "@react-native/babel-preset": "*", + "@react-native/metro-config": "*", + "@types/react-native": "*", + "react": "*", + "react-native": "*" + }, + "devDependencies": { + "@babel/core": "^7.20.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.21.0", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/preset-env": "^7.20.0", + "@babel/runtime": "^7.27.6", + "@react-native-masked-view/masked-view": "^0.3.2", + "@types/react-native-vector-icons": "^6.4.18", + "@types/setimmediate": "^1", + "babel-plugin-module-resolver": "^5.0.0", + "setimmediate": "^1.0.5" + }, + "engines": { + "node": ">= 18" + }, + "eslintConfig": { + "root": true, + "extends": "@react-native", + "rules": { + "no-console": "off", + "@typescript-eslint/no-shadow": "off" + }, + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx" + ], + "rules": { + "@typescript-eslint/consistent-type-imports": "error" + } + } + ] + } +} diff --git a/react-native/sample/react-native.config.js b/react-native/sample/react-native.config.js new file mode 100644 index 00000000..93429c7b --- /dev/null +++ b/react-native/sample/react-native.config.js @@ -0,0 +1,60 @@ +const path = require('path'); + +const root = path.resolve(__dirname, '..'); + +const resolvePackageRoot = packageName => + path.dirname( + require.resolve(`${packageName}/package.json`, { + paths: [root, __dirname], + }), + ); + +module.exports = { + dependencies: { + '@react-native-masked-view/masked-view': { + root: resolvePackageRoot('@react-native-masked-view/masked-view'), + }, + react: { + root: resolvePackageRoot('react'), + }, + 'react-native': { + root: resolvePackageRoot('react-native'), + }, + 'react-native-config': { + root: resolvePackageRoot('react-native-config'), + }, + 'react-native-encrypted-storage': { + root: resolvePackageRoot('react-native-encrypted-storage'), + }, + 'react-native-gesture-handler': { + root: resolvePackageRoot('react-native-gesture-handler'), + }, + 'react-native-nitro-modules': { + root: resolvePackageRoot('react-native-nitro-modules'), + }, + 'react-native-quick-base64': { + root: resolvePackageRoot('react-native-quick-base64'), + }, + 'react-native-quick-crypto': { + root: resolvePackageRoot('react-native-quick-crypto'), + }, + 'react-native-reanimated': { + root: resolvePackageRoot('react-native-reanimated'), + }, + 'react-native-safe-area-context': { + root: resolvePackageRoot('react-native-safe-area-context'), + }, + 'react-native-screens': { + root: resolvePackageRoot('react-native-screens'), + }, + 'react-native-vector-icons': { + root: resolvePackageRoot('react-native-vector-icons'), + }, + 'react-native-webview': { + root: resolvePackageRoot('react-native-webview'), + }, + '@shopify/checkout-sheet-kit': { + root: path.resolve(root, 'modules', '@shopify/checkout-sheet-kit'), + }, + }, +}; diff --git a/react-native/sample/scripts/android b/react-native/sample/scripts/android new file mode 100755 index 00000000..44b610d6 --- /dev/null +++ b/react-native/sample/scripts/android @@ -0,0 +1,8 @@ +#!/usr/bin/env sh + +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +. "$SCRIPT_DIR/android_sccache" + +exec react-native run-android "$@" diff --git a/react-native/sample/scripts/android_sccache b/react-native/sample/scripts/android_sccache new file mode 100755 index 00000000..ba02b4a9 --- /dev/null +++ b/react-native/sample/scripts/android_sccache @@ -0,0 +1,22 @@ +#!/usr/bin/env sh + +# React Native's Android CMake files discover and invoke a command named +# `ccache`. Put an sccache-backed compatibility command first on PATH. +if [ "${SCCACHE:-}" = "false" ]; then + if command -v sccache >/dev/null 2>&1; then + sccache --stop-server 2>/dev/null || true + fi + return 0 2>/dev/null || exit 0 +fi + +if command -v sccache >/dev/null 2>&1; then + ANDROID_SCCACHE_SHIM_DIR="${TMPDIR:-/tmp}/checkout-sheet-kit-react-native-sccache" + mkdir -p "$ANDROID_SCCACHE_SHIM_DIR" + cat > "$ANDROID_SCCACHE_SHIM_DIR/ccache" <<'EOF' +#!/usr/bin/env sh +exec sccache "$@" +EOF + chmod +x "$ANDROID_SCCACHE_SHIM_DIR/ccache" + export PATH="$ANDROID_SCCACHE_SHIM_DIR:$PATH" + export RUSTC_WRAPPER="${RUSTC_WRAPPER:-sccache}" +fi diff --git a/react-native/sample/scripts/build_android b/react-native/sample/scripts/build_android new file mode 100755 index 00000000..27c536cb --- /dev/null +++ b/react-native/sample/scripts/build_android @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +set -ex + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +. "$SCRIPT_DIR/android_sccache" + +cd android + +./gradlew assembleDebug --no-daemon --console=plain -PreactNativeArchitectures=arm64-v8a diff --git a/react-native/sample/scripts/build_ios b/react-native/sample/scripts/build_ios new file mode 100755 index 00000000..e5cd5a16 --- /dev/null +++ b/react-native/sample/scripts/build_ios @@ -0,0 +1,36 @@ + #!/usr/bin/env bash + +set -ex +set -eo pipefail + +# Add sccache for faster compilation outside of CI environments +# Can be disabled with SCCACHE=false for debugging or matching CI behavior locally +if [ "$CI" = "true" ] || [ "$SCCACHE" = "false" ]; then + # CI detected or sccache explicitly disabled - skipping sccache for clean builds + if command -v sccache >/dev/null 2>&1; then + sccache --stop-server 2>/dev/null || true + fi +else + if command -v sccache >/dev/null 2>&1; then + export RUSTC_WRAPPER=sccache + export CC="sccache clang" + export CXX="sccache clang++" + fi +fi + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "$SCRIPT_DIR/simulator" +dest="$(get_sim_destination)" + +cd ios + +xcodebuild clean build \ + -workspace ReactNative.xcworkspace \ + -scheme ReactNative \ + -sdk iphonesimulator \ + -destination "$dest" \ + -skipPackagePluginValidation \ + GCC_PRECOMPILE_PREFIX_HEADER=YES \ + ASSETCATALOG_COMPILER_OPTIMIZATION=time \ + COMPILER_INDEX_STORE_ENABLE=NO \ +| xcbeautify diff --git a/react-native/sample/scripts/release_android b/react-native/sample/scripts/release_android new file mode 100755 index 00000000..e3f21863 --- /dev/null +++ b/react-native/sample/scripts/release_android @@ -0,0 +1,46 @@ +#!/usr/bin/env bash + +# Working directory is "sample" when running "pnpm sample release:android" from root. + +# Exit immediately if a command exits with a non-zero status +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +. "$SCRIPT_DIR/android_sccache" + +# Print each command as it is executed +set -x + +mkdir -p android/app/src/main/assets +npx react-native bundle --platform android \ + --dev false \ + --entry-file index.js \ + --bundle-output android/app/src/main/assets/index.android.bundle \ + +# Generate release build (.aab file) +npx react-native build-android --mode=release + +# Generate APK (for testing) +cd android +./gradlew clean assembleRelease + +# Stop printing commands +set +x + +cat << EOF + + +Run "cd sample && npx react-native run-android --mode release" to test the release build. + +Output files: + - sample/android/app/build/outputs/bundle/release/app-release.aab (Upload to Play Store) + - sample/android/app/build/outputs/apk/release/app-release.apk (For testing) + +To install the release build: + - Ensure an emulator or device is connected + - Uninstall existing version: adb uninstall com.shopify.checkoutkitreactnative + - Install new version: adb install android/app/build/outputs/apk/release/app-release.apk + +To observe the production logs for your emulator/device: + - Run "adb logcat" +EOF diff --git a/react-native/sample/scripts/simulator b/react-native/sample/scripts/simulator new file mode 100644 index 00000000..a84a288b --- /dev/null +++ b/react-native/sample/scripts/simulator @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +# Determine an iOS Simulator destination string for xcodebuild. +get_sim_destination() { + if [[ -n "$CURRENT_SIMULATOR_UUID" ]]; then + echo "id=$CURRENT_SIMULATOR_UUID" + return + fi + + # Prefer a currently booted iOS simulator (iPhone or iPad) + local udid + udid="$(xcrun simctl list devices booted \ + | grep -E 'iPhone|iPad' \ + | sed -n -E 's/.*\(([0-9A-Fa-f-]{36})\).*/\1/p' \ + | head -n1)" + + # If none booted, pick the first available iOS simulator (iPhone or iPad) + if [[ -z "$udid" ]]; then + udid="$(xcrun simctl list devices available \ + | grep -E 'iPhone|iPad' \ + | sed -n -E 's/.*\(([0-9A-Fa-f-]{36})\).*/\1/p' \ + | head -n1)" + fi + + if [[ -n "$udid" ]]; then + echo "id=$udid" + else + echo "platform=iOS Simulator,name=iPhone 15 Pro" + fi +} + + diff --git a/react-native/sample/scripts/test_android b/react-native/sample/scripts/test_android new file mode 100755 index 00000000..a75e5496 --- /dev/null +++ b/react-native/sample/scripts/test_android @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +. "$SCRIPT_DIR/android_sccache" + +cd android + +./gradlew clean generateAndroidManifestFromTemplate test --no-daemon --console=plain -Dorg.gradle.workers.max=1 -PreactNativeArchitectures=arm64-v8a diff --git a/react-native/sample/scripts/test_ios b/react-native/sample/scripts/test_ios new file mode 100755 index 00000000..fbca71b9 --- /dev/null +++ b/react-native/sample/scripts/test_ios @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +set -e -o pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "$SCRIPT_DIR/simulator" +dest="$(get_sim_destination)" + +cd ios + +xcodebuild test \ + -workspace ReactNative.xcworkspace \ + -scheme ReactNative \ + -destination "$dest" \ + -skipPackagePluginValidation \ + -sdk iphonesimulator \ + ASSETCATALOG_COMPILER_OPTIMIZATION=time \ + COMPILER_INDEX_STORE_ENABLE=NO \ +| xcbeautify --renderer github-actions diff --git a/react-native/sample/src/App.tsx b/react-native/sample/src/App.tsx new file mode 100644 index 00000000..b67bd33d --- /dev/null +++ b/react-native/sample/src/App.tsx @@ -0,0 +1,585 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +import type {PropsWithChildren, ReactNode} from 'react'; +import React, {useCallback, useEffect, useMemo, useState} from 'react'; +import {Appearance, Linking, Pressable, StatusBar} from 'react-native'; +import { + NavigationContainer, + useNavigation, + type NavigationProp, +} from '@react-navigation/native'; +import {createBottomTabNavigator} from '@react-navigation/bottom-tabs'; +import {createNativeStackNavigator} from '@react-navigation/native-stack'; +import {ApolloClient, InMemoryCache, ApolloProvider} from '@apollo/client'; +import Icon from 'react-native-vector-icons/Entypo'; + +import CatalogScreen from './screens/CatalogScreen'; +import SettingsScreen from './screens/SettingsScreen'; +import AccountScreen from './screens/AccountScreen'; +import LoginScreen from './screens/LoginScreen'; + +import type {Configuration, Features} from '@shopify/checkout-sheet-kit'; +import { + ApplePayContactField, + ColorScheme, + LogLevel, + ShopifyCheckoutSheetProvider, + useShopifyCheckoutSheet, +} from '@shopify/checkout-sheet-kit'; +import type { + CheckoutCompletedEvent, + CheckoutException, + PixelEvent, +} from '@shopify/checkout-sheet-kit'; +import {ConfigProvider, useConfig} from './context/Config'; +import {BuyerIdentityMode} from './auth/types'; +import { + ThemeProvider, + darkColors, + getColors, + getNavigationTheme, + lightColors, + useTheme, +} from './context/Theme'; +import {CartProvider, useCart} from './context/Cart'; +import {useAuth} from './context/Auth'; +import CartScreen from './screens/CartScreen'; +import ProductDetailsScreen from './screens/ProductDetailsScreen'; +import type {ProductVariant, ShopifyProduct} from '../@types'; +import ErrorBoundary from './ErrorBoundary'; +import env from 'react-native-config'; +import {createDebugLogger} from './utils'; +import {useShopifyEventHandlers} from './hooks/useCheckoutEventHandlers'; + +const log = createDebugLogger('ENV'); + +function quote(str: string | undefined) { + return `"${str}"`; +} + +console.groupCollapsed('ENV'); +log('STOREFRONT_DOMAIN:', quote(env.STOREFRONT_DOMAIN)); +log( + 'STOREFRONT_ACCESS_TOKEN:', + '*'.repeat(8) + env.STOREFRONT_ACCESS_TOKEN?.slice(-4), +); +log('STOREFRONT_VERSION:', quote(env.STOREFRONT_VERSION)); +log( + 'STOREFRONT_MERCHANT_IDENTIFIER:', + quote(env.STOREFRONT_MERCHANT_IDENTIFIER), +); +log('EMAIL:', quote(env.EMAIL)); +log('PHONE:', quote(env.PHONE)); +console.groupEnd(); + +export type RootStackParamList = { + Catalog: undefined; + CatalogScreen: undefined; + ProductDetails: {product: ShopifyProduct; variant?: ProductVariant}; + Cart: undefined; + CartModal: undefined; + Account: undefined; + Settings: undefined; +}; + +export type AccountStackParamList = { + AccountHome: undefined; + Login: undefined; +}; + +const Tab = createBottomTabNavigator(); +const Stack = createNativeStackNavigator(); +const AccountStack = createNativeStackNavigator(); + +export const cache = new InMemoryCache(); + +const client = new ApolloClient({ + uri: `https://${env.STOREFRONT_DOMAIN}/api/${env.STOREFRONT_VERSION}/graphql.json`, + cache, + headers: { + 'Content-Type': 'application/json', + 'X-Shopify-Storefront-Access-Token': env.STOREFRONT_ACCESS_TOKEN ?? '', + }, + connectToDevTools: __DEV__, +}); + +function AppWithTheme({children}: PropsWithChildren) { + const {colorScheme} = useTheme(); + + return ( + + {children} + + ); +} + +const createNavigationIcon = + (name: string) => + ({ + color, + size, + }: { + color: string; + size: number; + focused?: boolean; + }): ReactNode => { + return ; + }; + +// See https://reactnative.dev/docs/linking#get-the-deep-link for more information +const useInitialURL = (): {url: string | null} => { + const [url, setUrl] = useState(null); + + useEffect(() => { + const getUrlAsync = async () => { + // Get the deep link used to open the app + const initialUrl = await Linking.getInitialURL(); + + if (initialUrl !== url) { + setUrl(initialUrl); + } + }; + + getUrlAsync(); + }, [url]); + + return { + url, + }; +}; + +// This code is meant as example only. +class StorefrontURL { + readonly url: string; + + constructor(url: string) { + this.url = url; + } + + isThankYouPage(): boolean { + return /thank[-_]you/i.test(this.url); + } + + isCheckout(): boolean { + return this.url.includes('/checkout'); + } + + isCart() { + return this.url.includes('/cart'); + } +} + +const checkoutKitConfigDefaults: Configuration = { + logLevel: LogLevel.debug, + colorScheme: ColorScheme.dark, + preloading: true, + colors: { + ios: { + backgroundColor: '#f0f0e8', + tintColor: '#2d2a38', + }, + android: { + backgroundColor: '#f0f0e8', + progressIndicator: '#2d2a38', + headerBackgroundColor: '#f0f0e8', + headerTextColor: '#2d2a38', + }, + }, +}; + +function AppWithContext({children}: PropsWithChildren) { + const shopify = useShopifyCheckoutSheet(); + const eventHandlers = useShopifyEventHandlers(); + + useEffect(() => { + const close = shopify.addEventListener('close', () => { + eventHandlers.onCancel?.(); + }); + + const pixel = shopify.addEventListener('pixel', (event: PixelEvent) => { + eventHandlers.onWebPixelEvent?.(event); + }); + + const completed = shopify.addEventListener( + 'completed', + (event: CheckoutCompletedEvent) => { + eventHandlers.onComplete?.(event); + }, + ); + + const error = shopify.addEventListener( + 'error', + (error: CheckoutException) => { + eventHandlers.onFail?.(error); + }, + ); + + return () => { + pixel?.remove(); + completed?.remove(); + close?.remove(); + error?.remove(); + }; + }, [shopify, eventHandlers]); + + return ( + + + + {children} + + + ); +} + +function CatalogStack() { + return ( + ({ + headerBackTitle: 'Back', + // eslint-disable-next-line react/no-unstable-nested-components + headerRight: () => ( + + navigation.getParent()?.navigate('Catalog', {screen: 'CartModal'}) + } + /> + ), + })}> + + ({ + headerTitle: route.params.product.title, + headerShown: true, + headerBackVisible: true, + headerBackTitle: 'Back', + })} + /> + + + ); +} + +function CartIcon({onPress}: {onPress: () => void}) { + const theme = useTheme(); + + return ( + + + + ); +} + +function AccountStackScreen() { + return ( + + + + + ); +} + +function AppWithCheckoutKit({children}: PropsWithChildren) { + const {appConfig} = useConfig(); + const {isAuthenticated, customerEmail, getValidAccessToken} = useAuth(); + const [accessToken, setAccessToken] = useState(null); + + const fetchAccessToken = useCallback(async () => { + if ( + appConfig.buyerIdentityMode === BuyerIdentityMode.CustomerAccount && + isAuthenticated + ) { + const token = await getValidAccessToken(); + setAccessToken(token); + } else { + setAccessToken(null); + } + }, [appConfig.buyerIdentityMode, isAuthenticated, getValidAccessToken]); + + useEffect(() => { + fetchAccessToken(); + }, [fetchAccessToken]); + + const updatedColors = getColors( + appConfig.colorScheme, + Appearance.getColorScheme(), + ); + + const checkoutKitThemeConfig: Configuration = useMemo(() => { + if (appConfig.colorScheme === ColorScheme.automatic) { + return { + colorScheme: ColorScheme.automatic, + colors: { + ios: { + backgroundColor: updatedColors.webviewBackgroundColor, + tintColor: updatedColors.webViewProgressIndicator, + }, + android: { + light: { + backgroundColor: lightColors.webviewBackgroundColor, + progressIndicator: lightColors.webViewProgressIndicator, + headerBackgroundColor: lightColors.webviewBackgroundColor, + headerTextColor: lightColors.webviewHeaderTextColor, + closeButtonColor: lightColors.webviewCloseButtonColor, + }, + dark: { + backgroundColor: darkColors.webviewBackgroundColor, + progressIndicator: darkColors.webViewProgressIndicator, + headerBackgroundColor: darkColors.webviewBackgroundColor, + headerTextColor: darkColors.webviewHeaderTextColor, + closeButtonColor: darkColors.webviewCloseButtonColor, + }, + }, + }, + }; + } + + return { + colorScheme: appConfig.colorScheme, + colors: { + ios: { + backgroundColor: updatedColors.webviewBackgroundColor, + tintColor: updatedColors.webViewProgressIndicator, + closeButtonColor: updatedColors.webviewCloseButtonColor, + }, + android: { + backgroundColor: updatedColors.webviewBackgroundColor, + progressIndicator: updatedColors.webViewProgressIndicator, + headerBackgroundColor: updatedColors.webviewBackgroundColor, + headerTextColor: updatedColors.webviewHeaderTextColor, + closeButtonColor: updatedColors.webviewCloseButtonColor, + }, + }, + }; + }, [appConfig.colorScheme, updatedColors]); + + const checkoutKitConfig: Configuration = useMemo(() => { + return { + ...checkoutKitConfigDefaults, + ...checkoutKitThemeConfig, + colors: { + ...checkoutKitThemeConfig.colors, + ios: { + ...checkoutKitThemeConfig.colors?.ios, + ...checkoutKitConfigDefaults.colors?.ios, + }, + android: + appConfig.colorScheme === ColorScheme.automatic + ? checkoutKitThemeConfig.colors?.android + : { + ...checkoutKitThemeConfig.colors?.android, + ...checkoutKitConfigDefaults.colors?.android, + }, + }, + acceleratedCheckouts: { + storefrontDomain: env.STOREFRONT_DOMAIN!, + storefrontAccessToken: env.STOREFRONT_ACCESS_TOKEN!, + /** + * We're reading the customer email and phone number from the environment variables here, + * but in a real app you would derive these values from your backend. + */ + customer: + appConfig.buyerIdentityMode === BuyerIdentityMode.Hardcoded + ? { + email: env.EMAIL!, + phoneNumber: env.PHONE!, + } + : appConfig.buyerIdentityMode === + BuyerIdentityMode.CustomerAccount && isAuthenticated + ? { + email: customerEmail ?? undefined, + accessToken: accessToken ?? undefined, + } + : undefined, + wallets: { + applePay: { + contactFields: [ + ApplePayContactField.email, + ApplePayContactField.phone, + ], + merchantIdentifier: env.STOREFRONT_MERCHANT_IDENTIFIER!, + }, + }, + }, + } as Configuration; + }, [appConfig, checkoutKitThemeConfig, isAuthenticated, customerEmail, accessToken]); + + return ( + + {children} + + ); +} + +function AppWithNavigation(props: {children: React.ReactNode}) { + const {colorScheme, preference} = useTheme(); + return ( + + {props.children} + + ); +} + +function Routes() { + const {totalQuantity} = useCart(); + const navigation = useNavigation>(); + const {url: initialUrl} = useInitialURL(); + const shopify = useShopifyCheckoutSheet(); + + useEffect(() => { + async function handleUniversalLink(url: string) { + const storefrontUrl = new StorefrontURL(url); + + switch (true) { + // Checkout URLs + case storefrontUrl.isCheckout() && !storefrontUrl.isThankYouPage(): + shopify.present(url); + return; + // Cart URLs + case storefrontUrl.isCart(): + navigation.navigate('Cart'); + return; + } + + // Open everything else in a mobile browser + const canOpenUrl = await Linking.canOpenURL(url); + + if (canOpenUrl) { + await Linking.openURL(url); + } + } + + if (initialUrl) { + handleUniversalLink(initialUrl); + } + + // Subscribe to universal links + const subscription = Linking.addEventListener('url', ({url}) => { + handleUniversalLink(url); + }); + + return () => { + subscription.remove(); + }; + }, [initialUrl, shopify, navigation]); + + return ( + + + 0 ? totalQuantity : undefined, + }} + /> + + + + ); +} + +const checkoutKitFeatures: Partial = { + handleGeolocationRequests: true, +}; + +function App() { + return ( + + + + + + + + + + + + + + ); +} + +export default App; diff --git a/react-native/sample/src/ErrorBoundary.tsx b/react-native/sample/src/ErrorBoundary.tsx new file mode 100644 index 00000000..1e6a5e9f --- /dev/null +++ b/react-native/sample/src/ErrorBoundary.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import {View, Text} from 'react-native'; + +interface State { + hasError: boolean; + error: Error | null; +} + +class ErrorBoundary extends React.Component { + state: State = {hasError: false, error: null}; + + static getDerivedStateFromError(error: Error) { + return {hasError: true, error}; + } + + componentDidCatch(error: Error, errorInfo: React.ErrorInfo) { + console.log('[ErrorBoundary]', error, errorInfo); + } + + render() { + if (this.state.hasError) { + return ( + + Something went wrong. + + ); + } + + return this.props.children; + } +} + +export default ErrorBoundary; diff --git a/react-native/sample/src/auth/__tests__/CustomerAccountManager.test.ts b/react-native/sample/src/auth/__tests__/CustomerAccountManager.test.ts new file mode 100644 index 00000000..b80744e2 --- /dev/null +++ b/react-native/sample/src/auth/__tests__/CustomerAccountManager.test.ts @@ -0,0 +1,196 @@ +import {getDefaultStore} from 'jotai'; +import { + CustomerAccountManager, + customerAccountManager, +} from '../customerAccountManager'; + +const SHOP_ID = 'test-shop-123'; +const CLIENT_ID = 'test-client-456'; + +function createTokenResponseBody(overrides: Record = {}) { + return JSON.stringify({ + access_token: 'access-token-123', + refresh_token: 'refresh-token-456', + expires_in: 3600, + id_token: buildIdToken({email: 'test@example.com'}), + token_type: 'bearer', + ...overrides, + }); +} + +function buildIdToken(payload: Record): string { + const header = btoa(JSON.stringify({alg: 'RS256'})); + const body = btoa(JSON.stringify(payload)); + return `${header}.${body}.signature`; +} + +beforeEach(() => { + jest.restoreAllMocks(); + global.fetch = jest.fn(); + const EncryptedStorage = + require('react-native-encrypted-storage').default; + EncryptedStorage.clear(); +}); + +describe('CustomerAccountManager', () => { + describe('static getters', () => { + it('returns the correct redirectUri', () => { + expect(CustomerAccountManager.redirectUri).toBe( + `shop.${SHOP_ID}.app://callback`, + ); + }); + + it('returns the correct callbackScheme', () => { + expect(CustomerAccountManager.callbackScheme).toBe( + `shop.${SHOP_ID}.app`, + ); + }); + }); + + describe('buildAuthorizationURL', () => { + it('returns a well-formed authorization URL', () => { + const manager = new CustomerAccountManager(); + const url = manager.buildAuthorizationURL(); + + expect(url).toContain( + `https://shopify.com/authentication/${SHOP_ID}/oauth/authorize`, + ); + + const parsed = new URL(url); + expect(parsed.searchParams.get('client_id')).toBe(CLIENT_ID); + expect(parsed.searchParams.get('redirect_uri')).toBe( + `shop.${SHOP_ID}.app://callback`, + ); + expect(parsed.searchParams.get('response_type')).toBe('code'); + expect(parsed.searchParams.get('scope')).toBe( + 'openid email customer-account-api:full', + ); + expect(parsed.searchParams.get('code_challenge_method')).toBe('S256'); + expect(parsed.searchParams.get('code_challenge')).toBeTruthy(); + expect(parsed.searchParams.get('state')).toBeTruthy(); + }); + }); + + describe('handleAuthCallback', () => { + it('exchanges code for tokens and updates session atom', async () => { + const manager = new CustomerAccountManager(); + const store = getDefaultStore(); + + const url = manager.buildAuthorizationURL(); + const parsed = new URL(url); + const state = parsed.searchParams.get('state')!; + + (global.fetch as jest.Mock).mockResolvedValueOnce({ + ok: true, + json: async () => JSON.parse(createTokenResponseBody()), + }); + + await manager.handleAuthCallback('test-code', state); + + const session = store.get(manager.sessionAtom); + expect(session.isAuthenticated).toBe(true); + expect(session.email).toBe('test@example.com'); + expect(session.tokenExpiresAt).toBeGreaterThan(Date.now()); + }); + + it('throws on state mismatch', async () => { + const manager = new CustomerAccountManager(); + manager.buildAuthorizationURL(); + + await expect( + manager.handleAuthCallback('test-code', 'wrong-state'), + ).rejects.toThrow('Invalid state parameter'); + }); + }); + + describe('logout', () => { + it('resets session atom to unauthenticated', async () => { + const manager = new CustomerAccountManager(); + const store = getDefaultStore(); + + const url = manager.buildAuthorizationURL(); + const parsed = new URL(url); + const state = parsed.searchParams.get('state')!; + + (global.fetch as jest.Mock).mockResolvedValueOnce({ + ok: true, + json: async () => JSON.parse(createTokenResponseBody()), + }); + + await manager.handleAuthCallback('test-code', state); + + const sessionBefore = store.get(manager.sessionAtom); + expect(sessionBefore.isAuthenticated).toBe(true); + + (global.fetch as jest.Mock).mockResolvedValueOnce({ok: true}); + + await manager.logout(); + + const sessionAfter = store.get(manager.sessionAtom); + expect(sessionAfter.isAuthenticated).toBe(false); + expect(sessionAfter.email).toBeNull(); + expect(sessionAfter.tokenExpiresAt).toBeNull(); + }); + }); + + describe('getValidAccessToken', () => { + it('returns the access token when session is valid', async () => { + const manager = new CustomerAccountManager(); + + const url = manager.buildAuthorizationURL(); + const parsed = new URL(url); + const state = parsed.searchParams.get('state')!; + + (global.fetch as jest.Mock).mockResolvedValueOnce({ + ok: true, + json: async () => JSON.parse(createTokenResponseBody()), + }); + + await manager.handleAuthCallback('test-code', state); + + const token = await manager.getValidAccessToken(); + expect(token).toBe('access-token-123'); + }); + + it('returns null when no tokens are stored', async () => { + const manager = new CustomerAccountManager(); + const token = await manager.getValidAccessToken(); + expect(token).toBeNull(); + }); + + it('refreshes the token when expiring soon', async () => { + const manager = new CustomerAccountManager(); + + const url = manager.buildAuthorizationURL(); + const parsed = new URL(url); + const state = parsed.searchParams.get('state')!; + + (global.fetch as jest.Mock).mockResolvedValueOnce({ + ok: true, + json: async () => + JSON.parse(createTokenResponseBody({expires_in: 60})), + }); + + await manager.handleAuthCallback('test-code', state); + + (global.fetch as jest.Mock).mockResolvedValueOnce({ + ok: true, + json: async () => + JSON.parse( + createTokenResponseBody({ + access_token: 'refreshed-token-789', + }), + ), + }); + + const token = await manager.getValidAccessToken(); + expect(token).toBe('refreshed-token-789'); + }); + }); + + describe('singleton export', () => { + it('exports a singleton instance', () => { + expect(customerAccountManager).toBeInstanceOf(CustomerAccountManager); + }); + }); +}); diff --git a/react-native/sample/src/auth/__tests__/PKCE.test.ts b/react-native/sample/src/auth/__tests__/PKCE.test.ts new file mode 100644 index 00000000..51fe8f4b --- /dev/null +++ b/react-native/sample/src/auth/__tests__/PKCE.test.ts @@ -0,0 +1,47 @@ +import {PKCE} from '../pkce'; + +const BASE64URL_REGEX = /^[A-Za-z0-9_-]+$/; + +describe('PKCE', () => { + describe('generateCodeVerifier', () => { + it('returns a base64url-encoded string', () => { + const verifier = PKCE.generateCodeVerifier(); + expect(verifier).toMatch(BASE64URL_REGEX); + }); + + it('returns a string of 43 characters (32 bytes base64url)', () => { + const verifier = PKCE.generateCodeVerifier(); + expect(verifier).toHaveLength(43); + }); + }); + + describe('generateCodeChallenge', () => { + it('returns a base64url-encoded string', () => { + const challenge = PKCE.generateCodeChallenge('test-verifier'); + expect(challenge).toMatch(BASE64URL_REGEX); + }); + + it('returns a string of 43 characters (SHA-256 hash base64url)', () => { + const challenge = PKCE.generateCodeChallenge('test-verifier'); + expect(challenge).toHaveLength(43); + }); + }); + + describe('generateState', () => { + it('returns a base64url-encoded string', () => { + const state = PKCE.generateState(); + expect(state).toMatch(BASE64URL_REGEX); + }); + + it('returns a string of 36 characters (27 bytes base64url)', () => { + const state = PKCE.generateState(); + expect(state).toHaveLength(36); + }); + }); + + describe('encapsulation', () => { + it('does not expose base64URLEncode as a public method', () => { + expect((PKCE as any).base64URLEncode).toBeUndefined(); + }); + }); +}); diff --git a/react-native/sample/src/auth/customerAccountManager.ts b/react-native/sample/src/auth/customerAccountManager.ts new file mode 100644 index 00000000..a8d00dff --- /dev/null +++ b/react-native/sample/src/auth/customerAccountManager.ts @@ -0,0 +1,326 @@ +import Config from 'react-native-config'; +import {atom, getDefaultStore} from 'jotai'; +import {PKCE} from './pkce'; +import * as tokenStorage from './tokenStorage'; +import type {OAuthTokenResult} from './types'; +import {createDebugLogger} from '../utils'; + +interface TokenResponse { + access_token: string; + refresh_token?: string; + expires_in: number; + id_token?: string; + token_type: string; +} + +interface Session { + isAuthenticated: boolean; + email: string | null; + tokenExpiresAt: number | null; +} + +const log = createDebugLogger('CustomerAccount'); + +const REFRESH_THRESHOLD_MS = 5 * 60 * 1000; + +const defaultSession: Session = { + isAuthenticated: false, + email: null, + tokenExpiresAt: null, +}; + +export class CustomerAccountManager { + readonly sessionAtom = atom(defaultSession); + readonly isLoadingAtom = atom(true); + + private store = getDefaultStore(); + private storedCodeVerifier: string | null = null; + private storedState: string | null = null; + + constructor() { + this.restoreSession(); + } + + static get redirectUri(): string { + return `shop.${CustomerAccountManager.shopId}.app://callback`; + } + + static get callbackScheme(): string { + return `shop.${CustomerAccountManager.shopId}.app`; + } + + buildAuthorizationURL(): string { + const verifier = PKCE.generateCodeVerifier(); + const challenge = PKCE.generateCodeChallenge(verifier); + const state = PKCE.generateState(); + + this.storedCodeVerifier = verifier; + this.storedState = state; + + const params = new URLSearchParams({ + client_id: CustomerAccountManager.clientId, + redirect_uri: CustomerAccountManager.redirectUri, + response_type: 'code', + scope: 'openid email customer-account-api:full', + code_challenge: challenge, + code_challenge_method: 'S256', + state, + }); + + return `${CustomerAccountManager.authorizationEndpoint}?${params.toString()}`; + } + + async handleAuthCallback(code: string, state: string): Promise { + this.store.set(this.isLoadingAtom, true); + try { + const tokens = await this.exchangeCodeForTokens(code, state); + const email = CustomerAccountManager.extractEmailFromIdToken( + tokens.idToken, + ); + this.store.set(this.sessionAtom, { + isAuthenticated: true, + email, + tokenExpiresAt: tokens.expiresAt, + }); + } finally { + this.store.set(this.isLoadingAtom, false); + } + } + + async getValidAccessToken(): Promise { + const tokens = await tokenStorage.getTokens(); + if (!tokens) { + return null; + } + + const isExpiringSoon = + Date.now() + REFRESH_THRESHOLD_MS >= tokens.expiresAt; + + if (isExpiringSoon && tokens.refreshToken) { + try { + const refreshed = await this.refreshAccessToken(); + return refreshed.accessToken; + } catch (error) { + log('Token refresh failed, returning existing token', error); + return tokens.accessToken; + } + } + + return tokens.accessToken; + } + + async logout(): Promise { + const tokens = await tokenStorage.getTokens(); + await tokenStorage.clearTokens(); + + if (tokens?.idToken) { + try { + const params = new URLSearchParams({ + id_token_hint: tokens.idToken, + }); + await fetch( + `${CustomerAccountManager.logoutEndpoint}?${params.toString()}`, + {method: 'GET'}, + ); + } catch { + log('Server-side logout request failed'); + } + } + + this.store.set(this.sessionAtom, defaultSession); + log('Logged out'); + } + + private static get shopId(): string { + const shopId = Config.CUSTOMER_ACCOUNT_API_SHOP_ID; + if (!shopId) { + throw new Error('CUSTOMER_ACCOUNT_API_SHOP_ID is not configured'); + } + return shopId; + } + + private static get clientId(): string { + const clientId = Config.CUSTOMER_ACCOUNT_API_CLIENT_ID; + if (!clientId) { + throw new Error('CUSTOMER_ACCOUNT_API_CLIENT_ID is not configured'); + } + return clientId; + } + + private static get authorizationEndpoint(): string { + return `https://shopify.com/authentication/${CustomerAccountManager.shopId}/oauth/authorize`; + } + + private static get tokenEndpoint(): string { + return `https://shopify.com/authentication/${CustomerAccountManager.shopId}/oauth/token`; + } + + private static get logoutEndpoint(): string { + return `https://shopify.com/authentication/${CustomerAccountManager.shopId}/logout`; + } + + private static extractEmailFromIdToken( + idToken: string | null, + ): string | null { + if (!idToken) { + return null; + } + + try { + const parts = idToken.split('.'); + if (parts.length !== 3) { + return null; + } + + const payload = JSON.parse(atob(parts[1]!)); + return payload.email ?? null; + } catch { + log('Failed to extract email from ID token'); + return null; + } + } + + private async exchangeCodeForTokens( + code: string, + state: string, + ): Promise { + if (state !== this.storedState) { + throw new Error('Invalid state parameter'); + } + + if (!this.storedCodeVerifier) { + throw new Error('Missing code verifier'); + } + + const body = new URLSearchParams({ + grant_type: 'authorization_code', + client_id: CustomerAccountManager.clientId, + redirect_uri: CustomerAccountManager.redirectUri, + code, + code_verifier: this.storedCodeVerifier, + }); + + const response = await fetch(CustomerAccountManager.tokenEndpoint, { + method: 'POST', + headers: {'Content-Type': 'application/x-www-form-urlencoded'}, + body: body.toString(), + }); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error(`Token exchange failed: ${errorText}`); + } + + const data: TokenResponse = await response.json(); + + const tokens: OAuthTokenResult = { + accessToken: data.access_token, + refreshToken: data.refresh_token ?? null, + expiresIn: data.expires_in, + expiresAt: Date.now() + data.expires_in * 1000, + idToken: data.id_token ?? null, + tokenType: data.token_type, + }; + + await tokenStorage.saveTokens(tokens); + + const email = CustomerAccountManager.extractEmailFromIdToken( + tokens.idToken, + ); + if (email) { + await tokenStorage.saveEmail(email); + } + + this.storedCodeVerifier = null; + this.storedState = null; + + log('Token exchange successful'); + return tokens; + } + + private async refreshAccessToken(): Promise { + const existing = await tokenStorage.getTokens(); + if (!existing?.refreshToken) { + throw new Error('No refresh token available'); + } + + const body = new URLSearchParams({ + grant_type: 'refresh_token', + client_id: CustomerAccountManager.clientId, + refresh_token: existing.refreshToken, + }); + + const response = await fetch(CustomerAccountManager.tokenEndpoint, { + method: 'POST', + headers: {'Content-Type': 'application/x-www-form-urlencoded'}, + body: body.toString(), + }); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error(`Token refresh failed: ${errorText}`); + } + + const data: TokenResponse = await response.json(); + + const tokens: OAuthTokenResult = { + accessToken: data.access_token, + refreshToken: data.refresh_token ?? existing.refreshToken, + expiresIn: data.expires_in, + expiresAt: Date.now() + data.expires_in * 1000, + idToken: data.id_token ?? existing.idToken, + tokenType: data.token_type, + }; + + await tokenStorage.saveTokens(tokens); + + log('Token refresh successful'); + return tokens; + } + + private async restoreSession(): Promise { + try { + const tokens = await tokenStorage.getTokens(); + const email = await tokenStorage.getEmail(); + + if (!tokens) { + this.store.set(this.sessionAtom, defaultSession); + return; + } + + const isExpired = Date.now() >= tokens.expiresAt; + + if (isExpired && tokens.refreshToken) { + try { + const refreshed = await this.refreshAccessToken(); + const refreshedEmail = + CustomerAccountManager.extractEmailFromIdToken( + refreshed.idToken, + ) ?? email; + this.store.set(this.sessionAtom, { + isAuthenticated: true, + email: refreshedEmail, + tokenExpiresAt: refreshed.expiresAt, + }); + return; + } catch { + await tokenStorage.clearTokens(); + this.store.set(this.sessionAtom, defaultSession); + return; + } + } + + this.store.set(this.sessionAtom, { + isAuthenticated: !isExpired, + email, + tokenExpiresAt: tokens.expiresAt, + }); + } catch { + this.store.set(this.sessionAtom, defaultSession); + } finally { + this.store.set(this.isLoadingAtom, false); + } + } +} + +export const customerAccountManager = new CustomerAccountManager(); diff --git a/react-native/sample/src/auth/pkce.ts b/react-native/sample/src/auth/pkce.ts new file mode 100644 index 00000000..3a24f114 --- /dev/null +++ b/react-native/sample/src/auth/pkce.ts @@ -0,0 +1,30 @@ +import crypto from 'react-native-quick-crypto'; + +function base64URLEncode(buffer: ArrayBufferLike): string { + const bytes = new Uint8Array(buffer); + let binary = ''; + for (let i = 0; i < bytes.length; i++) { + binary += String.fromCharCode(bytes[i]!); + } + return btoa(binary) + .replace(/\+/g, '-') + .replace(/\//g, '_') + .replace(/[=]/g, ''); +} + +export class PKCE { + static generateCodeVerifier(): string { + const bytes = crypto.randomBytes(32); + return base64URLEncode(bytes.buffer); + } + + static generateCodeChallenge(verifier: string): string { + const hash = crypto.createHash('sha256').update(verifier).digest(); + return base64URLEncode(hash.buffer); + } + + static generateState(): string { + const bytes = crypto.randomBytes(27); + return base64URLEncode(bytes.buffer); + } +} diff --git a/react-native/sample/src/auth/tokenStorage.ts b/react-native/sample/src/auth/tokenStorage.ts new file mode 100644 index 00000000..9271f3e9 --- /dev/null +++ b/react-native/sample/src/auth/tokenStorage.ts @@ -0,0 +1,30 @@ +import EncryptedStorage from 'react-native-encrypted-storage'; +import type {OAuthTokenResult} from './types'; + +const TOKENS_KEY = 'customer_account_tokens'; +const EMAIL_KEY = 'customer_account_email'; + +export async function saveTokens(tokens: OAuthTokenResult): Promise { + await EncryptedStorage.setItem(TOKENS_KEY, JSON.stringify(tokens)); +} + +export async function getTokens(): Promise { + const raw = await EncryptedStorage.getItem(TOKENS_KEY); + if (!raw) { + return null; + } + return JSON.parse(raw) as OAuthTokenResult; +} + +export async function clearTokens(): Promise { + await EncryptedStorage.removeItem(TOKENS_KEY); + await EncryptedStorage.removeItem(EMAIL_KEY); +} + +export async function saveEmail(email: string): Promise { + await EncryptedStorage.setItem(EMAIL_KEY, email); +} + +export async function getEmail(): Promise { + return EncryptedStorage.getItem(EMAIL_KEY); +} diff --git a/react-native/sample/src/auth/types.ts b/react-native/sample/src/auth/types.ts new file mode 100644 index 00000000..0dfbf003 --- /dev/null +++ b/react-native/sample/src/auth/types.ts @@ -0,0 +1,24 @@ +export const BuyerIdentityMode = { + Guest: 'guest', + Hardcoded: 'hardcoded', + CustomerAccount: 'customerAccount', +} as const; + +export type BuyerIdentityMode = + (typeof BuyerIdentityMode)[keyof typeof BuyerIdentityMode]; + +export const BuyerIdentityModeDisplayNames: Record = + { + [BuyerIdentityMode.Guest]: 'Guest', + [BuyerIdentityMode.Hardcoded]: 'Hardcoded', + [BuyerIdentityMode.CustomerAccount]: 'Customer Account', + }; + +export interface OAuthTokenResult { + accessToken: string; + refreshToken: string | null; + expiresIn: number; + expiresAt: number; + idToken: string | null; + tokenType: string; +} diff --git a/react-native/sample/src/context/Auth.tsx b/react-native/sample/src/context/Auth.tsx new file mode 100644 index 00000000..5eba4c51 --- /dev/null +++ b/react-native/sample/src/context/Auth.tsx @@ -0,0 +1,18 @@ +import {useAtomValue} from 'jotai'; +import {customerAccountManager} from '../auth/customerAccountManager'; + +export function useAuth() { + const session = useAtomValue(customerAccountManager.sessionAtom); + const isLoading = useAtomValue(customerAccountManager.isLoadingAtom); + + return { + isAuthenticated: session.isAuthenticated, + customerEmail: session.email, + isLoading, + tokenExpiresAt: session.tokenExpiresAt, + logout: () => customerAccountManager.logout(), + getValidAccessToken: () => customerAccountManager.getValidAccessToken(), + handleAuthCallback: (code: string, state: string) => + customerAccountManager.handleAuthCallback(code, state), + }; +} diff --git a/react-native/sample/src/context/Cart.tsx b/react-native/sample/src/context/Cart.tsx new file mode 100644 index 00000000..c4235be5 --- /dev/null +++ b/react-native/sample/src/context/Cart.tsx @@ -0,0 +1,278 @@ +import type {PropsWithChildren} from 'react'; +import React, { + createContext, + useCallback, + useEffect, + useMemo, + useReducer, +} from 'react'; +import {Alert} from 'react-native'; +import {atom, useAtom} from 'jotai'; +import {useShopifyCheckoutSheet} from '@shopify/checkout-sheet-kit'; +import useShopify from '../hooks/useShopify'; +import {useConfig} from './Config'; +import {useAuth} from './Auth'; +import {BuyerIdentityMode} from '../auth/types'; +import {createBuyerIdentityCartInput} from '../utils'; + +interface Context { + cartId: string | undefined; + checkoutURL: string | undefined; + totalQuantity: number; + addingToCart: Set; + clearCart: () => void; + addToCart: (variantId: string) => Promise; + removeFromCart: (variantId: string) => Promise; +} + +const defaultCartId = undefined; +const defaultCheckoutURL = undefined; +const defaultTotalQuantity = 0; + +const CartContext = createContext({ + cartId: defaultCartId, + checkoutURL: undefined, + totalQuantity: 0, + addingToCart: new Set(), + addToCart: async () => {}, + removeFromCart: async () => {}, + clearCart: () => {}, +}); + +type AddingToCartAction = + | {type: 'add'; variantId: string} + | {type: 'remove'; variantId: string}; + +const checkoutURLState = atom(defaultCheckoutURL); +const cartIdState = atom(defaultCartId); +const totalQuantityState = atom(defaultTotalQuantity); + +export const CartProvider: React.FC = ({children}) => { + const shopify = useShopifyCheckoutSheet(); + // Reuse the same cart ID for the lifetime of the app + const [checkoutURL, setCheckoutURL] = useAtom(checkoutURLState); + // Reuse the same cart ID for the lifetime of the app + const [cartId, setCartId] = useAtom(cartIdState); + // Keep track of the number of items in the cart + const [totalQuantity, setTotalQuantity] = useAtom(totalQuantityState); + // Maintain a loading state for items being added to the cart + const addingToCartReducer = ( + state: Set, + action: AddingToCartAction, + ): Set => { + switch (action.type) { + case 'add': + return new Set([...state, action.variantId]); + case 'remove': + return new Set([...state].filter(id => id !== action.variantId)); + default: + throw new Error(); + } + }; + // Maintain a loading state for items being added to the cart + const defaultSet: Set = new Set(); + const [addingToCart, dispatch] = useReducer(addingToCartReducer, defaultSet); + const {appConfig} = useConfig(); + const {getValidAccessToken, isAuthenticated} = useAuth(); + + const {mutations, queries} = useShopify(); + const [createCart] = mutations.cartCreate; + const [addLineItems] = mutations.cartLinesAdd; + const [removeLineItems] = mutations.cartLinesRemove; + const [fetchCart] = queries.cart; + + const clearCart = useCallback(() => { + setCartId(defaultCartId); + setCheckoutURL(undefined); + setTotalQuantity(0); + }, [setCartId, setCheckoutURL, setTotalQuantity]); + + useEffect(() => { + clearCart(); + }, [appConfig.buyerIdentityMode, clearCart]); + + useEffect(() => { + const subscription = shopify.addEventListener('completed', () => { + clearCart(); + }); + + return subscription?.remove; + }, [shopify, clearCart, setCartId, setCheckoutURL, setTotalQuantity]); + + useEffect(() => { + async function getCart() { + try { + const {data} = await fetchCart({ + variables: { + cartId, + }, + }); + if (data?.cart.totalQuantity) { + setTotalQuantity(data?.cart.totalQuantity); + } + } catch {} + } + + if (cartId) { + getCart(); + } + }, [cartId, fetchCart, setTotalQuantity]); + + const preloadCheckout = useCallback( + async (checkoutURL: string) => { + if (checkoutURL) { + const config = await shopify.getConfig(); + if (config?.preloading) { + shopify.preload(checkoutURL); + } + } + }, + [shopify], + ); + + const addToCart = useCallback( + async (variantId: string) => { + let id = cartId; + + dispatch({type: 'add', variantId}); + + if ( + !id && + appConfig.buyerIdentityMode === BuyerIdentityMode.CustomerAccount && + !isAuthenticated + ) { + dispatch({type: 'remove', variantId}); + Alert.alert( + 'Sign in required', + 'Sign in on the Account tab or change the Buyer Identity setting to add items to your cart.', + ); + return; + } + + if (!id) { + let customerAccessToken: string | undefined; + if ( + appConfig.buyerIdentityMode === BuyerIdentityMode.CustomerAccount + ) { + customerAccessToken = + (await getValidAccessToken()) ?? undefined; + } + const cartInput = createBuyerIdentityCartInput( + appConfig, + customerAccessToken, + ); + const cart = await createCart({variables: {input: cartInput}}); + id = cart.data.cartCreate.cart?.id; + + if (id) { + setCartId(id); + } + } + + const {data} = await addLineItems({ + variables: { + cartId: id, + lines: [{quantity: 1, merchandiseId: variantId}], + }, + }); + + dispatch({type: 'remove', variantId}); + + setCheckoutURL(data.cartLinesAdd.cart.checkoutUrl); + setTotalQuantity(data.cartLinesAdd.cart.totalQuantity); + + if (data.cartLinesAdd.cart.checkoutUrl) { + await preloadCheckout(data.cartLinesAdd.cart.checkoutUrl); + } + + if (id) { + fetchCart({ + variables: { + cartId: id, + }, + }); + } + }, + [ + cartId, + addLineItems, + setCheckoutURL, + setTotalQuantity, + appConfig, + createCart, + setCartId, + fetchCart, + preloadCheckout, + getValidAccessToken, + isAuthenticated, + ], + ); + + const removeFromCart = useCallback( + async (variantId: string) => { + if (!cartId) { + return; + } + + dispatch({type: 'add', variantId}); + + const {data} = await removeLineItems({ + variables: { + cartId, + lineIds: [variantId], + }, + }); + + setCheckoutURL(data.cartLinesRemove.cart.checkoutUrl); + setTotalQuantity(data.cartLinesRemove.cart.totalQuantity); + + if (checkoutURL) { + await preloadCheckout(checkoutURL); + } + + if (cartId) { + await fetchCart({ + variables: { + cartId, + }, + }); + } + + dispatch({type: 'remove', variantId}); + }, + [ + cartId, + removeLineItems, + setCheckoutURL, + setTotalQuantity, + checkoutURL, + preloadCheckout, + fetchCart, + ], + ); + + const value = useMemo( + () => ({ + cartId, + checkoutURL, + addToCart, + removeFromCart, + totalQuantity, + addingToCart, + clearCart, + }), + [ + cartId, + checkoutURL, + addToCart, + removeFromCart, + totalQuantity, + addingToCart, + clearCart, + ], + ); + + return {children}; +}; + +export const useCart = () => React.useContext(CartContext); diff --git a/react-native/sample/src/context/Config.tsx b/react-native/sample/src/context/Config.tsx new file mode 100644 index 00000000..407fde01 --- /dev/null +++ b/react-native/sample/src/context/Config.tsx @@ -0,0 +1,90 @@ +import type {PropsWithChildren} from 'react'; +import React, { + createContext, + useCallback, + useEffect, + useMemo, + useState, +} from 'react'; +import {ColorScheme, ApplePayStyle} from '@shopify/checkout-sheet-kit'; +import EncryptedStorage from 'react-native-encrypted-storage'; +import {useTheme} from './Theme'; +import {BuyerIdentityMode} from '../auth/types'; + +export interface AppConfig { + colorScheme: ColorScheme; + buyerIdentityMode: BuyerIdentityMode; + applePayStyle?: ApplePayStyle; +} + +interface Context { + appConfig: AppConfig; + setAppConfig: (config: AppConfig) => void; +} + +const CONFIG_STORAGE_KEY = 'app_config'; + +const defaultAppConfig: AppConfig = { + colorScheme: ColorScheme.automatic, + buyerIdentityMode: BuyerIdentityMode.Guest, + applePayStyle: ApplePayStyle.automatic, +}; + +const ConfigContext = createContext({ + appConfig: defaultAppConfig, + setAppConfig: () => undefined, +}); + +export const ConfigProvider: React.FC< + PropsWithChildren<{config?: AppConfig}> +> = ({children, config}) => { + const [appConfig, setInternalAppConfig] = + useState(defaultAppConfig); + const {setColorScheme} = useTheme(); + + useEffect(() => { + async function restoreConfig() { + try { + const raw = await EncryptedStorage.getItem(CONFIG_STORAGE_KEY); + if (raw) { + const saved = JSON.parse(raw) as Partial; + const restored: AppConfig = { + ...defaultAppConfig, + ...config, + ...saved, + }; + setInternalAppConfig(restored); + setColorScheme(restored.colorScheme); + return; + } + } catch {} + setColorScheme(config?.colorScheme ?? ColorScheme.automatic); + } + restoreConfig(); + }, [config, setColorScheme]); + + const setAppConfig = useCallback((newConfig: AppConfig) => { + console.groupCollapsed('APP CONFIG UPDATE'); + console.log(newConfig); + console.groupEnd(); + setInternalAppConfig(newConfig); + EncryptedStorage.setItem( + CONFIG_STORAGE_KEY, + JSON.stringify(newConfig), + ).catch(() => {}); + }, []); + + const value = useMemo( + () => ({ + appConfig, + setAppConfig, + }), + [appConfig, setAppConfig], + ); + + return ( + {children} + ); +}; + +export const useConfig = () => React.useContext(ConfigContext); diff --git a/react-native/sample/src/context/Theme.tsx b/react-native/sample/src/context/Theme.tsx new file mode 100644 index 00000000..b4f2d712 --- /dev/null +++ b/react-native/sample/src/context/Theme.tsx @@ -0,0 +1,207 @@ +import type {PropsWithChildren} from 'react'; +import React, {createContext, useCallback, useMemo, useState} from 'react'; +import type {ColorSchemeName} from 'react-native'; +import {Appearance, useColorScheme} from 'react-native'; +import type {Theme} from '@react-navigation/native'; +import {DarkTheme, DefaultTheme} from '@react-navigation/native'; +import {ColorScheme} from '@shopify/checkout-sheet-kit'; + +interface Context { + cornerRadius: number; + colors: Colors; + colorScheme: ColorScheme; + preference: ColorSchemeName; + setColorScheme: (colorScheme: ColorScheme) => void; +} + +export const darkColors: Colors = { + background: '#1D1D1F', + backgroundSubdued: '#222', + border: '#333336', + text: '#fff', + textSubdued: '#eee', + primary: '#0B96F1', + primaryText: '#fff', + secondary: '#0087ff', + secondaryText: '#fff', + + webviewBackgroundColor: '#1D1D1F', + webViewProgressIndicator: '#0B96F1', + webviewHeaderBackgroundColor: '#1D1D1F', + webviewHeaderTextColor: '#ffffff', + webviewCloseButtonColor: '#ffffff', +}; + +export const lightColors: Colors = { + background: '#eee', + backgroundSubdued: '#fff', + border: '#eee', + text: '#000', + textSubdued: '#a3a3a3', + primary: '#0087ff', + primaryText: '#fff', + secondary: '#000', + secondaryText: '#fff', + + webviewBackgroundColor: '#ffffff', + webViewProgressIndicator: '#0087ff', + webviewHeaderBackgroundColor: '#ffffff', + webviewHeaderTextColor: '#000000', + webviewCloseButtonColor: '#000000', +}; + +export const webColors: Colors = { + background: '#f0f0e8', + backgroundSubdued: '#e8e8e0', + border: '#d0d0cd', + text: '#2d2a38', + textSubdued: '#a3a3a3', + primary: '#2c2a38', + primaryText: '#0087ff', + secondary: '#2d2a38', + secondaryText: '#fff', + + webviewBackgroundColor: '#f0f0e8', + webViewProgressIndicator: '#2c2a38', + webviewHeaderBackgroundColor: '#f0f0e8', + webviewHeaderTextColor: '#2c2a38', + webviewCloseButtonColor: '#2c2a38', +}; + +const ThemeContext = createContext({ + cornerRadius: 35, + colorScheme: ColorScheme.automatic, + colors: lightColors, + preference: Appearance.getColorScheme(), + setColorScheme() {}, +}); + +export interface Colors { + background: string; + backgroundSubdued: string; + border: string; + text: string; + textSubdued: string; + primary: string; + primaryText: string; + secondary: string; + secondaryText: string; + webviewBackgroundColor: string; + webViewProgressIndicator: string; + webviewHeaderBackgroundColor: string; + webviewHeaderTextColor: string; + webviewCloseButtonColor: string; +} + +export function getNavigationTheme( + colorScheme: ColorScheme, + preference: ColorSchemeName, +): Theme { + const colors = getColors(colorScheme, preference); + const primary = '#0087ff'; + + const light = { + ...DefaultTheme, + dark: false, + colors: { + ...DefaultTheme.colors, + primary, + background: colors.background, + card: colors.backgroundSubdued, + text: colors.text, + border: colors.border, + notification: colors.primary, + }, + }; + + const dark = { + ...DarkTheme, + dark: true, + colors: { + ...DarkTheme.colors, + primary, + background: colors.background, + card: colors.backgroundSubdued, + text: colors.primaryText, + border: colors.border, + notification: colors.primary, + }, + }; + + const web = { + ...DefaultTheme, + dark: false, + colors: { + ...DefaultTheme.colors, + primary, + background: colors.background, + card: colors.backgroundSubdued, + text: colors.text, + border: colors.border, + notification: colors.primary, + }, + }; + + switch (colorScheme) { + case ColorScheme.automatic: + return preference === 'dark' ? dark : light; + case ColorScheme.dark: + return dark; + case ColorScheme.web: + return web; + default: + return light; + } +} + +export function getColors( + colorScheme: ColorScheme, + preference: ColorSchemeName, +): Colors { + switch (colorScheme) { + case ColorScheme.automatic: + return preference === 'dark' ? darkColors : lightColors; + case ColorScheme.dark: + return darkColors; + case ColorScheme.web: + return webColors; + default: + return lightColors; + } +} + +export const ThemeProvider: React.FC< + PropsWithChildren<{defaultValue: ColorScheme; cornerRadius: number}> +> = ({children, defaultValue = ColorScheme.automatic, cornerRadius}) => { + const preference = useColorScheme(); + const [colorScheme, setColorSchemeInternal] = + useState(defaultValue); + + const setColorScheme = useCallback((colorScheme: ColorScheme) => { + if (colorScheme === ColorScheme.automatic) { + Appearance.setColorScheme(null); + } else { + Appearance.setColorScheme( + colorScheme === ColorScheme.dark ? 'dark' : 'light', + ); + } + setColorSchemeInternal(colorScheme); + }, []); + + const value = useMemo( + () => ({ + cornerRadius, + colors: getColors(colorScheme, preference), + preference, + colorScheme, + setColorScheme, + }), + [preference, colorScheme, setColorScheme, cornerRadius], + ); + + return ( + {children} + ); +}; + +export const useTheme = () => React.useContext(ThemeContext); diff --git a/react-native/sample/src/hooks/useCheckoutEventHandlers.ts b/react-native/sample/src/hooks/useCheckoutEventHandlers.ts new file mode 100644 index 00000000..2511b5eb --- /dev/null +++ b/react-native/sample/src/hooks/useCheckoutEventHandlers.ts @@ -0,0 +1,55 @@ +import {useMemo} from 'react'; + +import {createDebugLogger} from '../utils'; + +import {useCart} from '../context/Cart'; +import type { + CheckoutCompletedEvent, + CheckoutException, + PixelEvent, + RenderStateChangeEvent, +} from '@shopify/checkout-sheet-kit'; +import {Linking} from 'react-native'; + +interface EventHandlers { + onFail?: (error: CheckoutException) => void; + onComplete?: (event: CheckoutCompletedEvent) => void; + onCancel?: () => void; + onRenderStateChange?: (event: RenderStateChangeEvent) => void; + onShouldRecoverFromError?: (error: {message: string}) => boolean; + onWebPixelEvent?: (event: PixelEvent) => void; + onClickLink?: (url: string) => void; +} + +export function useShopifyEventHandlers(name?: string): EventHandlers { + const {clearCart} = useCart(); + + return useMemo(() => { + const log = createDebugLogger(name ?? ''); + return { + onFail: error => { + log('onFail', error); + }, + onComplete: event => { + log('onComplete', event.orderDetails.id); + clearCart(); + }, + onCancel: () => { + log('onCancel'); + }, + onRenderStateChange: event => { + log('onRenderStateChange', event); + }, + onWebPixelEvent: event => { + log('onWebPixelEvent', event.name); + }, + onClickLink: async url => { + log('onClickLink', url); + + if (await Linking.canOpenURL(url)) { + await Linking.openURL(url); + } + }, + }; + }, [clearCart, name]); +} diff --git a/react-native/sample/src/hooks/useShopify.ts b/react-native/sample/src/hooks/useShopify.ts new file mode 100644 index 00000000..573ad335 --- /dev/null +++ b/react-native/sample/src/hooks/useShopify.ts @@ -0,0 +1,230 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +import {gql, useLazyQuery, useMutation} from '@apollo/client'; +import type {Edges, ShopifyProduct, ShopifyCart} from '../../@types'; +import {getLocale} from '../utils'; + +const moneyFragment = gql` + fragment Price on MoneyV2 { + currencyCode + amount + } +`; + +const productFragment = gql` + fragment Product on ProductVariant { + id + price { + ...Price + } + product { + title + } + image { + id + width + height + url + thumbnailUrl: url(transform: {maxWidth: 80, maxHeight: 80}) + } + } + + ${moneyFragment} +`; + +const cartCostFragment = gql` + fragment Cost on CartCost { + subtotalAmount { + ...Price + } + totalAmount { + ...Price + } + totalTaxAmount { + ...Price + } + } +`; + +const PRODUCTS_QUERY = gql` + query FetchProducts($country: CountryCode = CA) + @inContext(country: $country) { + products(first: 10) { + edges { + node { + id + title + description + variants(first: 1) { + edges { + node { + id + unitPrice { + ...Price + } + price { + ...Price + } + } + } + } + images(first: 1) { + edges { + node { + id + width + height + url + thumbnailUrl: url(transform: {maxWidth: 150, maxHeight: 150}) + } + } + } + } + } + } + } + + ${moneyFragment} +`; + +const CART_QUERY = gql` + query FetchCart($cartId: ID!, $country: CountryCode = CA) + @inContext(country: $country) { + cart(id: $cartId) { + id + totalQuantity + cost { + ...Cost + } + lines(first: 100) { + edges { + node { + id + quantity + merchandise { + ...Product + } + cost { + totalAmount { + ...Price + } + } + } + } + } + } + } + + ${productFragment} + ${moneyFragment} + ${cartCostFragment} +`; + +const CREATE_CART_MUTATION = gql` + mutation CreateCart($input: CartInput, $country: CountryCode = CA) + @inContext(country: $country) { + cartCreate(input: $input) { + cart { + id + checkoutUrl + } + userErrors { + code + field + message + } + } + } +`; + +const ADD_TO_CART_MUTATION = gql` + mutation AddToCart( + $cartId: ID! + $lines: [CartLineInput!]! + $country: CountryCode = CA + ) @inContext(country: $country) { + cartLinesAdd(cartId: $cartId, lines: $lines) { + cart { + id + checkoutUrl + totalQuantity + } + } + } +`; + +const REMOVE_FROM_CART_MUTATION = gql` + mutation RemoveFromCart( + $cartId: ID! + $lineIds: [ID!]! + $country: CountryCode = CA + ) @inContext(country: $country) { + cartLinesRemove(cartId: $cartId, lineIds: $lineIds) { + cart { + id + checkoutUrl + totalQuantity + } + } + } +`; + +function useShopify() { + const [, country] = getLocale().split('-'); + const includeCountry = { + variables: { + country, + }, + }; + const products = useLazyQuery<{products: Edges}>( + PRODUCTS_QUERY, + { + ...includeCountry, + }, + ); + const cart = useLazyQuery<{cart: ShopifyCart}>(CART_QUERY, { + fetchPolicy: 'network-only', + ...includeCountry, + }); + const cartCreate = useMutation(CREATE_CART_MUTATION, includeCountry); + const cartLinesAdd = useMutation(ADD_TO_CART_MUTATION, includeCountry); + const cartLinesRemove = useMutation( + REMOVE_FROM_CART_MUTATION, + includeCountry, + ); + + return { + queries: { + cart, + products, + }, + mutations: { + cartCreate, + cartLinesAdd, + cartLinesRemove, + }, + }; +} + +export default useShopify; diff --git a/react-native/sample/src/screens/AccountScreen.tsx b/react-native/sample/src/screens/AccountScreen.tsx new file mode 100644 index 00000000..c7d52c42 --- /dev/null +++ b/react-native/sample/src/screens/AccountScreen.tsx @@ -0,0 +1,151 @@ +import React from 'react'; +import { + ActivityIndicator, + Pressable, + SafeAreaView, + StyleSheet, + Text, + View, +} from 'react-native'; +import Icon from 'react-native-vector-icons/Entypo'; +import type {NativeStackScreenProps} from '@react-navigation/native-stack'; +import type {AccountStackParamList} from '../App'; +import type {Colors} from '../context/Theme'; +import {useTheme} from '../context/Theme'; +import {useAuth} from '../context/Auth'; + +type Props = NativeStackScreenProps; + +function AccountScreen({navigation}: Props) { + const {isAuthenticated, customerEmail, isLoading} = useAuth(); + const {colors} = useTheme(); + const styles = createStyles(colors); + + if (isLoading) { + return ( + + + + ); + } + + if (isAuthenticated) { + return ; + } + + return ( + navigation.navigate('Login')} + /> + ); +} + +function AuthenticatedView({ + email, + styles, +}: { + email: string | null; + styles: ReturnType; +}) { + const {logout} = useAuth(); + + return ( + + + + Signed In + {email && {email}} + + Your checkout will be pre-filled with your account information. + + + Sign Out + + + + ); +} + +function UnauthenticatedView({ + styles, + onSignIn, +}: { + styles: ReturnType; + onSignIn: () => void; +}) { + return ( + + + + Sign in to your account + + Get faster checkout, order tracking, and more. + + + • Faster checkout experience + • Pre-filled shipping details + • Order history and tracking + + + Sign In + + + + ); +} + +function createStyles(colors: Colors) { + return StyleSheet.create({ + container: { + flex: 1, + }, + centered: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + paddingHorizontal: 32, + }, + heading: { + fontSize: 22, + fontWeight: 'bold', + color: colors.text, + marginTop: 16, + marginBottom: 8, + }, + email: { + fontSize: 16, + color: colors.primary, + marginBottom: 8, + }, + description: { + fontSize: 14, + color: colors.textSubdued, + textAlign: 'center', + marginBottom: 16, + }, + benefitsList: { + alignSelf: 'stretch', + marginBottom: 24, + paddingHorizontal: 32, + }, + benefitItem: { + fontSize: 14, + color: colors.textSubdued, + paddingVertical: 4, + }, + button: { + backgroundColor: colors.secondary, + paddingHorizontal: 32, + paddingVertical: 12, + borderRadius: 10, + }, + buttonText: { + fontSize: 16, + fontWeight: 'bold', + color: colors.secondaryText, + }, + }); +} + +export default AccountScreen; diff --git a/react-native/sample/src/screens/CartScreen.tsx b/react-native/sample/src/screens/CartScreen.tsx new file mode 100644 index 00000000..e5712df3 --- /dev/null +++ b/react-native/sample/src/screens/CartScreen.tsx @@ -0,0 +1,406 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +import React, {useCallback, useEffect} from 'react'; +import { + SafeAreaView, + ScrollView, + View, + StyleSheet, + Text, + Image, + ActivityIndicator, + Pressable, + RefreshControl, +} from 'react-native'; +import Icon from 'react-native-vector-icons/Entypo'; + +import { + useShopifyCheckoutSheet, + AcceleratedCheckoutButtons, + ApplePayLabel, + AcceleratedCheckoutWallet, +} from '@shopify/checkout-sheet-kit'; +import {useConfig} from '../context/Config'; +import useShopify from '../hooks/useShopify'; +import type {CartLineItem} from '../../@types'; +import type {Colors} from '../context/Theme'; +import {useTheme} from '../context/Theme'; +import {useCart} from '../context/Cart'; +import {currency} from '../utils'; +import {useShopifyEventHandlers} from '../hooks/useCheckoutEventHandlers'; + +function CartScreen(): React.JSX.Element { + const ShopifyCheckout = useShopifyCheckoutSheet(); + const [refreshing, setRefreshing] = React.useState(false); + const {cartId, checkoutURL, totalQuantity, removeFromCart, addingToCart} = + useCart(); + const {queries} = useShopify(); + const {appConfig} = useConfig(); + const eventHandlers = useShopifyEventHandlers( + 'Cart - AcceleratedCheckoutButtons', + ); + + const [fetchCart, {data, loading, error}] = queries.cart; + + const {colors, cornerRadius} = useTheme(); + const styles = createStyles(colors, cornerRadius); + + useEffect(() => { + if (cartId) { + fetchCart({ + variables: { + cartId, + }, + }); + } + }, [fetchCart, cartId]); + + const onRefresh = useCallback(() => { + setRefreshing(true); + fetchCart({ + variables: { + cartId, + }, + }).then(() => setRefreshing(false)); + }, [cartId, fetchCart]); + + const presentCheckout = async () => { + if (checkoutURL) { + ShopifyCheckout.present(checkoutURL); + } + }; + + if (error) { + return ( + + + An error occurred while fetching the cart + + + {error?.name} {error?.message} + + + ); + } + + if (loading) { + return ( + + + Loading cart... + + ); + } + + if (!data || !data.cart || data.cart.lines.edges.length === 0 || !cartId) { + return ( + + + Your cart is empty. + + ); + } + + return ( + + + }> + + {data?.cart.lines.edges.map(({node}) => ( + removeFromCart(node.id)} + /> + ))} + + + + + Subtotal + + {price(data.cart.cost.subtotalAmount)} + + + + + Taxes + Estimated at checkout + + + + Total + + {price(data.cart.cost.totalAmount)} + + + + + {totalQuantity > 0 && cartId && ( + + + + + + Checkout + + {price(data.cart.cost.totalAmount)} + + + + {/* Empty wallets, should not render anything */} + + + + )} + + + ); +} + +function price(value: {amount: string; currencyCode: string}) { + if (!value) { + return '-'; + } + + const {amount, currencyCode} = value; + return currency(amount, currencyCode); +} + +function CartItem({ + item, + quantity, + onRemove, + loading, +}: { + item: CartLineItem; + quantity: number; + loading?: boolean; + onRemove: () => void; +}) { + const {colors, cornerRadius} = useTheme(); + const styles = createStyles(colors, cornerRadius); + + return ( + + {item.merchandise.image?.thumbnailUrl && ( + {item.merchandise.image?.altText} + )} + + + + {item.merchandise.product.title} + + Quantity: {quantity} + + + + {price(item.cost?.totalAmount)} + + + {loading ? ( + + ) : ( + Remove + )} + + + + + ); +} + +function createStyles(colors: Colors, cornerRadius: number) { + return StyleSheet.create({ + loading: { + flex: 1, + padding: 2, + justifyContent: 'center', + alignItems: 'center', + }, + loadingText: { + marginVertical: 20, + color: colors.text, + }, + scrollView: { + paddingBottom: 10, + }, + checkoutContainer: { + paddingHorizontal: 20, + paddingVertical: 10, + gap: 8, + }, + cartButton: { + flex: 1, + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + width: 'auto', + height: 48, + borderRadius: cornerRadius, + paddingHorizontal: 30, + paddingVertical: 2, + backgroundColor: colors.secondary, + fontWeight: 'bold', + }, + cartButtonText: { + fontSize: 22, + lineHeight: 24, + textAlign: 'center', + color: colors.secondaryText, + fontWeight: 'bold', + }, + cartButtonTextSubtitle: { + fontSize: 12, + textAlign: 'center', + color: colors.textSubdued, + fontWeight: 'bold', + }, + productList: { + marginVertical: 20, + paddingHorizontal: 16, + }, + productItem: { + display: 'flex', + flexDirection: 'row', + marginBottom: 10, + padding: 10, + backgroundColor: colors.backgroundSubdued, + borderRadius: 5, + }, + productItemLoading: { + opacity: 0.6, + }, + productTextContainer: { + flex: 1, + }, + productText: { + paddingLeft: 10, + display: 'flex', + flex: 1, + color: colors.textSubdued, + justifyContent: 'center', + flexDirection: 'row', + alignItems: 'center', + }, + productTitle: { + fontSize: 16, + marginBottom: 5, + fontWeight: 'bold', + lineHeight: 20, + color: colors.text, + }, + productDescription: { + fontSize: 14, + color: colors.textSubdued, + }, + productPrice: { + fontSize: 15, + alignSelf: 'flex-start', + paddingTop: 10, + paddingHorizontal: 10, + paddingBottom: 2, + fontWeight: 'bold', + color: colors.text, + }, + removeButton: { + alignSelf: 'flex-end', + marginRight: 10, + marginTop: 2, + }, + removeButtonText: { + color: colors.textSubdued, + }, + productImage: { + width: 60, + height: 60, + borderRadius: 6, + }, + costContainer: { + marginBottom: 10, + marginHorizontal: 20, + paddingTop: 10, + paddingBottom: 65, + paddingHorizontal: 2, + borderTopWidth: 1, + borderTopColor: colors.border, + }, + costBlock: { + display: 'flex', + flexDirection: 'row', + justifyContent: 'space-between', + paddingHorizontal: 5, + paddingVertical: 5, + }, + costBlockText: { + fontSize: 14, + color: colors.textSubdued, + }, + costBlockTextStrong: { + fontSize: 16, + color: colors.text, + fontWeight: 'bold', + }, + }); +} + +export default CartScreen; diff --git a/react-native/sample/src/screens/CatalogScreen.tsx b/react-native/sample/src/screens/CatalogScreen.tsx new file mode 100644 index 00000000..90ad13dd --- /dev/null +++ b/react-native/sample/src/screens/CatalogScreen.tsx @@ -0,0 +1,280 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +import React, {useEffect} from 'react'; +import { + SafeAreaView, + ScrollView, + View, + StyleSheet, + Text, + Image, + Pressable, + ActivityIndicator, +} from 'react-native'; + +import useShopify from '../hooks/useShopify'; + +import type {ShopifyProduct} from '../../@types'; +import type {Colors} from '../context/Theme'; +import {useTheme} from '../context/Theme'; +import {useCart} from '../context/Cart'; +import type {NativeStackScreenProps} from '@react-navigation/native-stack'; +import type {RootStackParamList} from '../App'; +import {currency} from '../utils'; + +type Props = NativeStackScreenProps; + +function CatalogScreen({navigation}: Props) { + const {addToCart, addingToCart} = useCart(); + const {colors} = useTheme(); + const styles = createStyles(colors); + const {queries} = useShopify(); + + const [fetchProducts, {loading, data, error}] = queries.products; + + useEffect(() => { + fetchProducts(); + }, [fetchProducts]); + + if (error) { + return ( + + + An error occurred while loading the catalog. + + "{error?.message}" + + ); + } + + if (loading) { + return ( + + + Loading catalog... + + ); + } + + return ( + + + + {data?.products.edges.map(({node}, index) => ( + { + navigation.navigate('ProductDetails', { + product: node, + variant: getVariant(node), + }); + }} + loading={addingToCart.has(getVariant(node)?.id ?? '')} + onAddToCart={addToCart} + /> + ))} + + + + ); +} + +function getVariant(node: ShopifyProduct) { + return node.variants.edges[0]?.node; +} + +function Product({ + product, + onAddToCart, + loading = false, + onPress, + testID, +}: { + product: ShopifyProduct; + loading?: boolean; + onPress: () => void; + onAddToCart: (variantId: string) => void; + testID: string; +}) { + const {colors} = useTheme(); + const styles = createStyles(colors); + const image = product.images?.edges[0]?.node; + const variant = getVariant(product); + + return ( + + {image?.url && ( + {image?.altText} + )} + + + {product.title} + + {currency(variant?.price.amount, variant?.price.currencyCode)} + + + + {loading ? ( + + + + ) : ( + variant?.id && onAddToCart(variant.id)}> + Add to cart + + )} + + + + ); +} + +export default CatalogScreen; + +function createStyles(colors: Colors) { + return StyleSheet.create({ + container: { + maxHeight: '100%', + }, + loading: { + flex: 1, + padding: 2, + justifyContent: 'center', + alignItems: 'center', + }, + loadingText: { + marginVertical: 20, + color: colors.text, + }, + scrollView: { + paddingBottom: 55, + }, + cartButton: { + position: 'absolute', + width: 'auto', + bottom: 10, + height: 55, + left: 0, + right: 0, + borderRadius: 10, + marginHorizontal: 20, + padding: 10, + backgroundColor: colors.secondary, + fontWeight: 'bold', + }, + cartButtonText: { + fontSize: 16, + lineHeight: 20, + textAlign: 'center', + color: colors.secondaryText, + fontWeight: 'bold', + }, + cartButtonTextSubtitle: { + fontSize: 12, + textAlign: 'center', + color: colors.textSubdued, + fontWeight: 'bold', + }, + productList: { + marginVertical: 20, + paddingHorizontal: 16, + }, + productItem: { + flex: 1, + flexDirection: 'row', + marginBottom: 10, + padding: 10, + backgroundColor: colors.backgroundSubdued, + borderRadius: 5, + }, + productText: { + paddingLeft: 20, + paddingTop: 10, + flexShrink: 1, + flexGrow: 1, + color: colors.textSubdued, + justifyContent: 'space-between', + }, + productTitle: { + fontSize: 16, + marginBottom: 5, + fontWeight: 'bold', + lineHeight: 20, + color: colors.text, + }, + productPrice: { + fontSize: 14, + flex: 1, + color: colors.textSubdued, + }, + productImage: { + width: 100, + height: 100, + marginRight: 5, + borderRadius: 6, + }, + addToCartLoading: { + padding: 10, + marginRight: 20, + }, + addToCartButtonContainer: { + alignItems: 'flex-end', + flexShrink: 1, + flexGrow: 0, + }, + addToCartButton: { + borderRadius: 10, + fontSize: 8, + margin: 5, + backgroundColor: 'transparent', + paddingHorizontal: 10, + paddingVertical: 5, + }, + addToCartButtonText: { + fontSize: 14, + lineHeight: 20, + color: colors.primary, + fontWeight: 'bold', + textAlign: 'center', + }, + }); +} diff --git a/react-native/sample/src/screens/LoginScreen.tsx b/react-native/sample/src/screens/LoginScreen.tsx new file mode 100644 index 00000000..3fc34d60 --- /dev/null +++ b/react-native/sample/src/screens/LoginScreen.tsx @@ -0,0 +1,105 @@ +import React, {useCallback, useMemo, useState} from 'react'; +import {ActivityIndicator, StyleSheet, View} from 'react-native'; +import {WebView} from 'react-native-webview'; +import type {ShouldStartLoadRequest} from 'react-native-webview/lib/WebViewTypes'; +import type {NativeStackScreenProps} from '@react-navigation/native-stack'; +import type {AccountStackParamList} from '../App'; +import {useAuth} from '../context/Auth'; +import {useConfig} from '../context/Config'; +import {BuyerIdentityMode} from '../auth/types'; +import { + CustomerAccountManager, + customerAccountManager, +} from '../auth/customerAccountManager'; +import type {Colors} from '../context/Theme'; +import {useTheme} from '../context/Theme'; + +type Props = NativeStackScreenProps; + +function LoginScreen({navigation}: Props) { + const {handleAuthCallback} = useAuth(); + const {appConfig, setAppConfig} = useConfig(); + const {colors} = useTheme(); + const styles = createStyles(colors); + const [isProcessing, setIsProcessing] = useState(false); + + const authorizationURL = useMemo( + () => customerAccountManager.buildAuthorizationURL(), + [], + ); + const callbackScheme = CustomerAccountManager.callbackScheme; + + const handleNavigationRequest = useCallback( + (request: ShouldStartLoadRequest): boolean => { + const {url} = request; + + if (url.startsWith(`${callbackScheme}://callback`)) { + setIsProcessing(true); + const urlParams = new URL(url); + const code = urlParams.searchParams.get('code'); + const state = urlParams.searchParams.get('state'); + + if (code && state) { + handleAuthCallback(code, state) + .then(() => { + setAppConfig({ + ...appConfig, + buyerIdentityMode: BuyerIdentityMode.CustomerAccount, + }); + navigation.goBack(); + }) + .catch(() => { + setIsProcessing(false); + navigation.goBack(); + }); + } else { + navigation.goBack(); + } + + return false; + } + + return true; + }, + [appConfig, callbackScheme, handleAuthCallback, navigation, setAppConfig], + ); + + if (isProcessing) { + return ( + + + + ); + } + + return ( + + + + ); +} + +function createStyles(colors: Colors) { + return StyleSheet.create({ + container: { + flex: 1, + backgroundColor: colors.background, + }, + loading: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, + webview: { + flex: 1, + }, + }); +} + +export default LoginScreen; diff --git a/react-native/sample/src/screens/ProductDetailsScreen.tsx b/react-native/sample/src/screens/ProductDetailsScreen.tsx new file mode 100644 index 00000000..8835a824 --- /dev/null +++ b/react-native/sample/src/screens/ProductDetailsScreen.tsx @@ -0,0 +1,233 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +import React from 'react'; +import { + SafeAreaView, + ScrollView, + View, + StyleSheet, + Text, + Image, + Pressable, + ActivityIndicator, +} from 'react-native'; + +import type {ShopifyProduct} from '../../@types'; +import type {Colors} from '../context/Theme'; +import {useTheme} from '../context/Theme'; +import {useCart} from '../context/Cart'; +import type {NativeStackScreenProps} from '@react-navigation/native-stack'; +import type {RootStackParamList} from '../App'; +import { + AcceleratedCheckoutButtons, + AcceleratedCheckoutWallet, + ApplePayLabel, + useShopifyCheckoutSheet, +} from '@shopify/checkout-sheet-kit'; +import {useConfig} from '../context/Config'; +import {useShopifyEventHandlers} from '../hooks/useCheckoutEventHandlers'; + +type Props = NativeStackScreenProps; + +function ProductDetailsScreen({route}: Props) { + const {colors, cornerRadius} = useTheme(); + const {addToCart, addingToCart} = useCart(); + const styles = createStyles(colors, cornerRadius); + + if (!route?.params) { + return null; + } + + return ( + + + + + + ); +} + +function getVariant(node: ShopifyProduct) { + return node.variants.edges[0]?.node; +} + +function ProductDetails({ + product, + onAddToCart, + loading = false, +}: { + product: ShopifyProduct; + loading?: boolean; + onAddToCart: (variantId: string) => void; +}) { + const {appConfig} = useConfig(); + const {colors, cornerRadius} = useTheme(); + const styles = createStyles(colors, cornerRadius); + const image = product.images?.edges[0]?.node; + const variant = getVariant(product); + const {acceleratedCheckoutsAvailable} = useShopifyCheckoutSheet(); + + const eventHandlers = useShopifyEventHandlers( + 'PDP - AcceleratedCheckoutButtons', + ); + + return ( + + {image?.url && ( + {image?.altText} + )} + + + {product.title} + + {product.description.slice(0, 100)}... + + + + + {acceleratedCheckoutsAvailable && variant?.id && ( + + )} + + variant?.id && onAddToCart(variant.id)}> + {loading ? ( + + ) : ( + + Add to cart + + )} + + + + + ); +} + +export default ProductDetailsScreen; + +function createStyles(colors: Colors, cornerRadius: number) { + return StyleSheet.create({ + container: { + maxHeight: '100%', + }, + scrollView: { + paddingBottom: 55, + }, + productItem: { + flex: 1, + flexDirection: 'column', + marginBottom: 10, + padding: 20, + backgroundColor: colors.backgroundSubdued, + borderRadius: 5, + }, + productText: { + paddingTop: 10, + flexShrink: 1, + flexGrow: 1, + color: colors.textSubdued, + justifyContent: 'space-between', + }, + productTitle: { + fontSize: 20, + marginTop: 10, + marginBottom: 5, + marginHorizontal: 5, + fontWeight: 'bold', + lineHeight: 28, + textAlign: 'left', + color: colors.text, + }, + productDescription: { + fontSize: 16, + marginTop: 5, + marginBottom: 10, + marginHorizontal: 5, + lineHeight: 20, + textAlign: 'left', + color: colors.text, + }, + productPrice: { + fontSize: 14, + flex: 1, + color: colors.textSubdued, + }, + productImage: { + width: '100%', + height: 400, + marginTop: 5, + borderRadius: cornerRadius, + }, + buttonContainer: { + marginTop: 20, + gap: 8, + }, + addToCartButton: { + borderRadius: cornerRadius, + backgroundColor: colors.secondary, + paddingHorizontal: 10, + paddingVertical: 14, + height: 48, + }, + addToCartButtonText: { + fontSize: 20, + lineHeight: 24, + color: colors.secondaryText, + fontWeight: 'bold', + textAlign: 'center', + }, + }); +} diff --git a/react-native/sample/src/screens/SettingsScreen.tsx b/react-native/sample/src/screens/SettingsScreen.tsx new file mode 100644 index 00000000..5de4ce4c --- /dev/null +++ b/react-native/sample/src/screens/SettingsScreen.tsx @@ -0,0 +1,547 @@ +/* +MIT License + +Copyright 2023 - Present, Shopify Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +import React, {useCallback, useMemo, useEffect, useState} from 'react'; +import { + Pressable, + SafeAreaView, + SectionList, + StyleSheet, + Switch, + Text, + View, +} from 'react-native'; +import pkg from '../../../package.json'; +import Config from 'react-native-config'; +import {useConfig} from '../context/Config'; +import { + ApplePayStyle, + ColorScheme, + useShopifyCheckoutSheet, +} from '@shopify/checkout-sheet-kit'; +import type {Colors} from '../context/Theme'; +import {useTheme} from '../context/Theme'; +import {useNavigation} from '@react-navigation/native'; +import {useAuth} from '../context/Auth'; +import { + BuyerIdentityMode, + BuyerIdentityModeDisplayNames, +} from '../auth/types'; + +enum SectionType { + Switch = 'switch', + SingleSelect = 'single-select', + Text = 'text', +} + +interface SwitchItem { + type: SectionType.Switch; + title: string; + description?: string; + value: boolean; + handler: () => void; +} + +interface SingleSelectItem { + type: SectionType.SingleSelect; + title: string; + value: ColorScheme | BuyerIdentityMode | ApplePayStyle; + selected: boolean; +} + +interface TextItem { + type: SectionType.Text; + title: string; + value?: string; +} + +function isSwitchItem(item: any): item is SwitchItem { + return item.type === SectionType.Switch; +} + +function isSingleSelectItem(item: any): item is SingleSelectItem { + return item.type === SectionType.SingleSelect; +} + +function isTextItem(item: any): item is TextItem { + return item.type === SectionType.Text; +} + +interface SectionData { + title: string; + footer?: string; + data: readonly (SwitchItem | SingleSelectItem | TextItem)[]; +} + +function SettingsScreen() { + const shopify = useShopifyCheckoutSheet(); + const {appConfig, setAppConfig} = useConfig(); + const {colors, setColorScheme} = useTheme(); + const styles = createStyles(colors); + const [preloadingEnabled, setPreloadingEnabled] = useState(false); + + useEffect(() => { + async function loadConfig() { + const config = await shopify.getConfig(); + setPreloadingEnabled(config?.preloading ?? false); + } + loadConfig(); + }, [shopify]); + + const handleColorSchemeChange = useCallback( + (item: SingleSelectItem) => { + setAppConfig({ + ...appConfig, + colorScheme: item.value as ColorScheme, + }); + setColorScheme(item.value as ColorScheme); + }, + [appConfig, setAppConfig, setColorScheme], + ); + + const handleTogglePreloading = useCallback(async () => { + const currentConfig = await shopify.getConfig(); + const newPreloadingValue = !currentConfig?.preloading; + shopify.setConfig({ + ...currentConfig, + preloading: newPreloadingValue, + }); + setPreloadingEnabled(newPreloadingValue); + }, [shopify]); + + const {isAuthenticated, customerEmail, tokenExpiresAt, logout} = useAuth(); + + const handleApplePayStyleChange = useCallback( + (item: SingleSelectItem) => { + setAppConfig({ + ...appConfig, + applePayStyle: item.value as ApplePayStyle, + }); + }, + [appConfig, setAppConfig], + ); + + const handleBuyerIdentityModeChange = useCallback( + (item: SingleSelectItem) => { + const newMode = item.value as BuyerIdentityMode; + if ( + appConfig.buyerIdentityMode === BuyerIdentityMode.CustomerAccount && + newMode !== BuyerIdentityMode.CustomerAccount + ) { + logout(); + } + setAppConfig({ + ...appConfig, + buyerIdentityMode: newMode, + }); + }, + [appConfig, logout, setAppConfig], + ); + + const configurationOptions: readonly SwitchItem[] = useMemo( + () => [ + { + title: 'Preload checkout', + type: SectionType.Switch, + value: preloadingEnabled, + handler: handleTogglePreloading, + }, + ], + [preloadingEnabled, handleTogglePreloading], + ); + + const buyerIdentityOptions: readonly SingleSelectItem[] = useMemo( + () => + Object.values(BuyerIdentityMode).map(mode => ({ + title: BuyerIdentityModeDisplayNames[mode], + type: SectionType.SingleSelect as const, + value: mode, + selected: appConfig.buyerIdentityMode === mode, + })), + [appConfig.buyerIdentityMode], + ); + + const themeOptions: readonly SingleSelectItem[] = useMemo( + () => [ + { + title: 'Automatic', + type: SectionType.SingleSelect, + value: ColorScheme.automatic, + selected: appConfig.colorScheme === ColorScheme.automatic, + }, + { + title: 'Light', + type: SectionType.SingleSelect, + value: ColorScheme.light, + selected: appConfig.colorScheme === ColorScheme.light, + }, + { + title: 'Dark', + type: SectionType.SingleSelect, + value: ColorScheme.dark, + selected: appConfig.colorScheme === ColorScheme.dark, + }, + { + title: 'Web', + type: SectionType.SingleSelect, + value: ColorScheme.web, + selected: appConfig.colorScheme === ColorScheme.web, + }, + ], + [appConfig.colorScheme], + ); + + const applePayStyleDisplayNames: Record = useMemo( + () => ({ + [ApplePayStyle.automatic]: 'Automatic', + [ApplePayStyle.black]: 'Black', + [ApplePayStyle.white]: 'White', + [ApplePayStyle.whiteOutline]: 'White Outline', + }), + [], + ); + + const applePayStyleOptions: readonly SingleSelectItem[] = useMemo( + () => + Object.values(ApplePayStyle).map(style => ({ + title: applePayStyleDisplayNames[style], + type: SectionType.SingleSelect as const, + value: style, + selected: appConfig.applePayStyle === style, + })), + [appConfig.applePayStyle, applePayStyleDisplayNames], + ); + + const informationalItems: readonly TextItem[] = useMemo( + () => [ + { + title: 'SDK version', + type: SectionType.Text, + value: shopify.version, + }, + { + title: 'App version', + type: SectionType.Text, + value: pkg.version, + }, + { + title: 'Storefront Domain', + type: SectionType.Text, + value: Config.STOREFRONT_DOMAIN || 'undefined', + }, + ], + [shopify.version], + ); + + const sections: SectionData[] = useMemo( + () => [ + { + title: 'Features', + data: configurationOptions, + }, + { + title: 'Authentication', + footer: + 'Prefills buyer identity at checkout. Changing this setting will clear your cart.', + data: buyerIdentityOptions, + }, + { + title: 'Theme', + data: themeOptions, + }, + { + title: 'Apple Pay Style', + footer: + 'Configures the visual style of the Apple Pay button.', + data: applePayStyleOptions, + }, + { + title: 'Versions', + data: informationalItems, + }, + ], + [ + themeOptions, + configurationOptions, + buyerIdentityOptions, + applePayStyleOptions, + informationalItems, + ], + ); + + return ( + + item.title} + renderItem={({item, section}) => { + if (isSwitchItem(item)) { + return ( + + ); + } + + if (isSingleSelectItem(item)) { + const sectionHandlers: Record void> = { + Authentication: handleBuyerIdentityModeChange, + 'Apple Pay Style': handleApplePayStyleChange, + }; + const handler = sectionHandlers[section.title] ?? handleColorSchemeChange; + return ( + handler(item)} + /> + ); + } + + if (isTextItem(item)) { + return ; + } + + return null; + }} + renderSectionHeader={({section: {title}}) => ( + + {title} + + )} + renderSectionFooter={({section}) => { + const isAuthSection = section.title === 'Authentication'; + return ( + + {isAuthSection && ( + + )} + {section.footer ? ( + + + {section.footer} + + + ) : null} + + ); + }} + /> + + ); +} + +interface SwitchItemProps { + item: SwitchItem; + styles: ReturnType; + onChange: () => void; +} + +interface SelectItemProps { + item: SingleSelectItem; + styles: ReturnType; + onPress: () => void; +} + +interface TextItemProps { + item: TextItem; + styles: ReturnType; +} + +function SwitchItem({item, styles, onChange}: SwitchItemProps) { + return ( + + + {item.title} + + + {item.description && ( + {item.description} + )} + + ); +} + +function SelectItem({item, styles, onPress}: SelectItemProps) { + return ( + + {item.title} + + {item.selected && } + + ); +} + +function TextItem({item, styles}: TextItemProps) { + return ( + + {item.title} + {item.value} + + ); +} + +interface BuyerIdentityDetailsProps { + mode: BuyerIdentityMode; + isAuthenticated: boolean; + customerEmail: string | null; + tokenExpiresAt: number | null; + styles: ReturnType; +} + +function BuyerIdentityDetails({ + mode, + isAuthenticated: authenticated, + customerEmail: email, + tokenExpiresAt: expiresAt, + styles, +}: BuyerIdentityDetailsProps) { + const navigation = useNavigation(); + + switch (mode) { + case BuyerIdentityMode.Guest: + return null; + case BuyerIdentityMode.Hardcoded: + return ( + + + Populates Cart Buyer Identity with values from .env + + + ); + case BuyerIdentityMode.CustomerAccount: + if (authenticated) { + return ( + + + Changing Buyer Identity will log you out. + + + + User: {email ?? 'Unknown'} + + navigation.navigate('Account' as never)}> + Change user + + + {expiresAt && ( + + Expires: {new Date(expiresAt).toLocaleString()} + + )} + + ); + } + return ( + + navigation.navigate('Account' as never)}> + Sign in on the + Account tab + + + ); + } +} + +function createStyles(colors: Colors) { + return StyleSheet.create({ + list: { + borderColor: colors.border, + borderTopWidth: 1, + }, + listItem: { + flex: 1, + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + paddingHorizontal: 16, + paddingVertical: 10, + padding: 10, + backgroundColor: colors.backgroundSubdued, + borderColor: colors.border, + borderBottomWidth: 1, + }, + listItemText: { + flex: 1, + fontSize: 16, + color: colors.text, + }, + listItemDescription: { + color: colors.textSubdued, + fontSize: 12, + paddingHorizontal: 16, + paddingVertical: 10, + }, + listItemSecondaryText: { + color: colors.textSubdued, + }, + listItemSwitch: {}, + listItemCheck: { + color: colors.secondary, + fontWeight: 'bold', + }, + section: { + paddingHorizontal: 16, + paddingVertical: 20, + }, + sectionText: { + fontSize: 13, + color: '#9f9f9f', + marginTop: 10, + marginBottom: -10, + }, + sectionFooter: { + paddingHorizontal: 16, + paddingTop: 8, + paddingBottom: 4, + }, + sectionFooterText: { + fontSize: 12, + color: colors.textSubdued, + }, + detailRow: { + flexDirection: 'row', + alignItems: 'center', + gap: 4, + }, + linkText: { + fontSize: 12, + color: '#007AFF', + }, + }); +} + +export default SettingsScreen; diff --git a/react-native/sample/src/utils.ts b/react-native/sample/src/utils.ts new file mode 100644 index 00000000..d061a08b --- /dev/null +++ b/react-native/sample/src/utils.ts @@ -0,0 +1,90 @@ +import Config from 'react-native-config'; +import type {AppConfig} from './context/Config'; +import {BuyerIdentityMode} from './auth/types'; + +const { + EMAIL, + ADDRESS_1, + ADDRESS_2, + CITY, + COMPANY, + COUNTRY, + FIRST_NAME, + LAST_NAME, + PROVINCE, + ZIP, + PHONE, +} = Config; + +export function createBuyerIdentityCartInput( + appConfig: AppConfig, + customerAccessToken?: string, +) { + switch (appConfig.buyerIdentityMode) { + case BuyerIdentityMode.Guest: + return {}; + case BuyerIdentityMode.Hardcoded: + return { + buyerIdentity: { + email: EMAIL, + deliveryAddressPreferences: { + deliveryAddress: { + address1: ADDRESS_1, + address2: ADDRESS_2, + city: CITY, + company: COMPANY, + country: COUNTRY, + firstName: FIRST_NAME, + lastName: LAST_NAME, + phone: PHONE, + province: PROVINCE, + zip: ZIP, + }, + }, + }, + }; + case BuyerIdentityMode.CustomerAccount: + if (!customerAccessToken) { + return {}; + } + return { + buyerIdentity: { + customerAccessToken, + }, + }; + } +} + +const fallbackLocale = 'en-CA'; +export function getLocale(): string { + return Intl.DateTimeFormat().resolvedOptions().locale ?? fallbackLocale; +} + +export function currency(amount?: string, currency?: string): string { + if (typeof amount === 'undefined' && typeof currency === 'undefined') { + return ''; + } + + try { + const locale = getLocale(); + return new Intl.NumberFormat(locale, { + style: 'currency', + currency: currency, + }).format(Number(amount ?? 0)); + } catch (error) { + console.error(error); + const currencyCode = currency ? ` ${currency}` : ''; + return `${Number(amount ?? 0).toFixed(2)}` + currencyCode; + } +} + +export function debugLog(message: string, data?: any) { + if (__DEV__) { + console.log(message, data || ''); + } +} + +export function createDebugLogger(name: string) { + return (message: string, data?: any) => + debugLog(`[${name}] ${message}`, data); +} diff --git a/react-native/scripts/check_cache b/react-native/scripts/check_cache new file mode 100755 index 00000000..f00852f3 --- /dev/null +++ b/react-native/scripts/check_cache @@ -0,0 +1,30 @@ +#!/bin/bash + +set -e + +WORKSPACE=$1 +COMMAND=$2 + +if [ -z "$WORKSPACE" ]; then + echo "Workspace not found. Example usage: ./scripts/check_cache.sh sample build:android" + exit 1 +fi + +if [ -z "$COMMAND" ]; then + echo "Command not found. Example usage: ./scripts/check_cache.sh sample build:android" + exit 1 +fi + +TASK_ID="$1#$2" + +# Fetch the turbo cache for the specified command +CACHE=$(pnpm turbo run $2 --cache-dir=".turbo" --dry=json) + +# Check the status of the cache +RESULT=$(echo $CACHE | jq ".tasks[] | select(.taskId==\"$TASK_ID\") | .cache.status") + +if [[ $RESULT == "HIT" ]]; then + echo "1" +else + echo "0" +fi diff --git a/react-native/scripts/compare_snapshot b/react-native/scripts/compare_snapshot new file mode 100755 index 00000000..9a270f76 --- /dev/null +++ b/react-native/scripts/compare_snapshot @@ -0,0 +1,40 @@ +#!/bin/bash + +FILENAME="modules/@shopify/checkout-sheet-kit/package.snapshot.json" +TMP_SNAPSHOT_FILENAME="snapshot.json" + +# Set up some colors to use later +red=$(tput setaf 1) +green=$(tput setaf 2) +reset=$(tput sgr0) + +./scripts/create_snapshot $TMP_SNAPSHOT_FILENAME + +if [ $? -ne 0 ]; then + echo "${red}Failed to create snapshot.${reset}" + exit 1 +fi + +diff $FILENAME $TMP_SNAPSHOT_FILENAME &>/dev/null + +if [ $? -eq 0 ] +then + echo "${green}SUCCESS${reset}: The package files have not changed." +else + echo " + + ${red}ERROR${reset}: The package files have changed. + + If this is intentional, run \"pnpm snapshot\" at the root of this repo to update the \"$FILENAME\" file. + + If it NOT intentional, please manually check the diff below to discern if the file(s) should be included in the public package or not: + + +${green}EXISTING SNAPSHOT${reset} ${red}NEW SNAPSHOT${reset} + " + diff --color --side-by-side $FILENAME $TMP_SNAPSHOT_FILENAME + + exit 1 +fi + +rm $TMP_SNAPSHOT_FILENAME diff --git a/react-native/scripts/copy_license b/react-native/scripts/copy_license new file mode 100755 index 00000000..ad8aa264 --- /dev/null +++ b/react-native/scripts/copy_license @@ -0,0 +1,125 @@ +#!/usr/bin/env ruby + +require 'find' + +## +# Builds the canonical license block that will be inserted at the top of files +# when needed. +def build_license_block + license_body = File.read('LICENSE') + "/*\n#{license_body}*/\n\n" +end + +## +# Normalizes a string by collapsing all whitespace (spaces, tabs, newlines) +# into single spaces and trimming the ends. Used to compare license text while +# ignoring formatting differences such as indentation or wrapping. +def normalize_whitespace(text) + text.gsub(/\s+/, ' ').strip +end + +## +# Given the contents of a file, extracts the very first comment at the top of +# the file if it exists and returns a tuple of: +# - full_comment_with_markers: the raw comment including comment markers +# - inner_comment_text: the text inside the comment with common decorations removed +# - range_end_index: the index where the comment ends in the file contents +# If there is no top-of-file comment, returns [nil, nil, 0]. +def extract_top_comment(content) + # Handle optional UTF-8 BOM at start + content = content.sub(/^\uFEFF/, '') + + if content.start_with?('/*') + end_idx = content.index('*/', 2) + return [nil, nil, 0] unless end_idx + full = content[0..(end_idx + 1)] + inner = full[2..-3] + # Remove leading '*' decoration often found in block comments + inner = inner.lines.map { |line| line.sub(/^\s*\*\s?/, '') }.join + return [full, inner, end_idx + 2] + elsif content.start_with?('//') + lines = [] + consumed = 0 + content.each_line do |line| + break unless line.start_with?('//') + lines << line + consumed += line.bytesize + end + full = lines.join + inner = lines.map { |l| l.sub(/^\/\/\s?/, '') }.join + return [full, inner, consumed] + else + return [nil, nil, 0] + end +end + +## +# Returns true if the provided file content begins with a license comment whose +# normalized text matches the repository LICENSE content, ignoring whitespace. +def license_at_top?(content, normalized_license) + _full, inner, _ = extract_top_comment(content) + return false unless inner + normalize_whitespace(inner) == normalized_license +end + +## +# Processes a single file, ensuring the license block exists at the very top of +# the file. If the file already has the license (with any whitespace formatting), +# it is left unchanged. Otherwise, the license block is prepended above any +# existing content. +def process_file(path, license_block, normalized_license, write: true) + content = File.read(path) + + # If license already at the very top (ignoring whitespace differences), do nothing. + return false if license_at_top?(content, normalized_license) + + # Remove leading BOM and leading blank lines to place license at true top. + content = content.sub(/^\uFEFF/, '') + content = content.sub(/^\n+/, '') + + updated = license_block + content + if write + File.write(path, updated) + end + true +end + +## +# Iterates through a directory tree and applies the license update for supported +# file extensions. Returns the list of files that would be or were modified. +def copy_license(dir, license_block, normalized_license, check_only: false) + modified = [] + supported_exts = %w[.swift .h .mm .java .js .ts .tsx] + + Find.find(dir) do |path| + next unless File.file?(path) && supported_exts.any? { |ext| path.end_with?(ext) } + + changed = process_file(path, license_block, normalized_license, write: !check_only) + if changed + modified << path + puts("[copy_license] #{check_only ? 'would update' : 'updated'} #{path}") + end + end + + modified +end + +license_block = build_license_block +normalized_license = normalize_whitespace(File.read('LICENSE')) + +check_only = ARGV.include?('--check') + +modified = [] +modified += copy_license('modules/@shopify/checkout-sheet-kit/ios', license_block, normalized_license, check_only: check_only) +modified += copy_license('modules/@shopify/checkout-sheet-kit/android', license_block, normalized_license, check_only: check_only) +modified += copy_license('modules/@shopify/checkout-sheet-kit/src', license_block, normalized_license, check_only: check_only) + +if check_only + if modified.empty? + puts('[copy_license] all files compliant') + exit 0 + else + puts("[copy_license] non-compliant files: #{modified.count}") + exit 1 + end +end diff --git a/react-native/scripts/create_snapshot b/react-native/scripts/create_snapshot new file mode 100755 index 00000000..878ff422 --- /dev/null +++ b/react-native/scripts/create_snapshot @@ -0,0 +1,5 @@ +#!/bin/bash + +OUTPUT_FILE=${1:-modules/@shopify/checkout-sheet-kit/package.snapshot.json} + +(cd modules/@shopify/checkout-sheet-kit && npm pack --dry-run --json) | jq ".[0].files | map(.path)" > $OUTPUT_FILE diff --git a/react-native/scripts/lint_swift b/react-native/scripts/lint_swift new file mode 100755 index 00000000..1995895f --- /dev/null +++ b/react-native/scripts/lint_swift @@ -0,0 +1,89 @@ +#!/bin/bash + +DIR=modules/@shopify/checkout-sheet-kit +MODE="${1:-check}" + +# Validate the mode +if [[ "$MODE" != "check" && "$MODE" != "fix" ]]; then + echo "❌ Invalid mode: $MODE" + echo "Usage: $0 [check|fix]" + echo " check: Run linters in check mode (default)" + echo " fix: Run linters in fix mode to auto-fix issues" + exit 1 +fi + +# Function to provide installation instructions +print_install_instructions() { + echo "🔧 FIX:" + echo " Shopify employee? Run 'dev up'" + echo " Not a Shopify employee? Install via homebrew:" + echo " - SwiftLint: 'brew install swiftlint' / https://github.com/realm/SwiftLint" + echo " - SwiftFormat: 'brew install swiftformat' / https://github.com/nicklockwood/SwiftFormat" +} + +# Check for SwiftLint +if ! which swiftlint >/dev/null; then + echo "⚠️ WARN: SwiftLint not installed" + print_install_instructions + exit 1 +fi + +# Check for SwiftFormat +if ! which swiftformat >/dev/null; then + echo "⚠️ WARN: SwiftFormat not installed" + print_install_instructions + exit 1 +fi + +# Run SwiftLint +if [[ "$MODE" == "check" ]]; then + echo "🔄 Running SwiftLint in check mode..." + swiftlint lint --strict $DIR --config .swiftlint.yml + LINT_STATUS=$? +else + echo "🔄 Running SwiftLint in fix mode..." + swiftlint lint --fix $DIR --config .swiftlint.yml + LINT_STATUS=$? +fi +echo "SwiftLint exit status: $LINT_STATUS" + +# Run SwiftFormat +if [[ "$MODE" == "check" ]]; then + echo "🔄 Running SwiftFormat in check mode..." + swiftformat $DIR --lint --config .swiftformat + FORMAT_STATUS=$? +else + echo "🔄 Running SwiftFormat in fix mode..." + swiftformat $DIR --config .swiftformat + FORMAT_STATUS=$? +fi +echo "SwiftFormat exit status: $FORMAT_STATUS" + +# Function to print error messages for linting issues +print_linting_error() { + local tool_name=$1 + echo "❌ $tool_name detected issues that need to be fixed." + echo "🔧 How to fix:" + echo " Shopify employee? Run 'dev fix' or 'dev check' to see detailed output" + echo " Not a Shopify employee? Run './scripts/lint_swift fix' to auto-fix issues" + if [[ "$tool_name" == "SwiftLint" ]]; then + echo " Then fix any remaining non-autofixable issues manually" + fi +} + +# Handle exit codes for check mode +if [[ "$MODE" == "check" ]]; then + if [ $LINT_STATUS -ne 0 ]; then + print_linting_error "SwiftLint" + exit 1 + fi + + if [ $FORMAT_STATUS -ne 0 ]; then + print_linting_error "SwiftFormat" + exit 1 + fi + + echo "✅ All linting checks passed!" +else + echo "✅ Linting fixes applied!" +fi diff --git a/react-native/tsconfig.json b/react-native/tsconfig.json new file mode 100644 index 00000000..8a05ab81 --- /dev/null +++ b/react-native/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "rootDir": ".", + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "jsx": "react", + "lib": ["esnext"], + "module": "esnext", + "moduleResolution": "node", + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "noImplicitUseStrict": false, + "noStrictGenericChecks": false, + "noUncheckedIndexedAccess": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "verbatimModuleSyntax": true, + "target": "esnext" + } +} diff --git a/react-native/turbo.json b/react-native/turbo.json new file mode 100644 index 00000000..2d8a88a3 --- /dev/null +++ b/react-native/turbo.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://turbo.build/schema.json", + "pipeline": { + "build": { + "outputs": ["./modules/@shopify/checkout-sheet-kit/lib/**"] + }, + "lint": {}, + "build:android": { + "dependsOn": ["build", "lint"], + "outputs": ["sample/android/app/build"] + }, + "build:ios": { + "dependsOn": ["build", "lint"], + "outputs": ["sample/ios/build"] + }, + "test:ios": { + "dependsOn": ["build", "lint"], + "cache": false + }, + "test:android": { + "dependsOn": ["build", "lint"], + "cache": false + } + } +}

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%0Dsrh++t#fI; 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 JR%_h|{~x**H;(`S literal 0 HcmV?d00001 diff --git a/react-native/sample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png b/react-native/sample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png new file mode 100644 index 0000000000000000000000000000000000000000..d749c0755ba8908f81cae2830c4579951f765451 GIT binary patch literal 44507 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 literal 0 HcmV?d00001 diff --git a/react-native/sample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/react-native/sample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4a72d13e9d293d24d0cddc3e1904087092b0de40 GIT binary patch literal 487 zcmeAS@N?(olHy`uVBq!ia0y~yU~~at4mO}j{44ikK+ZZ(7srr_xVHxxd4Yn57JT>5 kBt)78&qol`;+05qHxmH+?% literal 0 HcmV?d00001 diff --git a/react-native/sample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/react-native/sample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..97054d9ae0a035b538609f935cc6977e18c5f3db GIT binary patch literal 19630 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