From b56caddf1a6ff7a5397075c20f61afcbd514768f Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Tue, 2 Sep 2025 10:44:22 -0400 Subject: [PATCH 01/25] Modify permissions library --- .../android/app/src/main/AndroidManifest.xml | 3 + .../KlaviyoReactNativeSdkExample/Info.plist | 8 +- example/ios/Podfile.lock | 127 +-- example/package.json | 4 +- example/src/AppViewInterface.ts | 75 ++ example/src/GeofencingWrapper.ts | 176 ++++ package.json | 4 + src/Geofencing.ts | 290 +++++++ yarn.lock | 778 +++++++++--------- 9 files changed, 1037 insertions(+), 428 deletions(-) create mode 100644 example/src/GeofencingWrapper.ts create mode 100644 src/Geofencing.ts diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index 65b8af78..00de5f57 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -2,6 +2,9 @@ + + + NSLocationWhenInUseUsageDescription - + We use your location to show your position + NSLocationAlwaysAndWhenInUseUsageDescription + We need background location access + UIBackgroundModes + + location + UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index df32c07f..4d0585ac 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1251,6 +1251,8 @@ PODS: - React-jsiexecutor - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core + - react-native-geolocation-service (5.3.1): + - React - React-NativeModulesApple (0.78.0): - glog - hermes-engine @@ -1538,6 +1540,27 @@ PODS: - React-logger (= 0.78.0) - React-perflogger (= 0.78.0) - React-utils (= 0.78.0) + - RNPermissions (5.4.2): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga - SocketRocket (0.7.1) - Yoga (0.0.0) @@ -1583,6 +1606,7 @@ DEPENDENCIES: - 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-geolocation-service (from `../node_modules/react-native-geolocation-service`) - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`) @@ -1611,6 +1635,7 @@ DEPENDENCIES: - ReactAppDependencyProvider (from `build/generated/ios`) - ReactCodegen (from `build/generated/ios`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - RNPermissions (from `../node_modules/react-native-permissions`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: @@ -1700,6 +1725,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon" React-microtasksnativemodule: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" + react-native-geolocation-service: + :path: "../node_modules/react-native-geolocation-service" React-NativeModulesApple: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" React-perflogger: @@ -1756,6 +1783,8 @@ EXTERNAL SOURCES: :path: build/generated/ios ReactCommon: :path: "../node_modules/react-native/ReactCommon" + RNPermissions: + :path: "../node_modules/react-native-permissions" Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" @@ -1768,7 +1797,7 @@ SPEC CHECKSUMS: fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd glog: eb93e2f488219332457c3c4eafd2738ddc7e80b8 hermes-engine: b417d2b2aee3b89b58e63e23a51e02be91dc876d - klaviyo-react-native-sdk: bd5cb9cf23d06851b762c4e50c471e8186f4efb1 + klaviyo-react-native-sdk: 25787506822141b431feb3de033a783adbfd287d KlaviyoCore: b5756601aa1a36d9c52a2482129678ea12fb6fd8 KlaviyoForms: 8bd518b140115b1ddd5e892b7b12844fe1ce245e KlaviyoSwift: 995930ec8a87596950ff2cfc6340ac66e626e913 @@ -1779,61 +1808,63 @@ SPEC CHECKSUMS: RCTTypeSafety: c135dd2bf50402d87fd12884cbad5d5e64850edd React: b229c49ed5898dab46d60f61ed5a0bfa2ee2fadb React-callinvoker: 2ac508e92c8bd9cf834cc7d7787d94352e4af58f - React-Core: 13cdd1558d0b3f6d9d5a22e14d89150280e79f02 - React-CoreModules: b07a6744f48305405e67c845ebf481b6551b712a - React-cxxreact: 1055a86c66ac35b4e80bd5fb766aed5f494dfff4 + React-Core: 325b4f6d9162ae8b9a6ff42fe78e260eb124180d + React-CoreModules: 558041e5258f70cd1092f82778d07b8b2ff01897 + React-cxxreact: 8fff17cbe76e6a8f9991b59552e1235429f9c74b React-debug: c76e92776a86622209279fe6d24a0147584444ed - React-defaultsnativemodule: c2e3ac39909241374c3322eb2be33f4c15fe6be4 - React-domnativemodule: 240b3c95b5300cc6537594e73ebc6e8e77585b74 - React-Fabric: 3b403ca25f74d54454b31d1d2627050e0777d42c - React-FabricComponents: 154740cfcd57943709a9d0343769d17173c0ac9c - React-FabricImage: 0863e39cea98f3ca2f8c3d92984660795cec84ae + React-defaultsnativemodule: 111fb1efc95c2bd0ee18e38e9f7b57d678e6f932 + React-domnativemodule: d5154a815306fd6050ee9346a1490d2fb17eb0e5 + React-Fabric: 51ac32f0a6790b1d3b14d90c6870e5ce5bb3854a + React-FabricComponents: 1094d6a3c2566b3c56951331c44d7d3960570ac8 + React-FabricImage: 6b210ad3c72704a9ad60dde66c397ce6257333f4 React-featureflags: efb93a998907e4ad5b88f6ed77cc140914d5c36d - React-featureflagsnativemodule: 51116d72aafea30860f315702d17eb76bbb725a3 - React-graphics: 91d9920451f633d64d31948da3ba0377b6eda8de - React-hermes: 71186f872c932e4574d5feb3ed754dda63a0b3bd - React-idlecallbacksnativemodule: 19bf1fa4b2b66fe1898ac1d185129cdcc3221c7c - React-ImageManager: 7dc7bfca8e9ecb9a7436b8a89a143a193ef5adcf - React-jserrorhandler: d8640792495ac2d78e73acbcc77a8439d1eedfef - React-jsi: 0775a66820496769ad83e629f0f5cce621a57fc7 - React-jsiexecutor: 2cf5ba481386803f3c88b85c63fa102cba5d769e - React-jsinspector: d1d9f215c7431b286acc12e83cdf0d90c265f0ed - React-jsinspectortracing: c4c1cceb9a9c266ce849c82332e35cc57ee9dae9 - React-jsitracing: 267618eec9c362658a4587c5ddcfb41b2e00c403 - React-logger: 795cd5055782db394f187f9db0477d4b25b44291 - React-Mapbuffer: 0df2a235bd0182f5cbed6c5f095e66deca12e335 - React-microtasksnativemodule: b31e56a980634f383221bfefd5111d04c14c110b - React-NativeModulesApple: b74b4e3004104429461593fe460ad790cc4928c2 - React-perflogger: ab51b7592532a0ea45bf6eed7e6cae14a368b678 - React-performancetimeline: 37192fd1019c3b3b597a877dff12f3af68305c34 + React-featureflagsnativemodule: a74b09429c2e7a57412d78cc159ab86ae4f15db9 + React-graphics: 17ef0ee3ef4a4c1774cc82f1f477ecef4d67c73f + React-hermes: a9a0c8377627b5506ef9a7b6f60a805c306e3f51 + React-idlecallbacksnativemodule: 0711ec5eb53c7f790641fa00e5f6ec0355d3159b + React-ImageManager: 23b4701408390428724f0e0ebb2cbed7b37c2b24 + React-jserrorhandler: e21b438ef8b99ea8bf070ff35f00bc0215b5f769 + React-jsi: f3f51595cc4c089037b536368f016d4742bf9cf7 + React-jsiexecutor: cca6c232db461e2fd213a11e9364cfa6fdaa20eb + React-jsinspector: 8a3c2637b84ebec478f46a43432a522d7489410f + React-jsinspectortracing: ee0215d2db753cc10f45fc9aa86557718d0b16fb + React-jsitracing: 258be1fd259141f6aa43012c20c70ebc02e32087 + React-logger: 018826bfd51b9f18e87f67db1590bc510ad20664 + React-Mapbuffer: 9fbb496e7d6f7c34d5e617365ee778bf96d14eae + React-microtasksnativemodule: 36adde22631838680d1be62776e8ccb83186c06a + react-native-geolocation-service: 32b2c2a3b91e70ce2a8d0c684801aaeb0a07e0ec + React-NativeModulesApple: ec44c21ae0bbb5f9a2df72db00294e33a00e07f0 + React-perflogger: 9e8d3c0dc0194eb932162812a168aa5dc662f418 + React-performancetimeline: 350424518f433dd43f063dc5f2cf3195c1a5b60f React-RCTActionSheet: 592674cf61142497e0e820688f5a696e41bf16dd - React-RCTAnimation: 8fbb8dba757b49c78f4db403133ab6399a4ce952 - React-RCTAppDelegate: 7f88baa8cb4e5d6c38bb4d84339925c70c9ac864 - React-RCTBlob: f89b162d0fe6b570a18e755eb16cbe356d3c6d17 - React-RCTFabric: f2151588dc1dc884b34b8660d72ef5237aa4b10e - React-RCTFBReactNativeSpec: 8c29630c2f379c729300e4c1e540f3d1b78d1936 - React-RCTImage: ccac9969940f170503857733f9a5f63578e106e1 - React-RCTLinking: d82427bbf18415a3732105383dff119131cadd90 - React-RCTNetwork: 12ad4d0fbde939e00251ca5ca890da2e6825cc3c - React-RCTSettings: e7865bf9f455abf427da349c855f8644b5c39afa - React-RCTText: 2cdfd88745059ec3202a0842ea75a956c7d6f27d - React-RCTVibration: a3a1458e6230dfd64b3768ebc0a4aac430d9d508 + React-RCTAnimation: e6d669872f9b3b4ab9527aab283b7c49283236b7 + React-RCTAppDelegate: de2343fe08be4c945d57e0ecce44afcc7dd8fc03 + React-RCTBlob: 3e2dce94c56218becc4b32b627fc2293149f798d + React-RCTFabric: adad07a08efb186bc1046041207527927524170d + React-RCTFBReactNativeSpec: d10ca5e0ccbfeac8c047361fedf8e4ac653887b6 + React-RCTImage: dc04b176c022d12a8f55ae7a7279b1e091066ae0 + React-RCTLinking: 88f5e37fe4f26fbc80791aa2a5f01baf9b9a3fd5 + React-RCTNetwork: f213693565efbd698b8e9c18d700a514b49c0c8e + React-RCTSettings: a2d32a90c45a3575568cad850abc45924999b8a5 + React-RCTText: 54cdcd1cbf6f6a91dc6317f5d2c2b7fc3f6bf7a0 + React-RCTVibration: 11dae0e7f577b5807bb7d31e2e881eb46f854fd4 React-rendererconsistency: aa476d937c91886dd8b2ddde3191c775585ae47a - React-rendererdebug: 5a2219e0ceb78f4ffe9ee2d80fa260bb5bac50b2 + React-rendererdebug: df10d858ac7709b9c8349d952474b0746092c690 React-rncore: 517c6c3647d45de81a7920b6959adf14fed2a5a5 - React-RuntimeApple: 40809bf5975c265b990dec2725f2cfb61f1afc75 - React-RuntimeCore: 375c2645e924fdca875918f07ed987653c517edc + React-RuntimeApple: 6922a0861c3fc4c7d544fc7d1d5cb38c779d1264 + React-RuntimeCore: 41a95876d16630ce00946eaaee7ffd5222242b44 React-runtimeexecutor: a188df372373baf5066e6e229177836488799f80 - React-RuntimeHermes: 2de8d61ec25d950ae4aebcab1a895e0bb8b18c95 - React-runtimescheduler: e8b49a60eca68a3513c259879a352ed010fed255 + React-RuntimeHermes: f2ca409c03c36bb3dcbf61bdfa2636501f9faebd + React-runtimescheduler: 7ae10fa81428c2479e0a5534943dacb8e34c9d52 React-timing: e56b95cb12c6fb9146be7ba3d671cf6b5d17b2e0 - React-utils: 8ad62100a8780798a380b769e968c4764bad1f4b - ReactAppDependencyProvider: f2e81d80afd71a8058589e19d8a134243fa53f17 - ReactCodegen: 299e99fc57c93edc7c5396ef1a39a3a4d494f25d - ReactCommon: c8fdbc582b98a07daf201cd95c1da75dd029f3ee + React-utils: 6eabecc0e7d7bcf21b6b33357bc1fe8ae13c7c4c + ReactAppDependencyProvider: a1fb08dfdc7ebc387b2e54cfc9decd283ed821d8 + ReactCodegen: 0f8899ac1bad260bf3b362ee848ef67a70b5a306 + ReactCommon: a30b578194de911fbe1698efb8247bfe4cb6abff + RNPermissions: 34a056b3e81da28fafb55fb8f895acf4ac9504a1 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - Yoga: d89d04d86b5af18317f481166dccc48213d26927 + Yoga: be02ca501b03c79d7027a6bbbd0a8db985034f11 PODFILE CHECKSUM: e20d7567686b77a54d5ef38de82fae4c1448f77a -COCOAPODS: 1.15.2 +COCOAPODS: 1.16.2 diff --git a/example/package.json b/example/package.json index ed54f08b..ddbfe380 100644 --- a/example/package.json +++ b/example/package.json @@ -11,7 +11,9 @@ }, "dependencies": { "react": "19.0.0", - "react-native": "0.78.0" + "react-native": "0.78.0", + "react-native-geolocation-service": "^5.3.1", + "react-native-permissions": "^5.4.2" }, "devDependencies": { "@babel/core": "^7.25.2", diff --git a/example/src/AppViewInterface.ts b/example/src/AppViewInterface.ts index 8cfa677b..3b4238c3 100644 --- a/example/src/AppViewInterface.ts +++ b/example/src/AppViewInterface.ts @@ -16,6 +16,20 @@ import { registerForInAppForms, unregisterFromInAppForms, } from './KlaviyoReactWrapper'; +import { + initializeGeofencing, + addDefaultGeofences, + startGeofencing, + stopGeofencing, + removeAllGeofences, + getCurrentGeofences, + checkGeofencingStatus, + simulateGeofenceEnter, + simulateGeofenceExit, + setupGeofenceListeners, + addCustomGeofence, + checkLocationPermission, +} from './GeofencingWrapper'; export interface AppViewInterface { title: string; @@ -104,4 +118,65 @@ export const appViews: AppViewInterface[] = [ color: '#d3ab10', onPress: unregisterFromInAppForms, }, + // Geofencing functionality + { + title: 'Initialize Geofencing', + color: '#4CAF50', + onPress: initializeGeofencing, + }, + { + title: 'Add Default Geofences', + color: '#4CAF50', + onPress: addDefaultGeofences, + }, + { + title: 'Start Geofencing', + color: '#4CAF50', + onPress: startGeofencing, + }, + { + title: 'Stop Geofencing', + color: '#FF5722', + onPress: stopGeofencing, + }, + { + title: 'Setup Geofence Listeners', + color: '#2196F3', + onPress: setupGeofenceListeners, + }, + { + title: 'Get Current Geofences', + color: '#2196F3', + onPress: getCurrentGeofences, + }, + { + title: 'Check Geofencing Status', + color: '#2196F3', + onPress: checkGeofencingStatus, + }, + { + title: 'Check Location Permission', + color: '#2196F3', + onPress: checkLocationPermission, + }, + { + title: 'Add Custom Geofence', + color: '#9C27B0', + onPress: addCustomGeofence, + }, + { + title: 'Simulate Geofence Enter', + color: '#FF9800', + onPress: simulateGeofenceEnter, + }, + { + title: 'Simulate Geofence Exit', + color: '#FF9800', + onPress: simulateGeofenceExit, + }, + { + title: 'Remove All Geofences', + color: '#F44336', + onPress: removeAllGeofences, + }, ]; diff --git a/example/src/GeofencingWrapper.ts b/example/src/GeofencingWrapper.ts new file mode 100644 index 00000000..27e27924 --- /dev/null +++ b/example/src/GeofencingWrapper.ts @@ -0,0 +1,176 @@ +import { Alert } from 'react-native'; +import Geofencing, { + GeofenceTransitionType, + type GeofenceEvent, +} from '../../src/Geofencing'; + +/** + * Initialize geofencing with default configuration + */ +export const initializeGeofencing = async (): Promise => { + try { + await Geofencing.initialize(); + Alert.alert('Success', 'Geofencing initialized successfully!'); + } catch (error) { + Alert.alert('Error', `Failed to initialize geofencing: ${error}`); + } +}; + +/** + * Add default placeholder geofences for testing + */ +export const addDefaultGeofences = async (): Promise => { + try { + await Geofencing.addDefaultGeofences(); + Alert.alert('Success', 'Default geofences added successfully!'); + } catch (error) { + Alert.alert('Error', `Failed to add default geofences: ${error}`); + } +}; + +/** + * Start geofencing monitoring + */ +export const startGeofencing = async (): Promise => { + try { + await Geofencing.start(); + Alert.alert('Success', 'Geofencing monitoring started!'); + } catch (error) { + Alert.alert('Error', `Failed to start geofencing: ${error}`); + } +}; + +/** + * Stop geofencing monitoring + */ +export const stopGeofencing = async (): Promise => { + try { + await Geofencing.stop(); + Alert.alert('Success', 'Geofencing monitoring stopped!'); + } catch (error) { + Alert.alert('Error', `Failed to stop geofencing: ${error}`); + } +}; + +/** + * Remove all geofences + */ +export const removeAllGeofences = async (): Promise => { + try { + await Geofencing.removeAllGeofences(); + Alert.alert('Success', 'All geofences removed!'); + } catch (error) { + Alert.alert('Error', `Failed to remove geofences: ${error}`); + } +}; + +/** + * Get current geofences + */ +export const getCurrentGeofences = async (): Promise => { + try { + const geofences = Geofencing.getGeofences(); + const geofenceList = geofences + .map((g) => `${g.id}: (${g.latitude}, ${g.longitude}) - ${g.radius}m`) + .join('\n'); + Alert.alert('Current Geofences', geofenceList || 'No geofences configured'); + } catch (error) { + Alert.alert('Error', `Failed to get geofences: ${error}`); + } +}; + +/** + * Check if geofencing is initialized + */ +export const checkGeofencingStatus = async (): Promise => { + const isInitialized = Geofencing.isGeofencingInitialized(); + // const permissionStatus = await Geofencing.checkLocationPermissionStatus(); + Alert.alert( + 'Geofencing Status', + `Initialized: ${isInitialized ? 'Yes' : 'No'}` + ); +}; + +/** + * Simulate geofence enter event for testing + */ +export const simulateGeofenceEnter = async (): Promise => { + try { + Geofencing.simulateGeofenceEvent('home', GeofenceTransitionType.ENTER); + Alert.alert('Success', 'Simulated geofence enter event for "home"'); + } catch (error) { + Alert.alert('Error', `Failed to simulate geofence event: ${error}`); + } +}; + +/** + * Simulate geofence exit event for testing + */ +export const simulateGeofenceExit = async (): Promise => { + try { + Geofencing.simulateGeofenceEvent('home', GeofenceTransitionType.EXIT); + Alert.alert('Success', 'Simulated geofence exit event for "home"'); + } catch (error) { + Alert.alert('Error', `Failed to simulate geofence event: ${error}`); + } +}; + +/** + * Setup geofence event listeners + */ +export const setupGeofenceListeners = async (): Promise => { + // Set up enter event listener + Geofencing.onGeofenceEnter((event: GeofenceEvent) => { + console.log('Geofence Enter Event:', event); + Alert.alert( + 'Geofence Entered', + `You entered: ${event.geofenceId}\nLocation: ${event.location.latitude}, ${event.location.longitude}` + ); + }); + + // Set up exit event listener + Geofencing.onGeofenceExit((event: GeofenceEvent) => { + console.log('Geofence Exit Event:', event); + Alert.alert( + 'Geofence Exited', + `You exited: ${event.geofenceId}\nLocation: ${event.location.latitude}, ${event.location.longitude}` + ); + }); + + Alert.alert('Success', 'Geofence event listeners set up!'); +}; + +/** + * Add a custom geofence + */ +export const addCustomGeofence = async (): Promise => { + try { + const customGeofence = { + id: 'custom_location', + latitude: 40.7128, // New York coordinates as placeholder + longitude: -74.006, + radius: 150, + transitionType: GeofenceTransitionType.ENTER_AND_EXIT, + notification: { + title: 'Custom Location', + text: "You've entered/exited the custom area", + }, + }; + + await Geofencing.addGeofence(customGeofence); + Alert.alert('Success', 'Custom geofence added successfully!'); + } catch (error) { + Alert.alert('Error', `Failed to add custom geofence: ${error}`); + } +}; + +/** + * Check location permission status + */ +export const checkLocationPermission = async (): Promise => { + try { + Alert.alert('Location Permission Status'); + } catch (error) { + Alert.alert('Error', `Failed to check permission status: ${error}`); + } +}; diff --git a/package.json b/package.json index 8ec10b49..fcae6d64 100644 --- a/package.json +++ b/package.json @@ -104,6 +104,10 @@ "react": "*", "react-native": "*" }, + "dependencies": { + "react-native-geolocation-service": "^5.3.1", + "react-native-permissions": "^5.4.2" + }, "workspaces": [ "example" ], diff --git a/src/Geofencing.ts b/src/Geofencing.ts new file mode 100644 index 00000000..6c03b9d9 --- /dev/null +++ b/src/Geofencing.ts @@ -0,0 +1,290 @@ +import { NativeModules } from 'react-native'; +import Geolocation from 'react-native-geolocation-service'; + +const { KlaviyoReactNativeSdk } = NativeModules; + +export interface GeofenceConfig { + id: string; + latitude: number; + longitude: number; + radius: number; + transitionType: GeofenceTransitionType; + notification?: { + title: string; + text: string; + }; +} + +export enum GeofenceTransitionType { + ENTER = 1, + EXIT = 2, + ENTER_AND_EXIT = 3, +} + +export interface LocationData { + latitude: number; + longitude: number; + accuracy?: number; + timestamp?: number; +} + +export interface GeofenceEvent { + geofenceId: string; + transitionType: GeofenceTransitionType; + location: LocationData; + timestamp: number; +} + +class Geofencing { + private isInitialized: boolean = false; + private geofences: Map = new Map(); + private onGeofenceEnterCallback?: (event: GeofenceEvent) => void; + private onGeofenceExitCallback?: (event: GeofenceEvent) => void; + + /** + * Initialize geofencing with default configuration + */ + async initialize(): Promise { + if (this.isInitialized) { + console.warn('Geofencing already initialized'); + return; + } + + try { + // Request location permissions + await this.requestLocationPermissions(); + + // Configure with placeholder values as per the guide + const config = { + desiredAccuracy: 10, // HIGH_ACCURACY equivalent + stationaryRadius: 50, + distanceFilter: 50, + notificationTitle: 'Klaviyo Geofencing', + notificationText: 'Location tracking active', + debug: false, + startOnBoot: true, + stopOnTerminate: false, + interval: 10000, + fastestInterval: 5000, + activitiesInterval: 10000, + stopOnStillActivity: false, + }; + + // Initialize native module if available + if (KlaviyoReactNativeSdk && KlaviyoReactNativeSdk.configureGeofencing) { + await KlaviyoReactNativeSdk.configureGeofencing(config); + } + + this.isInitialized = true; + console.log('Geofencing initialized successfully'); + } catch (error) { + console.error('Failed to initialize geofencing:', error); + throw error; + } + } + + /** + * Request location permissions for Android and iOS + */ + private async requestLocationPermissions() { + const granted = await Geolocation.requestAuthorization('whenInUse'); + + return granted === 'granted'; + } + + /** + * Add a geofence with placeholder values + */ + async addGeofence(geofence: GeofenceConfig): Promise { + if (!this.isInitialized) { + throw new Error('Geofencing not initialized. Call initialize() first.'); + } + + // Store geofence configuration + this.geofences.set(geofence.id, geofence); + + // Add to native module if available + if (KlaviyoReactNativeSdk && KlaviyoReactNativeSdk.addGeofence) { + await KlaviyoReactNativeSdk.addGeofence(geofence); + } + + console.log(`Geofence added: ${geofence.id}`); + } + + /** + * Add default placeholder geofences for testing + */ + async addDefaultGeofences(): Promise { + const defaultGeofences: GeofenceConfig[] = [ + { + id: 'home', + latitude: 37.4219983, + longitude: -122.084, + radius: 100, + transitionType: GeofenceTransitionType.ENTER_AND_EXIT, + notification: { + title: 'Home Geofence', + text: "You've entered/exited your home area", + }, + }, + { + id: 'office', + latitude: 37.7749, + longitude: -122.4194, + radius: 200, + transitionType: GeofenceTransitionType.ENTER, + notification: { + title: 'Office Geofence', + text: 'Welcome to the office!', + }, + }, + { + id: 'coffee_shop', + latitude: 37.7858, + longitude: -122.4064, + radius: 50, + transitionType: GeofenceTransitionType.EXIT, + notification: { + title: 'Coffee Shop', + text: 'Thanks for visiting!', + }, + }, + ]; + + for (const geofence of defaultGeofences) { + await this.addGeofence(geofence); + } + } + + /** + * Remove a geofence + */ + async removeGeofence(geofenceId: string): Promise { + if (!this.isInitialized) { + throw new Error('Geofencing not initialized. Call initialize() first.'); + } + + this.geofences.delete(geofenceId); + + if (KlaviyoReactNativeSdk && KlaviyoReactNativeSdk.removeGeofence) { + await KlaviyoReactNativeSdk.removeGeofence(geofenceId); + } + + console.log(`Geofence removed: ${geofenceId}`); + } + + /** + * Remove all geofences + */ + async removeAllGeofences(): Promise { + if (!this.isInitialized) { + throw new Error('Geofencing not initialized. Call initialize() first.'); + } + + this.geofences.clear(); + + if (KlaviyoReactNativeSdk && KlaviyoReactNativeSdk.removeAllGeofences) { + await KlaviyoReactNativeSdk.removeAllGeofences(); + } + + console.log('All geofences removed'); + } + + /** + * Start geofencing monitoring + */ + async start(): Promise { + if (!this.isInitialized) { + throw new Error('Geofencing not initialized. Call initialize() first.'); + } + + if (KlaviyoReactNativeSdk && KlaviyoReactNativeSdk.startGeofencing) { + await KlaviyoReactNativeSdk.startGeofencing(); + } + + console.log('Geofencing started'); + } + + /** + * Stop geofencing monitoring + */ + async stop(): Promise { + if (KlaviyoReactNativeSdk && KlaviyoReactNativeSdk.stopGeofencing) { + await KlaviyoReactNativeSdk.stopGeofencing(); + } + + console.log('Geofencing stopped'); + } + + /** + * Set callback for geofence enter events + */ + onGeofenceEnter(callback: (event: GeofenceEvent) => void): void { + this.onGeofenceEnterCallback = callback; + } + + /** + * Set callback for geofence exit events + */ + onGeofenceExit(callback: (event: GeofenceEvent) => void): void { + this.onGeofenceExitCallback = callback; + } + + /** + * Get current geofences + */ + getGeofences(): GeofenceConfig[] { + return Array.from(this.geofences.values()); + } + + /** + * Check if geofencing is initialized + */ + isGeofencingInitialized(): boolean { + return this.isInitialized; + } + + /** + * Simulate geofence event for testing (placeholder implementation) + */ + simulateGeofenceEvent( + geofenceId: string, + transitionType: GeofenceTransitionType + ): void { + const geofence = this.geofences.get(geofenceId); + if (!geofence) { + console.warn(`Geofence ${geofenceId} not found`); + return; + } + + const event: GeofenceEvent = { + geofenceId, + transitionType, + location: { + latitude: geofence.latitude, + longitude: geofence.longitude, + accuracy: 10, + timestamp: Date.now(), + }, + timestamp: Date.now(), + }; + + if ( + transitionType === GeofenceTransitionType.ENTER && + this.onGeofenceEnterCallback + ) { + this.onGeofenceEnterCallback(event); + } else if ( + transitionType === GeofenceTransitionType.EXIT && + this.onGeofenceExitCallback + ) { + this.onGeofenceExitCallback(event); + } + + console.log( + `Simulated geofence event: ${geofenceId} - ${transitionType === GeofenceTransitionType.ENTER ? 'ENTER' : 'EXIT'}` + ); + } +} + +export default new Geofencing(); diff --git a/yarn.lock b/yarn.lock index 2c654a19..a2063de5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26,39 +26,39 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.27.2": - version: 7.27.5 - resolution: "@babel/compat-data@npm:7.27.5" - checksum: 8706be55f1c6e1cf85bfb3f2b3afdabba82142b339a11b62c694d07907b082d5715dfbe77fbbad891979809bdd013a0c9e2e5c3419dc8099b9fb7a45215f0f73 +"@babel/compat-data@npm:^7.27.2, @babel/compat-data@npm:^7.27.7, @babel/compat-data@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/compat-data@npm:7.28.0" + checksum: 37a40d4ea10a32783bc24c4ad374200f5db864c8dfa42f82e76f02b8e84e4c65e6a017fc014d165b08833f89333dff4cb635fce30f03c333ea3525ea7e20f0a2 languageName: node linkType: hard "@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.20.0, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.7, @babel/core@npm:^7.25.2": - version: 7.27.4 - resolution: "@babel/core@npm:7.27.4" + version: 7.28.3 + resolution: "@babel/core@npm:7.28.3" dependencies: "@ampproject/remapping": ^2.2.0 "@babel/code-frame": ^7.27.1 - "@babel/generator": ^7.27.3 + "@babel/generator": ^7.28.3 "@babel/helper-compilation-targets": ^7.27.2 - "@babel/helper-module-transforms": ^7.27.3 - "@babel/helpers": ^7.27.4 - "@babel/parser": ^7.27.4 + "@babel/helper-module-transforms": ^7.28.3 + "@babel/helpers": ^7.28.3 + "@babel/parser": ^7.28.3 "@babel/template": ^7.27.2 - "@babel/traverse": ^7.27.4 - "@babel/types": ^7.27.3 + "@babel/traverse": ^7.28.3 + "@babel/types": ^7.28.2 convert-source-map: ^2.0.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.3 semver: ^6.3.1 - checksum: e7f961274f2cfc14c81e32dc0f10b06123a847e9fe73ec7b4df90411c3ebdad8ffecd7086f06aa46c2b24d8d27f2f8bef4b7c7319228c768256fc0e13819d395 + checksum: d09132cd752730d219bdd29dbd65cb647151105bef6e615cfb6d57249f71a3d1aaf8a5beaa1c7ec54ad927962e4913ebc660f7f0c3e65c39bc171bc386285e50 languageName: node linkType: hard "@babel/eslint-parser@npm:^7.25.1": - version: 7.27.5 - resolution: "@babel/eslint-parser@npm:7.27.5" + version: 7.28.0 + resolution: "@babel/eslint-parser@npm:7.28.0" dependencies: "@nicolo-ribaudo/eslint-scope-5-internals": 5.1.1-v1 eslint-visitor-keys: ^2.1.0 @@ -66,24 +66,24 @@ __metadata: peerDependencies: "@babel/core": ^7.11.0 eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - checksum: 133191a3ea312dea92abb0f2cae87bc8d36b4a02ce7dce9367473940d91a1102d0dbb53418ba4b1e955d430741c1a1ed622ad3e5973e727e0a6d8d094a65aa5c + checksum: ccfc4b9b9fdca2b8df95da3827b70231e9588a71447ff7b2de76c4f36710e4e0a7dc5e2e98623f398a737c2429c46500cb11d4ccdfeb98271e067d0bf0eec9b5 languageName: node linkType: hard -"@babel/generator@npm:^7.20.0, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.27.3, @babel/generator@npm:^7.7.2": - version: 7.27.5 - resolution: "@babel/generator@npm:7.27.5" +"@babel/generator@npm:^7.20.0, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.28.3, @babel/generator@npm:^7.7.2": + version: 7.28.3 + resolution: "@babel/generator@npm:7.28.3" dependencies: - "@babel/parser": ^7.27.5 - "@babel/types": ^7.27.3 - "@jridgewell/gen-mapping": ^0.3.5 - "@jridgewell/trace-mapping": ^0.3.25 + "@babel/parser": ^7.28.3 + "@babel/types": ^7.28.2 + "@jridgewell/gen-mapping": ^0.3.12 + "@jridgewell/trace-mapping": ^0.3.28 jsesc: ^3.0.2 - checksum: f6d3bf70f6bfbc5df263a023200728c53161d7f3ee3607bd8b2222c8568b6dd604ee490e305f0492a8225dac059ad75b4cc772b5cfd7d967e70360499d4d3701 + checksum: e2202bf2b9c8a94f7e7a0a049fda0ee037d055c46922e85afa3bbc53309113f859b8193894f991045d7865226028b8f4f06152ed315ab414451932016dba5e42 languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.27.1": +"@babel/helper-annotate-as-pure@npm:^7.27.1, @babel/helper-annotate-as-pure@npm:^7.27.3": version: 7.27.3 resolution: "@babel/helper-annotate-as-pure@npm:7.27.3" dependencies: @@ -92,7 +92,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.27.2": +"@babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.27.2": version: 7.27.2 resolution: "@babel/helper-compilation-targets@npm:7.27.2" dependencies: @@ -105,20 +105,20 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-create-class-features-plugin@npm:7.27.1" +"@babel/helper-create-class-features-plugin@npm:^7.27.1, @babel/helper-create-class-features-plugin@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/helper-create-class-features-plugin@npm:7.28.3" dependencies: - "@babel/helper-annotate-as-pure": ^7.27.1 + "@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/helper-skip-transparent-expression-wrappers": ^7.27.1 - "@babel/traverse": ^7.27.1 + "@babel/traverse": ^7.28.3 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 406954b455e5b20924e7d1b41cf932e6e98e95c3a5224c7a70c3ad96a84e8fbde915ceff7ddbf9c7d121397c4e9274f061241648475122cf6fe54e0a95caae15 + checksum: 6d918e5e9c88ad1a262ab7b1a3caede1bbf95f8276c96846d8b0c1af251c85a0c868a9f1bbbaebdeb199e44dfd0e10fbe22935e56bedd1aa41ba4a7162bfa86c languageName: node linkType: hard @@ -135,18 +135,25 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.6.3, @babel/helper-define-polyfill-provider@npm:^0.6.4": - version: 0.6.4 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.4" +"@babel/helper-define-polyfill-provider@npm:^0.6.5": + version: 0.6.5 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.5" dependencies: - "@babel/helper-compilation-targets": ^7.22.6 - "@babel/helper-plugin-utils": ^7.22.5 - debug: ^4.1.1 + "@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.14.2 + resolve: ^1.22.10 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: bfbcb41f005ba11497b459cf801650af558b533f383b2f57034e9ccce592a0af699b585898deef93598ed3d9bd14502327e18dfc8a92a3db48b2a49ae2886f86 + checksum: 9fd3b09b209c8ed0d3d8bc1f494f1368b9e1f6e46195af4ce948630fe97d7dafde4882eedace270b319bf6555ddf35e220c77505f6d634f621766cdccbba0aae + languageName: node + linkType: hard + +"@babel/helper-globals@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/helper-globals@npm:7.28.0" + checksum: d8d7b91c12dad1ee747968af0cb73baf91053b2bcf78634da2c2c4991fb45ede9bd0c8f9b5f3254881242bc0921218fcb7c28ae885477c25177147e978ce4397 languageName: node linkType: hard @@ -170,16 +177,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.27.3": - version: 7.27.3 - resolution: "@babel/helper-module-transforms@npm:7.27.3" +"@babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/helper-module-transforms@npm:7.28.3" dependencies: "@babel/helper-module-imports": ^7.27.1 "@babel/helper-validator-identifier": ^7.27.1 - "@babel/traverse": ^7.27.3 + "@babel/traverse": ^7.28.3 peerDependencies: "@babel/core": ^7.0.0 - checksum: c611d42d3cb7ba23b1a864fcf8d6cde0dc99e876ca1c9a67e4d7919a70706ded4aaa45420de2bf7f7ea171e078e59f0edcfa15a56d74b9485e151b95b93b946e + checksum: 7cf7b79da0fa626d6c84bfc7b35c079a2559caecaa2ff645b0f1db0d741507aa4df6b5b98a3283e8ac4e89094af271d805bf5701e5c4f916e622797b7c8cbb18 languageName: node linkType: hard @@ -192,7 +199,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.8.0": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.8.0": version: 7.27.1 resolution: "@babel/helper-plugin-utils@npm:7.27.1" checksum: 5d715055301badab62bdb2336075a77f8dc8bd290cad2bc1b37ea3bf1b3efc40594d308082229f239deb4d6b5b80b0a73bce000e595ea74416e0339c11037047 @@ -257,34 +264,34 @@ __metadata: linkType: hard "@babel/helper-wrap-function@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-wrap-function@npm:7.27.1" + version: 7.28.3 + resolution: "@babel/helper-wrap-function@npm:7.28.3" dependencies: - "@babel/template": ^7.27.1 - "@babel/traverse": ^7.27.1 - "@babel/types": ^7.27.1 - checksum: b0427765766494cb5455a188d4cdef5e6167f2835a8ed76f3c25fa3bbe2ec2a716588fa326c52fab0d184a9537200d76e48656e516580a914129d74528322821 + "@babel/template": ^7.27.2 + "@babel/traverse": ^7.28.3 + "@babel/types": ^7.28.2 + checksum: 0ebdfdc918fdd0c1cf6ff15ba4c664974d0cdf21a017af560d58b00c379df3bf2e55f13a44fe3225668bca169da174f6cb97a96c4e987fb728fdb8f9a39db302 languageName: node linkType: hard -"@babel/helpers@npm:^7.27.4": - version: 7.27.6 - resolution: "@babel/helpers@npm:7.27.6" +"@babel/helpers@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/helpers@npm:7.28.3" dependencies: "@babel/template": ^7.27.2 - "@babel/types": ^7.27.6 - checksum: 12f96a5800ff677481dbc0a022c617303e945210cac4821ad5377a31201ffd8d9c4d00f039ed1487cf2a3d15868fb2d6cabecdb1aba334bd40a846f1938053a2 + "@babel/types": ^7.28.2 + checksum: 16c7f259dbd23834740ebc1c7e5a32d9424615eacd324ee067b585ab40eaafab37e2e50f50c84183a7e7a31251dc5a65a2ec4f8395f049001bbe6e14d0d3e9d4 languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.7, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.27.4, @babel/parser@npm:^7.27.5": - version: 7.27.5 - resolution: "@babel/parser@npm:7.27.5" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.7, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/parser@npm:7.28.3" dependencies: - "@babel/types": ^7.27.3 + "@babel/types": ^7.28.2 bin: parser: ./bin/babel-parser.js - checksum: 16f00a12895522c1682f1f047332010e129ba517add3a2db347a658e02f60434fc38f9105a9d6ec3fd6bfb5d1b0b70d88585c1f10e06e2b58fba29004a42d648 + checksum: 5aa5ea0683a4056f98cd9cd61650870d5d44ec1654da14f72a8a06fabe7b2a35bf6cef9605f3740b5ded1e68f64ec45ce1aabf7691047a13a1ff2babe126acf9 languageName: node linkType: hard @@ -335,15 +342,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.27.1" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.28.3" dependencies: "@babel/helper-plugin-utils": ^7.27.1 - "@babel/traverse": ^7.27.1 + "@babel/traverse": ^7.28.3 peerDependencies: "@babel/core": ^7.0.0 - checksum: 4d6792ccade2d6b9d5577b0a879ab22d05ac8a1206b1a636b6ffdb53a0c0bacaf0f7947e46de254f228ffd75456f4b95ccd82fdeaefc0b92d88af3c5991863ad + checksum: c810e5d36030df6861ced35f0adbda7b4b41ac3e984422b32bee906564fd49374435f0a7a1a42eb0a9e6a5170c255f0ab31c163d5fc51fa5a816aa0420311029 languageName: node linkType: hard @@ -621,16 +628,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.25.4, @babel/plugin-transform-async-generator-functions@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.27.1" +"@babel/plugin-transform-async-generator-functions@npm:^7.25.4, @babel/plugin-transform-async-generator-functions@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.28.0" dependencies: "@babel/helper-plugin-utils": ^7.27.1 "@babel/helper-remap-async-to-generator": ^7.27.1 - "@babel/traverse": ^7.27.1 + "@babel/traverse": ^7.28.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 37e8b76c992066f81cc24af11a25f296add6ae39f51f2c37da565fc004dbf3ef9733b42808acbfb86792d73f73bfbb4396338abbd364b9103146b119508b49c7 + checksum: 174aaccd7a8386fd7f32240c3f65a93cf60dcc5f6a2123cfbff44c0d22b424cd41de3a0c6d136b6a2fa60a8ca01550c261677284cb18a0daeab70730b2265f1d languageName: node linkType: hard @@ -658,14 +665,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.25.0, @babel/plugin-transform-block-scoping@npm:^7.27.1": - version: 7.27.5 - resolution: "@babel/plugin-transform-block-scoping@npm:7.27.5" +"@babel/plugin-transform-block-scoping@npm:^7.25.0, @babel/plugin-transform-block-scoping@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-block-scoping@npm:7.28.0" dependencies: "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: bd710674bebe2e90b1daee960523d06c958f060f439ce2eef6b157c780c0654168131d0312a06dd71c5b186ecc2a818334d16f8368bd273ab549d6230f074135 + checksum: 6d740f9a386e5fbdffd9e7c5a8400bff8d54068241a78b8e71aba6f1f46eff0c4297902f5f1543bee1ed076ec88d0dc4ceed19e98a466802c14d3c20f178f712 languageName: node linkType: hard @@ -681,31 +688,31 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-class-static-block@npm:7.27.1" +"@babel/plugin-transform-class-static-block@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/plugin-transform-class-static-block@npm:7.28.3" dependencies: - "@babel/helper-create-class-features-plugin": ^7.27.1 + "@babel/helper-create-class-features-plugin": ^7.28.3 "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.12.0 - checksum: 69688fe1641ae0ea025b916b8c2336e8b5643a5ec292e8f546ecd35d9d9d4bb301d738910822a79d867098cf687d550d92cd906ae4cda03c0f69b1ece2149a58 + checksum: 9b2feaacbf29637ab35a3aae1df35a1129adec5400a1767443739557fb0d3bf8278bf0ec90aacf43dec9a7dd91428d01375020b70528713e1bc36a72776a104c languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.25.4, @babel/plugin-transform-classes@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-classes@npm:7.27.1" +"@babel/plugin-transform-classes@npm:^7.25.4, @babel/plugin-transform-classes@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/plugin-transform-classes@npm:7.28.3" dependencies: - "@babel/helper-annotate-as-pure": ^7.27.1 - "@babel/helper-compilation-targets": ^7.27.1 + "@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/traverse": ^7.27.1 - globals: ^11.1.0 + "@babel/traverse": ^7.28.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a4275d3a9e2e4144c421baa49958191e4b33957fca6e87686ed8da0eb3240270d4f91a2a4b9491c87feb6c33f459d8aec013cec8d5f5099c794b740703802dc7 + checksum: 7c0246bbf90d823fc6e9367ee15e1dd840a5c68ef477f58c12d655508096b759c6d3a4aeff44a816716f4611603ab529e770a815445f76b66de2ae9f0824c012 languageName: node linkType: hard @@ -721,14 +728,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.24.8, @babel/plugin-transform-destructuring@npm:^7.27.1, @babel/plugin-transform-destructuring@npm:^7.27.3": - version: 7.27.3 - resolution: "@babel/plugin-transform-destructuring@npm:7.27.3" +"@babel/plugin-transform-destructuring@npm:^7.24.8, @babel/plugin-transform-destructuring@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-destructuring@npm:7.28.0" dependencies: "@babel/helper-plugin-utils": ^7.27.1 + "@babel/traverse": ^7.28.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1b00a609e6292a1e48104d63dd479a688e773dcf42c715f7b342ba1725ae9335d75c8569aa0518388ed359f98f0b7155fd7bb0453fbc36445e986b17e5ccaa98 + checksum: 5b464d6a03c6eaa1327b60ffc1630ca977db0256938b34e281e65c81c965680e930a6bac043272942d6d4bbd7d1eddded0b7231779429ba51275e092e7367859 languageName: node linkType: hard @@ -778,6 +786,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-explicit-resource-management@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-explicit-resource-management@npm:7.28.0" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/plugin-transform-destructuring": ^7.28.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a44140097ed4854883c426613f4e8763237cd0fdab1c780514f4315f6c148d6b528d7a57fe6fdec4dbce28a21b70393ef3507b72dfec2e30bfc8d7db1ff19474 + languageName: node + linkType: hard + "@babel/plugin-transform-exponentiation-operator@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.27.1" @@ -976,17 +996,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.24.7, @babel/plugin-transform-object-rest-spread@npm:^7.27.2": - version: 7.27.3 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.27.3" +"@babel/plugin-transform-object-rest-spread@npm:^7.24.7, @babel/plugin-transform-object-rest-spread@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.28.0" dependencies: "@babel/helper-compilation-targets": ^7.27.2 "@babel/helper-plugin-utils": ^7.27.1 - "@babel/plugin-transform-destructuring": ^7.27.3 - "@babel/plugin-transform-parameters": ^7.27.1 + "@babel/plugin-transform-destructuring": ^7.28.0 + "@babel/plugin-transform-parameters": ^7.27.7 + "@babel/traverse": ^7.28.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 624db8badc844d3256ce9b5d062f1716f01c15ab3ed023dc971eb8083bba55e83be8dc25971b4570d2cd8979eb2c61a3b08d332bd0ec1816ee8afbf1659472bf + checksum: 7c32c988b4b040d0091d0210b6b946249571858b2f33f3a5105f41c28ee0b8440a9dfb2aa46f3ae0d3014f86ddf16aee9a0cbf4229daf8e013235352b8f31fc9 languageName: node linkType: hard @@ -1025,14 +1046,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.24.7, @babel/plugin-transform-parameters@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-parameters@npm:7.27.1" +"@babel/plugin-transform-parameters@npm:^7.24.7, @babel/plugin-transform-parameters@npm:^7.27.7": + version: 7.27.7 + resolution: "@babel/plugin-transform-parameters@npm:7.27.7" dependencies: "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 52dd9db2be63ca954dbf86bba3f1dedce5f8bcf0cbc2b9ab26981b6f9c3ad5ea3a1b7ba286d18ae05d7487763f2bd086533826ee82f7b8d76873265569e45125 + checksum: d51f195e1d6ac5d9fce583e9a70a5bfe403e62386e5eb06db9fbc6533f895a98ff7e7c3dcaa311a8e6fa7a9794466e81cdabcba6af9f59d787fb767bfe7868b4 languageName: node linkType: hard @@ -1073,13 +1094,13 @@ __metadata: linkType: hard "@babel/plugin-transform-react-display-name@npm:^7.24.7, @babel/plugin-transform-react-display-name@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-react-display-name@npm:7.27.1" + version: 7.28.0 + resolution: "@babel/plugin-transform-react-display-name@npm:7.28.0" dependencies: "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 9fb5fae6283f612983dac4df51a6cd41e085e698008146e046357fe324e6e8264cedf8426ea5a188326f6d3cd1e7a3d3174e15d510851e93e9ef7ceeba380dc2 + checksum: 268b1a9192974439d17949e170b01cac2a2aa003c844e2fe3b8361146f42f66487178cffdfa8ce862aa9e6c814bc37f879a70300cb3f067815d15fa6aad04e6d languageName: node linkType: hard @@ -1143,14 +1164,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.24.7, @babel/plugin-transform-regenerator@npm:^7.27.1": - version: 7.27.5 - resolution: "@babel/plugin-transform-regenerator@npm:7.27.5" +"@babel/plugin-transform-regenerator@npm:^7.24.7, @babel/plugin-transform-regenerator@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/plugin-transform-regenerator@npm:7.28.3" dependencies: "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d343dbe491f2b2ef953ce990761006b8f1f9231044b3c244529d34335ba8337829e6d55cae0e4e9ec6d4952bc4875097c8776eee01119cd45529bc49e90c085f + checksum: a8582e311dadae14ef9b37d02c84e8966efe8f96f8a50c2100812c366cbab7b5088939cfe714709cb8d5638f79e577c9ab8c9d1a57d159afa6e048d049400dd0 languageName: node linkType: hard @@ -1178,18 +1199,18 @@ __metadata: linkType: hard "@babel/plugin-transform-runtime@npm:^7.24.7": - version: 7.27.4 - resolution: "@babel/plugin-transform-runtime@npm:7.27.4" + version: 7.28.3 + resolution: "@babel/plugin-transform-runtime@npm:7.28.3" dependencies: "@babel/helper-module-imports": ^7.27.1 "@babel/helper-plugin-utils": ^7.27.1 - babel-plugin-polyfill-corejs2: ^0.4.10 - babel-plugin-polyfill-corejs3: ^0.11.0 - babel-plugin-polyfill-regenerator: ^0.6.1 + babel-plugin-polyfill-corejs2: ^0.4.14 + babel-plugin-polyfill-corejs3: ^0.13.0 + babel-plugin-polyfill-regenerator: ^0.6.5 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 786d68e23eed9f8f0b1602f052b1ca81f97d4757ac1e3d089d60f6fd7a307185932c725e4fce35b4532773957a6748c620aef155ed1654b7badc196f830f73c0 + checksum: 63d2fc05d5bfcb96f31be54b095d72a89f0a03c8de10f5d742b18b174e2731bcdc27292e8deec66c2e88cebf8298393123d5e767526f6fffbc75cb8144ef66c6 languageName: node linkType: hard @@ -1261,17 +1282,17 @@ __metadata: linkType: hard "@babel/plugin-transform-typescript@npm:^7.25.2, @babel/plugin-transform-typescript@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-typescript@npm:7.27.1" + version: 7.28.0 + resolution: "@babel/plugin-transform-typescript@npm:7.28.0" dependencies: - "@babel/helper-annotate-as-pure": ^7.27.1 + "@babel/helper-annotate-as-pure": ^7.27.3 "@babel/helper-create-class-features-plugin": ^7.27.1 "@babel/helper-plugin-utils": ^7.27.1 "@babel/helper-skip-transparent-expression-wrappers": ^7.27.1 "@babel/plugin-syntax-typescript": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 0037db32fedaacf42b5b3df774263bb7176d455859f77322f57135f7e50e457e5c95151280fc83bb9942fc1839e785489b098d73c9539d0f3c7dc9d42b3a8e86 + checksum: 14c1024bcd57fcd469d90cf0c15c3cd4e771e2eb2cd9afee3aa79b59c8ed103654f7c5c71cdb3bfe31c1d0cb08bfad8c80f5aa1d24b4b454bd21301d5925533d languageName: node linkType: hard @@ -1323,10 +1344,10 @@ __metadata: linkType: hard "@babel/preset-env@npm:^7.25.2, @babel/preset-env@npm:^7.25.3": - version: 7.27.2 - resolution: "@babel/preset-env@npm:7.27.2" + version: 7.28.3 + resolution: "@babel/preset-env@npm:7.28.3" dependencies: - "@babel/compat-data": ^7.27.2 + "@babel/compat-data": ^7.28.0 "@babel/helper-compilation-targets": ^7.27.2 "@babel/helper-plugin-utils": ^7.27.1 "@babel/helper-validator-option": ^7.27.1 @@ -1334,25 +1355,26 @@ __metadata: "@babel/plugin-bugfix-safari-class-field-initializer-scope": ^7.27.1 "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.27.1 "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.27.1 - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ^7.27.1 + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ^7.28.3 "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2 "@babel/plugin-syntax-import-assertions": ^7.27.1 "@babel/plugin-syntax-import-attributes": ^7.27.1 "@babel/plugin-syntax-unicode-sets-regex": ^7.18.6 "@babel/plugin-transform-arrow-functions": ^7.27.1 - "@babel/plugin-transform-async-generator-functions": ^7.27.1 + "@babel/plugin-transform-async-generator-functions": ^7.28.0 "@babel/plugin-transform-async-to-generator": ^7.27.1 "@babel/plugin-transform-block-scoped-functions": ^7.27.1 - "@babel/plugin-transform-block-scoping": ^7.27.1 + "@babel/plugin-transform-block-scoping": ^7.28.0 "@babel/plugin-transform-class-properties": ^7.27.1 - "@babel/plugin-transform-class-static-block": ^7.27.1 - "@babel/plugin-transform-classes": ^7.27.1 + "@babel/plugin-transform-class-static-block": ^7.28.3 + "@babel/plugin-transform-classes": ^7.28.3 "@babel/plugin-transform-computed-properties": ^7.27.1 - "@babel/plugin-transform-destructuring": ^7.27.1 + "@babel/plugin-transform-destructuring": ^7.28.0 "@babel/plugin-transform-dotall-regex": ^7.27.1 "@babel/plugin-transform-duplicate-keys": ^7.27.1 "@babel/plugin-transform-duplicate-named-capturing-groups-regex": ^7.27.1 "@babel/plugin-transform-dynamic-import": ^7.27.1 + "@babel/plugin-transform-explicit-resource-management": ^7.28.0 "@babel/plugin-transform-exponentiation-operator": ^7.27.1 "@babel/plugin-transform-export-namespace-from": ^7.27.1 "@babel/plugin-transform-for-of": ^7.27.1 @@ -1369,15 +1391,15 @@ __metadata: "@babel/plugin-transform-new-target": ^7.27.1 "@babel/plugin-transform-nullish-coalescing-operator": ^7.27.1 "@babel/plugin-transform-numeric-separator": ^7.27.1 - "@babel/plugin-transform-object-rest-spread": ^7.27.2 + "@babel/plugin-transform-object-rest-spread": ^7.28.0 "@babel/plugin-transform-object-super": ^7.27.1 "@babel/plugin-transform-optional-catch-binding": ^7.27.1 "@babel/plugin-transform-optional-chaining": ^7.27.1 - "@babel/plugin-transform-parameters": ^7.27.1 + "@babel/plugin-transform-parameters": ^7.27.7 "@babel/plugin-transform-private-methods": ^7.27.1 "@babel/plugin-transform-private-property-in-object": ^7.27.1 "@babel/plugin-transform-property-literals": ^7.27.1 - "@babel/plugin-transform-regenerator": ^7.27.1 + "@babel/plugin-transform-regenerator": ^7.28.3 "@babel/plugin-transform-regexp-modifiers": ^7.27.1 "@babel/plugin-transform-reserved-words": ^7.27.1 "@babel/plugin-transform-shorthand-properties": ^7.27.1 @@ -1390,14 +1412,14 @@ __metadata: "@babel/plugin-transform-unicode-regex": ^7.27.1 "@babel/plugin-transform-unicode-sets-regex": ^7.27.1 "@babel/preset-modules": 0.1.6-no-external-plugins - babel-plugin-polyfill-corejs2: ^0.4.10 - babel-plugin-polyfill-corejs3: ^0.11.0 - babel-plugin-polyfill-regenerator: ^0.6.1 - core-js-compat: ^3.40.0 + babel-plugin-polyfill-corejs2: ^0.4.14 + babel-plugin-polyfill-corejs3: ^0.13.0 + babel-plugin-polyfill-regenerator: ^0.6.5 + core-js-compat: ^3.43.0 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 318b123c8783ac3833bde5a5ff315970967ccd4c1e5c97e0843c0199fe9eab48a8cb40b367b784ae19a33667bee63eb8533eb924dab05bfc92ff9ef436109001 + checksum: c4e70f69b727d21eedd4de201ac082e951482f2d28a388e401e7937fd6f15bc1a49a63c12f59e87a18d237ac037a5b29d983f3bb82f1196d6444ae5b605ac6e2 languageName: node linkType: hard @@ -1459,8 +1481,8 @@ __metadata: linkType: hard "@babel/register@npm:^7.24.6": - version: 7.27.1 - resolution: "@babel/register@npm:7.27.1" + version: 7.28.3 + resolution: "@babel/register@npm:7.28.3" dependencies: clone-deep: ^4.0.1 find-cache-dir: ^2.0.0 @@ -1469,14 +1491,14 @@ __metadata: source-map-support: ^0.5.16 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 154ab3075f245466bbd7a3f0cf972328365961a6f621ecb7795ba67e70243596138c264ac7cb79df4a93527318021b5edbab1df39b669afc83159a9e6e560770 + checksum: 179b6a5d499a25aa52e2f36a28f7cc04f720684457d46951d4d308e4ebfbe59c6d0a3b84bee2070e36964457c644da1d839be47fbb33b0bdad1ef263d65bc395 languageName: node linkType: hard "@babel/runtime@npm:^7.25.0": - version: 7.27.6 - resolution: "@babel/runtime@npm:7.27.6" - checksum: 3f7b879df1823c0926bd5dbc941c62f5d60faa790c1aab9758c04799e1f04ee8d93553be9ec059d4e5882f19fe03cbe8933ee4f46212dced0f6d8205992c9c9a + version: 7.28.3 + resolution: "@babel/runtime@npm:7.28.3" + checksum: dd22662b9e02b6e66cfb061d6f9730eb0aa3b3a390a7bd70fe9a64116d86a3704df6d54ab978cb4acc13b58dbf63a3d7dd4616b0b87030eb14a22835e0aa602d languageName: node linkType: hard @@ -1491,28 +1513,28 @@ __metadata: languageName: node linkType: hard -"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3, @babel/traverse@npm:^7.20.0, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.27.3, @babel/traverse@npm:^7.27.4": - version: 7.27.4 - resolution: "@babel/traverse@npm:7.27.4" +"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3, @babel/traverse@npm:^7.20.0, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.0, @babel/traverse@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/traverse@npm:7.28.3" dependencies: "@babel/code-frame": ^7.27.1 - "@babel/generator": ^7.27.3 - "@babel/parser": ^7.27.4 + "@babel/generator": ^7.28.3 + "@babel/helper-globals": ^7.28.0 + "@babel/parser": ^7.28.3 "@babel/template": ^7.27.2 - "@babel/types": ^7.27.3 + "@babel/types": ^7.28.2 debug: ^4.3.1 - globals: ^11.1.0 - checksum: ae0047fe786e200ffb048929347b074988e8b68decdb9fc0e2b36ca3e137d72462f349fa0e6193e44fb3cb99f9c639654515028995b44d7040707cef48ddb5c1 + checksum: 5f5ce477adc99ebdd6e8c9b7ba2e0a162bef39a1d3c5860c730c1674e57f9cb057c7e3dfdd652ce890bd79331a70f6cd310902414697787578e68167d52d96e7 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.2, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.6, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": - version: 7.27.6 - resolution: "@babel/types@npm:7.27.6" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.2, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.2, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": + version: 7.28.2 + resolution: "@babel/types@npm:7.28.2" dependencies: "@babel/helper-string-parser": ^7.27.1 "@babel/helper-validator-identifier": ^7.27.1 - checksum: c3bd0984d892b0edec38fd12cf63f620bb52fba8187ec7cbe2d1aff5bee5e185e0fd86a3fb90b4d8f18b072113d07901476d0e39f58d5c988db14b231a6ea735 + checksum: 2218f0996d5fbadc4e3428c4c38f4ed403f0e2634e3089beba2c89783268c0c1d796a23e65f9f1ff8547b9061ae1a67691c76dc27d0b457e5fa9f2dd4e022e49 languageName: node linkType: hard @@ -1584,11 +1606,11 @@ __metadata: linkType: hard "@evilmartians/lefthook@npm:^1.6.0": - version: 1.11.14 - resolution: "@evilmartians/lefthook@npm:1.11.14" + version: 1.12.3 + resolution: "@evilmartians/lefthook@npm:1.12.3" bin: lefthook: bin/index.js - checksum: e934095f95a2ed93f18b859677ef35a630ce0d950f439c1191ca94b574373329fa5fa5272e330d3b6c6a3dde4296e9909370d0465e26dac60136dc2a0b8ecc0d + checksum: 00488ba640ed84fb28d6e988453c1e40a487b4c2463f7912e22f5b0bf0190c01e2aca19759e3938398d418efc59efcef702fc5e9747015ee43f974c67d3d0363 conditions: (os=darwin | os=linux | os=win32) & (cpu=x64 | cpu=arm64 | cpu=ia32) languageName: node linkType: hard @@ -1649,9 +1671,9 @@ __metadata: linkType: hard "@inquirer/figures@npm:^1.0.3": - version: 1.0.12 - resolution: "@inquirer/figures@npm:1.0.12" - checksum: db4446e45adb921686bda06ee3bfb0e96d0b656569392613042c67e7ba4b4b15c04459b22e2e2a9ef3750b34b7fcab6a784114c64922d3d211558cc8b5458027 + version: 1.0.13 + resolution: "@inquirer/figures@npm:1.0.13" + checksum: 1042cbefad8c69b004396ce6be2d0b135c303317d870ddd0cee75bac429fc7c7f577bac9e3c1ec1cd3668a709f49a591edb2f714193778e7d7b140a622f2a1ef languageName: node linkType: hard @@ -1957,14 +1979,13 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.8 - resolution: "@jridgewell/gen-mapping@npm:0.3.8" +"@jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" dependencies: - "@jridgewell/set-array": ^1.2.1 - "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/sourcemap-codec": ^1.5.0 "@jridgewell/trace-mapping": ^0.3.24 - checksum: c0687b5227461717aa537fe71a42e356bcd1c43293b3353796a148bf3b0d6f59109def46c22f05b60e29a46f19b2e4676d027959a7c53a6c92b9d5b0d87d0420 + checksum: f2105acefc433337145caa3c84bba286de954f61c0bc46279bbd85a9e6a02871089717fa060413cfb6a9d44189fe8313b2d1cabf3a2eb3284d208fd5f75c54ff languageName: node linkType: hard @@ -1975,37 +1996,30 @@ __metadata: languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 - languageName: node - linkType: hard - "@jridgewell/source-map@npm:^0.3.3": - version: 0.3.6 - resolution: "@jridgewell/source-map@npm:0.3.6" + version: 0.3.11 + resolution: "@jridgewell/source-map@npm:0.3.11" dependencies: "@jridgewell/gen-mapping": ^0.3.5 "@jridgewell/trace-mapping": ^0.3.25 - checksum: c9dc7d899397df95e3c9ec287b93c0b56f8e4453cd20743e2b9c8e779b1949bc3cccf6c01bb302779e46560eb45f62ea38d19fedd25370d814734268450a9f30 + checksum: c8a0011cc67e701f270fa042e32b312f382c413bcc70ca9c03684687cbf5b64d5eed87d4afa36dddaabe60ab3da6db4935f878febd9cfc7f82724ea1a114d344 languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 05df4f2538b3b0f998ea4c1cd34574d0feba216fa5d4ccaef0187d12abf82eafe6021cec8b49f9bb4d90f2ba4582ccc581e72986a5fcf4176ae0cfeb04cf52ec +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: c2e36e67971f719a8a3a85ef5a5f580622437cc723c35d03ebd0c9c0b06418700ef006f58af742791f71f6a4fc68fcfaf1f6a74ec2f9a3332860e9373459dae7 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28": + version: 0.3.30 + resolution: "@jridgewell/trace-mapping@npm:0.3.30" dependencies: "@jridgewell/resolve-uri": ^3.1.0 "@jridgewell/sourcemap-codec": ^1.4.14 - checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 + checksum: 26edb94faf6f02df346e3657deff9df3f2f083195cbda62a6cf60204d548a0a6134454cbc3af8437392206a89dfb3e72782eaf78f49cbd8924400e55a6575e72 languageName: node linkType: hard @@ -2075,8 +2089,8 @@ __metadata: linkType: hard "@octokit/core@npm:^5.0.2": - version: 5.2.1 - resolution: "@octokit/core@npm:5.2.1" + version: 5.2.2 + resolution: "@octokit/core@npm:5.2.2" dependencies: "@octokit/auth-token": ^4.0.0 "@octokit/graphql": ^7.1.0 @@ -2085,7 +2099,7 @@ __metadata: "@octokit/types": ^13.0.0 before-after-hook: ^2.2.0 universal-user-agent: ^6.0.0 - checksum: a7076095ec1109bb9273764a2b561b323368e96ea2c1257cef1d48107fe6493f363cfa84539da2d182b065831667c1baa85b00e99712079e299e06b46ba8693b + checksum: d4303d808c6b8eca32ce03381db5f6230440c1c6cfd9d73376ed583973094abd8ca56d9a64d490e6b0045f827a8f913b619bd90eae99c2cba682487720dc8002 languageName: node linkType: hard @@ -2199,10 +2213,10 @@ __metadata: languageName: node linkType: hard -"@pkgr/core@npm:^0.2.4": - version: 0.2.7 - resolution: "@pkgr/core@npm:0.2.7" - checksum: b16959878940f3d3016b79a4b2c23fd518aaec6b47295baa3154fbcf6574fee644c51023bb69069fa3ea9cdcaca40432818f54695f11acc0ae326cf56676e4d1 +"@pkgr/core@npm:^0.2.9": + version: 0.2.9 + resolution: "@pkgr/core@npm:0.2.9" + checksum: bb2fb86977d63f836f8f5b09015d74e6af6488f7a411dcd2bfdca79d76b5a681a9112f41c45bdf88a9069f049718efc6f3900d7f1de66a2ec966068308ae517f languageName: node linkType: hard @@ -2772,11 +2786,11 @@ __metadata: linkType: hard "@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": - version: 7.20.7 - resolution: "@types/babel__traverse@npm:7.20.7" + version: 7.28.0 + resolution: "@types/babel__traverse@npm:7.28.0" dependencies: - "@babel/types": ^7.20.7 - checksum: 2a2e5ad29c34a8b776162b0fe81c9ccb6459b2b46bf230f756ba0276a0258fcae1cbcfdccbb93a1e8b1df44f4939784ee8a1a269f95afe0c78b24b9cb6d50dd1 + "@babel/types": ^7.28.2 + checksum: e3124e6575b2f70de338eab8a9c704d315a86c46a8e395b6ec78a0157ab7b5fd877289556a57dcf28e4ff3543714e359cc1182d4afc4bcb4f3575a0bbafa0dad languageName: node linkType: hard @@ -2839,20 +2853,20 @@ __metadata: linkType: hard "@types/node-forge@npm:^1.3.0": - version: 1.3.11 - resolution: "@types/node-forge@npm:1.3.11" + version: 1.3.14 + resolution: "@types/node-forge@npm:1.3.14" dependencies: "@types/node": "*" - checksum: 1e86bd55b92a492eaafd75f6d01f31e7d86a5cdadd0c6bcdc0b1df4103b7f99bb75b832efd5217c7ddda5c781095dc086a868e20b9de00f5a427ddad4c296cd5 + checksum: ff621803390e723e56b289a89fca3a06f9f8b438add1b843203a0f64bcbc7ac03d457136b3c15010b5bc89d81f57b35f62964e6e980f6290597bb21b4463c009 languageName: node linkType: hard "@types/node@npm:*": - version: 24.0.4 - resolution: "@types/node@npm:24.0.4" + version: 24.3.0 + resolution: "@types/node@npm:24.3.0" dependencies: - undici-types: ~7.8.0 - checksum: db036e3f1fea5a92fd6cd76064cf07d517b245ace73d6f46bcd8e35f38ff856f86f3311aabc7c7406de2bdae9f8308070541dacfce20fec2510d42b3cd00bb9e + undici-types: ~7.10.0 + checksum: 0f98e492032007d7be811b5598d24b6260f6ef3d21b6fe3b9ca61a1c88f70d5d94c33f361b0f2bd9a1f5963426584c7c2514e29ca69b0649f6b075e7abd551cb languageName: node linkType: hard @@ -3151,9 +3165,9 @@ __metadata: linkType: hard "agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": - version: 7.1.3 - resolution: "agent-base@npm:7.1.3" - checksum: 87bb7ee54f5ecf0ccbfcba0b07473885c43ecd76cb29a8db17d6137a19d9f9cd443a2a7c5fd8a3f24d58ad8145f9eb49116344a66b107e1aeab82cf2383f4753 + version: 7.1.4 + resolution: "agent-base@npm:7.1.4" + checksum: 86a7f542af277cfbd77dd61e7df8422f90bac512953709003a1c530171a9d019d072e2400eab2b59f84b49ab9dd237be44315ca663ac73e82b3922d10ea5eafa languageName: node linkType: hard @@ -3249,9 +3263,9 @@ __metadata: linkType: hard "ansi-regex@npm:^6.0.1": - version: 6.1.0 - resolution: "ansi-regex@npm:6.1.0" - checksum: 495834a53b0856c02acd40446f7130cb0f8284f4a39afdab20d5dc42b2e198b1196119fe887beed8f9055c4ff2055e3b2f6d4641d0be018cdfb64fedf6fc1aac + version: 6.2.0 + resolution: "ansi-regex@npm:6.2.0" + checksum: f1a540a85647187f21918a87ea3fc910adc6ecc2bfc180c22d9b01a04379dce3a6c1f2e5375ab78e8d7d589eb1aeb734f49171e262e90c4225f21b4415c08c8c languageName: node linkType: hard @@ -3569,39 +3583,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.10": - version: 0.4.13 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.13" +"babel-plugin-polyfill-corejs2@npm:^0.4.14": + version: 0.4.14 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.14" dependencies: - "@babel/compat-data": ^7.22.6 - "@babel/helper-define-polyfill-provider": ^0.6.4 + "@babel/compat-data": ^7.27.7 + "@babel/helper-define-polyfill-provider": ^0.6.5 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 553b64eb11bad2cfc220e94f1fb2449755b5c7d54886dca6d8053b13b6e910f349a38bbc75aafd610f88217699db499548919bb5df653d635b9cdeb39d34a68d + checksum: d654334c1b4390d08282416144b7b6f3d74d2cab44b2bfa2b6405c828882c82907b8b67698dce1be046c218d2d4fe5bf7fb6d01879938f3129dad969e8cfc44d languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.11.0": - version: 0.11.1 - resolution: "babel-plugin-polyfill-corejs3@npm:0.11.1" +"babel-plugin-polyfill-corejs3@npm:^0.13.0": + version: 0.13.0 + resolution: "babel-plugin-polyfill-corejs3@npm:0.13.0" dependencies: - "@babel/helper-define-polyfill-provider": ^0.6.3 - core-js-compat: ^3.40.0 + "@babel/helper-define-polyfill-provider": ^0.6.5 + core-js-compat: ^3.43.0 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: ee39440475ef377a1570ccbc06b1a1d274cbfbbe2e7c3d4c60f38781a47f00a28bd10d8e23430828b965820c41beb2c93c84596baf72583a2c9c3fdfa4397994 + checksum: cf526031acd97ff2124e7c10e15047e6eeb0620d029c687f1dca99916a8fe6cac0e634b84c913db6cb68b7a024f82492ba8fdcc2a6266e7b05bdac2cba0c2434 languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.6.1": - version: 0.6.4 - resolution: "babel-plugin-polyfill-regenerator@npm:0.6.4" +"babel-plugin-polyfill-regenerator@npm:^0.6.5": + version: 0.6.5 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.5" dependencies: - "@babel/helper-define-polyfill-provider": ^0.6.4 + "@babel/helper-define-polyfill-provider": ^0.6.5 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: f4d4a803834ffa72713579d696586d8cc654c0025cbd5ec775fc5d37faa00381dcb80e5b97d4b16059443352653585596d87848b5590b1d8670c235408e73fb3 + checksum: ed1932fa9a31e0752fd10ebf48ab9513a654987cab1182890839523cb898559d24ae0578fdc475d9f995390420e64eeaa4b0427045b56949dace3c725bc66dbb languageName: node linkType: hard @@ -3624,8 +3638,8 @@ __metadata: linkType: hard "babel-preset-current-node-syntax@npm:^1.0.0": - version: 1.1.0 - resolution: "babel-preset-current-node-syntax@npm:1.1.0" + version: 1.2.0 + resolution: "babel-preset-current-node-syntax@npm:1.2.0" dependencies: "@babel/plugin-syntax-async-generators": ^7.8.4 "@babel/plugin-syntax-bigint": ^7.8.3 @@ -3643,8 +3657,8 @@ __metadata: "@babel/plugin-syntax-private-property-in-object": ^7.14.5 "@babel/plugin-syntax-top-level-await": ^7.14.5 peerDependencies: - "@babel/core": ^7.0.0 - checksum: 9f93fac975eaba296c436feeca1031ca0539143c4066eaf5d1ba23525a31850f03b651a1049caea7287df837a409588c8252c15627ad3903f17864c8e25ed64b + "@babel/core": ^7.0.0 || ^8.0.0-0 + checksum: 3608fa671cfa46364ea6ec704b8fcdd7514b7b70e6ec09b1199e13ae73ed346c51d5ce2cb6d4d5b295f6a3f2cad1fdeec2308aa9e037002dd7c929194cc838ea languageName: node linkType: hard @@ -3743,17 +3757,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.20.4, browserslist@npm:^4.24.0, browserslist@npm:^4.25.0": - version: 4.25.1 - resolution: "browserslist@npm:4.25.1" +"browserslist@npm:^4.20.4, browserslist@npm:^4.24.0, browserslist@npm:^4.25.3": + version: 4.25.4 + resolution: "browserslist@npm:4.25.4" dependencies: - caniuse-lite: ^1.0.30001726 - electron-to-chromium: ^1.5.173 + caniuse-lite: ^1.0.30001737 + electron-to-chromium: ^1.5.211 node-releases: ^2.0.19 update-browserslist-db: ^1.1.3 bin: browserslist: cli.js - checksum: 2a7e4317e809b09a436456221a1fcb8ccbd101bada187ed217f7a07a9e42ced822c7c86a0a4333d7d1b4e6e0c859d201732ffff1585d6bcacd8d226f6ddce7e3 + checksum: 936db8d7801576a93bc47f0ecd5a2d8424417bd62e0c94dbd7e6aa02493108e4362b4140d1904c070bcc64430c4d6987980fa02b75d38839db75af3951ce3605 languageName: node linkType: hard @@ -3916,14 +3930,14 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001726": - version: 1.0.30001726 - resolution: "caniuse-lite@npm:1.0.30001726" - checksum: 6148fc2c2f46ae1faf74af932aa768031355e2394164d7ccba0caafd30310c9b4f2c723d19d5ae5fab05a3238d1bed7e98037c84199d29d40768168e848135f5 +"caniuse-lite@npm:^1.0.30001737": + version: 1.0.30001739 + resolution: "caniuse-lite@npm:1.0.30001739" + checksum: 285554bcf66d5baf6c1b76f2864100aa1fca2d8795ed7ca76033dc472c100ec56a8556601cbdb632c3287a7b338f571a18e5bab5ee1500c5852abd80081972a0 languageName: node linkType: hard -"chalk@npm:5.4.1, chalk@npm:^5.3.0, chalk@npm:^5.4.1": +"chalk@npm:5.4.1": version: 5.4.1 resolution: "chalk@npm:5.4.1" checksum: 0c656f30b782fed4d99198825c0860158901f449a6b12b818b0aabad27ec970389e7e8767d0e00762175b23620c812e70c4fd92c0210e55fc2d993638b74e86e @@ -3940,6 +3954,13 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^5.3.0, chalk@npm:^5.4.1": + version: 5.6.0 + resolution: "chalk@npm:5.6.0" + checksum: 245d4b53c29c88da9e291f318c86b6b3ee65aa81568f9e10fafc984a6ef520412dee513057d07cc0f4614ab5a46cb07a0394fab3794d88d48c89c17b2d8fbf7f + languageName: node + linkType: hard + "char-regex@npm:^1.0.2": version: 1.0.2 resolution: "char-regex@npm:1.0.2" @@ -4004,9 +4025,9 @@ __metadata: linkType: hard "ci-info@npm:^4.1.0": - version: 4.2.0 - resolution: "ci-info@npm:4.2.0" - checksum: 0e3726721526f54c5b17cf44ab2ed69b842c756bcb4d2b26ce279e595a80a856aec9fb38a2986a2baca3de73d15895f3a01d2771c4aad93c898aae7e3ca0ceb1 + version: 4.3.0 + resolution: "ci-info@npm:4.3.0" + checksum: 77a851ec826e1fbcd993e0e3ef402e6a5e499c733c475af056b7808dea9c9ede53e560ed433020489a8efea2d824fd68ca203446c9988a0bac8475210b0d4491 languageName: node linkType: hard @@ -4244,17 +4265,17 @@ __metadata: linkType: hard "compression@npm:^1.7.1": - version: 1.8.0 - resolution: "compression@npm:1.8.0" + version: 1.8.1 + resolution: "compression@npm:1.8.1" dependencies: bytes: 3.1.2 compressible: ~2.0.18 debug: 2.6.9 negotiator: ~0.6.4 - on-headers: ~1.0.2 + on-headers: ~1.1.0 safe-buffer: 5.2.1 vary: ~1.1.2 - checksum: 12ca3e326b4ccb6b6e51e1d14d96fafd058ddb3be08fe888487d367d42fb4f81f25d4bf77acc517ba724370e7d74469280688baf2da8cad61062bdf62eb9fd45 + checksum: 906325935180cd3507d30ed898fb129deccab03689383d55536245a94610f5003923bb14c95ee6adc8d658ee13be549407eb4346ef55169045f3e41e9969808e languageName: node linkType: hard @@ -4406,8 +4427,8 @@ __metadata: linkType: hard "conventional-changelog-writer@npm:^8.0.0": - version: 8.1.0 - resolution: "conventional-changelog-writer@npm:8.1.0" + version: 8.2.0 + resolution: "conventional-changelog-writer@npm:8.2.0" dependencies: conventional-commits-filter: ^5.0.0 handlebars: ^4.7.7 @@ -4415,7 +4436,7 @@ __metadata: semver: ^7.5.2 bin: conventional-changelog-writer: dist/cli/index.js - checksum: cf3122058186f1e0ceaaa321fdad22c4ff2cbd830115747a695be153184692800e4bf51e54487884c3809c87b52f7933a968b53f44e2a25ad56993ffc2034cf1 + checksum: 0a7b62fdc06dbe3e8f0feff2c51295ebc03d8046db73111b3c6a595472885551adf9ef2eeb741c43794466e58c1f23a055160c8aef08cacfe769b86ea2b7c611 languageName: node linkType: hard @@ -4478,12 +4499,12 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.40.0": - version: 3.43.0 - resolution: "core-js-compat@npm:3.43.0" +"core-js-compat@npm:^3.43.0": + version: 3.45.1 + resolution: "core-js-compat@npm:3.45.1" dependencies: - browserslist: ^4.25.0 - checksum: 32d1383c3d6bf84b8bb41b5a1e0a45bf8144ea3f7b913a7e83dd51f1252e9db9c187c4e34877b39ac5661be51a03655694c3a01e03637b895c39f7908f440c77 + browserslist: ^4.25.3 + checksum: 817286f6b7deb90278fd1f46131664fda36b74983e2fc4859a36ae85ef9361868b307964eea0e364251763e415eab7589e9abe2a4ec4d1672c2870f03c52b1ac languageName: node linkType: hard @@ -4599,9 +4620,9 @@ __metadata: linkType: hard "dayjs@npm:^1.8.15": - version: 1.11.13 - resolution: "dayjs@npm:1.11.13" - checksum: f388db88a6aa93956c1f6121644e783391c7b738b73dbc54485578736565c8931bdfba4bb94e9b1535c6e509c97d5deb918bbe1ae6b34358d994de735055cca9 + version: 1.11.18 + resolution: "dayjs@npm:1.11.18" + checksum: cc90054bad30ab011417a7a474b2ffa70e7a28ca6f834d7e86fe53a408a40a14c174f26155072628670e9eda4c48c4ed0d847d2edf83d47c0bfb78be15bbf2dd languageName: node linkType: hard @@ -4614,7 +4635,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0, debug@npm:^4.4.1": version: 4.4.1 resolution: "debug@npm:4.4.1" dependencies: @@ -4913,10 +4934,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.173": - version: 1.5.174 - resolution: "electron-to-chromium@npm:1.5.174" - checksum: b2920217ffa8a42e063609ca9436572a63ddedfece0755e26e70ea2b652a86144b77892e81c9a13f08b993bc4fcce47d606b7f24ea7b2fdffb0da56cec1a956b +"electron-to-chromium@npm:^1.5.211": + version: 1.5.212 + resolution: "electron-to-chromium@npm:1.5.212" + checksum: 2d1e86df723a834d30a43636bfa2ddc942ca4b823c55d141796668315de11afaffba5ba07eb522fbe5ad8f1324a237a33e8bf01b2586dca5eb555e80b60aba28 languageName: node linkType: hard @@ -4928,9 +4949,9 @@ __metadata: linkType: hard "emoji-regex@npm:^10.3.0": - version: 10.4.0 - resolution: "emoji-regex@npm:10.4.0" - checksum: a6d9a0e454829a52e664e049847776ee1fff5646617b06cd87de7c03ce1dfcce4102a3b154d5e9c8e90f8125bc120fc1fe114d523dddf60a8a161f26c72658d2 + version: 10.5.0 + resolution: "emoji-regex@npm:10.5.0" + checksum: 3a5164bfc2ac4685aa2fda613bb2b58d1d4e05b6ace9d87f8e119fe8cd39779875adfe1919b64f06f5dcd2b522238ad23b50caaaff7fb600bd53c84ff86e4b61 languageName: node linkType: hard @@ -5247,24 +5268,24 @@ __metadata: linkType: hard "eslint-config-prettier@npm:^8.5.0": - version: 8.10.0 - resolution: "eslint-config-prettier@npm:8.10.0" + version: 8.10.2 + resolution: "eslint-config-prettier@npm:8.10.2" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: 153266badd477e49b0759816246b2132f1dbdb6c7f313ca60a9af5822fd1071c2bc5684a3720d78b725452bbac04bb130878b2513aea5e72b1b792de5a69fec8 + checksum: a92b7e8a996e65adf79de1579524235687e9d3552d088cfab4f170da60d23762addb4276169c8ca3a9551329dda8408c59f7e414101b238a6385379ac1bc3b16 languageName: node linkType: hard "eslint-config-prettier@npm:^9.0.0": - version: 9.1.0 - resolution: "eslint-config-prettier@npm:9.1.0" + version: 9.1.2 + resolution: "eslint-config-prettier@npm:9.1.2" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: 9229b768c879f500ee54ca05925f31b0c0bafff3d9f5521f98ff05127356de78c81deb9365c86a5ec4efa990cb72b74df8612ae15965b14136044c73e1f6a907 + checksum: e786b767331094fd024cb1b0899964a9da0602eaf4ebd617d6d9794752ccd04dbe997e3c14c17f256c97af20bee1c83c9273f69b74cb2081b6f514580d62408f languageName: node linkType: hard @@ -5325,8 +5346,8 @@ __metadata: linkType: hard "eslint-plugin-prettier@npm:^5.0.1": - version: 5.5.1 - resolution: "eslint-plugin-prettier@npm:5.5.1" + version: 5.5.4 + resolution: "eslint-plugin-prettier@npm:5.5.4" dependencies: prettier-linter-helpers: ^1.0.0 synckit: ^0.11.7 @@ -5340,7 +5361,7 @@ __metadata: optional: true eslint-config-prettier: optional: true - checksum: 913ecebfeab932ed510d8608875594d2529dc28957eed0d56a896e9862257031038a9f0921dcf198d61475ef0f5904332a7f1839be387d0a314c91f3cfbf3817 + checksum: 0dd05ed85018ab0e98da80325b7bd4c4ab6dd684398f1270a7c8cf4261df714dd4502ba4c7f85f651aade9989da0a7d2adda03af8873b73b52014141abf385de languageName: node linkType: hard @@ -5739,14 +5760,14 @@ __metadata: linkType: hard "fdir@npm:^6.4.4": - version: 6.4.6 - resolution: "fdir@npm:6.4.6" + version: 6.5.0 + resolution: "fdir@npm:6.5.0" peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true - checksum: fe9f3014901d023cf631831dcb9eae5447f4d7f69218001dd01ecf007eccc40f6c129a04411b5cc273a5f93c14e02e971e17270afc9022041c80be924091eb6f + checksum: bd537daa9d3cd53887eed35efa0eab2dbb1ca408790e10e024120e7a36c6e9ae2b33710cb8381e35def01bc9c1d7eaba746f886338413e68ff6ebaee07b9a6e8 languageName: node linkType: hard @@ -5865,9 +5886,9 @@ __metadata: linkType: hard "flow-parser@npm:0.*": - version: 0.274.0 - resolution: "flow-parser@npm:0.274.0" - checksum: 901254f207ec530444a26b4e1064095746e9c886a3e63ef75fb037300bc028bbc8ea6abc60db4de29fda5f78c3f663143154e97ae349ed00bbbfbfbae812a146 + version: 0.280.0 + resolution: "flow-parser@npm:0.280.0" + checksum: da3fa52838075e0fc584d68a84669a4612459a62bc7269277020ea3cdd7045dcfbeebe46510d8dfe32c7ddd6796749ae383250229709e10e13386c8df6936934 languageName: node linkType: hard @@ -5996,10 +6017,10 @@ __metadata: languageName: node linkType: hard -"get-east-asian-width@npm:^1.0.0": - version: 1.3.0 - resolution: "get-east-asian-width@npm:1.3.0" - checksum: 757a34c7a46ff385e2775f96f9d3e553f6b6666a8898fb89040d36a1010fba692332772945606a7d4b0f0c6afb84cd394e75d5477c56e1f00f1eb79603b0aecc +"get-east-asian-width@npm:^1.0.0, get-east-asian-width@npm:^1.3.1": + version: 1.3.1 + resolution: "get-east-asian-width@npm:1.3.1" + checksum: a65927415e0690dda1f790f075566aa02bf81d649ddfed6e85585f228c89e6bf8a9e6582c06e120597a632b40b18db2f7cef7424073bad931d713e71fd5ede27 languageName: node linkType: hard @@ -6073,13 +6094,13 @@ __metadata: linkType: hard "get-uri@npm:^6.0.1": - version: 6.0.4 - resolution: "get-uri@npm:6.0.4" + version: 6.0.5 + resolution: "get-uri@npm:6.0.5" dependencies: basic-ftp: ^5.0.2 data-uri-to-buffer: ^6.0.2 debug: ^4.3.4 - checksum: 7eae81655e0c8cee250d29c189e09030f37a2d37987298325709affb9408de448bf2dc43ee9a59acd21c1f100c3ca711d0446b4e689e9590c25774ecc59f0442 + checksum: aef94dbecde44bc9cd23f5c1b6af5bf772a3d16612c0fc37d3a4056ffd202f2cdd329746d4fdc2124813ea6c8b1c5279f3749d27226a2b161df43dbcb70082e3 languageName: node linkType: hard @@ -6208,13 +6229,6 @@ __metadata: languageName: node linkType: hard -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e - languageName: node - linkType: hard - "globals@npm:^13.19.0": version: 13.24.0 resolution: "globals@npm:13.24.0" @@ -6693,13 +6707,10 @@ __metadata: languageName: node linkType: hard -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: 1.1.0 - sprintf-js: ^1.1.3 - checksum: aa15f12cfd0ef5e38349744e3654bae649a34c3b10c77a674a167e99925d1549486c5b14730eebce9fea26f6db9d5e42097b00aa4f9f612e68c79121c71652dc +"ip-address@npm:^10.0.1": + version: 10.0.1 + resolution: "ip-address@npm:10.0.1" + checksum: 525d5391cfd31a91f80f5857e98487aeaa8474e860a6725a0b6461ac8e436c7f8c869774dece391c8f8e7486306a34a4d1c094778c4c583a3f1f2cd905e5ed50 languageName: node linkType: hard @@ -6863,11 +6874,11 @@ __metadata: linkType: hard "is-fullwidth-code-point@npm:^5.0.0": - version: 5.0.0 - resolution: "is-fullwidth-code-point@npm:5.0.0" + version: 5.1.0 + resolution: "is-fullwidth-code-point@npm:5.1.0" dependencies: - get-east-asian-width: ^1.0.0 - checksum: 8dfb2d2831b9e87983c136f5c335cd9d14c1402973e357a8ff057904612ed84b8cba196319fabedf9aefe4639e14fe3afe9d9966d1d006ebeb40fe1fed4babe5 + get-east-asian-width: ^1.3.1 + checksum: 4700d8a82cb71bd2a2955587b2823c36dc4660eadd4047bfbd070821ddbce8504fc5f9b28725567ecddf405b1e06c6692c9b719f65df6af9ec5262bc11393a6a languageName: node linkType: hard @@ -7334,12 +7345,12 @@ __metadata: linkType: hard "istanbul-reports@npm:^3.1.3": - version: 3.1.7 - resolution: "istanbul-reports@npm:3.1.7" + version: 3.2.0 + resolution: "istanbul-reports@npm:3.2.0" dependencies: html-escaper: ^2.0.0 istanbul-lib-report: ^3.0.0 - checksum: 2072db6e07bfbb4d0eb30e2700250636182398c1af811aea5032acb219d2080f7586923c09fa194029efd6b92361afb3dcbe1ebcc3ee6651d13340f7c6c4ed95 + checksum: 72b4c8525276147908d28b0917bc675b1019836b638e50875521ca3b8ec63672681aa98dbab88a6f49ef798c08fe041d428abdcf84f4f3fcff5844eee54af65a languageName: node linkType: hard @@ -7852,13 +7863,6 @@ __metadata: languageName: node linkType: hard -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 944f924f2bd67ad533b3850eee47603eed0f6ae425fd1ee8c760f477e8c34a05f144c1bd4f5a5dd1963141dc79a2c55f89ccc5ab77d039e7077f3ad196b64965 - languageName: node - linkType: hard - "jsc-safe-url@npm:^0.2.2": version: 0.2.4 resolution: "jsc-safe-url@npm:0.2.4" @@ -7981,15 +7985,15 @@ __metadata: linkType: hard "jsonfile@npm:^6.0.1": - version: 6.1.0 - resolution: "jsonfile@npm:6.1.0" + version: 6.2.0 + resolution: "jsonfile@npm:6.2.0" dependencies: graceful-fs: ^4.1.6 universalify: ^2.0.0 dependenciesMeta: graceful-fs: optional: true - checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 + checksum: c3028ec5c770bb41290c9bb9ca04bdd0a1b698ddbdf6517c9453d3f90fc9e000c9675959fb46891d317690a93c62de03ff1735d8dbe02be83e51168ce85815d3 languageName: node linkType: hard @@ -8037,6 +8041,8 @@ __metadata: react: 19.0.0 react-native: 0.78.0 react-native-builder-bob: ^0.36.0 + react-native-geolocation-service: ^5.3.1 + react-native-permissions: ^5.4.2 languageName: unknown linkType: soft @@ -8062,6 +8068,8 @@ __metadata: react: 19.0.0 react-native: 0.78.0 react-native-builder-bob: ^0.36.0 + react-native-geolocation-service: ^5.3.1 + react-native-permissions: ^5.4.2 release-it: ^17.10.0 turbo: ^1.10.7 typedoc: ^0.25.7 @@ -8087,9 +8095,9 @@ __metadata: linkType: hard "ky@npm:^1.2.0": - version: 1.8.1 - resolution: "ky@npm:1.8.1" - checksum: 802f3023ae1060b1d8c11376b9866fb5be82fa5174473d82c16a25d2905b3b41bc0121a134be87d8e3b40b24d56d34920a376e653785310803cbb8ea7cd43f85 + version: 1.9.1 + resolution: "ky@npm:1.9.1" + checksum: df3de560c8398a2769a83fbc48d7e079c1a4cfd862fbed3aba370cba9629630fed8bc60dd3857f0b5d6536d61d1fb6412fefb1debb7f065c7a1a3fbba50ab07a languageName: node linkType: hard @@ -9287,8 +9295,8 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 11.2.0 - resolution: "node-gyp@npm:11.2.0" + version: 11.4.2 + resolution: "node-gyp@npm:11.4.2" dependencies: env-paths: ^2.2.0 exponential-backoff: ^3.1.1 @@ -9302,7 +9310,7 @@ __metadata: which: ^5.0.0 bin: node-gyp: bin/node-gyp.js - checksum: 2536282ba81f8a94b29482d3622b6ab298611440619e46de4512a6f32396a68b5530357c474b859787069d84a4c537d99e0c71078cce5b9f808bf84eeb78e8fb + checksum: d8041cee7ec60c86fb2961d77c12a2d083a481fb28b08e6d9583153186c0e7766044dc30bdb1f3ac01ddc5763b83caeed3d1ea35787ec4ffd8cc4aeedfc34f2b languageName: node linkType: hard @@ -9500,10 +9508,10 @@ __metadata: languageName: node linkType: hard -"on-headers@npm:~1.0.2": - version: 1.0.2 - resolution: "on-headers@npm:1.0.2" - checksum: 2bf13467215d1e540a62a75021e8b318a6cfc5d4fc53af8e8f84ad98dbcea02d506c6d24180cd62e1d769c44721ba542f3154effc1f7579a8288c9f7873ed8e5 +"on-headers@npm:~1.1.0": + version: 1.1.0 + resolution: "on-headers@npm:1.1.0" + checksum: 98aa64629f986fb8cc4517dd8bede73c980e31208cba97f4442c330959f60ced3dc6214b83420491f5111fc7c4f4343abe2ea62c85f505cf041d67850f238776 languageName: node linkType: hard @@ -9920,9 +9928,9 @@ __metadata: linkType: hard "picomatch@npm:^4.0.2": - version: 4.0.2 - resolution: "picomatch@npm:4.0.2" - checksum: a7a5188c954f82c6585720e9143297ccd0e35ad8072231608086ca950bee672d51b0ef676254af0788205e59bd4e4deb4e7708769226bed725bf13370a7d1464 + version: 4.0.3 + resolution: "picomatch@npm:4.0.3" + checksum: 6817fb74eb745a71445debe1029768de55fd59a42b75606f478ee1d0dc1aa6e78b711d041a7c9d5550e042642029b7f373dc1a43b224c4b7f12d23436735dba0 languageName: node linkType: hard @@ -10000,11 +10008,11 @@ __metadata: linkType: hard "prettier@npm:^3.0.3": - version: 3.6.1 - resolution: "prettier@npm:3.6.1" + version: 3.6.2 + resolution: "prettier@npm:3.6.2" bin: prettier: bin/prettier.cjs - checksum: 3b487e03078168467c7efed62207cab4fe9da0c304bd5d1c7ab55647fce9f78cc19caf801890d7bb49653b506b098d796277d998722f87eddf8fa5b2c66744b1 + checksum: 0206f5f437892e8858f298af8850bf9d0ef1c22e21107a213ba56bfb9c2387a2020bfda244a20161d8e3dad40c6b04101609a55d370dece53d0a31893b64f861 languageName: node linkType: hard @@ -10200,12 +10208,12 @@ __metadata: linkType: hard "react-devtools-core@npm:^6.0.1": - version: 6.1.2 - resolution: "react-devtools-core@npm:6.1.2" + version: 6.1.5 + resolution: "react-devtools-core@npm:6.1.5" dependencies: shell-quote: ^1.6.1 ws: ^7 - checksum: aa72d4ad993af861088ead93bcce789dbf084a530a7723d94d3a040dad6cdb3fa46e14ff0d6e1c1c8f22713f30cf52505c6083f3c91b5114c1d90f7a3c2c1e43 + checksum: b54f2d2416f5f5ca61b1741367865eab18b0040d7e4b3236693595803dfdf82ae02adbcb480acc5b9767748b615a2d5ce3af286cde3a7f8c193123c62c777428 languageName: node linkType: hard @@ -10262,6 +10270,27 @@ __metadata: languageName: node linkType: hard +"react-native-geolocation-service@npm:^5.3.1": + version: 5.3.1 + resolution: "react-native-geolocation-service@npm:5.3.1" + checksum: 9a625c9f87811933491055fd8cbd1ef46f97fbbe0262714ad1d9aa969a8900dcb4abc47e58fe162400a81bcdee79324dfcc8e631862df9a22d59ac84af9acfde + languageName: node + linkType: hard + +"react-native-permissions@npm:^5.4.2": + version: 5.4.2 + resolution: "react-native-permissions@npm:5.4.2" + peerDependencies: + react: ">=18.1.0" + react-native: ">=0.70.0" + react-native-windows: ">=0.70.0" + peerDependenciesMeta: + react-native-windows: + optional: true + checksum: fac680b7d85fb979806156d6c9f90dee9c8299b83eb9d2d82bee50aec4baa71b0f5d3cf79e8bf02345e67f77d6cb0fbfbe7e54d02b6822de0ae2e0d9323a6614 + languageName: node + linkType: hard + "react-native@npm:0.78.0": version: 0.78.0 resolution: "react-native@npm:0.78.0" @@ -10635,7 +10664,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.14.2, resolve@npm:^1.20.0, resolve@npm:^1.22.8": +"resolve@npm:^1.1.6, resolve@npm:^1.20.0, resolve@npm:^1.22.10, resolve@npm:^1.22.8": version: 1.22.10 resolution: "resolve@npm:1.22.10" dependencies: @@ -10661,7 +10690,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.8#~builtin": +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.10#~builtin, resolve@patch:resolve@^1.22.8#~builtin": version: 1.22.10 resolution: "resolve@patch:resolve@npm%3A1.22.10#~builtin::version=1.22.10&hash=c3c19d" dependencies: @@ -11174,12 +11203,12 @@ __metadata: linkType: hard "socks@npm:^2.8.3": - version: 2.8.5 - resolution: "socks@npm:2.8.5" + version: 2.8.7 + resolution: "socks@npm:2.8.7" dependencies: - ip-address: ^9.0.5 + ip-address: ^10.0.1 smart-buffer: ^4.2.0 - checksum: d39a77a8c91cfacafc75c67dba45925eccfd884a8a4a68dcda6fb9ab7f37de6e250bb6db3721e8a16a066a8e1ebe872d4affc26f3eb763f4befedcc7b733b7ed + checksum: 4bbe2c88cf0eeaf49f94b7f11564a99b2571bde6fd1e714ff95b38f89e1f97858c19e0ab0e6d39eb7f6a984fa67366825895383ed563fe59962a1d57a1d55318 languageName: node linkType: hard @@ -11245,16 +11274,9 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.21 - resolution: "spdx-license-ids@npm:3.0.21" - checksum: 681dfe26d250f48cc725c9118adf1eb0a175e3c298cd8553c039bfae37ed21bea30a27bc02dbb99b4a0d3a25c644c5dda952090e11ef4b3093f6ec7db4b93b58 - languageName: node - linkType: hard - -"sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: a3fdac7b49643875b70864a9d9b469d87a40dfeaf5d34d9d0c5b1cda5fd7d065531fcb43c76357d62254c57184a7b151954156563a4d6a747015cfb41021cad0 + version: 3.0.22 + resolution: "spdx-license-ids@npm:3.0.22" + checksum: 3810ce1ddd8c67d7cfa76a0af05157090a2d93e5bb93bd85bf9735f1fd8062c5b510423a4669dc7d8c34b0892b27a924b1c6f8965f85d852aa25062cceff5e29 languageName: node linkType: hard @@ -11592,11 +11614,11 @@ __metadata: linkType: hard "synckit@npm:^0.11.7": - version: 0.11.8 - resolution: "synckit@npm:0.11.8" + version: 0.11.11 + resolution: "synckit@npm:0.11.11" dependencies: - "@pkgr/core": ^0.2.4 - checksum: dd7193736e0b5eb209192e280649b98b539537bf23bef20c8a2b24cd12ccde47bcf4e77773ff9cb66c35960d2cb41e28c05e0b19124488abbfb6423258b56275 + "@pkgr/core": ^0.2.9 + checksum: bc896d4320525501495654766e6b0aa394e522476ea0547af603bdd9fd7e9b65dcd6e3a237bc7eb3ab7e196376712f228bf1bf6ed1e1809f4b32dc9baf7ad413 languageName: node linkType: hard @@ -11690,9 +11712,9 @@ __metadata: linkType: hard "tmp@npm:^0.2.3": - version: 0.2.3 - resolution: "tmp@npm:0.2.3" - checksum: 73b5c96b6e52da7e104d9d44afb5d106bb1e16d9fa7d00dbeb9e6522e61b571fbdb165c756c62164be9a3bbe192b9b268c236d370a2a0955c7689cd2ae377b95 + version: 0.2.5 + resolution: "tmp@npm:0.2.5" + checksum: 9d18e58060114154939930457b9e198b34f9495bcc05a343bc0a0a29aa546d2c1c2b343dae05b87b17c8fde0af93ab7d8fe8574a8f6dc2cd8fd3f2ca1ad0d8e1 languageName: node linkType: hard @@ -11966,22 +11988,22 @@ __metadata: linkType: hard "typescript@npm:^5.0.2": - version: 5.8.3 - resolution: "typescript@npm:5.8.3" + version: 5.4.5 + resolution: "typescript@npm:5.4.5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: cb1d081c889a288b962d3c8ae18d337ad6ee88a8e81ae0103fa1fecbe923737f3ba1dbdb3e6d8b776c72bc73bfa6d8d850c0306eed1a51377d2fccdfd75d92c4 + checksum: 53c879c6fa1e3bcb194b274d4501ba1985894b2c2692fa079db03c5a5a7140587a1e04e1ba03184605d35f439b40192d9e138eb3279ca8eee313c081c8bcd9b0 languageName: node linkType: hard "typescript@patch:typescript@^5.0.2#~builtin": - version: 5.8.3 - resolution: "typescript@patch:typescript@npm%3A5.8.3#~builtin::version=5.8.3&hash=14eedb" + version: 5.4.5 + resolution: "typescript@patch:typescript@npm%3A5.4.5#~builtin::version=5.4.5&hash=14eedb" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 1b503525a88ff0ff5952e95870971c4fb2118c17364d60302c21935dedcd6c37e6a0a692f350892bafcef6f4a16d09073fe461158547978d2f16fbe4cb18581c + checksum: 2373c693f3b328f3b2387c3efafe6d257b057a142f9a79291854b14ff4d5367d3d730810aee981726b677ae0fd8329b23309da3b6aaab8263dbdccf1da07a3ba languageName: node linkType: hard @@ -12013,10 +12035,10 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~7.8.0": - version: 7.8.0 - resolution: "undici-types@npm:7.8.0" - checksum: 59521a5b9b50e72cb838a29466b3557b4eacbc191a83f4df5a2f7b156bc8263072b145dc4bb8ec41da7d56a7e9b178892458da02af769243d57f801a50ac5751 +"undici-types@npm:~7.10.0": + version: 7.10.0 + resolution: "undici-types@npm:7.10.0" + checksum: 6917fcd8c80963919fe918952f9243a6749af0e3f759a39f8d2c2486144a66c86ae4125aebbce700b636cb1dcd45e85eb8c49c60d60738a97b63f0e89ef9b053 languageName: node linkType: hard @@ -12521,11 +12543,11 @@ __metadata: linkType: hard "yaml@npm:^2.2.1, yaml@npm:^2.7.0": - version: 2.8.0 - resolution: "yaml@npm:2.8.0" + version: 2.8.1 + resolution: "yaml@npm:2.8.1" bin: yaml: bin.mjs - checksum: 66f103ca5a2f02dac0526895cc7ae7626d91aa8c43aad6fdcff15edf68b1199be4012140b390063877913441aaa5288fdf57eca30e06268a8282dd741525e626 + checksum: 35b46150d48bc1da2fd5b1521a48a4fa36d68deaabe496f3c3fa9646d5796b6b974f3930a02c4b5aee6c85c860d7d7f79009416724465e835f40b87898c36de4 languageName: node linkType: hard @@ -12595,8 +12617,8 @@ __metadata: linkType: hard "yoctocolors-cjs@npm:^2.1.1": - version: 2.1.2 - resolution: "yoctocolors-cjs@npm:2.1.2" - checksum: 1c474d4b30a8c130e679279c5c2c33a0d48eba9684ffa0252cc64846c121fb56c3f25457fef902edbe1e2d7a7872130073a9fc8e795299d75e13fa3f5f548f1b + version: 2.1.3 + resolution: "yoctocolors-cjs@npm:2.1.3" + checksum: 207df586996c3b604fa85903f81cc54676f1f372613a0c7247f0d24b1ca781905685075d06955211c4d5d4f629d7d5628464f8af0a42d286b7a8ff88e9dadcb8 languageName: node linkType: hard From 9c2f5b30c3b2155be7eb8e6996d55aa5e746ae02 Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Tue, 2 Sep 2025 14:02:08 -0400 Subject: [PATCH 02/25] Add bridging to test mock API call --- example/ios/Podfile | 4 + example/ios/Podfile.lock | 27 ++- example/src/AppViewInterface.ts | 73 +------- example/src/GeofencingWrapper.ts | 176 ----------------- example/src/KlaviyoReactWrapper.ts | 8 + ios/KlaviyoBridge.swift | 7 + ios/KlaviyoReactNativeSdk.mm | 4 + klaviyo-react-native-sdk.podspec | 1 + src/Geofencing.ts | 291 +---------------------------- src/Klaviyo.ts | 2 + src/index.tsx | 3 + 11 files changed, 53 insertions(+), 543 deletions(-) delete mode 100644 example/src/GeofencingWrapper.ts diff --git a/example/ios/Podfile b/example/ios/Podfile index c5c308c9..5a01ef74 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -21,6 +21,10 @@ target 'KlaviyoReactNativeSdkExample' do use_frameworks! :linkage => :static # Insert override klaviyo-swift-sdk pods below this line when needed + pod 'KlaviyoCore', :path => '../../../klaviyo-swift-sdk' + pod 'KlaviyoSwift', :path => '../../../klaviyo-swift-sdk' + pod 'KlaviyoForms', :path => '../../../klaviyo-swift-sdk' + pod 'KlaviyoLocation', :path => '../../../klaviyo-swift-sdk' use_react_native!( :path => config[:reactNativePath], diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 4d0585ac..b9e5bdc1 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -11,12 +11,15 @@ PODS: - hermes-engine/Pre-built (0.78.0) - klaviyo-react-native-sdk (2.0.2): - KlaviyoForms (= 5.0.2) + - KlaviyoLocation (= 5.0.2) - KlaviyoSwift (= 5.0.2) - React-Core - KlaviyoCore (5.0.2): - AnyCodable-FlightSchool - KlaviyoForms (5.0.2): - KlaviyoSwift (~> 5.0.2) + - KlaviyoLocation (5.0.2): + - KlaviyoSwift (~> 5.0.2) - KlaviyoSwift (5.0.2): - AnyCodable-FlightSchool - KlaviyoCore (~> 5.0.2) @@ -1573,6 +1576,10 @@ DEPENDENCIES: - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - klaviyo-react-native-sdk (from `../..`) + - KlaviyoCore (from `../../../klaviyo-swift-sdk`) + - KlaviyoForms (from `../../../klaviyo-swift-sdk`) + - KlaviyoLocation (from `../../../klaviyo-swift-sdk`) + - KlaviyoSwift (from `../../../klaviyo-swift-sdk`) - KlaviyoSwiftExtension - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) @@ -1641,9 +1648,6 @@ DEPENDENCIES: SPEC REPOS: trunk: - AnyCodable-FlightSchool - - KlaviyoCore - - KlaviyoForms - - KlaviyoSwift - KlaviyoSwiftExtension - SocketRocket @@ -1665,6 +1669,14 @@ EXTERNAL SOURCES: :tag: hermes-2025-01-13-RNv0.78.0-a942ef374897d85da38e9c8904574f8376555388 klaviyo-react-native-sdk: :path: "../.." + KlaviyoCore: + :path: "../../../klaviyo-swift-sdk" + KlaviyoForms: + :path: "../../../klaviyo-swift-sdk" + KlaviyoLocation: + :path: "../../../klaviyo-swift-sdk" + KlaviyoSwift: + :path: "../../../klaviyo-swift-sdk" RCT-Folly: :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTDeprecation: @@ -1797,10 +1809,11 @@ SPEC CHECKSUMS: fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd glog: eb93e2f488219332457c3c4eafd2738ddc7e80b8 hermes-engine: b417d2b2aee3b89b58e63e23a51e02be91dc876d - klaviyo-react-native-sdk: 25787506822141b431feb3de033a783adbfd287d - KlaviyoCore: b5756601aa1a36d9c52a2482129678ea12fb6fd8 + klaviyo-react-native-sdk: c11f72dd86bb0fc91158fc28e3e86474124abed9 + KlaviyoCore: 198afe296ac277491b60c124b6ee9f0ab081c814 KlaviyoForms: 8bd518b140115b1ddd5e892b7b12844fe1ce245e - KlaviyoSwift: 995930ec8a87596950ff2cfc6340ac66e626e913 + KlaviyoLocation: 09d8375201afdaa50e8138f0a83dc90d4fa194dd + KlaviyoSwift: e972b43901270e84cc45ec92d85eafcd7808b76f KlaviyoSwiftExtension: 3ba7570f45e9cc2873de73e79e27b4af46ed6553 RCT-Folly: e78785aa9ba2ed998ea4151e314036f6c49e6d82 RCTDeprecation: b2eecf2d60216df56bc5e6be5f063826d3c1ee35 @@ -1865,6 +1878,6 @@ SPEC CHECKSUMS: SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: be02ca501b03c79d7027a6bbbd0a8db985034f11 -PODFILE CHECKSUM: e20d7567686b77a54d5ef38de82fae4c1448f77a +PODFILE CHECKSUM: 3b283b428640c18a3af8ea2ac09ec7b7ddf1d741 COCOAPODS: 1.16.2 diff --git a/example/src/AppViewInterface.ts b/example/src/AppViewInterface.ts index 3b4238c3..68731d44 100644 --- a/example/src/AppViewInterface.ts +++ b/example/src/AppViewInterface.ts @@ -15,21 +15,8 @@ import { getPushToken, registerForInAppForms, unregisterFromInAppForms, + registerForGeofences, } from './KlaviyoReactWrapper'; -import { - initializeGeofencing, - addDefaultGeofences, - startGeofencing, - stopGeofencing, - removeAllGeofences, - getCurrentGeofences, - checkGeofencingStatus, - simulateGeofenceEnter, - simulateGeofenceExit, - setupGeofenceListeners, - addCustomGeofence, - checkLocationPermission, -} from './GeofencingWrapper'; export interface AppViewInterface { title: string; @@ -118,65 +105,9 @@ export const appViews: AppViewInterface[] = [ color: '#d3ab10', onPress: unregisterFromInAppForms, }, - // Geofencing functionality { title: 'Initialize Geofencing', color: '#4CAF50', - onPress: initializeGeofencing, - }, - { - title: 'Add Default Geofences', - color: '#4CAF50', - onPress: addDefaultGeofences, - }, - { - title: 'Start Geofencing', - color: '#4CAF50', - onPress: startGeofencing, - }, - { - title: 'Stop Geofencing', - color: '#FF5722', - onPress: stopGeofencing, - }, - { - title: 'Setup Geofence Listeners', - color: '#2196F3', - onPress: setupGeofenceListeners, - }, - { - title: 'Get Current Geofences', - color: '#2196F3', - onPress: getCurrentGeofences, - }, - { - title: 'Check Geofencing Status', - color: '#2196F3', - onPress: checkGeofencingStatus, - }, - { - title: 'Check Location Permission', - color: '#2196F3', - onPress: checkLocationPermission, - }, - { - title: 'Add Custom Geofence', - color: '#9C27B0', - onPress: addCustomGeofence, - }, - { - title: 'Simulate Geofence Enter', - color: '#FF9800', - onPress: simulateGeofenceEnter, - }, - { - title: 'Simulate Geofence Exit', - color: '#FF9800', - onPress: simulateGeofenceExit, - }, - { - title: 'Remove All Geofences', - color: '#F44336', - onPress: removeAllGeofences, + onPress: registerForGeofences, }, ]; diff --git a/example/src/GeofencingWrapper.ts b/example/src/GeofencingWrapper.ts deleted file mode 100644 index 27e27924..00000000 --- a/example/src/GeofencingWrapper.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { Alert } from 'react-native'; -import Geofencing, { - GeofenceTransitionType, - type GeofenceEvent, -} from '../../src/Geofencing'; - -/** - * Initialize geofencing with default configuration - */ -export const initializeGeofencing = async (): Promise => { - try { - await Geofencing.initialize(); - Alert.alert('Success', 'Geofencing initialized successfully!'); - } catch (error) { - Alert.alert('Error', `Failed to initialize geofencing: ${error}`); - } -}; - -/** - * Add default placeholder geofences for testing - */ -export const addDefaultGeofences = async (): Promise => { - try { - await Geofencing.addDefaultGeofences(); - Alert.alert('Success', 'Default geofences added successfully!'); - } catch (error) { - Alert.alert('Error', `Failed to add default geofences: ${error}`); - } -}; - -/** - * Start geofencing monitoring - */ -export const startGeofencing = async (): Promise => { - try { - await Geofencing.start(); - Alert.alert('Success', 'Geofencing monitoring started!'); - } catch (error) { - Alert.alert('Error', `Failed to start geofencing: ${error}`); - } -}; - -/** - * Stop geofencing monitoring - */ -export const stopGeofencing = async (): Promise => { - try { - await Geofencing.stop(); - Alert.alert('Success', 'Geofencing monitoring stopped!'); - } catch (error) { - Alert.alert('Error', `Failed to stop geofencing: ${error}`); - } -}; - -/** - * Remove all geofences - */ -export const removeAllGeofences = async (): Promise => { - try { - await Geofencing.removeAllGeofences(); - Alert.alert('Success', 'All geofences removed!'); - } catch (error) { - Alert.alert('Error', `Failed to remove geofences: ${error}`); - } -}; - -/** - * Get current geofences - */ -export const getCurrentGeofences = async (): Promise => { - try { - const geofences = Geofencing.getGeofences(); - const geofenceList = geofences - .map((g) => `${g.id}: (${g.latitude}, ${g.longitude}) - ${g.radius}m`) - .join('\n'); - Alert.alert('Current Geofences', geofenceList || 'No geofences configured'); - } catch (error) { - Alert.alert('Error', `Failed to get geofences: ${error}`); - } -}; - -/** - * Check if geofencing is initialized - */ -export const checkGeofencingStatus = async (): Promise => { - const isInitialized = Geofencing.isGeofencingInitialized(); - // const permissionStatus = await Geofencing.checkLocationPermissionStatus(); - Alert.alert( - 'Geofencing Status', - `Initialized: ${isInitialized ? 'Yes' : 'No'}` - ); -}; - -/** - * Simulate geofence enter event for testing - */ -export const simulateGeofenceEnter = async (): Promise => { - try { - Geofencing.simulateGeofenceEvent('home', GeofenceTransitionType.ENTER); - Alert.alert('Success', 'Simulated geofence enter event for "home"'); - } catch (error) { - Alert.alert('Error', `Failed to simulate geofence event: ${error}`); - } -}; - -/** - * Simulate geofence exit event for testing - */ -export const simulateGeofenceExit = async (): Promise => { - try { - Geofencing.simulateGeofenceEvent('home', GeofenceTransitionType.EXIT); - Alert.alert('Success', 'Simulated geofence exit event for "home"'); - } catch (error) { - Alert.alert('Error', `Failed to simulate geofence event: ${error}`); - } -}; - -/** - * Setup geofence event listeners - */ -export const setupGeofenceListeners = async (): Promise => { - // Set up enter event listener - Geofencing.onGeofenceEnter((event: GeofenceEvent) => { - console.log('Geofence Enter Event:', event); - Alert.alert( - 'Geofence Entered', - `You entered: ${event.geofenceId}\nLocation: ${event.location.latitude}, ${event.location.longitude}` - ); - }); - - // Set up exit event listener - Geofencing.onGeofenceExit((event: GeofenceEvent) => { - console.log('Geofence Exit Event:', event); - Alert.alert( - 'Geofence Exited', - `You exited: ${event.geofenceId}\nLocation: ${event.location.latitude}, ${event.location.longitude}` - ); - }); - - Alert.alert('Success', 'Geofence event listeners set up!'); -}; - -/** - * Add a custom geofence - */ -export const addCustomGeofence = async (): Promise => { - try { - const customGeofence = { - id: 'custom_location', - latitude: 40.7128, // New York coordinates as placeholder - longitude: -74.006, - radius: 150, - transitionType: GeofenceTransitionType.ENTER_AND_EXIT, - notification: { - title: 'Custom Location', - text: "You've entered/exited the custom area", - }, - }; - - await Geofencing.addGeofence(customGeofence); - Alert.alert('Success', 'Custom geofence added successfully!'); - } catch (error) { - Alert.alert('Error', `Failed to add custom geofence: ${error}`); - } -}; - -/** - * Check location permission status - */ -export const checkLocationPermission = async (): Promise => { - try { - Alert.alert('Location Permission Status'); - } catch (error) { - Alert.alert('Error', `Failed to check permission status: ${error}`); - } -}; diff --git a/example/src/KlaviyoReactWrapper.ts b/example/src/KlaviyoReactWrapper.ts index 23fb5064..e0b328fb 100644 --- a/example/src/KlaviyoReactWrapper.ts +++ b/example/src/KlaviyoReactWrapper.ts @@ -114,6 +114,14 @@ export const unregisterFromInAppForms = async () => { } }; +export const registerForGeofences = async () => { + try { + Klaviyo.registerForGeofences(); + } catch (e: any) { + console.log(e.message, e.code); + } +}; + export const setPushToken = async () => { try { // If handling push tokens from the react native layer diff --git a/ios/KlaviyoBridge.swift b/ios/KlaviyoBridge.swift index 47c3160e..b6c8a3ce 100644 --- a/ios/KlaviyoBridge.swift +++ b/ios/KlaviyoBridge.swift @@ -1,5 +1,6 @@ import KlaviyoSwift import KlaviyoForms +import KlaviyoLocation @_spi(KlaviyoPrivate) import KlaviyoCore @objc @@ -65,6 +66,12 @@ public class KlaviyoBridge: NSObject { KlaviyoSDK().unregisterFromInAppForms() } + @MainActor + @objc + public static func registerForGeofences() { + KlaviyoSDK().registerForGeofences() + } + @objc public static func setProfile( _ profileDict: [String: AnyObject] diff --git a/ios/KlaviyoReactNativeSdk.mm b/ios/KlaviyoReactNativeSdk.mm index 3872fbbc..be57590c 100644 --- a/ios/KlaviyoReactNativeSdk.mm +++ b/ios/KlaviyoReactNativeSdk.mm @@ -100,6 +100,10 @@ - (NSDictionary *)constantsToExport { [KlaviyoBridge unregisterFromInAppForms]; } +RCT_EXPORT_METHOD(registerForGeofences) { + [KlaviyoBridge registerForGeofences]; +} + // Don't compile this code when we build for the old architecture. #ifdef RCT_NEW_ARCH_ENABLED - (std::shared_ptr)getTurboModule: diff --git a/klaviyo-react-native-sdk.podspec b/klaviyo-react-native-sdk.podspec index 54f46e98..d35e073b 100644 --- a/klaviyo-react-native-sdk.podspec +++ b/klaviyo-react-native-sdk.podspec @@ -20,6 +20,7 @@ Pod::Spec.new do |s| s.dependency "React-Core" s.dependency "KlaviyoSwift", "5.0.2" s.dependency "KlaviyoForms", "5.0.2" + s.dependency "KlaviyoLocation", "5.0.2" s.default_subspecs = :none diff --git a/src/Geofencing.ts b/src/Geofencing.ts index 6c03b9d9..5c47719d 100644 --- a/src/Geofencing.ts +++ b/src/Geofencing.ts @@ -1,290 +1,3 @@ -import { NativeModules } from 'react-native'; -import Geolocation from 'react-native-geolocation-service'; - -const { KlaviyoReactNativeSdk } = NativeModules; - -export interface GeofenceConfig { - id: string; - latitude: number; - longitude: number; - radius: number; - transitionType: GeofenceTransitionType; - notification?: { - title: string; - text: string; - }; +export interface KlaviyoGeofencingApi { + registerForGeofences(): void; } - -export enum GeofenceTransitionType { - ENTER = 1, - EXIT = 2, - ENTER_AND_EXIT = 3, -} - -export interface LocationData { - latitude: number; - longitude: number; - accuracy?: number; - timestamp?: number; -} - -export interface GeofenceEvent { - geofenceId: string; - transitionType: GeofenceTransitionType; - location: LocationData; - timestamp: number; -} - -class Geofencing { - private isInitialized: boolean = false; - private geofences: Map = new Map(); - private onGeofenceEnterCallback?: (event: GeofenceEvent) => void; - private onGeofenceExitCallback?: (event: GeofenceEvent) => void; - - /** - * Initialize geofencing with default configuration - */ - async initialize(): Promise { - if (this.isInitialized) { - console.warn('Geofencing already initialized'); - return; - } - - try { - // Request location permissions - await this.requestLocationPermissions(); - - // Configure with placeholder values as per the guide - const config = { - desiredAccuracy: 10, // HIGH_ACCURACY equivalent - stationaryRadius: 50, - distanceFilter: 50, - notificationTitle: 'Klaviyo Geofencing', - notificationText: 'Location tracking active', - debug: false, - startOnBoot: true, - stopOnTerminate: false, - interval: 10000, - fastestInterval: 5000, - activitiesInterval: 10000, - stopOnStillActivity: false, - }; - - // Initialize native module if available - if (KlaviyoReactNativeSdk && KlaviyoReactNativeSdk.configureGeofencing) { - await KlaviyoReactNativeSdk.configureGeofencing(config); - } - - this.isInitialized = true; - console.log('Geofencing initialized successfully'); - } catch (error) { - console.error('Failed to initialize geofencing:', error); - throw error; - } - } - - /** - * Request location permissions for Android and iOS - */ - private async requestLocationPermissions() { - const granted = await Geolocation.requestAuthorization('whenInUse'); - - return granted === 'granted'; - } - - /** - * Add a geofence with placeholder values - */ - async addGeofence(geofence: GeofenceConfig): Promise { - if (!this.isInitialized) { - throw new Error('Geofencing not initialized. Call initialize() first.'); - } - - // Store geofence configuration - this.geofences.set(geofence.id, geofence); - - // Add to native module if available - if (KlaviyoReactNativeSdk && KlaviyoReactNativeSdk.addGeofence) { - await KlaviyoReactNativeSdk.addGeofence(geofence); - } - - console.log(`Geofence added: ${geofence.id}`); - } - - /** - * Add default placeholder geofences for testing - */ - async addDefaultGeofences(): Promise { - const defaultGeofences: GeofenceConfig[] = [ - { - id: 'home', - latitude: 37.4219983, - longitude: -122.084, - radius: 100, - transitionType: GeofenceTransitionType.ENTER_AND_EXIT, - notification: { - title: 'Home Geofence', - text: "You've entered/exited your home area", - }, - }, - { - id: 'office', - latitude: 37.7749, - longitude: -122.4194, - radius: 200, - transitionType: GeofenceTransitionType.ENTER, - notification: { - title: 'Office Geofence', - text: 'Welcome to the office!', - }, - }, - { - id: 'coffee_shop', - latitude: 37.7858, - longitude: -122.4064, - radius: 50, - transitionType: GeofenceTransitionType.EXIT, - notification: { - title: 'Coffee Shop', - text: 'Thanks for visiting!', - }, - }, - ]; - - for (const geofence of defaultGeofences) { - await this.addGeofence(geofence); - } - } - - /** - * Remove a geofence - */ - async removeGeofence(geofenceId: string): Promise { - if (!this.isInitialized) { - throw new Error('Geofencing not initialized. Call initialize() first.'); - } - - this.geofences.delete(geofenceId); - - if (KlaviyoReactNativeSdk && KlaviyoReactNativeSdk.removeGeofence) { - await KlaviyoReactNativeSdk.removeGeofence(geofenceId); - } - - console.log(`Geofence removed: ${geofenceId}`); - } - - /** - * Remove all geofences - */ - async removeAllGeofences(): Promise { - if (!this.isInitialized) { - throw new Error('Geofencing not initialized. Call initialize() first.'); - } - - this.geofences.clear(); - - if (KlaviyoReactNativeSdk && KlaviyoReactNativeSdk.removeAllGeofences) { - await KlaviyoReactNativeSdk.removeAllGeofences(); - } - - console.log('All geofences removed'); - } - - /** - * Start geofencing monitoring - */ - async start(): Promise { - if (!this.isInitialized) { - throw new Error('Geofencing not initialized. Call initialize() first.'); - } - - if (KlaviyoReactNativeSdk && KlaviyoReactNativeSdk.startGeofencing) { - await KlaviyoReactNativeSdk.startGeofencing(); - } - - console.log('Geofencing started'); - } - - /** - * Stop geofencing monitoring - */ - async stop(): Promise { - if (KlaviyoReactNativeSdk && KlaviyoReactNativeSdk.stopGeofencing) { - await KlaviyoReactNativeSdk.stopGeofencing(); - } - - console.log('Geofencing stopped'); - } - - /** - * Set callback for geofence enter events - */ - onGeofenceEnter(callback: (event: GeofenceEvent) => void): void { - this.onGeofenceEnterCallback = callback; - } - - /** - * Set callback for geofence exit events - */ - onGeofenceExit(callback: (event: GeofenceEvent) => void): void { - this.onGeofenceExitCallback = callback; - } - - /** - * Get current geofences - */ - getGeofences(): GeofenceConfig[] { - return Array.from(this.geofences.values()); - } - - /** - * Check if geofencing is initialized - */ - isGeofencingInitialized(): boolean { - return this.isInitialized; - } - - /** - * Simulate geofence event for testing (placeholder implementation) - */ - simulateGeofenceEvent( - geofenceId: string, - transitionType: GeofenceTransitionType - ): void { - const geofence = this.geofences.get(geofenceId); - if (!geofence) { - console.warn(`Geofence ${geofenceId} not found`); - return; - } - - const event: GeofenceEvent = { - geofenceId, - transitionType, - location: { - latitude: geofence.latitude, - longitude: geofence.longitude, - accuracy: 10, - timestamp: Date.now(), - }, - timestamp: Date.now(), - }; - - if ( - transitionType === GeofenceTransitionType.ENTER && - this.onGeofenceEnterCallback - ) { - this.onGeofenceEnterCallback(event); - } else if ( - transitionType === GeofenceTransitionType.EXIT && - this.onGeofenceExitCallback - ) { - this.onGeofenceExitCallback(event); - } - - console.log( - `Simulated geofence event: ${geofenceId} - ${transitionType === GeofenceTransitionType.ENTER ? 'ENTER' : 'EXIT'}` - ); - } -} - -export default new Geofencing(); diff --git a/src/Klaviyo.ts b/src/Klaviyo.ts index 0654320e..a4e32885 100644 --- a/src/Klaviyo.ts +++ b/src/Klaviyo.ts @@ -2,6 +2,7 @@ import type { KlaviyoEventAPI } from './Event'; import type { KlaviyoProfileApi } from './Profile'; import type { KlaviyoPushApi } from './Push'; import type { KlaviyoFormsApi } from './Forms'; +import type { KlaviyoGeofencingApi } from './Geofencing'; /** * The Klaviyo React Native SDK Interface @@ -13,6 +14,7 @@ export interface KlaviyoInterface extends KlaviyoEventAPI, KlaviyoProfileApi, KlaviyoPushApi, + KlaviyoGeofencingApi, KlaviyoFormsApi { /** * Initializes the Klaviyo SDK with the given API key. diff --git a/src/index.tsx b/src/index.tsx index 8c16bd1e..4810658a 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -66,6 +66,9 @@ export const Klaviyo: KlaviyoInterface = { unregisterFromInAppForms: () => { KlaviyoReactNativeSdk.unregisterFromInAppForms(); }, + registerForGeofences(): void { + KlaviyoReactNativeSdk.registerForGeofences(); + }, }; export { type Event, type EventProperties, EventName } from './Event'; From d04d13165efdf69c4805046bedb58991069c2498 Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Tue, 2 Sep 2025 14:08:42 -0400 Subject: [PATCH 03/25] Removed unused react-native-permissions library --- example/ios/Podfile.lock | 25 ------------------------- example/package.json | 3 +-- package.json | 3 +-- yarn.lock | 16 ---------------- 4 files changed, 2 insertions(+), 45 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index b9e5bdc1..11e72315 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1543,27 +1543,6 @@ PODS: - React-logger (= 0.78.0) - React-perflogger (= 0.78.0) - React-utils (= 0.78.0) - - RNPermissions (5.4.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - SocketRocket (0.7.1) - Yoga (0.0.0) @@ -1642,7 +1621,6 @@ DEPENDENCIES: - ReactAppDependencyProvider (from `build/generated/ios`) - ReactCodegen (from `build/generated/ios`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - - RNPermissions (from `../node_modules/react-native-permissions`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: @@ -1795,8 +1773,6 @@ EXTERNAL SOURCES: :path: build/generated/ios ReactCommon: :path: "../node_modules/react-native/ReactCommon" - RNPermissions: - :path: "../node_modules/react-native-permissions" Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" @@ -1874,7 +1850,6 @@ SPEC CHECKSUMS: ReactAppDependencyProvider: a1fb08dfdc7ebc387b2e54cfc9decd283ed821d8 ReactCodegen: 0f8899ac1bad260bf3b362ee848ef67a70b5a306 ReactCommon: a30b578194de911fbe1698efb8247bfe4cb6abff - RNPermissions: 34a056b3e81da28fafb55fb8f895acf4ac9504a1 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: be02ca501b03c79d7027a6bbbd0a8db985034f11 diff --git a/example/package.json b/example/package.json index ddbfe380..14f0266e 100644 --- a/example/package.json +++ b/example/package.json @@ -12,8 +12,7 @@ "dependencies": { "react": "19.0.0", "react-native": "0.78.0", - "react-native-geolocation-service": "^5.3.1", - "react-native-permissions": "^5.4.2" + "react-native-geolocation-service": "^5.3.1" }, "devDependencies": { "@babel/core": "^7.25.2", diff --git a/package.json b/package.json index fcae6d64..e98fc559 100644 --- a/package.json +++ b/package.json @@ -105,8 +105,7 @@ "react-native": "*" }, "dependencies": { - "react-native-geolocation-service": "^5.3.1", - "react-native-permissions": "^5.4.2" + "react-native-geolocation-service": "^5.3.1" }, "workspaces": [ "example" diff --git a/yarn.lock b/yarn.lock index a2063de5..d0f35839 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8042,7 +8042,6 @@ __metadata: react-native: 0.78.0 react-native-builder-bob: ^0.36.0 react-native-geolocation-service: ^5.3.1 - react-native-permissions: ^5.4.2 languageName: unknown linkType: soft @@ -8069,7 +8068,6 @@ __metadata: react-native: 0.78.0 react-native-builder-bob: ^0.36.0 react-native-geolocation-service: ^5.3.1 - react-native-permissions: ^5.4.2 release-it: ^17.10.0 turbo: ^1.10.7 typedoc: ^0.25.7 @@ -10277,20 +10275,6 @@ __metadata: languageName: node linkType: hard -"react-native-permissions@npm:^5.4.2": - version: 5.4.2 - resolution: "react-native-permissions@npm:5.4.2" - peerDependencies: - react: ">=18.1.0" - react-native: ">=0.70.0" - react-native-windows: ">=0.70.0" - peerDependenciesMeta: - react-native-windows: - optional: true - checksum: fac680b7d85fb979806156d6c9f90dee9c8299b83eb9d2d82bee50aec4baa71b0f5d3cf79e8bf02345e67f77d6cb0fbfbe7e54d02b6822de0ae2e0d9323a6614 - languageName: node - linkType: hard - "react-native@npm:0.78.0": version: 0.78.0 resolution: "react-native@npm:0.78.0" From 635a2da19615b4dbb39b94c97b970e877960ce4e Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Tue, 2 Sep 2025 14:17:31 -0400 Subject: [PATCH 04/25] Oh we don't need react-native-geolocation-service either --- example/ios/Podfile.lock | 6 ------ example/package.json | 3 +-- package.json | 3 --- yarn.lock | 9 --------- 4 files changed, 1 insertion(+), 20 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 11e72315..4efa456f 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1254,8 +1254,6 @@ PODS: - React-jsiexecutor - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - - react-native-geolocation-service (5.3.1): - - React - React-NativeModulesApple (0.78.0): - glog - hermes-engine @@ -1592,7 +1590,6 @@ DEPENDENCIES: - 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-geolocation-service (from `../node_modules/react-native-geolocation-service`) - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`) @@ -1715,8 +1712,6 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon" React-microtasksnativemodule: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" - react-native-geolocation-service: - :path: "../node_modules/react-native-geolocation-service" React-NativeModulesApple: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" React-perflogger: @@ -1821,7 +1816,6 @@ SPEC CHECKSUMS: React-logger: 018826bfd51b9f18e87f67db1590bc510ad20664 React-Mapbuffer: 9fbb496e7d6f7c34d5e617365ee778bf96d14eae React-microtasksnativemodule: 36adde22631838680d1be62776e8ccb83186c06a - react-native-geolocation-service: 32b2c2a3b91e70ce2a8d0c684801aaeb0a07e0ec React-NativeModulesApple: ec44c21ae0bbb5f9a2df72db00294e33a00e07f0 React-perflogger: 9e8d3c0dc0194eb932162812a168aa5dc662f418 React-performancetimeline: 350424518f433dd43f063dc5f2cf3195c1a5b60f diff --git a/example/package.json b/example/package.json index 14f0266e..ed54f08b 100644 --- a/example/package.json +++ b/example/package.json @@ -11,8 +11,7 @@ }, "dependencies": { "react": "19.0.0", - "react-native": "0.78.0", - "react-native-geolocation-service": "^5.3.1" + "react-native": "0.78.0" }, "devDependencies": { "@babel/core": "^7.25.2", diff --git a/package.json b/package.json index e98fc559..8ec10b49 100644 --- a/package.json +++ b/package.json @@ -104,9 +104,6 @@ "react": "*", "react-native": "*" }, - "dependencies": { - "react-native-geolocation-service": "^5.3.1" - }, "workspaces": [ "example" ], diff --git a/yarn.lock b/yarn.lock index d0f35839..ffc6d2fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8041,7 +8041,6 @@ __metadata: react: 19.0.0 react-native: 0.78.0 react-native-builder-bob: ^0.36.0 - react-native-geolocation-service: ^5.3.1 languageName: unknown linkType: soft @@ -8067,7 +8066,6 @@ __metadata: react: 19.0.0 react-native: 0.78.0 react-native-builder-bob: ^0.36.0 - react-native-geolocation-service: ^5.3.1 release-it: ^17.10.0 turbo: ^1.10.7 typedoc: ^0.25.7 @@ -10268,13 +10266,6 @@ __metadata: languageName: node linkType: hard -"react-native-geolocation-service@npm:^5.3.1": - version: 5.3.1 - resolution: "react-native-geolocation-service@npm:5.3.1" - checksum: 9a625c9f87811933491055fd8cbd1ef46f97fbbe0262714ad1d9aa969a8900dcb4abc47e58fe162400a81bcdee79324dfcc8e631862df9a22d59ac84af9acfde - languageName: node - linkType: hard - "react-native@npm:0.78.0": version: 0.78.0 resolution: "react-native@npm:0.78.0" From 98624f86c166af4e1518615c4331d3b21d0580e5 Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Mon, 3 Nov 2025 10:24:28 -0500 Subject: [PATCH 05/25] Rename registerForGeofences to registerGeofencing --- example/ios/Podfile.lock | 2 +- example/src/AppViewInterface.ts | 6 +++--- example/src/KlaviyoReactWrapper.ts | 4 ++-- ios/KlaviyoBridge.swift | 4 ++-- ios/KlaviyoReactNativeSdk.mm | 4 ++-- src/Geofencing.ts | 2 +- src/index.tsx | 4 ++-- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 82719a36..ef7e3c86 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -2398,7 +2398,7 @@ SPEC CHECKSUMS: klaviyo-react-native-sdk: 9dba0c8e6ad48f42945c11bf6b251af8022d1b68 KlaviyoCore: a64cb9abf1ad3eadd09656b2ec790a8fd051a80d KlaviyoForms: 1c8e9cc8c4276e421a6778198ecd0dc893aad223 - KlaviyoLocation: 10e2639c20b681a62dd442ea503637552ebb8e57 + KlaviyoLocation: 678c63704bfee189d3e7500e366da44ca1994b29 KlaviyoSwift: 19e312d7f757f3a42783a268e9521e11769717cb KlaviyoSwiftExtension: 0a497aa4c66f05aeff4fd2bb82f8e66080de4bfe RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669 diff --git a/example/src/AppViewInterface.ts b/example/src/AppViewInterface.ts index 68731d44..c7b2af7d 100644 --- a/example/src/AppViewInterface.ts +++ b/example/src/AppViewInterface.ts @@ -15,7 +15,7 @@ import { getPushToken, registerForInAppForms, unregisterFromInAppForms, - registerForGeofences, + registerGeofencing, } from './KlaviyoReactWrapper'; export interface AppViewInterface { @@ -106,8 +106,8 @@ export const appViews: AppViewInterface[] = [ onPress: unregisterFromInAppForms, }, { - title: 'Initialize Geofencing', + title: 'Register Geofencing', color: '#4CAF50', - onPress: registerForGeofences, + onPress: registerGeofencing, }, ]; diff --git a/example/src/KlaviyoReactWrapper.ts b/example/src/KlaviyoReactWrapper.ts index e0b328fb..ccea2844 100644 --- a/example/src/KlaviyoReactWrapper.ts +++ b/example/src/KlaviyoReactWrapper.ts @@ -114,9 +114,9 @@ export const unregisterFromInAppForms = async () => { } }; -export const registerForGeofences = async () => { +export const registerGeofencing = async () => { try { - Klaviyo.registerForGeofences(); + Klaviyo.registerGeofencing(); } catch (e: any) { console.log(e.message, e.code); } diff --git a/ios/KlaviyoBridge.swift b/ios/KlaviyoBridge.swift index 39bbe3ff..73ac6193 100644 --- a/ios/KlaviyoBridge.swift +++ b/ios/KlaviyoBridge.swift @@ -68,8 +68,8 @@ public class KlaviyoBridge: NSObject { @MainActor @objc - public static func registerForGeofences() { - KlaviyoSDK().registerForGeofences() + public static func registerGeofencing() { + KlaviyoSDK().registerGeofencing() } @objc diff --git a/ios/KlaviyoReactNativeSdk.mm b/ios/KlaviyoReactNativeSdk.mm index 98eea127..af0234fc 100644 --- a/ios/KlaviyoReactNativeSdk.mm +++ b/ios/KlaviyoReactNativeSdk.mm @@ -116,8 +116,8 @@ - (NSDictionary *)constantsToExport { [KlaviyoBridge unregisterFromInAppForms]; } -RCT_EXPORT_METHOD(registerForGeofences) { - [KlaviyoBridge registerForGeofences]; +RCT_EXPORT_METHOD(registerGeofencing) { + [KlaviyoBridge registerGeofencing]; } // Don't compile this code when we build for the old architecture. diff --git a/src/Geofencing.ts b/src/Geofencing.ts index 5c47719d..7f57b936 100644 --- a/src/Geofencing.ts +++ b/src/Geofencing.ts @@ -1,3 +1,3 @@ export interface KlaviyoGeofencingApi { - registerForGeofences(): void; + registerGeofencing(): void; } diff --git a/src/index.tsx b/src/index.tsx index 7d2453e5..121fc4f2 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -66,8 +66,8 @@ export const Klaviyo: KlaviyoInterface = { unregisterFromInAppForms: () => { KlaviyoReactNativeSdk.unregisterFromInAppForms(); }, - registerForGeofences(): void { - KlaviyoReactNativeSdk.registerForGeofences(); + registerGeofencing(): void { + KlaviyoReactNativeSdk.registerGeofencing(); }, /** * Resolves a Klaviyo tracking link to a Universal Link URL, From 7c611652db55e3ab6748670313469462416310bb Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Mon, 3 Nov 2025 10:30:26 -0500 Subject: [PATCH 06/25] Bridge unregister method --- example/src/AppViewInterface.ts | 6 ++++++ example/src/KlaviyoReactWrapper.ts | 8 ++++++++ ios/KlaviyoBridge.swift | 6 ++++++ ios/KlaviyoReactNativeSdk.mm | 4 ++++ src/Geofencing.ts | 1 + src/index.tsx | 3 +++ 6 files changed, 28 insertions(+) diff --git a/example/src/AppViewInterface.ts b/example/src/AppViewInterface.ts index c7b2af7d..8ab865ae 100644 --- a/example/src/AppViewInterface.ts +++ b/example/src/AppViewInterface.ts @@ -16,6 +16,7 @@ import { registerForInAppForms, unregisterFromInAppForms, registerGeofencing, + unregisterGeofencing, } from './KlaviyoReactWrapper'; export interface AppViewInterface { @@ -110,4 +111,9 @@ export const appViews: AppViewInterface[] = [ color: '#4CAF50', onPress: registerGeofencing, }, + { + title: 'Unregister Geofencing', + color: '#4CAF50', + onPress: unregisterGeofencing, + }, ]; diff --git a/example/src/KlaviyoReactWrapper.ts b/example/src/KlaviyoReactWrapper.ts index ccea2844..94ba606b 100644 --- a/example/src/KlaviyoReactWrapper.ts +++ b/example/src/KlaviyoReactWrapper.ts @@ -122,6 +122,14 @@ export const registerGeofencing = async () => { } }; +export const unregisterGeofencing = async () => { + try { + Klaviyo.unregisterGeofencing(); + } catch (e: any) { + console.log(e.message, e.code); + } +}; + export const setPushToken = async () => { try { // If handling push tokens from the react native layer diff --git a/ios/KlaviyoBridge.swift b/ios/KlaviyoBridge.swift index 73ac6193..cf74ee34 100644 --- a/ios/KlaviyoBridge.swift +++ b/ios/KlaviyoBridge.swift @@ -72,6 +72,12 @@ public class KlaviyoBridge: NSObject { KlaviyoSDK().registerGeofencing() } + @MainActor + @objc + public static func unregisterGeofencing() { + KlaviyoSDK().unregisterGeofencing() + } + @objc public static func setProfile( _ profileDict: [String: AnyObject] diff --git a/ios/KlaviyoReactNativeSdk.mm b/ios/KlaviyoReactNativeSdk.mm index af0234fc..69980afd 100644 --- a/ios/KlaviyoReactNativeSdk.mm +++ b/ios/KlaviyoReactNativeSdk.mm @@ -120,6 +120,10 @@ - (NSDictionary *)constantsToExport { [KlaviyoBridge registerGeofencing]; } +RCT_EXPORT_METHOD(unregisterGeofencing) { + [KlaviyoBridge unregisterGeofencing]; +} + // Don't compile this code when we build for the old architecture. #ifdef RCT_NEW_ARCH_ENABLED - (std::shared_ptr)getTurboModule: diff --git a/src/Geofencing.ts b/src/Geofencing.ts index 7f57b936..5811b3e1 100644 --- a/src/Geofencing.ts +++ b/src/Geofencing.ts @@ -1,3 +1,4 @@ export interface KlaviyoGeofencingApi { registerGeofencing(): void; + unregisterGeofencing(): void; } diff --git a/src/index.tsx b/src/index.tsx index 121fc4f2..43a8fb91 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -69,6 +69,9 @@ export const Klaviyo: KlaviyoInterface = { registerGeofencing(): void { KlaviyoReactNativeSdk.registerGeofencing(); }, + unregisterGeofencing(): void { + KlaviyoReactNativeSdk.unregisterGeofencing(); + }, /** * Resolves a Klaviyo tracking link to a Universal Link URL, * then handles navigation to the resolved URL. From d7ae33de8124afc1d9a4e9eb7144402ecb369704 Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Tue, 4 Nov 2025 10:09:55 -0500 Subject: [PATCH 07/25] Add permission prompting through react-native-permissions, add to example app --- .../KlaviyoReactNativeSdkExample/Info.plist | 6 + example/ios/Podfile | 21 ++ example/ios/Podfile.lock | 35 +++- example/package.json | 3 +- example/src/AppViewInterface.ts | 12 ++ example/src/KlaviyoReactWrapper.ts | 181 +++++++++++++++++- yarn.lock | 27 ++- 7 files changed, 276 insertions(+), 9 deletions(-) diff --git a/example/ios/KlaviyoReactNativeSdkExample/Info.plist b/example/ios/KlaviyoReactNativeSdkExample/Info.plist index 960f8f9a..30573f15 100644 --- a/example/ios/KlaviyoReactNativeSdkExample/Info.plist +++ b/example/ios/KlaviyoReactNativeSdkExample/Info.plist @@ -70,5 +70,11 @@ klaviyo_app_group org.reactjs.native.example.KlaviyoReactNativeSdkExample.shared + NSLocationWhenInUseUsageDescription + We use your location to provide location-based features and geofencing. + NSLocationAlwaysAndWhenInUseUsageDescription + We need access to your location at all times to provide geofencing features, including when the app is in the background. + NSLocationAlwaysUsageDescription + We need access to your location at all times to provide geofencing features, including when the app is in the background. diff --git a/example/ios/Podfile b/example/ios/Podfile index 5a01ef74..016db202 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -5,9 +5,24 @@ require Pod::Executable.execute_command('node', ['-p', {paths: [process.argv[1]]}, )', __dir__]).strip + def node_require(script) + require Pod::Executable.execute_command('node', ['-p', + "require.resolve( + '#{script}', + {paths: [process.argv[1]]}, + )", __dir__]).strip + end + +node_require('react-native/scripts/react_native_pods.rb') +node_require('react-native-permissions/scripts/setup.rb') + platform :ios, min_ios_version_supported prepare_react_native_project! +setup_permissions([ + 'LocationAlways', + 'LocationWhenInUse', +]) linkage = ENV['USE_FRAMEWORKS'] if linkage != nil @@ -25,6 +40,12 @@ target 'KlaviyoReactNativeSdkExample' do pod 'KlaviyoSwift', :path => '../../../klaviyo-swift-sdk' pod 'KlaviyoForms', :path => '../../../klaviyo-swift-sdk' pod 'KlaviyoLocation', :path => '../../../klaviyo-swift-sdk' + + # Setup permissions for react-native-permissions + setup_permissions([ + 'LocationWhenInUse', + 'LocationAlways', + ]) use_react_native!( :path => config[:reactNativePath], diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index ef7e3c86..e54ae66b 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -2138,6 +2138,35 @@ PODS: - React-perflogger (= 0.80.2) - React-utils (= 0.80.2) - SocketRocket + - RNPermissions (4.1.5): + - 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 - SocketRocket (0.7.1) - Yoga (0.0.0) @@ -2220,6 +2249,7 @@ DEPENDENCIES: - ReactAppDependencyProvider (from `build/generated/ios`) - ReactCodegen (from `build/generated/ios`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - RNPermissions (from `../node_modules/react-native-permissions`) - SocketRocket (~> 0.7.1) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) @@ -2383,6 +2413,8 @@ EXTERNAL SOURCES: :path: build/generated/ios ReactCommon: :path: "../node_modules/react-native/ReactCommon" + RNPermissions: + :path: "../node_modules/react-native-permissions" Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" @@ -2465,9 +2497,10 @@ SPEC CHECKSUMS: ReactAppDependencyProvider: 8df342c127fd0c1e30e8b9f71ff814c22414a7c0 ReactCodegen: 4928682e20747464165effacc170019a18da953c ReactCommon: ec1cdf708729338070f8c4ad746768a782fd9eb1 + RNPermissions: db0611d79f920fc8d834568a933dd5c446399623 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: ce248fb32065c9b00451491b06607f1c25b2f1ed -PODFILE CHECKSUM: 3b283b428640c18a3af8ea2ac09ec7b7ddf1d741 +PODFILE CHECKSUM: bbebe3b73f7476bfcde832c93d7c8649afa1e140 COCOAPODS: 1.16.2 diff --git a/example/package.json b/example/package.json index 586eacb5..2df370af 100644 --- a/example/package.json +++ b/example/package.json @@ -12,7 +12,8 @@ "dependencies": { "@react-native/new-app-screen": "0.80.2", "react": "19.1.0", - "react-native": "0.80.2" + "react-native": "0.80.2", + "react-native-permissions": "^5.0.0" }, "devDependencies": { "@babel/core": "^7.25.2", diff --git a/example/src/AppViewInterface.ts b/example/src/AppViewInterface.ts index 8ab865ae..7c85cd2f 100644 --- a/example/src/AppViewInterface.ts +++ b/example/src/AppViewInterface.ts @@ -17,6 +17,8 @@ import { unregisterFromInAppForms, registerGeofencing, unregisterGeofencing, + requestLocationPermission, + getLocationAuthorizationStatus, } from './KlaviyoReactWrapper'; export interface AppViewInterface { @@ -116,4 +118,14 @@ export const appViews: AppViewInterface[] = [ color: '#4CAF50', onPress: unregisterGeofencing, }, + { + title: 'Request Location Permission (Click Twice)', + color: '#FF9800', + onPress: requestLocationPermission, + }, + { + title: 'Get Location Authorization Status', + color: '#FF9800', + onPress: getLocationAuthorizationStatus, + }, ]; diff --git a/example/src/KlaviyoReactWrapper.ts b/example/src/KlaviyoReactWrapper.ts index 94ba606b..23ccaa7e 100644 --- a/example/src/KlaviyoReactWrapper.ts +++ b/example/src/KlaviyoReactWrapper.ts @@ -15,12 +15,21 @@ import { getRandomMetric, } from './RandomGenerators'; +import { Alert, Platform } from 'react-native'; +import { + PERMISSIONS, + RESULTS, + check, + openSettings, + request, +} from 'react-native-permissions'; + export const initialize = async () => { try { // Alternate Android Installation Step 3 // Alternate iOS Installation Step 3 // Initialize the SDK with public key, if initializing from React Native - Klaviyo.initialize('YOUR_KLAVIYO_PUBLIC_API_KEY'); + Klaviyo.initialize('XNhKEQ'); } catch (e: any) { console.log(e.message, e.code); } @@ -237,3 +246,173 @@ export const sendRandomEvent = async () => { console.log(e.message, e.code); } }; + +const handleDeniedPermissionModal = () => { + Alert.alert( + 'Permission Required', + 'We need access to your location to provide accurate results and personalized services. Please enable location permissions in your device settings.', + [ + { + text: 'Cancel', + style: 'cancel', + }, + { + text: 'Open Settings', + onPress: () => openSettings(), + }, + ] + ); +}; + +export const requestLocationPermission = async () => { + try { + if (Platform.OS === 'ios') { + const whenInUseStatus = await check(PERMISSIONS.IOS.LOCATION_WHEN_IN_USE); + if ( + whenInUseStatus !== RESULTS.GRANTED && + whenInUseStatus !== RESULTS.LIMITED + ) { + const whenInUseResult = await request( + PERMISSIONS.IOS.LOCATION_WHEN_IN_USE + ); + switch (whenInUseResult) { + case RESULTS.UNAVAILABLE: + console.log('Location permission is not available on this device.'); + return; + case RESULTS.BLOCKED: + case RESULTS.DENIED: + console.log('Location permission was blocked or denied.'); + handleDeniedPermissionModal(); + return; + case RESULTS.GRANTED: + case RESULTS.LIMITED: + break; + } + } + + const alwaysResult = await request(PERMISSIONS.IOS.LOCATION_ALWAYS); + switch (alwaysResult) { + case RESULTS.UNAVAILABLE: + console.log( + 'Always location permission is not available on this device.' + ); + break; + case RESULTS.DENIED: + console.log('Always location permission was denied by user.'); + break; + case RESULTS.GRANTED: + console.log('Always location permission granted!'); + break; + case RESULTS.BLOCKED: + console.log('Always location permission is blocked.'); + console.log( + '💡 Tip: Go to Settings > Privacy & Security > Location Services to manually upgrade to "Always"' + ); + handleDeniedPermissionModal(); + break; + case RESULTS.LIMITED: + console.log('Always location permission is limited (iOS 14+).'); + break; + } + } else if (Platform.OS === 'android') { + const fineLocationStatus = await check( + PERMISSIONS.ANDROID.ACCESS_FINE_LOCATION + ); + if (fineLocationStatus !== RESULTS.GRANTED) { + const fineLocationResult = await request( + PERMISSIONS.ANDROID.ACCESS_FINE_LOCATION + ); + + switch (fineLocationResult) { + case RESULTS.UNAVAILABLE: + console.log('Location permission is not available on this device.'); + return; + case RESULTS.BLOCKED: + case RESULTS.DENIED: + console.log('Location permission was blocked or denied.'); + handleDeniedPermissionModal(); + return; + case RESULTS.GRANTED: + console.log( + 'Fine location permission granted! Click again to request background permission.' + ); + return; + } + } + + if (Platform.Version >= 29) { + const backgroundStatus = await check( + PERMISSIONS.ANDROID.ACCESS_BACKGROUND_LOCATION + ); + if (backgroundStatus !== RESULTS.GRANTED) { + const backgroundResult = await request( + PERMISSIONS.ANDROID.ACCESS_BACKGROUND_LOCATION + ); + switch (backgroundResult) { + case RESULTS.UNAVAILABLE: + console.log( + 'Background location permission is not available on this device.' + ); + break; + case RESULTS.DENIED: + console.log('Background location permission was denied by user.'); + break; + case RESULTS.GRANTED: + console.log('Background location permission granted!'); + break; + case RESULTS.BLOCKED: + console.log('Background location permission is blocked.'); + handleDeniedPermissionModal(); + break; + } + } else { + console.log('Background location permission already granted.'); + } + } + } + } catch (e: any) { + console.log( + 'Error requesting location permission:', + e.message, + e.code, + e.stack + ); + } +}; + +export const getLocationAuthorizationStatus = async () => { + try { + const permission = + Platform.OS === 'ios' + ? PERMISSIONS.IOS.LOCATION_WHEN_IN_USE + : PERMISSIONS.ANDROID.ACCESS_FINE_LOCATION; + + const status = await check(permission); + + switch (status) { + case RESULTS.UNAVAILABLE: + console.log('Location permission is unavailable on this device.'); + break; + case RESULTS.DENIED: + console.log('Location permission is denied.'); + break; + case RESULTS.GRANTED: + console.log('Location permission is granted.'); + break; + case RESULTS.BLOCKED: + console.log( + 'Location permission is blocked. User can enable it in settings.' + ); + break; + case RESULTS.LIMITED: + console.log('Location permission is limited (iOS 14+).'); + break; + } + } catch (e: any) { + console.log( + 'Error checking location authorization status:', + e.message, + e.code + ); + } +}; diff --git a/yarn.lock b/yarn.lock index 05cdb5c7..4e18e866 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7991,6 +7991,7 @@ __metadata: react: 19.1.0 react-native: 0.80.2 react-native-builder-bob: ^0.36.0 + react-native-permissions: ^5.0.0 languageName: unknown linkType: soft @@ -10207,6 +10208,20 @@ __metadata: languageName: node linkType: hard +"react-native-permissions@npm:^5.0.0": + version: 5.4.4 + resolution: "react-native-permissions@npm:5.4.4" + peerDependencies: + react: ">=18.1.0" + react-native: ">=0.70.0" + react-native-windows: ">=0.70.0" + peerDependenciesMeta: + react-native-windows: + optional: true + checksum: 43deb38d03321c6b23c7f9f6e1561a629e3aff1e4be20e643ff85010f040b82d707a7db43179108a203663cd138da2f3b6d954f1b278f44ed85797ec49bbacb1 + languageName: node + linkType: hard + "react-native@npm:0.80.2": version: 0.80.2 resolution: "react-native@npm:0.80.2" @@ -11850,22 +11865,22 @@ __metadata: linkType: hard "typescript@npm:^5.0.2": - version: 5.9.3 - resolution: "typescript@npm:5.9.3" + version: 5.4.5 + resolution: "typescript@npm:5.4.5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 0d0ffb84f2cd072c3e164c79a2e5a1a1f4f168e84cb2882ff8967b92afe1def6c2a91f6838fb58b168428f9458c57a2ba06a6737711fdd87a256bbe83e9a217f + checksum: 53c879c6fa1e3bcb194b274d4501ba1985894b2c2692fa079db03c5a5a7140587a1e04e1ba03184605d35f439b40192d9e138eb3279ca8eee313c081c8bcd9b0 languageName: node linkType: hard "typescript@patch:typescript@^5.0.2#~builtin": - version: 5.9.3 - resolution: "typescript@patch:typescript@npm%3A5.9.3#~builtin::version=5.9.3&hash=14eedb" + version: 5.4.5 + resolution: "typescript@patch:typescript@npm%3A5.4.5#~builtin::version=5.4.5&hash=14eedb" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 8bb8d86819ac86a498eada254cad7fb69c5f74778506c700c2a712daeaff21d3a6f51fd0d534fe16903cb010d1b74f89437a3d02d4d0ff5ca2ba9a4660de8497 + checksum: 2373c693f3b328f3b2387c3efafe6d257b057a142f9a79291854b14ff4d5367d3d730810aee981726b677ae0fd8329b23309da3b6aaab8263dbdccf1da07a3ba languageName: node linkType: hard From 96d7dc2437a2e20f408e159a237ae1abfb778f28 Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Tue, 4 Nov 2025 11:25:31 -0500 Subject: [PATCH 08/25] Support location services in terminated state --- .../project.pbxproj | 16 ++++++++++++++++ .../AppDelegate.h | 5 +++++ .../AppDelegate.mm | 5 ++++- .../KlaviyoReactNativeSdkExample/Info.plist | 19 ++++++++++--------- example/src/KlaviyoReactWrapper.ts | 10 +++++++++- ios/KlaviyoBridge.swift | 6 ++++++ ios/KlaviyoReactNativeSdk.mm | 4 ++++ src/Geofencing.ts | 1 + src/index.tsx | 3 +++ 9 files changed, 58 insertions(+), 11 deletions(-) diff --git a/example/ios/KlaviyoReactNativeSdkExample.xcodeproj/project.pbxproj b/example/ios/KlaviyoReactNativeSdkExample.xcodeproj/project.pbxproj index 79564159..889039d1 100644 --- a/example/ios/KlaviyoReactNativeSdkExample.xcodeproj/project.pbxproj +++ b/example/ios/KlaviyoReactNativeSdkExample.xcodeproj/project.pbxproj @@ -370,10 +370,14 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); + inputPaths = ( + ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); + outputPaths = ( + ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests-frameworks.sh\"\n"; @@ -409,10 +413,14 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests-resources-${CONFIGURATION}-input-files.xcfilelist", ); + inputPaths = ( + ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests-resources-${CONFIGURATION}-output-files.xcfilelist", ); + outputPaths = ( + ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests-resources.sh\"\n"; @@ -470,10 +478,14 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample/Pods-KlaviyoReactNativeSdkExample-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); + inputPaths = ( + ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample/Pods-KlaviyoReactNativeSdkExample-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); + outputPaths = ( + ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample/Pods-KlaviyoReactNativeSdkExample-frameworks.sh\"\n"; @@ -487,10 +499,14 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample/Pods-KlaviyoReactNativeSdkExample-resources-${CONFIGURATION}-input-files.xcfilelist", ); + inputPaths = ( + ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample/Pods-KlaviyoReactNativeSdkExample-resources-${CONFIGURATION}-output-files.xcfilelist", ); + outputPaths = ( + ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample/Pods-KlaviyoReactNativeSdkExample-resources.sh\"\n"; diff --git a/example/ios/KlaviyoReactNativeSdkExample/AppDelegate.h b/example/ios/KlaviyoReactNativeSdkExample/AppDelegate.h index 66aec99c..faa4e637 100644 --- a/example/ios/KlaviyoReactNativeSdkExample/AppDelegate.h +++ b/example/ios/KlaviyoReactNativeSdkExample/AppDelegate.h @@ -2,6 +2,11 @@ #import #import #import "KlaviyoReactNativeSdkExample-Swift.h" +#if __has_include() +#import +#else +#import "klaviyo_react_native_sdk-Swift.h" +#endif // iOS Installation Step 1: Conform AppDelegate to UNUserNotificationCenterDelegate @interface AppDelegate: RCTAppDelegate diff --git a/example/ios/KlaviyoReactNativeSdkExample/AppDelegate.mm b/example/ios/KlaviyoReactNativeSdkExample/AppDelegate.mm index 6a510a89..2b0a1a54 100644 --- a/example/ios/KlaviyoReactNativeSdkExample/AppDelegate.mm +++ b/example/ios/KlaviyoReactNativeSdkExample/AppDelegate.mm @@ -24,7 +24,7 @@ - (BOOL)application:(UIApplication *)application // iOS Installation Step 3: Initialize the SDK with public key, if // initializing from native code Exclude if initializing from react native // layer - [PushNotificationsHelper initializeSDK:@"Xr5bFG"]; + [PushNotificationsHelper initializeSDK:@"YOUR_KLAVIYO_PUBLIC_API_KEY"]; // iOS Installation Step 4: Request notification permission from the user // Exclude if handling permissions from react native layer @@ -33,6 +33,9 @@ - (BOOL)application:(UIApplication *)application // Initialize cross-platform push library, e.g. Firebase } + // Start monitoring geofences from background + [KlaviyoBridge monitorGeofencesFromBackground]; + // refer to installation step 16 below NSMutableDictionary *launchOptionsWithURL = [self getLaunchOptionsWithURL:launchOptions]; diff --git a/example/ios/KlaviyoReactNativeSdkExample/Info.plist b/example/ios/KlaviyoReactNativeSdkExample/Info.plist index 30573f15..d828cc19 100644 --- a/example/ios/KlaviyoReactNativeSdkExample/Info.plist +++ b/example/ios/KlaviyoReactNativeSdkExample/Info.plist @@ -48,12 +48,19 @@ NSAllowsLocalNetworking + NSLocationAlwaysAndWhenInUseUsageDescription + We need access to your location at all times to provide geofencing features, including when the app is in the background. + NSLocationAlwaysUsageDescription + We need access to your location at all times to provide geofencing features, including when the app is in the background. + NSLocationWhenInUseUsageDescription + We use your location to provide location-based features and geofencing. + RCTNewArchEnabled + UIBackgroundModes - location + location + fetch - RCTNewArchEnabled - UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities @@ -70,11 +77,5 @@ klaviyo_app_group org.reactjs.native.example.KlaviyoReactNativeSdkExample.shared - NSLocationWhenInUseUsageDescription - We use your location to provide location-based features and geofencing. - NSLocationAlwaysAndWhenInUseUsageDescription - We need access to your location at all times to provide geofencing features, including when the app is in the background. - NSLocationAlwaysUsageDescription - We need access to your location at all times to provide geofencing features, including when the app is in the background. diff --git a/example/src/KlaviyoReactWrapper.ts b/example/src/KlaviyoReactWrapper.ts index 23ccaa7e..513f49a9 100644 --- a/example/src/KlaviyoReactWrapper.ts +++ b/example/src/KlaviyoReactWrapper.ts @@ -29,7 +29,7 @@ export const initialize = async () => { // Alternate Android Installation Step 3 // Alternate iOS Installation Step 3 // Initialize the SDK with public key, if initializing from React Native - Klaviyo.initialize('XNhKEQ'); + Klaviyo.initialize('YOUR_KLAVIYO_PUBLIC_API_KEY'); } catch (e: any) { console.log(e.message, e.code); } @@ -131,6 +131,14 @@ export const registerGeofencing = async () => { } }; +export const monitorGeofencesFromBackground = async () => { + try { + Klaviyo.monitorGeofencesFromBackground(); + } catch (e: any) { + console.log(e.message, e.code); + } +}; + export const unregisterGeofencing = async () => { try { Klaviyo.unregisterGeofencing(); diff --git a/ios/KlaviyoBridge.swift b/ios/KlaviyoBridge.swift index cf74ee34..e7573d49 100644 --- a/ios/KlaviyoBridge.swift +++ b/ios/KlaviyoBridge.swift @@ -72,6 +72,12 @@ public class KlaviyoBridge: NSObject { KlaviyoSDK().registerGeofencing() } + @MainActor + @objc + public static func monitorGeofencesFromBackground() { + KlaviyoSDK().monitorGeofencesFromBackground() + } + @MainActor @objc public static func unregisterGeofencing() { diff --git a/ios/KlaviyoReactNativeSdk.mm b/ios/KlaviyoReactNativeSdk.mm index 69980afd..702a0a96 100644 --- a/ios/KlaviyoReactNativeSdk.mm +++ b/ios/KlaviyoReactNativeSdk.mm @@ -120,6 +120,10 @@ - (NSDictionary *)constantsToExport { [KlaviyoBridge registerGeofencing]; } +RCT_EXPORT_METHOD(monitorGeofencesFromBackground) { + [KlaviyoBridge monitorGeofencesFromBackground]; +} + RCT_EXPORT_METHOD(unregisterGeofencing) { [KlaviyoBridge unregisterGeofencing]; } diff --git a/src/Geofencing.ts b/src/Geofencing.ts index 5811b3e1..ed0b7c19 100644 --- a/src/Geofencing.ts +++ b/src/Geofencing.ts @@ -1,4 +1,5 @@ export interface KlaviyoGeofencingApi { registerGeofencing(): void; + monitorGeofencesFromBackground(): void; unregisterGeofencing(): void; } diff --git a/src/index.tsx b/src/index.tsx index 43a8fb91..3f4c76f1 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -69,6 +69,9 @@ export const Klaviyo: KlaviyoInterface = { registerGeofencing(): void { KlaviyoReactNativeSdk.registerGeofencing(); }, + monitorGeofencesFromBackground(): void { + KlaviyoReactNativeSdk.monitorGeofencesFromBackground(); + }, unregisterGeofencing(): void { KlaviyoReactNativeSdk.unregisterGeofencing(); }, From b96670e33e4e1ac42e110c84e8b1f99963bc82f3 Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Tue, 4 Nov 2025 13:50:44 -0500 Subject: [PATCH 09/25] Only bridge background monitor method to objc, not RN --- example/src/KlaviyoReactWrapper.ts | 8 -------- ios/KlaviyoReactNativeSdk.mm | 4 ---- src/Geofencing.ts | 1 - src/index.tsx | 3 --- 4 files changed, 16 deletions(-) diff --git a/example/src/KlaviyoReactWrapper.ts b/example/src/KlaviyoReactWrapper.ts index 513f49a9..adcb8c71 100644 --- a/example/src/KlaviyoReactWrapper.ts +++ b/example/src/KlaviyoReactWrapper.ts @@ -131,14 +131,6 @@ export const registerGeofencing = async () => { } }; -export const monitorGeofencesFromBackground = async () => { - try { - Klaviyo.monitorGeofencesFromBackground(); - } catch (e: any) { - console.log(e.message, e.code); - } -}; - export const unregisterGeofencing = async () => { try { Klaviyo.unregisterGeofencing(); diff --git a/ios/KlaviyoReactNativeSdk.mm b/ios/KlaviyoReactNativeSdk.mm index 702a0a96..69980afd 100644 --- a/ios/KlaviyoReactNativeSdk.mm +++ b/ios/KlaviyoReactNativeSdk.mm @@ -120,10 +120,6 @@ - (NSDictionary *)constantsToExport { [KlaviyoBridge registerGeofencing]; } -RCT_EXPORT_METHOD(monitorGeofencesFromBackground) { - [KlaviyoBridge monitorGeofencesFromBackground]; -} - RCT_EXPORT_METHOD(unregisterGeofencing) { [KlaviyoBridge unregisterGeofencing]; } diff --git a/src/Geofencing.ts b/src/Geofencing.ts index ed0b7c19..5811b3e1 100644 --- a/src/Geofencing.ts +++ b/src/Geofencing.ts @@ -1,5 +1,4 @@ export interface KlaviyoGeofencingApi { registerGeofencing(): void; - monitorGeofencesFromBackground(): void; unregisterGeofencing(): void; } diff --git a/src/index.tsx b/src/index.tsx index 3f4c76f1..43a8fb91 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -69,9 +69,6 @@ export const Klaviyo: KlaviyoInterface = { registerGeofencing(): void { KlaviyoReactNativeSdk.registerGeofencing(); }, - monitorGeofencesFromBackground(): void { - KlaviyoReactNativeSdk.monitorGeofencesFromBackground(); - }, unregisterGeofencing(): void { KlaviyoReactNativeSdk.unregisterGeofencing(); }, From 2363dcb4b40cb9276feb1c9b4f6c2516659df777 Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Tue, 4 Nov 2025 14:04:18 -0500 Subject: [PATCH 10/25] Point to swift SDK feat/geofencing --- .../project.pbxproj | 16 -------- example/ios/Podfile | 9 +++-- example/ios/Podfile.lock | 40 ++++++++++++++----- 3 files changed, 34 insertions(+), 31 deletions(-) diff --git a/example/ios/KlaviyoReactNativeSdkExample.xcodeproj/project.pbxproj b/example/ios/KlaviyoReactNativeSdkExample.xcodeproj/project.pbxproj index 889039d1..79564159 100644 --- a/example/ios/KlaviyoReactNativeSdkExample.xcodeproj/project.pbxproj +++ b/example/ios/KlaviyoReactNativeSdkExample.xcodeproj/project.pbxproj @@ -370,14 +370,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests-frameworks.sh\"\n"; @@ -413,14 +409,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests-resources-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests/Pods-KlaviyoReactNativeSdkExample-KlaviyoReactNativeSdkExampleTests-resources.sh\"\n"; @@ -478,14 +470,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample/Pods-KlaviyoReactNativeSdkExample-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample/Pods-KlaviyoReactNativeSdkExample-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample/Pods-KlaviyoReactNativeSdkExample-frameworks.sh\"\n"; @@ -499,14 +487,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample/Pods-KlaviyoReactNativeSdkExample-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample/Pods-KlaviyoReactNativeSdkExample-resources-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-KlaviyoReactNativeSdkExample/Pods-KlaviyoReactNativeSdkExample-resources.sh\"\n"; diff --git a/example/ios/Podfile b/example/ios/Podfile index 016db202..cf6f499a 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -36,10 +36,11 @@ target 'KlaviyoReactNativeSdkExample' do use_frameworks! :linkage => :static # Insert override klaviyo-swift-sdk pods below this line when needed - pod 'KlaviyoCore', :path => '../../../klaviyo-swift-sdk' - pod 'KlaviyoSwift', :path => '../../../klaviyo-swift-sdk' - pod 'KlaviyoForms', :path => '../../../klaviyo-swift-sdk' - pod 'KlaviyoLocation', :path => '../../../klaviyo-swift-sdk' + # Using remote branch feat/geofencing from GitHub + pod 'KlaviyoCore', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'feat/geofencing' + pod 'KlaviyoSwift', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'feat/geofencing' + pod 'KlaviyoForms', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'feat/geofencing' + pod 'KlaviyoLocation', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'feat/geofencing' # Setup permissions for react-native-permissions setup_permissions([ diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index e54ae66b..33b51a30 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -2138,7 +2138,7 @@ PODS: - React-perflogger (= 0.80.2) - React-utils (= 0.80.2) - SocketRocket - - RNPermissions (4.1.5): + - RNPermissions (5.4.4): - boost - DoubleConversion - fast_float @@ -2179,10 +2179,10 @@ DEPENDENCIES: - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - klaviyo-react-native-sdk (from `../..`) - - KlaviyoCore (from `../../../klaviyo-swift-sdk`) - - KlaviyoForms (from `../../../klaviyo-swift-sdk`) - - KlaviyoLocation (from `../../../klaviyo-swift-sdk`) - - KlaviyoSwift (from `../../../klaviyo-swift-sdk`) + - KlaviyoCore (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) + - KlaviyoForms (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) + - KlaviyoLocation (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) + - KlaviyoSwift (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) - KlaviyoSwiftExtension - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) @@ -2278,13 +2278,17 @@ EXTERNAL SOURCES: klaviyo-react-native-sdk: :path: "../.." KlaviyoCore: - :path: "../../../klaviyo-swift-sdk" + :branch: feat/geofencing + :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoForms: - :path: "../../../klaviyo-swift-sdk" + :branch: feat/geofencing + :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoLocation: - :path: "../../../klaviyo-swift-sdk" + :branch: feat/geofencing + :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoSwift: - :path: "../../../klaviyo-swift-sdk" + :branch: feat/geofencing + :git: https://github.com/klaviyo/klaviyo-swift-sdk.git RCT-Folly: :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTDeprecation: @@ -2418,6 +2422,20 @@ EXTERNAL SOURCES: Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" +CHECKOUT OPTIONS: + KlaviyoCore: + :commit: bed44a61666fcc378a7bb98afa5c1928bf0190fd + :git: https://github.com/klaviyo/klaviyo-swift-sdk.git + KlaviyoForms: + :commit: bed44a61666fcc378a7bb98afa5c1928bf0190fd + :git: https://github.com/klaviyo/klaviyo-swift-sdk.git + KlaviyoLocation: + :commit: bed44a61666fcc378a7bb98afa5c1928bf0190fd + :git: https://github.com/klaviyo/klaviyo-swift-sdk.git + KlaviyoSwift: + :commit: bed44a61666fcc378a7bb98afa5c1928bf0190fd + :git: https://github.com/klaviyo/klaviyo-swift-sdk.git + SPEC CHECKSUMS: AnyCodable-FlightSchool: 261cbe76757802b17d471b9059b21e6fa5edf57b boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 @@ -2497,10 +2515,10 @@ SPEC CHECKSUMS: ReactAppDependencyProvider: 8df342c127fd0c1e30e8b9f71ff814c22414a7c0 ReactCodegen: 4928682e20747464165effacc170019a18da953c ReactCommon: ec1cdf708729338070f8c4ad746768a782fd9eb1 - RNPermissions: db0611d79f920fc8d834568a933dd5c446399623 + RNPermissions: 9775bc801150b14236c5d308d502a8070e623717 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: ce248fb32065c9b00451491b06607f1c25b2f1ed -PODFILE CHECKSUM: bbebe3b73f7476bfcde832c93d7c8649afa1e140 +PODFILE CHECKSUM: 4ea14015bffc1f74b99ed508875c55d0afb01d1d COCOAPODS: 1.16.2 From 01de64b8c1998de5928fc7c009472f2fb653f343 Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Tue, 4 Nov 2025 14:19:13 -0500 Subject: [PATCH 11/25] Remove duplicate setup_permissions --- example/ios/Podfile | 5 ----- 1 file changed, 5 deletions(-) diff --git a/example/ios/Podfile b/example/ios/Podfile index cf6f499a..b63a5b5c 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -19,11 +19,6 @@ node_require('react-native-permissions/scripts/setup.rb') platform :ios, min_ios_version_supported prepare_react_native_project! -setup_permissions([ - 'LocationAlways', - 'LocationWhenInUse', -]) - linkage = ENV['USE_FRAMEWORKS'] if linkage != nil Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green From 685595d73d30fcc12a6842507f8944286a2d2cd5 Mon Sep 17 00:00:00 2001 From: Evan C Masseau <5167687+evan-masseau@users.noreply.github.com> Date: Wed, 12 Nov 2025 09:50:15 -0500 Subject: [PATCH 12/25] Bridged android methods (#283) Co-authored-by: Evan Masseau <> --- android/build.gradle | 1 + android/gradle.properties | 2 +- .../KlaviyoReactNativeSdkModule.kt | 12 ++++++++++++ configure-sdk.sh | 3 ++- 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 79faca3c..db6ccb3a 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -121,6 +121,7 @@ dependencies { api "com.github.klaviyo.klaviyo-android-sdk:analytics:$klaviyoAndroidSdkVersion" api "com.github.klaviyo.klaviyo-android-sdk:push-fcm:$klaviyoAndroidSdkVersion" api "com.github.klaviyo.klaviyo-android-sdk:forms:$klaviyoAndroidSdkVersion" + api "com.github.klaviyo.klaviyo-android-sdk:location:$klaviyoAndroidSdkVersion" implementation "com.github.klaviyo.klaviyo-android-sdk:core:$klaviyoAndroidSdkVersion" // We used reflection to enumerate keywords in the Klaviyo Android SDK dynamically diff --git a/android/gradle.properties b/android/gradle.properties index 5120afac..3071d5a8 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -11,7 +11,7 @@ org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryErro # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true #Tue Dec 19 15:08:27 EST 2023 -KlaviyoReactNativeSdk_klaviyoAndroidSdkVersion=4.1.0 +KlaviyoReactNativeSdk_klaviyoAndroidSdkVersion=68d7123 KlaviyoReactNativeSdk_kotlinVersion=1.8.0 KlaviyoReactNativeSdk_minSdkVersion=23 KlaviyoReactNativeSdk_targetSdkVersion=36 diff --git a/android/src/main/java/com/klaviyoreactnativesdk/KlaviyoReactNativeSdkModule.kt b/android/src/main/java/com/klaviyoreactnativesdk/KlaviyoReactNativeSdkModule.kt index 8669947e..2be0119c 100644 --- a/android/src/main/java/com/klaviyoreactnativesdk/KlaviyoReactNativeSdkModule.kt +++ b/android/src/main/java/com/klaviyoreactnativesdk/KlaviyoReactNativeSdkModule.kt @@ -20,6 +20,8 @@ import com.klaviyo.core.utils.AdvancedAPI import com.klaviyo.forms.InAppFormsConfig import com.klaviyo.forms.registerForInAppForms import com.klaviyo.forms.unregisterFromInAppForms +import com.klaviyo.location.registerGeofencing +import com.klaviyo.location.unregisterGeofencing import java.io.Serializable import kotlin.reflect.KVisibility import kotlin.time.Duration.Companion.seconds @@ -87,6 +89,16 @@ class KlaviyoReactNativeSdkModule( } } + @ReactMethod + fun registerGeofencing() { + Klaviyo.registerGeofencing() + } + + @ReactMethod + fun unregisterGeofencing() { + Klaviyo.unregisterGeofencing() + } + @ReactMethod fun setProfile(profile: ReadableMap) { val parsedProfile = Profile() diff --git a/configure-sdk.sh b/configure-sdk.sh index 7afd37c5..07afd9b9 100755 --- a/configure-sdk.sh +++ b/configure-sdk.sh @@ -50,6 +50,7 @@ function configure_podfile() { sed -i '' "/pod 'KlaviyoCore'/d" "$podfile" sed -i '' "/pod 'KlaviyoSwift'/d" "$podfile" sed -i '' "/pod 'KlaviyoForms'/d" "$podfile" + sed -i '' "/pod 'KlaviyoLocation'/d" "$podfile" if [[ -z "$swift_sdk_version" || "$swift_sdk_version" == "podspec" ]]; then echo "Skipping Swift SDK version update." @@ -57,7 +58,7 @@ function configure_podfile() { fi # List of dependencies - dependencies=("KlaviyoCore" "KlaviyoSwift" "KlaviyoForms") + dependencies=("KlaviyoCore" "KlaviyoSwift" "KlaviyoForms" "KlaviyoLocation") # Find the line number of the target block target_line=$(grep -n "# Insert override klaviyo-swift-sdk pods below this line when needed" "$podfile" | cut -d: -f1) From 4ace88a7e457070b27028715e6c5a845ed6843b3 Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Wed, 12 Nov 2025 10:45:35 -0500 Subject: [PATCH 13/25] dispatch to main thread, update pods --- example/ios/Podfile.lock | 10 +++++----- ios/KlaviyoReactNativeSdk.mm | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 33b51a30..b14df0c0 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -2424,16 +2424,16 @@ EXTERNAL SOURCES: CHECKOUT OPTIONS: KlaviyoCore: - :commit: bed44a61666fcc378a7bb98afa5c1928bf0190fd + :commit: 014c2864a61b9d97ec470acb29ead01634f19fd6 :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoForms: - :commit: bed44a61666fcc378a7bb98afa5c1928bf0190fd + :commit: 014c2864a61b9d97ec470acb29ead01634f19fd6 :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoLocation: - :commit: bed44a61666fcc378a7bb98afa5c1928bf0190fd + :commit: 014c2864a61b9d97ec470acb29ead01634f19fd6 :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoSwift: - :commit: bed44a61666fcc378a7bb98afa5c1928bf0190fd + :commit: 014c2864a61b9d97ec470acb29ead01634f19fd6 :git: https://github.com/klaviyo/klaviyo-swift-sdk.git SPEC CHECKSUMS: @@ -2519,6 +2519,6 @@ SPEC CHECKSUMS: SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: ce248fb32065c9b00451491b06607f1c25b2f1ed -PODFILE CHECKSUM: 4ea14015bffc1f74b99ed508875c55d0afb01d1d +PODFILE CHECKSUM: 5b166543dbdc92a883a755d81e79c6f49641dba3 COCOAPODS: 1.16.2 diff --git a/ios/KlaviyoReactNativeSdk.mm b/ios/KlaviyoReactNativeSdk.mm index 69980afd..f338933c 100644 --- a/ios/KlaviyoReactNativeSdk.mm +++ b/ios/KlaviyoReactNativeSdk.mm @@ -109,19 +109,27 @@ - (NSDictionary *)constantsToExport { } RCT_EXPORT_METHOD(registerForInAppForms: (NSDictionary *)configuration) { - [KlaviyoBridge registerForInAppFormsWithConfiguration:configuration]; + dispatch_async(dispatch_get_main_queue(), ^{ + [KlaviyoBridge registerForInAppFormsWithConfiguration:configuration]; + }); } RCT_EXPORT_METHOD(unregisterFromInAppForms) { - [KlaviyoBridge unregisterFromInAppForms]; + dispatch_async(dispatch_get_main_queue(), ^{ + [KlaviyoBridge unregisterFromInAppForms]; + }); } RCT_EXPORT_METHOD(registerGeofencing) { - [KlaviyoBridge registerGeofencing]; + dispatch_async(dispatch_get_main_queue(), ^{ + [KlaviyoBridge registerGeofencing]; + }); } RCT_EXPORT_METHOD(unregisterGeofencing) { - [KlaviyoBridge unregisterGeofencing]; + dispatch_async(dispatch_get_main_queue(), ^{ + [KlaviyoBridge unregisterGeofencing]; + }); } // Don't compile this code when we build for the old architecture. From 9168d24e4a68601c6e71a4c27651311f7fef9261 Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Wed, 12 Nov 2025 13:36:52 -0500 Subject: [PATCH 14/25] Remove permissions from Android manifest --- example/android/app/src/main/AndroidManifest.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index 4fc912d9..0ef34a25 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -2,9 +2,6 @@ - - - Date: Wed, 12 Nov 2025 13:51:06 -0500 Subject: [PATCH 15/25] Add dispatch to main --- example/ios/KlaviyoReactNativeSdkExample/AppDelegate.mm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/example/ios/KlaviyoReactNativeSdkExample/AppDelegate.mm b/example/ios/KlaviyoReactNativeSdkExample/AppDelegate.mm index 2b0a1a54..764188c0 100644 --- a/example/ios/KlaviyoReactNativeSdkExample/AppDelegate.mm +++ b/example/ios/KlaviyoReactNativeSdkExample/AppDelegate.mm @@ -34,7 +34,9 @@ - (BOOL)application:(UIApplication *)application } // Start monitoring geofences from background - [KlaviyoBridge monitorGeofencesFromBackground]; + dispatch_async(dispatch_get_main_queue(), ^{ + [KlaviyoBridge monitorGeofencesFromBackground]; + }); // refer to installation step 16 below NSMutableDictionary *launchOptionsWithURL = From 4274a7db87d3d78319266e349145b913372994c4 Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Wed, 12 Nov 2025 15:27:02 -0500 Subject: [PATCH 16/25] Remove redundant script loading --- example/ios/Podfile | 7 ------- 1 file changed, 7 deletions(-) diff --git a/example/ios/Podfile b/example/ios/Podfile index b63a5b5c..4ebaf83c 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -1,10 +1,3 @@ -# 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 - def node_require(script) require Pod::Executable.execute_command('node', ['-p', "require.resolve( From bcf95598fa9cb0817093289dff3cb588fbae9f57 Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Thu, 13 Nov 2025 14:48:54 -0500 Subject: [PATCH 17/25] Unversion dependencies --- klaviyo-react-native-sdk.podspec | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/klaviyo-react-native-sdk.podspec b/klaviyo-react-native-sdk.podspec index a0cfce77..2a171d86 100644 --- a/klaviyo-react-native-sdk.podspec +++ b/klaviyo-react-native-sdk.podspec @@ -18,9 +18,9 @@ Pod::Spec.new do |s| s.pod_target_xcconfig = { "DEFINES_MODULE" => "YES" } s.dependency "React-Core" - s.dependency "KlaviyoSwift", "5.1.0" - s.dependency "KlaviyoForms", "5.1.0" - s.dependency "KlaviyoLocation", "5.1.0" + s.dependency "KlaviyoSwift" + s.dependency "KlaviyoForms" + s.dependency "KlaviyoLocation" s.default_subspecs = :none From cb840f77a937a48148035db153255c2d1a7c79e8 Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Mon, 17 Nov 2025 14:02:53 -0500 Subject: [PATCH 18/25] Point to updated feat/geofencing swift branch --- .../project.pbxproj | 4 +- example/ios/Podfile.lock | 306 ++++++++-------- yarn.lock | 337 ++++++++++-------- 3 files changed, 338 insertions(+), 309 deletions(-) diff --git a/example/ios/KlaviyoReactNativeSdkExample.xcodeproj/project.pbxproj b/example/ios/KlaviyoReactNativeSdkExample.xcodeproj/project.pbxproj index 79564159..84db5fd6 100644 --- a/example/ios/KlaviyoReactNativeSdkExample.xcodeproj/project.pbxproj +++ b/example/ios/KlaviyoReactNativeSdkExample.xcodeproj/project.pbxproj @@ -826,7 +826,7 @@ "-DFOLLY_CFG_NO_COROUTINES=1", ); OTHER_LDFLAGS = "$(inherited)"; - REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + REACT_NATIVE_PATH = "${PODS_ROOT}/../../../node_modules/react-native"; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; USE_HERMES = true; @@ -910,7 +910,7 @@ "-DFOLLY_CFG_NO_COROUTINES=1", ); OTHER_LDFLAGS = "$(inherited)"; - REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + REACT_NATIVE_PATH = "${PODS_ROOT}/../../../node_modules/react-native"; SDKROOT = iphoneos; USE_HERMES = true; VALIDATE_PRODUCT = YES; diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index b14df0c0..0d3f1a8e 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -10,9 +10,9 @@ PODS: - hermes-engine/Pre-built (= 0.80.2) - hermes-engine/Pre-built (0.80.2) - klaviyo-react-native-sdk (2.1.0): - - KlaviyoForms (= 5.1.0) - - KlaviyoLocation (= 5.1.0) - - KlaviyoSwift (= 5.1.0) + - KlaviyoForms + - KlaviyoLocation + - KlaviyoSwift - React-Core - KlaviyoCore (5.1.0): - AnyCodable-FlightSchool @@ -23,7 +23,7 @@ PODS: - KlaviyoSwift (5.1.0): - AnyCodable-FlightSchool - KlaviyoCore (~> 5.1.0) - - KlaviyoSwiftExtension (5.1.0) + - KlaviyoSwiftExtension (5.1.1) - RCT-Folly (2024.11.18.00): - boost - DoubleConversion @@ -2171,87 +2171,87 @@ PODS: - 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`) + - 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`) - klaviyo-react-native-sdk (from `../..`) - KlaviyoCore (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) - KlaviyoForms (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) - KlaviyoLocation (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) - KlaviyoSwift (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) - KlaviyoSwiftExtension - - 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-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`) + - 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-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`) + - ReactCommon/turbomodule/core (from `../../node_modules/react-native/ReactCommon`) - RNPermissions (from `../node_modules/react-native-permissions`) - SocketRocket (~> 0.7.1) - - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) + - Yoga (from `../../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: trunk: @@ -2261,19 +2261,19 @@ SPEC REPOS: EXTERNAL SOURCES: boost: - :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" + :podspec: "../../node_modules/react-native/third-party-podspecs/boost.podspec" DoubleConversion: - :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + :podspec: "../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" fast_float: - :podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec" + :podspec: "../../node_modules/react-native/third-party-podspecs/fast_float.podspec" FBLazyVector: - :path: "../node_modules/react-native/Libraries/FBLazyVector" + :path: "../../node_modules/react-native/Libraries/FBLazyVector" fmt: - :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" + :podspec: "../../node_modules/react-native/third-party-podspecs/fmt.podspec" glog: - :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + :podspec: "../../node_modules/react-native/third-party-podspecs/glog.podspec" hermes-engine: - :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + :podspec: "../../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" :tag: hermes-2025-07-24-RNv0.80.2-5c7dbc0a78cb2d2a8bc81c41c617c3abecf209ff klaviyo-react-native-sdk: :path: "../.." @@ -2290,150 +2290,150 @@ EXTERNAL SOURCES: :branch: feat/geofencing :git: https://github.com/klaviyo/klaviyo-swift-sdk.git RCT-Folly: - :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + :podspec: "../../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTDeprecation: - :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" + :path: "../../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" RCTRequired: - :path: "../node_modules/react-native/Libraries/Required" + :path: "../../node_modules/react-native/Libraries/Required" RCTTypeSafety: - :path: "../node_modules/react-native/Libraries/TypeSafety" + :path: "../../node_modules/react-native/Libraries/TypeSafety" React: - :path: "../node_modules/react-native/" + :path: "../../node_modules/react-native/" React-callinvoker: - :path: "../node_modules/react-native/ReactCommon/callinvoker" + :path: "../../node_modules/react-native/ReactCommon/callinvoker" React-Core: - :path: "../node_modules/react-native/" + :path: "../../node_modules/react-native/" React-CoreModules: - :path: "../node_modules/react-native/React/CoreModules" + :path: "../../node_modules/react-native/React/CoreModules" React-cxxreact: - :path: "../node_modules/react-native/ReactCommon/cxxreact" + :path: "../../node_modules/react-native/ReactCommon/cxxreact" React-debug: - :path: "../node_modules/react-native/ReactCommon/react/debug" + :path: "../../node_modules/react-native/ReactCommon/react/debug" React-defaultsnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/defaults" + :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/defaults" React-domnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/dom" + :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/dom" React-Fabric: - :path: "../node_modules/react-native/ReactCommon" + :path: "../../node_modules/react-native/ReactCommon" React-FabricComponents: - :path: "../node_modules/react-native/ReactCommon" + :path: "../../node_modules/react-native/ReactCommon" React-FabricImage: - :path: "../node_modules/react-native/ReactCommon" + :path: "../../node_modules/react-native/ReactCommon" React-featureflags: - :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" + :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" React-graphics: - :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" + :path: "../../node_modules/react-native/ReactCommon/react/renderer/graphics" React-hermes: - :path: "../node_modules/react-native/ReactCommon/hermes" + :path: "../../node_modules/react-native/ReactCommon/hermes" React-idlecallbacksnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" + :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" React-ImageManager: - :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" + :path: "../../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" React-jserrorhandler: - :path: "../node_modules/react-native/ReactCommon/jserrorhandler" + :path: "../../node_modules/react-native/ReactCommon/jserrorhandler" React-jsi: - :path: "../node_modules/react-native/ReactCommon/jsi" + :path: "../../node_modules/react-native/ReactCommon/jsi" React-jsiexecutor: - :path: "../node_modules/react-native/ReactCommon/jsiexecutor" + :path: "../../node_modules/react-native/ReactCommon/jsiexecutor" React-jsinspector: - :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" + :path: "../../node_modules/react-native/ReactCommon/jsinspector-modern" React-jsinspectorcdp: - :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/cdp" + :path: "../../node_modules/react-native/ReactCommon/jsinspector-modern/cdp" React-jsinspectornetwork: - :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/network" + :path: "../../node_modules/react-native/ReactCommon/jsinspector-modern/network" React-jsinspectortracing: - :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/tracing" + :path: "../../node_modules/react-native/ReactCommon/jsinspector-modern/tracing" React-jsitooling: - :path: "../node_modules/react-native/ReactCommon/jsitooling" + :path: "../../node_modules/react-native/ReactCommon/jsitooling" React-jsitracing: - :path: "../node_modules/react-native/ReactCommon/hermes/executor/" + :path: "../../node_modules/react-native/ReactCommon/hermes/executor/" React-logger: - :path: "../node_modules/react-native/ReactCommon/logger" + :path: "../../node_modules/react-native/ReactCommon/logger" React-Mapbuffer: - :path: "../node_modules/react-native/ReactCommon" + :path: "../../node_modules/react-native/ReactCommon" React-microtasksnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" + :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" React-NativeModulesApple: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" + :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" React-oscompat: - :path: "../node_modules/react-native/ReactCommon/oscompat" + :path: "../../node_modules/react-native/ReactCommon/oscompat" React-perflogger: - :path: "../node_modules/react-native/ReactCommon/reactperflogger" + :path: "../../node_modules/react-native/ReactCommon/reactperflogger" React-performancetimeline: - :path: "../node_modules/react-native/ReactCommon/react/performance/timeline" + :path: "../../node_modules/react-native/ReactCommon/react/performance/timeline" React-RCTActionSheet: - :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + :path: "../../node_modules/react-native/Libraries/ActionSheetIOS" React-RCTAnimation: - :path: "../node_modules/react-native/Libraries/NativeAnimation" + :path: "../../node_modules/react-native/Libraries/NativeAnimation" React-RCTAppDelegate: - :path: "../node_modules/react-native/Libraries/AppDelegate" + :path: "../../node_modules/react-native/Libraries/AppDelegate" React-RCTBlob: - :path: "../node_modules/react-native/Libraries/Blob" + :path: "../../node_modules/react-native/Libraries/Blob" React-RCTFabric: - :path: "../node_modules/react-native/React" + :path: "../../node_modules/react-native/React" React-RCTFBReactNativeSpec: - :path: "../node_modules/react-native/React" + :path: "../../node_modules/react-native/React" React-RCTImage: - :path: "../node_modules/react-native/Libraries/Image" + :path: "../../node_modules/react-native/Libraries/Image" React-RCTLinking: - :path: "../node_modules/react-native/Libraries/LinkingIOS" + :path: "../../node_modules/react-native/Libraries/LinkingIOS" React-RCTNetwork: - :path: "../node_modules/react-native/Libraries/Network" + :path: "../../node_modules/react-native/Libraries/Network" React-RCTRuntime: - :path: "../node_modules/react-native/React/Runtime" + :path: "../../node_modules/react-native/React/Runtime" React-RCTSettings: - :path: "../node_modules/react-native/Libraries/Settings" + :path: "../../node_modules/react-native/Libraries/Settings" React-RCTText: - :path: "../node_modules/react-native/Libraries/Text" + :path: "../../node_modules/react-native/Libraries/Text" React-RCTVibration: - :path: "../node_modules/react-native/Libraries/Vibration" + :path: "../../node_modules/react-native/Libraries/Vibration" React-rendererconsistency: - :path: "../node_modules/react-native/ReactCommon/react/renderer/consistency" + :path: "../../node_modules/react-native/ReactCommon/react/renderer/consistency" React-renderercss: - :path: "../node_modules/react-native/ReactCommon/react/renderer/css" + :path: "../../node_modules/react-native/ReactCommon/react/renderer/css" React-rendererdebug: - :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" + :path: "../../node_modules/react-native/ReactCommon/react/renderer/debug" React-rncore: - :path: "../node_modules/react-native/ReactCommon" + :path: "../../node_modules/react-native/ReactCommon" React-RuntimeApple: - :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" + :path: "../../node_modules/react-native/ReactCommon/react/runtime/platform/ios" React-RuntimeCore: - :path: "../node_modules/react-native/ReactCommon/react/runtime" + :path: "../../node_modules/react-native/ReactCommon/react/runtime" React-runtimeexecutor: - :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + :path: "../../node_modules/react-native/ReactCommon/runtimeexecutor" React-RuntimeHermes: - :path: "../node_modules/react-native/ReactCommon/react/runtime" + :path: "../../node_modules/react-native/ReactCommon/react/runtime" React-runtimescheduler: - :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" + :path: "../../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" React-timing: - :path: "../node_modules/react-native/ReactCommon/react/timing" + :path: "../../node_modules/react-native/ReactCommon/react/timing" React-utils: - :path: "../node_modules/react-native/ReactCommon/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" + :path: "../../node_modules/react-native/ReactCommon" RNPermissions: :path: "../node_modules/react-native-permissions" Yoga: - :path: "../node_modules/react-native/ReactCommon/yoga" + :path: "../../node_modules/react-native/ReactCommon/yoga" CHECKOUT OPTIONS: KlaviyoCore: - :commit: 014c2864a61b9d97ec470acb29ead01634f19fd6 + :commit: 0a8dc556cfad6f7eaf8383bd52773d7bc81292b4 :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoForms: - :commit: 014c2864a61b9d97ec470acb29ead01634f19fd6 + :commit: 0a8dc556cfad6f7eaf8383bd52773d7bc81292b4 :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoLocation: - :commit: 014c2864a61b9d97ec470acb29ead01634f19fd6 + :commit: 0a8dc556cfad6f7eaf8383bd52773d7bc81292b4 :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoSwift: - :commit: 014c2864a61b9d97ec470acb29ead01634f19fd6 + :commit: 0a8dc556cfad6f7eaf8383bd52773d7bc81292b4 :git: https://github.com/klaviyo/klaviyo-swift-sdk.git SPEC CHECKSUMS: @@ -2445,12 +2445,12 @@ SPEC CHECKSUMS: fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 hermes-engine: bbc1152da7d2d40f9e59c28acc6576fcf5d28e2a - klaviyo-react-native-sdk: 9dba0c8e6ad48f42945c11bf6b251af8022d1b68 + klaviyo-react-native-sdk: c83494a454d127e5ce94bffb7a7164e55277172e KlaviyoCore: a64cb9abf1ad3eadd09656b2ec790a8fd051a80d KlaviyoForms: 1c8e9cc8c4276e421a6778198ecd0dc893aad223 KlaviyoLocation: 678c63704bfee189d3e7500e366da44ca1994b29 KlaviyoSwift: 19e312d7f757f3a42783a268e9521e11769717cb - KlaviyoSwiftExtension: 0a497aa4c66f05aeff4fd2bb82f8e66080de4bfe + KlaviyoSwiftExtension: 311e81a7b272010de996676451de5e4b385ddd64 RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669 RCTDeprecation: 300c5eb91114d4339b0bb39505d0f4824d7299b7 RCTRequired: e0446b01093475b7082fbeee5d1ef4ad1fe20ac4 @@ -2513,12 +2513,12 @@ SPEC CHECKSUMS: React-timing: 42e8212c479d1e956d3024be0a07f205a2e34d9d React-utils: a185f723baa0c525c361e6c281a846d919623dbe ReactAppDependencyProvider: 8df342c127fd0c1e30e8b9f71ff814c22414a7c0 - ReactCodegen: 4928682e20747464165effacc170019a18da953c + ReactCodegen: d2afbb49db9fbcb0b8ea4c028bd58af901e0bdaa ReactCommon: ec1cdf708729338070f8c4ad746768a782fd9eb1 RNPermissions: 9775bc801150b14236c5d308d502a8070e623717 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: ce248fb32065c9b00451491b06607f1c25b2f1ed -PODFILE CHECKSUM: 5b166543dbdc92a883a755d81e79c6f49641dba3 +PODFILE CHECKSUM: 7fe48648c68411b0821bcd8f695bdc295553e13c COCOAPODS: 1.16.2 diff --git a/yarn.lock b/yarn.lock index 4e18e866..d286d925 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1646,9 +1646,25 @@ __metadata: linkType: hard "@inquirer/figures@npm:^1.0.3": - version: 1.0.14 - resolution: "@inquirer/figures@npm:1.0.14" - checksum: 37eec986f119eabb6c231c8c1481c6a48ab2347e9f57b2d6442161f7b83936678221fccb7ead60582026c2ae20d457467d0727c485ff53aee2cf965077b0f51b + version: 1.0.15 + resolution: "@inquirer/figures@npm:1.0.15" + checksum: bd87a578ab667236cb72bdbb900cb144017dbc306d60e9dc7e665cd7d6b3097e9464cb4d8fe215315083a7820530caf86d7af59e7c41a35a555fb22a881913ad + languageName: node + linkType: hard + +"@isaacs/balanced-match@npm:^4.0.1": + version: 4.0.1 + resolution: "@isaacs/balanced-match@npm:4.0.1" + checksum: 102fbc6d2c0d5edf8f6dbf2b3feb21695a21bc850f11bc47c4f06aa83bd8884fde3fe9d6d797d619901d96865fdcb4569ac2a54c937992c48885c5e3d9967fe8 + languageName: node + linkType: hard + +"@isaacs/brace-expansion@npm:^5.0.0": + version: 5.0.0 + resolution: "@isaacs/brace-expansion@npm:5.0.0" + dependencies: + "@isaacs/balanced-match": ^4.0.1 + checksum: d7a3b8b0ddbf0ccd8eeb1300e29dd0a0c02147e823d8138f248375a365682360620895c66d113e05ee02389318c654379b0e538b996345b83c914941786705b1 languageName: node linkType: hard @@ -2044,16 +2060,16 @@ __metadata: languageName: node linkType: hard -"@npmcli/agent@npm:^3.0.0": - version: 3.0.0 - resolution: "@npmcli/agent@npm:3.0.0" +"@npmcli/agent@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/agent@npm:4.0.0" dependencies: agent-base: ^7.1.0 http-proxy-agent: ^7.0.0 https-proxy-agent: ^7.0.1 - lru-cache: ^10.0.1 + lru-cache: ^11.2.1 socks-proxy-agent: ^8.0.3 - checksum: e8fc25d536250ed3e669813b36e8c6d805628b472353c57afd8c4fde0fcfcf3dda4ffe22f7af8c9070812ec2e7a03fb41d7151547cef3508efe661a5a3add20f + checksum: 89ae20b44859ff8d4de56ade319d8ceaa267a0742d6f7345fe98aa5cd8614ced7db85ea4dc5bfbd6614dbb200a10b134e087143582534c939e8a02219e8665c8 languageName: node linkType: hard @@ -2191,13 +2207,6 @@ __metadata: languageName: node linkType: hard -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f - languageName: node - linkType: hard - "@pkgr/core@npm:^0.2.9": version: 0.2.9 resolution: "@pkgr/core@npm:0.2.9" @@ -2836,11 +2845,11 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 24.10.0 - resolution: "@types/node@npm:24.10.0" + version: 24.10.1 + resolution: "@types/node@npm:24.10.1" dependencies: undici-types: ~7.16.0 - checksum: 268c843faae02ba88be2441759c26e73038583a7e221fa3000f2c1d7fdc1d06b28cb514fc5367f7cb147c3519cd25ddafdfa1f8566829b91fb096262ebe3f7bb + checksum: c2f370ae7a97c04991e0eee6b57e588a2abef0814a5f6e41fda5a9200cf02ae6654fad51c8372ee203ae4134bab80f5bf441c586f7f50e0fda3ba422f35eb3c0 languageName: node linkType: hard @@ -2852,11 +2861,11 @@ __metadata: linkType: hard "@types/react@npm:^19.1.0": - version: 19.2.2 - resolution: "@types/react@npm:19.2.2" + version: 19.2.5 + resolution: "@types/react@npm:19.2.5" dependencies: csstype: ^3.0.2 - checksum: 7eb2d316dd5a6c02acb416524b50bae932c38d055d26e0f561ca23c009c686d16a2b22fcbb941eecbe2ecb167f119e29b9d0142d9d056dd381352c43413b60da + checksum: 32a48cba7b214d74bd73f79ef9a6ec04a02ba052a7b488f4c925648c7a242765a4571146d2e03bd55435c7dc4d239d593cb180cc15fc2d8d6c87f37be07b8989 languageName: node linkType: hard @@ -2882,20 +2891,20 @@ __metadata: linkType: hard "@types/yargs@npm:^15.0.0": - version: 15.0.19 - resolution: "@types/yargs@npm:15.0.19" + version: 15.0.20 + resolution: "@types/yargs@npm:15.0.20" dependencies: "@types/yargs-parser": "*" - checksum: 6a509db36304825674f4f00300323dce2b4d850e75819c3db87e9e9f213ac2c4c6ed3247a3e4eed6e8e45b3f191b133a356d3391dd694d9ea27a0507d914ef4c + checksum: 7e33bed59f7d44f32f6c0f6da07e8aa79605d725fcdd223febe45ccfa5254da3bc0f70242553021fd9491b637ae99ddee84e5dd05d1771a71986619a73cbf897 languageName: node linkType: hard "@types/yargs@npm:^17.0.8": - version: 17.0.34 - resolution: "@types/yargs@npm:17.0.34" + version: 17.0.35 + resolution: "@types/yargs@npm:17.0.35" dependencies: "@types/yargs-parser": "*" - checksum: 8f39dad7e345236b1c92ddc20dcee74b01d5322639054fe0c494b3d870ce0d784f8fd6ed81f5d010671625ae95b216ac9df13662c079afd112503b0ffd949e5e + checksum: ebf1f5373388cfcbf9cfb5e56ce7a77c0ba2450420f26f3701010ca92df48cce7e14e4245ed1f17178a38ff8702467a6f4047742775b8e2fd06dec8f4f3501ce languageName: node linkType: hard @@ -3094,10 +3103,10 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:^3.0.0": - version: 3.0.1 - resolution: "abbrev@npm:3.0.1" - checksum: e70b209f5f408dd3a3bbd0eec4b10a2ffd64704a4a3821d0969d84928cc490a8eb60f85b78a95622c1841113edac10161c62e52f5e7d0027aa26786a8136e02e +"abbrev@npm:^4.0.0": + version: 4.0.0 + resolution: "abbrev@npm:4.0.0" + checksum: d0344b63d28e763f259b4898c41bdc92c08e9d06d0da5617d0bbe4d78244e46daea88c510a2f9472af59b031d9060ec1a999653144e793fd029a59dae2f56dc8 languageName: node linkType: hard @@ -3210,11 +3219,11 @@ __metadata: linkType: hard "ansi-escapes@npm:^7.0.0": - version: 7.1.1 - resolution: "ansi-escapes@npm:7.1.1" + version: 7.2.0 + resolution: "ansi-escapes@npm:7.2.0" dependencies: environment: ^1.0.0 - checksum: 458361e54f6e7f3a8a3df6d0e39e9e2d0270963753ec50e05b6a4d784d05bcc5e35ee370071725b9e9f5b66b1d11f607196b516216fb4cd22a76bd0ea9fa6d39 + checksum: d490871d4107dc6d4b0f2d0eaddbe3e4681d584c58495f06fe2908f2707bbaaf54825f485c5a6ce14c2d2a731fa382b18d7235a102db69aeff5dd9461397cb44 languageName: node linkType: hard @@ -3465,13 +3474,6 @@ __metadata: languageName: node linkType: hard -"async-generator-function@npm:^1.0.0": - version: 1.0.0 - resolution: "async-generator-function@npm:1.0.0" - checksum: 74a71a4a2dd7afd06ebb612f6d612c7f4766a351bedffde466023bf6dae629e46b0d2cd38786239e0fbf245de0c7df76035465e16d1213774a0efb22fec0d713 - languageName: node - linkType: hard - "async-limiter@npm:~1.0.0": version: 1.0.1 resolution: "async-limiter@npm:1.0.1" @@ -3667,12 +3669,12 @@ __metadata: languageName: node linkType: hard -"baseline-browser-mapping@npm:^2.8.19": - version: 2.8.23 - resolution: "baseline-browser-mapping@npm:2.8.23" +"baseline-browser-mapping@npm:^2.8.25": + version: 2.8.29 + resolution: "baseline-browser-mapping@npm:2.8.29" bin: baseline-browser-mapping: dist/cli.js - checksum: 9417720d14a4ed9f646562b65263356f46ff0b9e024f5c9756da2574e57328cf4bcf649faf951538169a203817496a94b380b1efba134019aa4d2f16bc0fcac5 + checksum: 36aac32abcb13f5ec24cf00b3cde7469bda560fa8bf82d0e4f23b2ddf5a78ba182cf15fa51e4c76e597bfbaf1f71b78330030674f89b4fd20444730faff2c5c2 languageName: node linkType: hard @@ -3766,17 +3768,17 @@ __metadata: linkType: hard "browserslist@npm:^4.20.4, browserslist@npm:^4.24.0, browserslist@npm:^4.26.3": - version: 4.27.0 - resolution: "browserslist@npm:4.27.0" + version: 4.28.0 + resolution: "browserslist@npm:4.28.0" dependencies: - baseline-browser-mapping: ^2.8.19 - caniuse-lite: ^1.0.30001751 - electron-to-chromium: ^1.5.238 - node-releases: ^2.0.26 + baseline-browser-mapping: ^2.8.25 + caniuse-lite: ^1.0.30001754 + electron-to-chromium: ^1.5.249 + node-releases: ^2.0.27 update-browserslist-db: ^1.1.4 bin: browserslist: cli.js - checksum: 01dc8428f5deb018bf99d3d8da1dd41bb0ca8a65af0b371e3b5386f5eef11f0c15ec741fc0686ca0d85aafc8f20036c4330e37bcc6b448a7424012128ded8c96 + checksum: c19fe2c6f123851d899d5b207f76de93064e247931e32ca0adcaceb3b48aec65c7c3310c0dc969de96922d488af7de0a0b77b41505e7dfa0a8d3736500748e11 languageName: node linkType: hard @@ -3822,23 +3824,22 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^19.0.1": - version: 19.0.1 - resolution: "cacache@npm:19.0.1" +"cacache@npm:^20.0.1": + version: 20.0.1 + resolution: "cacache@npm:20.0.1" dependencies: "@npmcli/fs": ^4.0.0 fs-minipass: ^3.0.0 - glob: ^10.2.2 - lru-cache: ^10.0.1 + glob: ^11.0.3 + lru-cache: ^11.1.0 minipass: ^7.0.3 minipass-collect: ^2.0.1 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 p-map: ^7.0.2 ssri: ^12.0.0 - tar: ^7.4.3 unique-filename: ^4.0.0 - checksum: e95684717de6881b4cdaa949fa7574e3171946421cd8291769dd3d2417dbf7abf4aa557d1f968cca83dcbc95bed2a281072b09abfc977c942413146ef7ed4525 + checksum: 33d1514f5c05ba761601fe6e5a49eb396e91bdb439a2ceabdb5a3490552393a5c01d97b14eb2eb12849f7062e5704a3ec3de48f22fa7196e0cbc4b2623406527 languageName: node linkType: hard @@ -3939,10 +3940,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001751": - version: 1.0.30001753 - resolution: "caniuse-lite@npm:1.0.30001753" - checksum: d38b17895a99bf1ba9f1a8076233e3d4a606cd0121ccdb381ea94c651aaea0e1587ba3922b11dde4eb153b6741ac3e129fc670df0a7251987ed8619f09059b8a +"caniuse-lite@npm:^1.0.30001754": + version: 1.0.30001755 + resolution: "caniuse-lite@npm:1.0.30001755" + checksum: ceef13931e01a4db4fb8eb2097aff7f0a295d597455b155a5fbbef9dc584d879b4d17393c7fefb60544264092ed11e332d498dbe3e09d0b732d46ae8caca4128 languageName: node linkType: hard @@ -4571,9 +4572,9 @@ __metadata: linkType: hard "csstype@npm:^3.0.2": - version: 3.1.3 - resolution: "csstype@npm:3.1.3" - checksum: 8db785cc92d259102725b3c694ec0c823f5619a84741b5c7991b8ad135dfaa66093038a1cc63e03361a6cd28d122be48f2106ae72334e067dd619a51f49eddf7 + version: 3.2.3 + resolution: "csstype@npm:3.2.3" + checksum: cb882521b3398958a1ce6ca98c011aec0bde1c77ecaf8a1dd4db3b112a189939beae3b1308243b2fe50fc27eb3edeb0f73a5a4d91d928765dc6d5ecc7bda92ee languageName: node linkType: hard @@ -4710,19 +4711,19 @@ __metadata: linkType: hard "default-browser-id@npm:^5.0.0": - version: 5.0.0 - resolution: "default-browser-id@npm:5.0.0" - checksum: 185bfaecec2c75fa423544af722a3469b20704c8d1942794a86e4364fe7d9e8e9f63241a5b769d61c8151993bc65833a5b959026fa1ccea343b3db0a33aa6deb + version: 5.0.1 + resolution: "default-browser-id@npm:5.0.1" + checksum: 52c637637bcd76bfe974462a2f1dd75cb04784c2852935575760f82e1fd338e5e80d3c45a9b01fdbb1e450553a830bb163b004d2eca223c5573989f82232a072 languageName: node linkType: hard "default-browser@npm:^5.2.1": - version: 5.2.1 - resolution: "default-browser@npm:5.2.1" + version: 5.4.0 + resolution: "default-browser@npm:5.4.0" dependencies: bundle-name: ^4.1.0 default-browser-id: ^5.0.0 - checksum: afab7eff7b7f5f7a94d9114d1ec67273d3fbc539edf8c0f80019879d53aa71e867303c6f6d7cffeb10a6f3cfb59d4f963dba3f9c96830b4540cc7339a1bf9840 + checksum: cac0222ca5c9a3387d25337228689652ab33679a6566995c7194a75af7e554e91ec9ac92a70bfaa8e8089eae9f466ae99267bb38601282aade89b200f50a765c languageName: node linkType: hard @@ -4932,10 +4933,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.238": - version: 1.5.244 - resolution: "electron-to-chromium@npm:1.5.244" - checksum: 0ca55077fa97c6a59e571d066bb1483399522d849758d878dd8e6b5ed0324c973da2448beb6cf630c2d700853824a633742158194d1345e6d2a53fa278dc8937 +"electron-to-chromium@npm:^1.5.249": + version: 1.5.254 + resolution: "electron-to-chromium@npm:1.5.254" + checksum: 0e6bac3a398d729f091cbbb8f96b1ca0c73a7a410938508a683d9e3597a0c811ec22d2f2b83798759a9b99dcabaf7bcfe5aa0b7f9852a30a37e6224613a3e422 languageName: node linkType: hard @@ -5881,7 +5882,7 @@ __metadata: languageName: node linkType: hard -"foreground-child@npm:^3.1.0": +"foreground-child@npm:^3.3.1": version: 3.3.1 resolution: "foreground-child@npm:3.3.1" dependencies: @@ -6012,23 +6013,20 @@ __metadata: linkType: hard "get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": - version: 1.3.1 - resolution: "get-intrinsic@npm:1.3.1" + version: 1.3.0 + resolution: "get-intrinsic@npm:1.3.0" dependencies: - async-function: ^1.0.0 - async-generator-function: ^1.0.0 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 - generator-function: ^2.0.0 get-proto: ^1.0.1 gopd: ^1.2.0 has-symbols: ^1.1.0 hasown: ^2.0.2 math-intrinsics: ^1.1.0 - checksum: c02b3b6a445f9cd53e14896303794ac60f9751f58a69099127248abdb0251957174c6524245fc68579dc8e6a35161d3d94c93e665f808274716f4248b269436a + checksum: 301008e4482bb9a9cb49e132b88fee093bff373b4e6def8ba219b1e96b60158a6084f273ef5cafe832e42cd93462f4accb46a618d35fe59a2b507f2388c5b79d languageName: node linkType: hard @@ -6155,19 +6153,19 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2": - version: 10.4.5 - resolution: "glob@npm:10.4.5" +"glob@npm:^11.0.3": + version: 11.1.0 + resolution: "glob@npm:11.1.0" dependencies: - foreground-child: ^3.1.0 - jackspeak: ^3.1.2 - minimatch: ^9.0.4 + foreground-child: ^3.3.1 + jackspeak: ^4.1.1 + minimatch: ^10.1.1 minipass: ^7.1.2 package-json-from-dist: ^1.0.0 - path-scurry: ^1.11.1 + path-scurry: ^2.0.0 bin: glob: dist/esm/bin.mjs - checksum: 0bc725de5e4862f9f387fd0f2b274baf16850dcd2714502ccf471ee401803997983e2c05590cb65f9675a3c6f2a58e7a53f9e365704108c6ad3cbf1d60934c4a + checksum: 1cfbdc743db77688727411f00233404eb9c67d7c89a4ff1f8b8e60031382d4f695ecf60f279d0d45e5ba2377610572d013a858a433b45a133cf20aba6e3206e0 languageName: node linkType: hard @@ -6714,9 +6712,9 @@ __metadata: linkType: hard "ip-address@npm:^10.0.1": - version: 10.0.1 - resolution: "ip-address@npm:10.0.1" - checksum: 525d5391cfd31a91f80f5857e98487aeaa8474e860a6725a0b6461ac8e436c7f8c869774dece391c8f8e7486306a34a4d1c094778c4c583a3f1f2cd905e5ed50 + version: 10.1.0 + resolution: "ip-address@npm:10.1.0" + checksum: 76b1abcdf52a32e2e05ca1f202f3a8ab8547e5651a9233781b330271bd7f1a741067748d71c4cbb9d9906d9f1fa69e7ddc8b4a11130db4534fdab0e908c84e0d languageName: node linkType: hard @@ -7359,16 +7357,12 @@ __metadata: languageName: node linkType: hard -"jackspeak@npm:^3.1.2": - version: 3.4.3 - resolution: "jackspeak@npm:3.4.3" +"jackspeak@npm:^4.1.1": + version: 4.1.1 + resolution: "jackspeak@npm:4.1.1" dependencies: "@isaacs/cliui": ^8.0.2 - "@pkgjs/parseargs": ^0.11.0 - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: be31027fc72e7cc726206b9f560395604b82e0fddb46c4cbf9f97d049bcef607491a5afc0699612eaa4213ca5be8fd3e1e7cd187b3040988b65c9489838a7c00 + checksum: daca714c5adebfb80932c0b0334025307b68602765098d73d52ec546bc4defdb083292893384261c052742255d0a77d8fcf96f4c669bcb4a99b498b94a74955e languageName: node linkType: hard @@ -7832,25 +7826,25 @@ __metadata: linkType: hard "js-yaml@npm:^3.13.1": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" + version: 3.14.2 + resolution: "js-yaml@npm:3.14.2" dependencies: argparse: ^1.0.7 esprima: ^4.0.0 bin: js-yaml: bin/js-yaml.js - checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c + checksum: 626fc207734a3452d6ba84e1c8c226240e6d431426ed94d0ab043c50926d97c509629c08b1d636f5d27815833b7cfd225865631da9fb33cb957374490bf3e90b languageName: node linkType: hard "js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" + version: 4.1.1 + resolution: "js-yaml@npm:4.1.1" dependencies: argparse: ^2.0.1 bin: js-yaml: bin/js-yaml.js - checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a + checksum: ea2339c6930fe048ec31b007b3c90be2714ab3e7defcc2c27ebf30c74fd940358f29070b4345af0019ef151875bf3bc3f8644bea1bab0372652b5044813ac02d languageName: node linkType: hard @@ -8043,9 +8037,9 @@ __metadata: linkType: hard "ky@npm:^1.2.0": - version: 1.13.0 - resolution: "ky@npm:1.13.0" - checksum: a197f34be52304023020a233cc96927752988ff0b4987081638fad1e8fef19c2756daa4c80afa1560869b8d4a4a6ea8e43622e051ade65f015b5a3dca31d2408 + version: 1.14.0 + resolution: "ky@npm:1.14.0" + checksum: e4a3d7651953d823dc17021277349d0b61deb300d0cd77bbb495491e1d76cb3322a4aa6bc78d08146b696ba797d7367f7dcd4a42505399380f333ff74db38916 languageName: node linkType: hard @@ -8298,6 +8292,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1": + version: 11.2.2 + resolution: "lru-cache@npm:11.2.2" + checksum: 052b3d0b81a02dd017e8b6d82422bed273732c89c9c63762f538e0a75b7018247896b365c19d9392cc7de9c6a304cde3ac11eb7376f96a4885d0ab32b5c46d5b + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -8346,22 +8347,22 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^14.0.3": - version: 14.0.3 - resolution: "make-fetch-happen@npm:14.0.3" +"make-fetch-happen@npm:^15.0.0": + version: 15.0.3 + resolution: "make-fetch-happen@npm:15.0.3" dependencies: - "@npmcli/agent": ^3.0.0 - cacache: ^19.0.1 + "@npmcli/agent": ^4.0.0 + cacache: ^20.0.1 http-cache-semantics: ^4.1.1 minipass: ^7.0.2 - minipass-fetch: ^4.0.0 + minipass-fetch: ^5.0.0 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 negotiator: ^1.0.0 - proc-log: ^5.0.0 + proc-log: ^6.0.0 promise-retry: ^2.0.1 - ssri: ^12.0.0 - checksum: 6fb2fee6da3d98f1953b03d315826b5c5a4ea1f908481afc113782d8027e19f080c85ae998454de4e5f27a681d3ec58d57278f0868d4e0b736f51d396b661691 + ssri: ^13.0.0 + checksum: 4fb9dbb739b33565c85dacdcff7eb9388d8f36f326a59dc13375f01af809c42c48aa5d1f4840ee36623b2461a15476e1e79e4548ca1af30b42e1e324705ac8b3 languageName: node linkType: hard @@ -8995,6 +8996,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^10.1.1": + version: 10.1.1 + resolution: "minimatch@npm:10.1.1" + dependencies: + "@isaacs/brace-expansion": ^5.0.0 + checksum: 8820c0be92994f57281f0a7a2cc4268dcc4b610f9a1ab666685716b4efe4b5898b43c835a8f22298875b31c7a278a5e3b7e253eee7c886546bb0b61fb94bca6b + languageName: node + linkType: hard + "minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -9058,9 +9068,9 @@ __metadata: languageName: node linkType: hard -"minipass-fetch@npm:^4.0.0": - version: 4.0.1 - resolution: "minipass-fetch@npm:4.0.1" +"minipass-fetch@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass-fetch@npm:5.0.0" dependencies: encoding: ^0.1.13 minipass: ^7.0.3 @@ -9069,7 +9079,7 @@ __metadata: dependenciesMeta: encoding: optional: true - checksum: 3dfca705ce887ca9ff14d73e8d8593996dea1a1ecd8101fdbb9c10549d1f9670bc8fb66ad0192769ead4c2dc01b4f9ca1cf567ded365adff17827a303b948140 + checksum: 416645d1e54c09fdfe64ec1676541ac2f6f2af3abc7ad25f2f22c4518535997c1ecd2c0c586ea8a5c6499ad7d8f97671f50ff38488ada54bf61fde309f731379 languageName: node linkType: hard @@ -9228,22 +9238,22 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 11.5.0 - resolution: "node-gyp@npm:11.5.0" + version: 12.1.0 + resolution: "node-gyp@npm:12.1.0" dependencies: env-paths: ^2.2.0 exponential-backoff: ^3.1.1 graceful-fs: ^4.2.6 - make-fetch-happen: ^14.0.3 - nopt: ^8.0.0 - proc-log: ^5.0.0 + make-fetch-happen: ^15.0.0 + nopt: ^9.0.0 + proc-log: ^6.0.0 semver: ^7.3.5 - tar: ^7.4.3 + tar: ^7.5.2 tinyglobby: ^0.2.12 - which: ^5.0.0 + which: ^6.0.0 bin: node-gyp: bin/node-gyp.js - checksum: 6cc29b9d454d9a684c8fe299668db618875bb4282e37717ca5b79689cc5ce99cd553c70944bb367979f2eba40ad6a50afaf7b12a6b214172edc7377384efa051 + checksum: 198d91c535fe9940bcdc0db4e578f94cf9872e0d068e88ef2f4656924248bb67245b270b48eded6634c7513841c0cd42f3da3ac9d77c8e16437fcd90703b9ef3 languageName: node linkType: hard @@ -9254,7 +9264,7 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.26": +"node-releases@npm:^2.0.27": version: 2.0.27 resolution: "node-releases@npm:2.0.27" checksum: a9a54079d894704c2ec728a690b41fbc779a710f5d47b46fa3e460acff08a3e7dfa7108e5599b2db390aa31dac062c47c5118317201f12784188dc5b415f692d @@ -9268,14 +9278,14 @@ __metadata: languageName: node linkType: hard -"nopt@npm:^8.0.0": - version: 8.1.0 - resolution: "nopt@npm:8.1.0" +"nopt@npm:^9.0.0": + version: 9.0.0 + resolution: "nopt@npm:9.0.0" dependencies: - abbrev: ^3.0.0 + abbrev: ^4.0.0 bin: nopt: bin/nopt.js - checksum: 49cfd3eb6f565e292bf61f2ff1373a457238804d5a5a63a8d786c923007498cba89f3648e3b952bc10203e3e7285752abf5b14eaf012edb821e84f24e881a92a + checksum: 7a5d9ab0629eaec1944a95438cc4efa6418ed2834aa8eb21a1bea579a7d8ac3e30120131855376a96ef59ab0e23ad8e0bc94d3349770a95e5cb7119339f7c7fb languageName: node linkType: hard @@ -9655,9 +9665,9 @@ __metadata: linkType: hard "p-map@npm:^7.0.2": - version: 7.0.3 - resolution: "p-map@npm:7.0.3" - checksum: 8c92d533acf82f0d12f7e196edccff773f384098bbb048acdd55a08778ce4fc8889d8f1bde72969487bd96f9c63212698d79744c20bedfce36c5b00b46d369f8 + version: 7.0.4 + resolution: "p-map@npm:7.0.4" + checksum: 4be2097e942f2fd3a4f4b0c6585c721f23851de8ad6484d20c472b3ea4937d5cd9a59914c832b1bceac7bf9d149001938036b82a52de0bc381f61ff2d35d26a5 languageName: node linkType: hard @@ -9822,7 +9832,7 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^1.11.1, path-scurry@npm:^1.6.1": +"path-scurry@npm:^1.6.1": version: 1.11.1 resolution: "path-scurry@npm:1.11.1" dependencies: @@ -9832,6 +9842,16 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^2.0.0": + version: 2.0.1 + resolution: "path-scurry@npm:2.0.1" + dependencies: + lru-cache: ^11.0.0 + minipass: ^7.1.2 + checksum: a022c6c38fed836079d03f96540eafd4cd989acf287b99613c82300107f366e889513ad8b671a2039a9d251122621f9c6fa649f0bd4d50acf95a6943a6692dbf + languageName: node + linkType: hard + "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -9956,10 +9976,10 @@ __metadata: languageName: node linkType: hard -"proc-log@npm:^5.0.0": - version: 5.0.0 - resolution: "proc-log@npm:5.0.0" - checksum: c78b26ecef6d5cce4a7489a1e9923d7b4b1679028c8654aef0463b27f4a90b0946cd598f55799da602895c52feb085ec76381d007ab8dcceebd40b89c2f9dfe0 +"proc-log@npm:^6.0.0": + version: 6.0.0 + resolution: "proc-log@npm:6.0.0" + checksum: 005a2aa24b8cbc98ca24fc49ccbdbbefb1f7932fcc96664e1008c59459ea66e8cc8bd463716d6c67e39327d45e8e080eb73bf32be70461425593b0f0d6acb91f languageName: node linkType: hard @@ -11178,6 +11198,15 @@ __metadata: languageName: node linkType: hard +"ssri@npm:^13.0.0": + version: 13.0.0 + resolution: "ssri@npm:13.0.0" + dependencies: + minipass: ^7.0.3 + checksum: 9705dff9e686b11f3035fb4c3d44ce690359a15a54adcd6a18951f2763f670877321178dc72c37a2b804dba3287ecaa48726dbd0cff79b2715b1cc24521b3af3 + languageName: node + linkType: hard + "stack-utils@npm:^2.0.3": version: 2.0.6 resolution: "stack-utils@npm:2.0.6" @@ -11504,7 +11533,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^7.4.3": +"tar@npm:^7.5.2": version: 7.5.2 resolution: "tar@npm:7.5.2" dependencies: @@ -11518,8 +11547,8 @@ __metadata: linkType: hard "terser@npm:^5.15.0": - version: 5.44.0 - resolution: "terser@npm:5.44.0" + version: 5.44.1 + resolution: "terser@npm:5.44.1" dependencies: "@jridgewell/source-map": ^0.3.3 acorn: ^8.15.0 @@ -11527,7 +11556,7 @@ __metadata: source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: 4e1868d9662ea280dad7b49cfe61b7693187be2b529b31b1f86782db00833c03ba05f2b82fc513d928e937260f2a5fbf42a93724e86eaf55f069288f934ccdb3 + checksum: 1113c5711bb53127f9886e3c906fde8a93a665b532db9c7e36ff7bf287e032ed48ea0e5a3a1a27f6a27c3c0f934e47e7590fcd15c76b7b7bd44ad751b8a9ede4 languageName: node linkType: hard @@ -12225,14 +12254,14 @@ __metadata: languageName: node linkType: hard -"which@npm:^5.0.0": - version: 5.0.0 - resolution: "which@npm:5.0.0" +"which@npm:^6.0.0": + version: 6.0.0 + resolution: "which@npm:6.0.0" dependencies: isexe: ^3.1.1 bin: node-which: bin/which.js - checksum: 6ec99e89ba32c7e748b8a3144e64bfc74aa63e2b2eacbb61a0060ad0b961eb1a632b08fb1de067ed59b002cec3e21de18299216ebf2325ef0f78e0f121e14e90 + checksum: df19b2cd8aac94b333fa29b42e8e371a21e634a742a3b156716f7752a5afe1d73fb5d8bce9b89326f453d96879e8fe626eb421e0117eb1a3ce9fd8c97f6b7db9 languageName: node linkType: hard From 62809aa0bb80b74e5c085041d00923ee978df20c Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Mon, 17 Nov 2025 14:26:39 -0500 Subject: [PATCH 19/25] fix path for CI --- .../project.pbxproj | 4 +- example/ios/Podfile.lock | 394 +++++++++--------- 2 files changed, 199 insertions(+), 199 deletions(-) diff --git a/example/ios/KlaviyoReactNativeSdkExample.xcodeproj/project.pbxproj b/example/ios/KlaviyoReactNativeSdkExample.xcodeproj/project.pbxproj index 84db5fd6..79564159 100644 --- a/example/ios/KlaviyoReactNativeSdkExample.xcodeproj/project.pbxproj +++ b/example/ios/KlaviyoReactNativeSdkExample.xcodeproj/project.pbxproj @@ -826,7 +826,7 @@ "-DFOLLY_CFG_NO_COROUTINES=1", ); OTHER_LDFLAGS = "$(inherited)"; - REACT_NATIVE_PATH = "${PODS_ROOT}/../../../node_modules/react-native"; + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; USE_HERMES = true; @@ -910,7 +910,7 @@ "-DFOLLY_CFG_NO_COROUTINES=1", ); OTHER_LDFLAGS = "$(inherited)"; - REACT_NATIVE_PATH = "${PODS_ROOT}/../../../node_modules/react-native"; + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; USE_HERMES = true; VALIDATE_PRODUCT = YES; diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 0d3f1a8e..d50a4fb9 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -2171,87 +2171,87 @@ PODS: - 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`) + - 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`) - klaviyo-react-native-sdk (from `../..`) - KlaviyoCore (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) - KlaviyoForms (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) - KlaviyoLocation (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) - KlaviyoSwift (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) - KlaviyoSwiftExtension - - 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-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`) + - 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-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`) + - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - RNPermissions (from `../node_modules/react-native-permissions`) - SocketRocket (~> 0.7.1) - - Yoga (from `../../node_modules/react-native/ReactCommon/yoga`) + - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: trunk: @@ -2261,19 +2261,19 @@ SPEC REPOS: EXTERNAL SOURCES: boost: - :podspec: "../../node_modules/react-native/third-party-podspecs/boost.podspec" + :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" DoubleConversion: - :podspec: "../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" fast_float: - :podspec: "../../node_modules/react-native/third-party-podspecs/fast_float.podspec" + :podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec" FBLazyVector: - :path: "../../node_modules/react-native/Libraries/FBLazyVector" + :path: "../node_modules/react-native/Libraries/FBLazyVector" fmt: - :podspec: "../../node_modules/react-native/third-party-podspecs/fmt.podspec" + :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" glog: - :podspec: "../../node_modules/react-native/third-party-podspecs/glog.podspec" + :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" hermes-engine: - :podspec: "../../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" :tag: hermes-2025-07-24-RNv0.80.2-5c7dbc0a78cb2d2a8bc81c41c617c3abecf209ff klaviyo-react-native-sdk: :path: "../.." @@ -2290,137 +2290,137 @@ EXTERNAL SOURCES: :branch: feat/geofencing :git: https://github.com/klaviyo/klaviyo-swift-sdk.git RCT-Folly: - :podspec: "../../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTDeprecation: - :path: "../../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" + :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" RCTRequired: - :path: "../../node_modules/react-native/Libraries/Required" + :path: "../node_modules/react-native/Libraries/Required" RCTTypeSafety: - :path: "../../node_modules/react-native/Libraries/TypeSafety" + :path: "../node_modules/react-native/Libraries/TypeSafety" React: - :path: "../../node_modules/react-native/" + :path: "../node_modules/react-native/" React-callinvoker: - :path: "../../node_modules/react-native/ReactCommon/callinvoker" + :path: "../node_modules/react-native/ReactCommon/callinvoker" React-Core: - :path: "../../node_modules/react-native/" + :path: "../node_modules/react-native/" React-CoreModules: - :path: "../../node_modules/react-native/React/CoreModules" + :path: "../node_modules/react-native/React/CoreModules" React-cxxreact: - :path: "../../node_modules/react-native/ReactCommon/cxxreact" + :path: "../node_modules/react-native/ReactCommon/cxxreact" React-debug: - :path: "../../node_modules/react-native/ReactCommon/react/debug" + :path: "../node_modules/react-native/ReactCommon/react/debug" React-defaultsnativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/defaults" + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/defaults" React-domnativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/dom" + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/dom" React-Fabric: - :path: "../../node_modules/react-native/ReactCommon" + :path: "../node_modules/react-native/ReactCommon" React-FabricComponents: - :path: "../../node_modules/react-native/ReactCommon" + :path: "../node_modules/react-native/ReactCommon" React-FabricImage: - :path: "../../node_modules/react-native/ReactCommon" + :path: "../node_modules/react-native/ReactCommon" React-featureflags: - :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" + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" React-graphics: - :path: "../../node_modules/react-native/ReactCommon/react/renderer/graphics" + :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" React-hermes: - :path: "../../node_modules/react-native/ReactCommon/hermes" + :path: "../node_modules/react-native/ReactCommon/hermes" React-idlecallbacksnativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" React-ImageManager: - :path: "../../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" + :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" React-jserrorhandler: - :path: "../../node_modules/react-native/ReactCommon/jserrorhandler" + :path: "../node_modules/react-native/ReactCommon/jserrorhandler" React-jsi: - :path: "../../node_modules/react-native/ReactCommon/jsi" + :path: "../node_modules/react-native/ReactCommon/jsi" React-jsiexecutor: - :path: "../../node_modules/react-native/ReactCommon/jsiexecutor" + :path: "../node_modules/react-native/ReactCommon/jsiexecutor" React-jsinspector: - :path: "../../node_modules/react-native/ReactCommon/jsinspector-modern" + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" React-jsinspectorcdp: - :path: "../../node_modules/react-native/ReactCommon/jsinspector-modern/cdp" + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/cdp" React-jsinspectornetwork: - :path: "../../node_modules/react-native/ReactCommon/jsinspector-modern/network" + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/network" React-jsinspectortracing: - :path: "../../node_modules/react-native/ReactCommon/jsinspector-modern/tracing" + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/tracing" React-jsitooling: - :path: "../../node_modules/react-native/ReactCommon/jsitooling" + :path: "../node_modules/react-native/ReactCommon/jsitooling" React-jsitracing: - :path: "../../node_modules/react-native/ReactCommon/hermes/executor/" + :path: "../node_modules/react-native/ReactCommon/hermes/executor/" React-logger: - :path: "../../node_modules/react-native/ReactCommon/logger" + :path: "../node_modules/react-native/ReactCommon/logger" React-Mapbuffer: - :path: "../../node_modules/react-native/ReactCommon" + :path: "../node_modules/react-native/ReactCommon" React-microtasksnativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" React-NativeModulesApple: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" React-oscompat: - :path: "../../node_modules/react-native/ReactCommon/oscompat" + :path: "../node_modules/react-native/ReactCommon/oscompat" React-perflogger: - :path: "../../node_modules/react-native/ReactCommon/reactperflogger" + :path: "../node_modules/react-native/ReactCommon/reactperflogger" React-performancetimeline: - :path: "../../node_modules/react-native/ReactCommon/react/performance/timeline" + :path: "../node_modules/react-native/ReactCommon/react/performance/timeline" React-RCTActionSheet: - :path: "../../node_modules/react-native/Libraries/ActionSheetIOS" + :path: "../node_modules/react-native/Libraries/ActionSheetIOS" React-RCTAnimation: - :path: "../../node_modules/react-native/Libraries/NativeAnimation" + :path: "../node_modules/react-native/Libraries/NativeAnimation" React-RCTAppDelegate: - :path: "../../node_modules/react-native/Libraries/AppDelegate" + :path: "../node_modules/react-native/Libraries/AppDelegate" React-RCTBlob: - :path: "../../node_modules/react-native/Libraries/Blob" + :path: "../node_modules/react-native/Libraries/Blob" React-RCTFabric: - :path: "../../node_modules/react-native/React" + :path: "../node_modules/react-native/React" React-RCTFBReactNativeSpec: - :path: "../../node_modules/react-native/React" + :path: "../node_modules/react-native/React" React-RCTImage: - :path: "../../node_modules/react-native/Libraries/Image" + :path: "../node_modules/react-native/Libraries/Image" React-RCTLinking: - :path: "../../node_modules/react-native/Libraries/LinkingIOS" + :path: "../node_modules/react-native/Libraries/LinkingIOS" React-RCTNetwork: - :path: "../../node_modules/react-native/Libraries/Network" + :path: "../node_modules/react-native/Libraries/Network" React-RCTRuntime: - :path: "../../node_modules/react-native/React/Runtime" + :path: "../node_modules/react-native/React/Runtime" React-RCTSettings: - :path: "../../node_modules/react-native/Libraries/Settings" + :path: "../node_modules/react-native/Libraries/Settings" React-RCTText: - :path: "../../node_modules/react-native/Libraries/Text" + :path: "../node_modules/react-native/Libraries/Text" React-RCTVibration: - :path: "../../node_modules/react-native/Libraries/Vibration" + :path: "../node_modules/react-native/Libraries/Vibration" React-rendererconsistency: - :path: "../../node_modules/react-native/ReactCommon/react/renderer/consistency" + :path: "../node_modules/react-native/ReactCommon/react/renderer/consistency" React-renderercss: - :path: "../../node_modules/react-native/ReactCommon/react/renderer/css" + :path: "../node_modules/react-native/ReactCommon/react/renderer/css" React-rendererdebug: - :path: "../../node_modules/react-native/ReactCommon/react/renderer/debug" + :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" React-rncore: - :path: "../../node_modules/react-native/ReactCommon" + :path: "../node_modules/react-native/ReactCommon" React-RuntimeApple: - :path: "../../node_modules/react-native/ReactCommon/react/runtime/platform/ios" + :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" React-RuntimeCore: - :path: "../../node_modules/react-native/ReactCommon/react/runtime" + :path: "../node_modules/react-native/ReactCommon/react/runtime" React-runtimeexecutor: - :path: "../../node_modules/react-native/ReactCommon/runtimeexecutor" + :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" React-RuntimeHermes: - :path: "../../node_modules/react-native/ReactCommon/react/runtime" + :path: "../node_modules/react-native/ReactCommon/react/runtime" React-runtimescheduler: - :path: "../../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" + :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" React-timing: - :path: "../../node_modules/react-native/ReactCommon/react/timing" + :path: "../node_modules/react-native/ReactCommon/react/timing" React-utils: - :path: "../../node_modules/react-native/ReactCommon/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" + :path: "../node_modules/react-native/ReactCommon" RNPermissions: :path: "../node_modules/react-native-permissions" Yoga: - :path: "../../node_modules/react-native/ReactCommon/yoga" + :path: "../node_modules/react-native/ReactCommon/yoga" CHECKOUT OPTIONS: KlaviyoCore: @@ -2445,80 +2445,80 @@ SPEC CHECKSUMS: fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 hermes-engine: bbc1152da7d2d40f9e59c28acc6576fcf5d28e2a - klaviyo-react-native-sdk: c83494a454d127e5ce94bffb7a7164e55277172e + klaviyo-react-native-sdk: fe64bd9f2c4f8be9bb3471ce51268ca62e76013f KlaviyoCore: a64cb9abf1ad3eadd09656b2ec790a8fd051a80d KlaviyoForms: 1c8e9cc8c4276e421a6778198ecd0dc893aad223 KlaviyoLocation: 678c63704bfee189d3e7500e366da44ca1994b29 KlaviyoSwift: 19e312d7f757f3a42783a268e9521e11769717cb KlaviyoSwiftExtension: 311e81a7b272010de996676451de5e4b385ddd64 - RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669 + RCT-Folly: 59ec0ac1f2f39672a0c6e6cecdd39383b764646f RCTDeprecation: 300c5eb91114d4339b0bb39505d0f4824d7299b7 RCTRequired: e0446b01093475b7082fbeee5d1ef4ad1fe20ac4 RCTTypeSafety: cb974efcdc6695deedf7bf1eb942f2a0603a063f React: e7a4655b09d0e17e54be188cc34c2f3e2087318a React-callinvoker: 62192daaa2f30c3321fc531e4f776f7b09cf892b - React-Core: b23cdaaa9d76389d958c06af3c57aa6ad611c542 - React-CoreModules: 8e0f562e5695991e455abbebe1e968af71d52553 - React-cxxreact: 6ccbe0cc2c652b29409b14b23cfb3cd74e084691 + React-Core: c400b068fdb6172177f3b3fae00c10d1077244d7 + React-CoreModules: 8e911a5a504b45824374eec240a78de7a6db8ca2 + React-cxxreact: 06a91f55ac5f842219d6ca47e0f77187a5b5f4ac React-debug: ab52e07f7148480ea61c5e9b68408d749c6e2b8f - React-defaultsnativemodule: 291d2b0a93c399056121f4f0acc7f46d155a38ec - React-domnativemodule: c4968302e857bd422df8eec50a3cd4d078bd4ac0 - React-Fabric: 7e3ba48433b87a416052c4077d5965aff64cb8c9 - React-FabricComponents: 21de255cf52232644d12d3288cced1f0c519b25d - React-FabricImage: 15a0961a0ab34178f1c803aa0a7d28f21322ffc3 - React-featureflags: 4e5dad365d57e3c3656447dfdad790f75878d9f4 - React-featureflagsnativemodule: 5eac59389131c2b87d165dac4094b5e86067fabb - React-graphics: 2f9b3db89f156afd793da99f23782f400f58c1ee - React-hermes: cc8c77acee1406c258622cd8abbee9049f6b5761 - React-idlecallbacksnativemodule: 1d7e1f73b624926d16db956e87c4885ef485664a - React-ImageManager: 8b6066f6638fba7d4a94fbd0b39b477ea8aced58 - React-jserrorhandler: e5a4626d65b0eda9a11c43a9f14d0423d8a7080d - React-jsi: ea5c640ea63c127080f158dac7f4f393d13d415c - React-jsiexecutor: cf7920f82e46fe9a484c15c9f31e67d7179aa826 - React-jsinspector: 094e3cb99952a0024fa977fa04706e68747cba18 - React-jsinspectorcdp: dca545979146e3ecbdc999c0789dab55beecc140 - React-jsinspectornetwork: 0a105fe74b0b1a93f70409d955c8a0556dc17c59 - React-jsinspectortracing: 76088dd78a2de3ea637a860cdf39a6d9c2637d6b - React-jsitooling: a2e1e87382aae2294bc94a6e9682b9bc83da1d36 - React-jsitracing: 45827be59e673f4c54175c150891301138846906 - React-logger: 7cfc7b1ae1f8e5fe5097f9c746137cc3a8fad4ce - React-Mapbuffer: 8f620d1794c6b59a8c3862c3ae820a2e9e6c9bb0 - React-microtasksnativemodule: dcf5321c9a41659a6718df8a5f202af1577c6825 - React-NativeModulesApple: 342e280bb9fc2aa5f61f6c257b309a86b995e12d + React-defaultsnativemodule: fab7bf1b5ce1f3ed252aa4e949ec48a8df67d624 + React-domnativemodule: 735fa5238cceebceeecc18f9f4321016461178cf + React-Fabric: c75719fc8818049c3cf9071f0619af988b020c9f + React-FabricComponents: 74a381cc0dfaf2ec3ee29f39ef8533a7fd864b83 + React-FabricImage: 9a3ff143b1ac42e077c0b33ec790f3674ace5783 + React-featureflags: e1eca0727563a61c919131d57bbd0019c3bdb0f0 + React-featureflagsnativemodule: 692211fd48283b2ddee3817767021010e2f1788e + React-graphics: 759b02bde621f12426c1dc1ae2498aaa6b441cd7 + React-hermes: b6e33fcd21aa7523dc76e62acd7a547e68c28a5b + React-idlecallbacksnativemodule: 731552efc0815fc9d65a6931da55e722b1b3a397 + React-ImageManager: 2c510a480f2c358f56a82df823c66d5700949c96 + React-jserrorhandler: 411e18cbdcbdf546f8f8707091faeb00703527c1 + React-jsi: 3fde19aaf675c0607a0824c4d6002a4943820fd9 + React-jsiexecutor: 4f898228240cf261a02568e985dfa7e1d7ad1dfb + React-jsinspector: 2f0751e6a4fb840f4ed325384d0795a9e9afaf39 + React-jsinspectorcdp: 71c48944d97f5f20e8e144e419ddf04ffa931e93 + React-jsinspectornetwork: 102f347669b278644cc9bb4ebf2f90422bd5ccef + React-jsinspectortracing: 0f6f2ec7f3faa9dc73d591b24b460141612515eb + React-jsitooling: b557f8e12efdaf16997e43b0d07dbd8a3fce3a5b + React-jsitracing: f9a77561d99c0cd053a8230bab4829b100903949 + React-logger: ea80169d826e0cd112fa4d68f58b2b3b968f1ecb + React-Mapbuffer: 230c34b1cabd1c4815726c711b9df221c3d3fbfb + React-microtasksnativemodule: 29d62f132e4aba34ebb7f2b936dde754eb08971b + React-NativeModulesApple: d061f458c3febdf0ac99b1b0faf23b7305974b25 React-oscompat: 56d6de59f9ae95cd006a1c40be2cde83bc06a4e1 - React-perflogger: 4008bd05a8b6c157b06608c0ea0b8bd5d9c5e6c9 - React-performancetimeline: 3ac316a346fe3d48801a746b754dd8f5b5146838 + React-perflogger: 0633844e495d8b34798c9bf0cb32ce315f1d5c9f + React-performancetimeline: 53bdf62ff49a9b0c4bd4d66329fdcf28d77c1c9d React-RCTActionSheet: 49138012280ec3bbb35193d8d09adb8bc61c982e - React-RCTAnimation: ebfe7c62016d4c17b56b2cab3a221908ae46288d - React-RCTAppDelegate: 0108657ba9a19f6a1cd62dcd19c2c0485b3fc251 - React-RCTBlob: 6cc309d1623f3c2679125a04a7425685b7219e6b - React-RCTFabric: 04d1cf11ee3747a699260492e319e92649d7ac88 - React-RCTFBReactNativeSpec: ff3e37e2456afc04211334e86d07bf20488df0ae - React-RCTImage: bb98a59aeed953a48be3f917b9b745b213b340ab - React-RCTLinking: d6e9795d4d75d154c1dd821fd0746cc3e05d6670 - React-RCTNetwork: 5c8a7a2dd26728323189362f149e788548ac72bc - React-RCTRuntime: 52b28e281aba881e1f94ee8b16611823b730d1c5 - React-RCTSettings: b6a02d545ce10dd936b39914b32674db6e865307 - React-RCTText: c7d9232da0e9b5082a99a617483d9164a9cd46e9 - React-RCTVibration: fe636c985c1bf25e4a5b5b4d9315a3b882468a72 + React-RCTAnimation: c7ed4a9d5a4e43c9b10f68bb43cd238c4a2e7e89 + React-RCTAppDelegate: ea2ab6f4aef1489f72025b7128d8ab645b40eafb + React-RCTBlob: c052799460b245e1fffe3d1dddea36fa88e998a0 + React-RCTFabric: fad6230640c42fb8cda29b1d0759f7a1fb8cc677 + React-RCTFBReactNativeSpec: ffb22c3ee3d359ae9245ca94af203845da9371ec + React-RCTImage: 59fc2571f4f109a77139924f5babee8f9cd639c9 + React-RCTLinking: a045cb58c08188dce6c6f4621de105114b1b16ce + React-RCTNetwork: fc7115a2f5e15ae0aa05e9a9be726817feefb482 + React-RCTRuntime: c69b86dc60dcc7297318097fc60bd8e40b050f74 + React-RCTSettings: 30d7dd7eae66290467a1e72bf42d927fa78c3884 + React-RCTText: 755d59284e66c7d33bb4f0ccc428fe69110c3e74 + React-RCTVibration: ffe019e588815df226f6f8ccdc65979f8b2bc440 React-rendererconsistency: aba18fa58a4d037004f6bed6bb201eb368016c56 - React-renderercss: b490bd53486a6bae1e9809619735d1f2b2cabd7f - React-rendererdebug: 8db25b276b64d5a1dbf05677de0c4ff1039d5184 + React-renderercss: c7c140782f5f21103b638abfde7b3f11d6a5fd7e + React-rendererdebug: 111519052db9610f1b93baf7350c800621df3d0c React-rncore: 22f344c7f9109b68c3872194b0b5081ca1aee655 - React-RuntimeApple: 19bdabedda0eeb70acb71e68bfc42d61bbcbacd9 - React-RuntimeCore: 11bf03bdbd6e72857481c46d0f4eb9c19b14c754 + React-RuntimeApple: 30d20d804a216eb297ccc9ce1dc9e931738c03b1 + React-RuntimeCore: 6e1facd50e0b7aed1bc36b090015f33133958bb6 React-runtimeexecutor: b35de9cb7f5d19c66ea9b067235f95b947697ba5 - React-RuntimeHermes: d8f736d0a2d38233c7ec7bd36040eb9b0a3ccd8c - React-runtimescheduler: 0c95966d030c8ebbebddaab49630cda2889ca073 + React-RuntimeHermes: 222268a5931a23f095565c4d60e2673c04e2178a + React-runtimescheduler: aea93219348ba3069fe6c7685a84fe17d3a4b4ee React-timing: 42e8212c479d1e956d3024be0a07f205a2e34d9d - React-utils: a185f723baa0c525c361e6c281a846d919623dbe - ReactAppDependencyProvider: 8df342c127fd0c1e30e8b9f71ff814c22414a7c0 - ReactCodegen: d2afbb49db9fbcb0b8ea4c028bd58af901e0bdaa - ReactCommon: ec1cdf708729338070f8c4ad746768a782fd9eb1 - RNPermissions: 9775bc801150b14236c5d308d502a8070e623717 + React-utils: 0ebf25dd4eb1b5497933f4d8923b862d0fe9566f + ReactAppDependencyProvider: 6c9197c1f6643633012ab646d2bfedd1b0d25989 + ReactCodegen: f8ae44cfcb65af88f409f4b094b879591232f12c + ReactCommon: a237545f08f598b8b37dc3a9163c1c4b85817b0b + RNPermissions: 5153634e1eeaa223a11f537b31f207b3e0b626b9 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - Yoga: ce248fb32065c9b00451491b06607f1c25b2f1ed + Yoga: 1e9b9a43e24807ab708430d5d1bf5e36a55a1c4d PODFILE CHECKSUM: 7fe48648c68411b0821bcd8f695bdc295553e13c -COCOAPODS: 1.16.2 +COCOAPODS: 1.15.2 From 03bbef6d5e965b393f88967f193a1eda783cbe4c Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Mon, 17 Nov 2025 14:48:40 -0500 Subject: [PATCH 20/25] Use Task in KlaviyoBridge async calls --- ios/KlaviyoBridge.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ios/KlaviyoBridge.swift b/ios/KlaviyoBridge.swift index e7573d49..e77c5c0d 100644 --- a/ios/KlaviyoBridge.swift +++ b/ios/KlaviyoBridge.swift @@ -69,7 +69,9 @@ public class KlaviyoBridge: NSObject { @MainActor @objc public static func registerGeofencing() { - KlaviyoSDK().registerGeofencing() + Task { @MainActor in + await KlaviyoSDK().registerGeofencing() + } } @MainActor @@ -81,7 +83,9 @@ public class KlaviyoBridge: NSObject { @MainActor @objc public static func unregisterGeofencing() { - KlaviyoSDK().unregisterGeofencing() + Task { @MainActor in + await KlaviyoSDK().unregisterGeofencing() + } } @objc From f4f722175dcc38fd8c098910bdfe1467f4592b10 Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Tue, 18 Nov 2025 14:08:11 -0500 Subject: [PATCH 21/25] Bridge getCurrentGeofences --- example/ios/Podfile | 8 +- example/ios/Podfile.lock | 136 ++++++++++++++--------------- example/src/AppViewInterface.ts | 6 ++ example/src/KlaviyoReactWrapper.ts | 31 +++++++ ios/KlaviyoBridge.swift | 19 +++- ios/KlaviyoReactNativeSdk.mm | 8 +- src/Geofencing.ts | 10 +++ src/index.tsx | 7 ++ 8 files changed, 149 insertions(+), 76 deletions(-) diff --git a/example/ios/Podfile b/example/ios/Podfile index 4ebaf83c..2d731942 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -25,10 +25,10 @@ target 'KlaviyoReactNativeSdkExample' do # Insert override klaviyo-swift-sdk pods below this line when needed # Using remote branch feat/geofencing from GitHub - pod 'KlaviyoCore', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'feat/geofencing' - pod 'KlaviyoSwift', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'feat/geofencing' - pod 'KlaviyoForms', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'feat/geofencing' - pod 'KlaviyoLocation', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'feat/geofencing' + pod 'KlaviyoCore', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'bl/geofence-getter' + pod 'KlaviyoSwift', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'bl/geofence-getter' + pod 'KlaviyoForms', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'bl/geofence-getter' + pod 'KlaviyoLocation', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'bl/geofence-getter' # Setup permissions for react-native-permissions setup_permissions([ diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index d50a4fb9..f7e6a2d6 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -2179,10 +2179,10 @@ DEPENDENCIES: - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - klaviyo-react-native-sdk (from `../..`) - - KlaviyoCore (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) - - KlaviyoForms (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) - - KlaviyoLocation (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) - - KlaviyoSwift (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) + - KlaviyoCore (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `bl/geofence-getter`) + - KlaviyoForms (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `bl/geofence-getter`) + - KlaviyoLocation (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `bl/geofence-getter`) + - KlaviyoSwift (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `bl/geofence-getter`) - KlaviyoSwiftExtension - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) @@ -2278,16 +2278,16 @@ EXTERNAL SOURCES: klaviyo-react-native-sdk: :path: "../.." KlaviyoCore: - :branch: feat/geofencing + :branch: bl/geofence-getter :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoForms: - :branch: feat/geofencing + :branch: bl/geofence-getter :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoLocation: - :branch: feat/geofencing + :branch: bl/geofence-getter :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoSwift: - :branch: feat/geofencing + :branch: bl/geofence-getter :git: https://github.com/klaviyo/klaviyo-swift-sdk.git RCT-Folly: :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" @@ -2424,16 +2424,16 @@ EXTERNAL SOURCES: CHECKOUT OPTIONS: KlaviyoCore: - :commit: 0a8dc556cfad6f7eaf8383bd52773d7bc81292b4 + :commit: 9479ebc6f9d472fccc4b373f4363f43c1272a607 :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoForms: - :commit: 0a8dc556cfad6f7eaf8383bd52773d7bc81292b4 + :commit: 9479ebc6f9d472fccc4b373f4363f43c1272a607 :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoLocation: - :commit: 0a8dc556cfad6f7eaf8383bd52773d7bc81292b4 + :commit: 9479ebc6f9d472fccc4b373f4363f43c1272a607 :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoSwift: - :commit: 0a8dc556cfad6f7eaf8383bd52773d7bc81292b4 + :commit: 9479ebc6f9d472fccc4b373f4363f43c1272a607 :git: https://github.com/klaviyo/klaviyo-swift-sdk.git SPEC CHECKSUMS: @@ -2445,7 +2445,7 @@ SPEC CHECKSUMS: fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 hermes-engine: bbc1152da7d2d40f9e59c28acc6576fcf5d28e2a - klaviyo-react-native-sdk: fe64bd9f2c4f8be9bb3471ce51268ca62e76013f + klaviyo-react-native-sdk: c83494a454d127e5ce94bffb7a7164e55277172e KlaviyoCore: a64cb9abf1ad3eadd09656b2ec790a8fd051a80d KlaviyoForms: 1c8e9cc8c4276e421a6778198ecd0dc893aad223 KlaviyoLocation: 678c63704bfee189d3e7500e366da44ca1994b29 @@ -2457,68 +2457,68 @@ SPEC CHECKSUMS: RCTTypeSafety: cb974efcdc6695deedf7bf1eb942f2a0603a063f React: e7a4655b09d0e17e54be188cc34c2f3e2087318a React-callinvoker: 62192daaa2f30c3321fc531e4f776f7b09cf892b - React-Core: c400b068fdb6172177f3b3fae00c10d1077244d7 - React-CoreModules: 8e911a5a504b45824374eec240a78de7a6db8ca2 - React-cxxreact: 06a91f55ac5f842219d6ca47e0f77187a5b5f4ac + React-Core: b23cdaaa9d76389d958c06af3c57aa6ad611c542 + React-CoreModules: 8e0f562e5695991e455abbebe1e968af71d52553 + React-cxxreact: 6ccbe0cc2c652b29409b14b23cfb3cd74e084691 React-debug: ab52e07f7148480ea61c5e9b68408d749c6e2b8f - React-defaultsnativemodule: fab7bf1b5ce1f3ed252aa4e949ec48a8df67d624 - React-domnativemodule: 735fa5238cceebceeecc18f9f4321016461178cf - React-Fabric: c75719fc8818049c3cf9071f0619af988b020c9f - React-FabricComponents: 74a381cc0dfaf2ec3ee29f39ef8533a7fd864b83 - React-FabricImage: 9a3ff143b1ac42e077c0b33ec790f3674ace5783 - React-featureflags: e1eca0727563a61c919131d57bbd0019c3bdb0f0 - React-featureflagsnativemodule: 692211fd48283b2ddee3817767021010e2f1788e - React-graphics: 759b02bde621f12426c1dc1ae2498aaa6b441cd7 - React-hermes: b6e33fcd21aa7523dc76e62acd7a547e68c28a5b - React-idlecallbacksnativemodule: 731552efc0815fc9d65a6931da55e722b1b3a397 - React-ImageManager: 2c510a480f2c358f56a82df823c66d5700949c96 - React-jserrorhandler: 411e18cbdcbdf546f8f8707091faeb00703527c1 - React-jsi: 3fde19aaf675c0607a0824c4d6002a4943820fd9 - React-jsiexecutor: 4f898228240cf261a02568e985dfa7e1d7ad1dfb - React-jsinspector: 2f0751e6a4fb840f4ed325384d0795a9e9afaf39 - React-jsinspectorcdp: 71c48944d97f5f20e8e144e419ddf04ffa931e93 - React-jsinspectornetwork: 102f347669b278644cc9bb4ebf2f90422bd5ccef - React-jsinspectortracing: 0f6f2ec7f3faa9dc73d591b24b460141612515eb - React-jsitooling: b557f8e12efdaf16997e43b0d07dbd8a3fce3a5b - React-jsitracing: f9a77561d99c0cd053a8230bab4829b100903949 - React-logger: ea80169d826e0cd112fa4d68f58b2b3b968f1ecb - React-Mapbuffer: 230c34b1cabd1c4815726c711b9df221c3d3fbfb - React-microtasksnativemodule: 29d62f132e4aba34ebb7f2b936dde754eb08971b - React-NativeModulesApple: d061f458c3febdf0ac99b1b0faf23b7305974b25 + React-defaultsnativemodule: 291d2b0a93c399056121f4f0acc7f46d155a38ec + React-domnativemodule: c4968302e857bd422df8eec50a3cd4d078bd4ac0 + React-Fabric: 7e3ba48433b87a416052c4077d5965aff64cb8c9 + React-FabricComponents: 21de255cf52232644d12d3288cced1f0c519b25d + React-FabricImage: 15a0961a0ab34178f1c803aa0a7d28f21322ffc3 + React-featureflags: 4e5dad365d57e3c3656447dfdad790f75878d9f4 + React-featureflagsnativemodule: 5eac59389131c2b87d165dac4094b5e86067fabb + React-graphics: 2f9b3db89f156afd793da99f23782f400f58c1ee + React-hermes: cc8c77acee1406c258622cd8abbee9049f6b5761 + React-idlecallbacksnativemodule: 1d7e1f73b624926d16db956e87c4885ef485664a + React-ImageManager: 8b6066f6638fba7d4a94fbd0b39b477ea8aced58 + React-jserrorhandler: e5a4626d65b0eda9a11c43a9f14d0423d8a7080d + React-jsi: ea5c640ea63c127080f158dac7f4f393d13d415c + React-jsiexecutor: cf7920f82e46fe9a484c15c9f31e67d7179aa826 + React-jsinspector: 094e3cb99952a0024fa977fa04706e68747cba18 + React-jsinspectorcdp: dca545979146e3ecbdc999c0789dab55beecc140 + React-jsinspectornetwork: 0a105fe74b0b1a93f70409d955c8a0556dc17c59 + React-jsinspectortracing: 76088dd78a2de3ea637a860cdf39a6d9c2637d6b + React-jsitooling: a2e1e87382aae2294bc94a6e9682b9bc83da1d36 + React-jsitracing: 45827be59e673f4c54175c150891301138846906 + React-logger: 7cfc7b1ae1f8e5fe5097f9c746137cc3a8fad4ce + React-Mapbuffer: 8f620d1794c6b59a8c3862c3ae820a2e9e6c9bb0 + React-microtasksnativemodule: dcf5321c9a41659a6718df8a5f202af1577c6825 + React-NativeModulesApple: 342e280bb9fc2aa5f61f6c257b309a86b995e12d React-oscompat: 56d6de59f9ae95cd006a1c40be2cde83bc06a4e1 - React-perflogger: 0633844e495d8b34798c9bf0cb32ce315f1d5c9f - React-performancetimeline: 53bdf62ff49a9b0c4bd4d66329fdcf28d77c1c9d + React-perflogger: 4008bd05a8b6c157b06608c0ea0b8bd5d9c5e6c9 + React-performancetimeline: 3ac316a346fe3d48801a746b754dd8f5b5146838 React-RCTActionSheet: 49138012280ec3bbb35193d8d09adb8bc61c982e - React-RCTAnimation: c7ed4a9d5a4e43c9b10f68bb43cd238c4a2e7e89 - React-RCTAppDelegate: ea2ab6f4aef1489f72025b7128d8ab645b40eafb - React-RCTBlob: c052799460b245e1fffe3d1dddea36fa88e998a0 - React-RCTFabric: fad6230640c42fb8cda29b1d0759f7a1fb8cc677 - React-RCTFBReactNativeSpec: ffb22c3ee3d359ae9245ca94af203845da9371ec - React-RCTImage: 59fc2571f4f109a77139924f5babee8f9cd639c9 - React-RCTLinking: a045cb58c08188dce6c6f4621de105114b1b16ce - React-RCTNetwork: fc7115a2f5e15ae0aa05e9a9be726817feefb482 - React-RCTRuntime: c69b86dc60dcc7297318097fc60bd8e40b050f74 - React-RCTSettings: 30d7dd7eae66290467a1e72bf42d927fa78c3884 - React-RCTText: 755d59284e66c7d33bb4f0ccc428fe69110c3e74 - React-RCTVibration: ffe019e588815df226f6f8ccdc65979f8b2bc440 + React-RCTAnimation: ebfe7c62016d4c17b56b2cab3a221908ae46288d + React-RCTAppDelegate: 0108657ba9a19f6a1cd62dcd19c2c0485b3fc251 + React-RCTBlob: 6cc309d1623f3c2679125a04a7425685b7219e6b + React-RCTFabric: 04d1cf11ee3747a699260492e319e92649d7ac88 + React-RCTFBReactNativeSpec: ff3e37e2456afc04211334e86d07bf20488df0ae + React-RCTImage: bb98a59aeed953a48be3f917b9b745b213b340ab + React-RCTLinking: d6e9795d4d75d154c1dd821fd0746cc3e05d6670 + React-RCTNetwork: 5c8a7a2dd26728323189362f149e788548ac72bc + React-RCTRuntime: 52b28e281aba881e1f94ee8b16611823b730d1c5 + React-RCTSettings: b6a02d545ce10dd936b39914b32674db6e865307 + React-RCTText: c7d9232da0e9b5082a99a617483d9164a9cd46e9 + React-RCTVibration: fe636c985c1bf25e4a5b5b4d9315a3b882468a72 React-rendererconsistency: aba18fa58a4d037004f6bed6bb201eb368016c56 - React-renderercss: c7c140782f5f21103b638abfde7b3f11d6a5fd7e - React-rendererdebug: 111519052db9610f1b93baf7350c800621df3d0c + React-renderercss: b490bd53486a6bae1e9809619735d1f2b2cabd7f + React-rendererdebug: 8db25b276b64d5a1dbf05677de0c4ff1039d5184 React-rncore: 22f344c7f9109b68c3872194b0b5081ca1aee655 - React-RuntimeApple: 30d20d804a216eb297ccc9ce1dc9e931738c03b1 - React-RuntimeCore: 6e1facd50e0b7aed1bc36b090015f33133958bb6 + React-RuntimeApple: 19bdabedda0eeb70acb71e68bfc42d61bbcbacd9 + React-RuntimeCore: 11bf03bdbd6e72857481c46d0f4eb9c19b14c754 React-runtimeexecutor: b35de9cb7f5d19c66ea9b067235f95b947697ba5 - React-RuntimeHermes: 222268a5931a23f095565c4d60e2673c04e2178a - React-runtimescheduler: aea93219348ba3069fe6c7685a84fe17d3a4b4ee + React-RuntimeHermes: d8f736d0a2d38233c7ec7bd36040eb9b0a3ccd8c + React-runtimescheduler: 0c95966d030c8ebbebddaab49630cda2889ca073 React-timing: 42e8212c479d1e956d3024be0a07f205a2e34d9d - React-utils: 0ebf25dd4eb1b5497933f4d8923b862d0fe9566f - ReactAppDependencyProvider: 6c9197c1f6643633012ab646d2bfedd1b0d25989 - ReactCodegen: f8ae44cfcb65af88f409f4b094b879591232f12c - ReactCommon: a237545f08f598b8b37dc3a9163c1c4b85817b0b - RNPermissions: 5153634e1eeaa223a11f537b31f207b3e0b626b9 + React-utils: a185f723baa0c525c361e6c281a846d919623dbe + ReactAppDependencyProvider: 8df342c127fd0c1e30e8b9f71ff814c22414a7c0 + ReactCodegen: 4928682e20747464165effacc170019a18da953c + ReactCommon: ec1cdf708729338070f8c4ad746768a782fd9eb1 + RNPermissions: 9775bc801150b14236c5d308d502a8070e623717 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - Yoga: 1e9b9a43e24807ab708430d5d1bf5e36a55a1c4d + Yoga: ce248fb32065c9b00451491b06607f1c25b2f1ed -PODFILE CHECKSUM: 7fe48648c68411b0821bcd8f695bdc295553e13c +PODFILE CHECKSUM: ab2d14ff8e5158b559fe6d3401f5feb8c418ff9c -COCOAPODS: 1.15.2 +COCOAPODS: 1.16.2 diff --git a/example/src/AppViewInterface.ts b/example/src/AppViewInterface.ts index 7c85cd2f..b92b7cb6 100644 --- a/example/src/AppViewInterface.ts +++ b/example/src/AppViewInterface.ts @@ -17,6 +17,7 @@ import { unregisterFromInAppForms, registerGeofencing, unregisterGeofencing, + getCurrentGeofences, requestLocationPermission, getLocationAuthorizationStatus, } from './KlaviyoReactWrapper'; @@ -118,6 +119,11 @@ export const appViews: AppViewInterface[] = [ color: '#4CAF50', onPress: unregisterGeofencing, }, + { + title: 'Get Current Geofences', + color: '#4CAF50', + onPress: getCurrentGeofences, + }, { title: 'Request Location Permission (Click Twice)', color: '#FF9800', diff --git a/example/src/KlaviyoReactWrapper.ts b/example/src/KlaviyoReactWrapper.ts index adcb8c71..53f43ace 100644 --- a/example/src/KlaviyoReactWrapper.ts +++ b/example/src/KlaviyoReactWrapper.ts @@ -139,6 +139,37 @@ export const unregisterGeofencing = async () => { } }; +export const getCurrentGeofences = async () => { + try { + Klaviyo.getCurrentGeofences((result) => { + const { geofences } = result; + console.log('Current geofences:', JSON.stringify(geofences, null, 2)); + + if (geofences.length === 0) { + Alert.alert( + 'Current Geofences', + 'No geofences are currently being monitored.', + [{ text: 'OK' }] + ); + } else { + const geofencesList = geofences + .map( + (g, index) => + `${index + 1}. ${g.identifier}\n Center: (${g.latitude.toFixed(6)}, ${g.longitude.toFixed(6)})\n Radius: ${g.radius.toFixed(2)}m` + ) + .join('\n\n'); + + Alert.alert(`Current Geofences (${geofences.length})`, geofencesList, [ + { text: 'OK' }, + ]); + } + }); + } catch (e: any) { + console.log(e.message, e.code); + Alert.alert('Error', `Failed to get current geofences: ${e.message}`); + } +}; + export const setPushToken = async () => { try { // If handling push tokens from the react native layer diff --git a/ios/KlaviyoBridge.swift b/ios/KlaviyoBridge.swift index e77c5c0d..a2ae6989 100644 --- a/ios/KlaviyoBridge.swift +++ b/ios/KlaviyoBridge.swift @@ -1,6 +1,6 @@ import KlaviyoSwift import KlaviyoForms -import KlaviyoLocation +@_spi(KlaviyoPrivate)import KlaviyoLocation @_spi(KlaviyoPrivate) import KlaviyoCore @objc @@ -83,9 +83,22 @@ public class KlaviyoBridge: NSObject { @MainActor @objc public static func unregisterGeofencing() { - Task { @MainActor in - await KlaviyoSDK().unregisterGeofencing() + KlaviyoSDK().unregisterGeofencing() + } + + @MainActor + @objc + public static func getCurrentGeofences(callback: @escaping ([String: AnyObject]) -> Void) { + let geofences = KlaviyoSDK().getCurrentGeofences() + let geofencesArray = geofences.map { region -> [String: AnyObject] in + [ + "identifier": region.identifier as AnyObject, + "latitude": region.center.latitude as AnyObject, + "longitude": region.center.longitude as AnyObject, + "radius": region.radius as AnyObject + ] } + callback(["geofences": geofencesArray as AnyObject]) } @objc diff --git a/ios/KlaviyoReactNativeSdk.mm b/ios/KlaviyoReactNativeSdk.mm index f338933c..b5b55c1d 100644 --- a/ios/KlaviyoReactNativeSdk.mm +++ b/ios/KlaviyoReactNativeSdk.mm @@ -127,8 +127,14 @@ - (NSDictionary *)constantsToExport { } RCT_EXPORT_METHOD(unregisterGeofencing) { + [KlaviyoBridge unregisterGeofencing]; +} + +RCT_EXPORT_METHOD(getCurrentGeofences: (RCTResponseSenderBlock)callback) { dispatch_async(dispatch_get_main_queue(), ^{ - [KlaviyoBridge unregisterGeofencing]; + [KlaviyoBridge getCurrentGeofencesWithCallback:^(NSDictionary *result) { + callback(@[result]); + }]; }); } diff --git a/src/Geofencing.ts b/src/Geofencing.ts index 5811b3e1..51a685f5 100644 --- a/src/Geofencing.ts +++ b/src/Geofencing.ts @@ -1,4 +1,14 @@ +export interface Geofence { + identifier: string; + latitude: number; + longitude: number; + radius: number; +} + export interface KlaviyoGeofencingApi { registerGeofencing(): void; unregisterGeofencing(): void; + getCurrentGeofences( + callback: (result: { geofences: Geofence[] }) => void + ): void; } diff --git a/src/index.tsx b/src/index.tsx index 43a8fb91..30b2c8fc 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -7,6 +7,7 @@ import { } from './Profile'; import type { Event } from './Event'; import type { FormConfiguration } from './Forms'; +import type { Geofence } from './Geofencing'; /** * Implementation of the {@link KlaviyoInterface} @@ -72,6 +73,11 @@ export const Klaviyo: KlaviyoInterface = { unregisterGeofencing(): void { KlaviyoReactNativeSdk.unregisterGeofencing(); }, + getCurrentGeofences( + callback: (result: { geofences: Geofence[] }) => void + ): void { + KlaviyoReactNativeSdk.getCurrentGeofences(callback); + }, /** * Resolves a Klaviyo tracking link to a Universal Link URL, * then handles navigation to the resolved URL. @@ -108,3 +114,4 @@ export { export type { KlaviyoInterface } from './Klaviyo'; export type { FormConfiguration } from './Forms'; export type { KlaviyoDeepLinkAPI } from './KlaviyoDeepLinkAPI'; +export type { Geofence } from './Geofencing'; From 0a9bed43c38823fa7c73806a286bb84c5f4cd763 Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Wed, 19 Nov 2025 15:21:40 -0500 Subject: [PATCH 22/25] Point pods to feat/geofencing --- example/ios/Podfile | 10 +++++----- example/ios/Podfile.lock | 26 +++++++++++++------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/example/ios/Podfile b/example/ios/Podfile index 2d731942..675f4f78 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -25,11 +25,11 @@ target 'KlaviyoReactNativeSdkExample' do # Insert override klaviyo-swift-sdk pods below this line when needed # Using remote branch feat/geofencing from GitHub - pod 'KlaviyoCore', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'bl/geofence-getter' - pod 'KlaviyoSwift', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'bl/geofence-getter' - pod 'KlaviyoForms', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'bl/geofence-getter' - pod 'KlaviyoLocation', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'bl/geofence-getter' - + pod 'KlaviyoCore', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'feat/geofencing' + pod 'KlaviyoSwift', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'feat/geofencing' + pod 'KlaviyoForms', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'feat/geofencing' + pod 'KlaviyoLocation', :git => 'https://github.com/klaviyo/klaviyo-swift-sdk.git', :branch => 'feat/geofencing' + # Setup permissions for react-native-permissions setup_permissions([ 'LocationWhenInUse', diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index f7e6a2d6..cd5715b0 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -2179,10 +2179,10 @@ DEPENDENCIES: - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - klaviyo-react-native-sdk (from `../..`) - - KlaviyoCore (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `bl/geofence-getter`) - - KlaviyoForms (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `bl/geofence-getter`) - - KlaviyoLocation (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `bl/geofence-getter`) - - KlaviyoSwift (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `bl/geofence-getter`) + - KlaviyoCore (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) + - KlaviyoForms (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) + - KlaviyoLocation (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) + - KlaviyoSwift (from `https://github.com/klaviyo/klaviyo-swift-sdk.git`, branch `feat/geofencing`) - KlaviyoSwiftExtension - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) @@ -2278,16 +2278,16 @@ EXTERNAL SOURCES: klaviyo-react-native-sdk: :path: "../.." KlaviyoCore: - :branch: bl/geofence-getter + :branch: feat/geofencing :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoForms: - :branch: bl/geofence-getter + :branch: feat/geofencing :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoLocation: - :branch: bl/geofence-getter + :branch: feat/geofencing :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoSwift: - :branch: bl/geofence-getter + :branch: feat/geofencing :git: https://github.com/klaviyo/klaviyo-swift-sdk.git RCT-Folly: :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" @@ -2424,16 +2424,16 @@ EXTERNAL SOURCES: CHECKOUT OPTIONS: KlaviyoCore: - :commit: 9479ebc6f9d472fccc4b373f4363f43c1272a607 + :commit: 3db1bf97f097a3c7226bbdf2743f7b0923f45f37 :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoForms: - :commit: 9479ebc6f9d472fccc4b373f4363f43c1272a607 + :commit: 3db1bf97f097a3c7226bbdf2743f7b0923f45f37 :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoLocation: - :commit: 9479ebc6f9d472fccc4b373f4363f43c1272a607 + :commit: 3db1bf97f097a3c7226bbdf2743f7b0923f45f37 :git: https://github.com/klaviyo/klaviyo-swift-sdk.git KlaviyoSwift: - :commit: 9479ebc6f9d472fccc4b373f4363f43c1272a607 + :commit: 3db1bf97f097a3c7226bbdf2743f7b0923f45f37 :git: https://github.com/klaviyo/klaviyo-swift-sdk.git SPEC CHECKSUMS: @@ -2519,6 +2519,6 @@ SPEC CHECKSUMS: SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: ce248fb32065c9b00451491b06607f1c25b2f1ed -PODFILE CHECKSUM: ab2d14ff8e5158b559fe6d3401f5feb8c418ff9c +PODFILE CHECKSUM: e62c43ecbb226cdf50a2845df1415161fc526e65 COCOAPODS: 1.16.2 From fca51fcf7b505377e545aa5cc120f0235ce60691 Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Wed, 19 Nov 2025 15:37:15 -0500 Subject: [PATCH 23/25] Fix async calls --- ios/KlaviyoBridge.swift | 34 ++++++++++++++++++++++++++++------ ios/KlaviyoReactNativeSdk.mm | 4 +++- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/ios/KlaviyoBridge.swift b/ios/KlaviyoBridge.swift index a2ae6989..0806fe7f 100644 --- a/ios/KlaviyoBridge.swift +++ b/ios/KlaviyoBridge.swift @@ -83,17 +83,39 @@ public class KlaviyoBridge: NSObject { @MainActor @objc public static func unregisterGeofencing() { - KlaviyoSDK().unregisterGeofencing() + Task { @MainActor in + await KlaviyoSDK().unregisterGeofencing() + + } + } + + @MainActor + @objc + public static func getCurrentGeofences(callback: @escaping ([String: AnyObject]) -> Void) { + Task { @MainActor in + await KlaviyoSDK().getCurrentGeofences { geofences in + let geofencesArray = geofences.map { region -> [String: AnyObject] in + [ + "identifier": region.identifier as AnyObject, + "latitude": region.center.latitude as AnyObject, + "longitude": region.center.longitude as AnyObject, + "radius": region.radius as AnyObject + ] + } + callback(["geofences": geofencesArray as AnyObject]) + } + } } @MainActor @objc public static func getCurrentGeofences(callback: @escaping ([String: AnyObject]) -> Void) { - let geofences = KlaviyoSDK().getCurrentGeofences() - let geofencesArray = geofences.map { region -> [String: AnyObject] in - [ - "identifier": region.identifier as AnyObject, - "latitude": region.center.latitude as AnyObject, + Task { @MainActor in + await KlaviyoSDK().getCurrentGeofences { geofences in + let geofencesArray = geofences.map { region -> [String: AnyObject] in + [ + "identifier": region.identifier as AnyObject, + "latitude": region.center.latitude as AnyObject, "longitude": region.center.longitude as AnyObject, "radius": region.radius as AnyObject ] diff --git a/ios/KlaviyoReactNativeSdk.mm b/ios/KlaviyoReactNativeSdk.mm index b5b55c1d..e109a991 100644 --- a/ios/KlaviyoReactNativeSdk.mm +++ b/ios/KlaviyoReactNativeSdk.mm @@ -127,7 +127,9 @@ - (NSDictionary *)constantsToExport { } RCT_EXPORT_METHOD(unregisterGeofencing) { - [KlaviyoBridge unregisterGeofencing]; + dispatch_async(dispatch_get_main_queue(), ^{ + [KlaviyoBridge unregisterGeofencing]; + }); } RCT_EXPORT_METHOD(getCurrentGeofences: (RCTResponseSenderBlock)callback) { From 066427ca8d53f80c9f6aeeabc0badc855d0af09e Mon Sep 17 00:00:00 2001 From: Isobelle Lim Date: Thu, 20 Nov 2025 13:32:18 -0500 Subject: [PATCH 24/25] Fix getCurrentGeofences in KlaviyoBridge --- ios/KlaviyoBridge.swift | 36 +++++++++--------------------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/ios/KlaviyoBridge.swift b/ios/KlaviyoBridge.swift index 0806fe7f..52ab397b 100644 --- a/ios/KlaviyoBridge.swift +++ b/ios/KlaviyoBridge.swift @@ -85,7 +85,6 @@ public class KlaviyoBridge: NSObject { public static func unregisterGeofencing() { Task { @MainActor in await KlaviyoSDK().unregisterGeofencing() - } } @@ -93,36 +92,19 @@ public class KlaviyoBridge: NSObject { @objc public static func getCurrentGeofences(callback: @escaping ([String: AnyObject]) -> Void) { Task { @MainActor in - await KlaviyoSDK().getCurrentGeofences { geofences in - let geofencesArray = geofences.map { region -> [String: AnyObject] in - [ - "identifier": region.identifier as AnyObject, - "latitude": region.center.latitude as AnyObject, - "longitude": region.center.longitude as AnyObject, - "radius": region.radius as AnyObject - ] - } - callback(["geofences": geofencesArray as AnyObject]) + let geofences = await KlaviyoSDK().getCurrentGeofences() + let geofencesArray = geofences.map { region -> [String: AnyObject] in + [ + "identifier": region.identifier as AnyObject, + "latitude": region.center.latitude as AnyObject, + "longitude": region.center.longitude as AnyObject, + "radius": region.radius as AnyObject + ] } + callback(["geofences": geofencesArray as AnyObject]) } } - @MainActor - @objc - public static func getCurrentGeofences(callback: @escaping ([String: AnyObject]) -> Void) { - Task { @MainActor in - await KlaviyoSDK().getCurrentGeofences { geofences in - let geofencesArray = geofences.map { region -> [String: AnyObject] in - [ - "identifier": region.identifier as AnyObject, - "latitude": region.center.latitude as AnyObject, - "longitude": region.center.longitude as AnyObject, - "radius": region.radius as AnyObject - ] - } - callback(["geofences": geofencesArray as AnyObject]) - } - @objc public static func setProfile( _ profileDict: [String: AnyObject] From 3cd95440d62da24730b0b546da8332198c0b17bd Mon Sep 17 00:00:00 2001 From: Evan Masseau <> Date: Thu, 20 Nov 2025 16:15:04 -0500 Subject: [PATCH 25/25] Added android "getCurrentGeofences" bridge function, tagged it internal also added tests --- .../KlaviyoReactNativeSdkModule.kt | 27 ++++++++++ example/src/KlaviyoReactWrapper.ts | 1 + src/Geofencing.ts | 22 ++++++++ src/__tests__/index.test.tsx | 53 +++++++++++++++++++ 4 files changed, 103 insertions(+) diff --git a/android/src/main/java/com/klaviyoreactnativesdk/KlaviyoReactNativeSdkModule.kt b/android/src/main/java/com/klaviyoreactnativesdk/KlaviyoReactNativeSdkModule.kt index 2be0119c..7ebce0fd 100644 --- a/android/src/main/java/com/klaviyoreactnativesdk/KlaviyoReactNativeSdkModule.kt +++ b/android/src/main/java/com/klaviyoreactnativesdk/KlaviyoReactNativeSdkModule.kt @@ -1,5 +1,6 @@ package com.klaviyoreactnativesdk +import com.facebook.react.bridge.Arguments import com.facebook.react.bridge.Callback import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReactContextBaseJavaModule @@ -20,6 +21,7 @@ import com.klaviyo.core.utils.AdvancedAPI import com.klaviyo.forms.InAppFormsConfig import com.klaviyo.forms.registerForInAppForms import com.klaviyo.forms.unregisterFromInAppForms +import com.klaviyo.location.LocationManager import com.klaviyo.location.registerGeofencing import com.klaviyo.location.unregisterGeofencing import java.io.Serializable @@ -99,6 +101,31 @@ class KlaviyoReactNativeSdkModule( Klaviyo.unregisterGeofencing() } + @ReactMethod + fun getCurrentGeofences(callback: Callback) { + // Note: in the future, we may be storing more fences than we are observing, so we'd have to update this + val geofencesArray = Arguments.createArray() + Registry.getOrNull()?.getStoredGeofences()?.forEach { geofence -> + geofencesArray.pushMap( + Arguments.createMap().apply { + putString("identifier", geofence.id) + putDouble("latitude", geofence.latitude) + putDouble("longitude", geofence.longitude) + putDouble("radius", geofence.radius.toDouble()) + }, + ) + } ?: run { + Registry.log.wtf("Geofencing is not yet registered") + } + + val resultMap = + Arguments.createMap().apply { + putArray("geofences", geofencesArray) + } + + callback.invoke(resultMap) + } + @ReactMethod fun setProfile(profile: ReadableMap) { val parsedProfile = Profile() diff --git a/example/src/KlaviyoReactWrapper.ts b/example/src/KlaviyoReactWrapper.ts index 53f43ace..e3578cc7 100644 --- a/example/src/KlaviyoReactWrapper.ts +++ b/example/src/KlaviyoReactWrapper.ts @@ -141,6 +141,7 @@ export const unregisterGeofencing = async () => { export const getCurrentGeofences = async () => { try { + // Note: this @internal method is intended only for demonstration and debugging purposes Klaviyo.getCurrentGeofences((result) => { const { geofences } = result; console.log('Current geofences:', JSON.stringify(geofences, null, 2)); diff --git a/src/Geofencing.ts b/src/Geofencing.ts index 51a685f5..be32d535 100644 --- a/src/Geofencing.ts +++ b/src/Geofencing.ts @@ -5,9 +5,31 @@ export interface Geofence { radius: number; } +/** + * Interface for the Klaviyo location module + */ export interface KlaviyoGeofencingApi { + /** + * Begin geofence monitoring + * Once proper permissions are granted from the user, we will fetch + * geofences configured for your account and begin reporting + * geofence transitions as analytics events. + */ registerGeofencing(): void; + + /** + * Stop monitoring geofences + */ unregisterGeofencing(): void; + + /** + * Gets the currently monitored geofences from the native SDK. + * + * This is intended for demonstration and debugging purposes only. + * It may be subject to change or removal without notice. + * + * @internal + */ getCurrentGeofences( callback: (result: { geofences: Geofence[] }) => void ): void; diff --git a/src/__tests__/index.test.tsx b/src/__tests__/index.test.tsx index a9516523..ab6333ed 100644 --- a/src/__tests__/index.test.tsx +++ b/src/__tests__/index.test.tsx @@ -24,6 +24,9 @@ jest.mock('react-native', () => { createEvent: jest.fn(), registerForInAppForms: jest.fn(), unregisterFromInAppForms: jest.fn(), + registerGeofencing: jest.fn(), + unregisterGeofencing: jest.fn(), + getCurrentGeofences: jest.fn(), handleUniversalTrackingLink: jest.fn(), getConstants: jest.fn().mockReturnValue({ PROFILE_KEYS: { @@ -265,6 +268,56 @@ describe('Klaviyo SDK', () => { }); }); + describe('geofencing', () => { + it('should register for geofencing', () => { + Klaviyo.registerGeofencing(); + expect( + NativeModules.KlaviyoReactNativeSdk.registerGeofencing + ).toHaveBeenCalledTimes(1); + }); + + it('should unregister from geofencing', () => { + Klaviyo.unregisterGeofencing(); + expect( + NativeModules.KlaviyoReactNativeSdk.unregisterGeofencing + ).toHaveBeenCalledTimes(1); + }); + + it('should get current geofences through callback correctly', () => { + const mockGeofences = { + geofences: [ + { + identifier: 'geofence_1', + latitude: 42.3601, + longitude: -71.0589, + radius: 100, + }, + { + identifier: 'geofence_2', + latitude: 40.7128, + longitude: -74.006, + radius: 200, + }, + ], + }; + + // Test with callback + Klaviyo.getCurrentGeofences((result) => { + expect(result).toEqual(mockGeofences); + }); + + // Simulate callback invocation + const getCurrentGeofencesCall = + NativeModules.KlaviyoReactNativeSdk.getCurrentGeofences.mock + .calls[0][0]; + getCurrentGeofencesCall(mockGeofences); + + expect( + NativeModules.KlaviyoReactNativeSdk.getCurrentGeofences + ).toHaveBeenCalled(); + }); + }); + describe('tracking links', () => { it('should call the native handleUniversalTrackingLink method with a valid Klaviyo universal tracking link', () => { const trackingLink = 'https://klaviyo.com/u/abc123';