From 7cc1bee0765d71cece3be504aa6a23bf2d8ec4c1 Mon Sep 17 00:00:00 2001 From: Loren Posen Date: Mon, 6 Oct 2025 14:09:38 -0700 Subject: [PATCH] feat: add support for launch options in new architecture and enhance Iterable SDK initialization --- android/build.gradle | 2 +- example/src/hooks/useIterableApp.tsx | 14 +- example_implementation.md | 0 ios/RNIterableAPI/ReactIterableAPI.swift | 204 +++++++++++++++--- src/api/NativeRNIterableAPI.ts | 4 + src/core/classes/Iterable.ts | 51 ++++- yarn.lock | 258 ++++++++++++----------- 7 files changed, 372 insertions(+), 161 deletions(-) create mode 100644 example_implementation.md diff --git a/android/build.gradle b/android/build.gradle index d3cab9036..d546cce98 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -105,7 +105,7 @@ def kotlin_version = getExtOrDefault("kotlinVersion") dependencies { implementation "com.facebook.react:react-android" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - api "com.iterable:iterableapi:3.5.10" + api "com.iterable:iterableapi:3.6.1" // api project(":iterableapi") // links to local android SDK repo rather than by release } diff --git a/example/src/hooks/useIterableApp.tsx b/example/src/hooks/useIterableApp.tsx index 24861e735..7fe3111c0 100644 --- a/example/src/hooks/useIterableApp.tsx +++ b/example/src/hooks/useIterableApp.tsx @@ -148,6 +148,9 @@ export const IterableAppProvider: FunctionComponent< config.logLevel = IterableLogLevel.debug; + // Add network debugging to help identify the source of socket warnings + console.log('Iterable SDK initialized with network debugging enabled'); + config.retryPolicy = { maxRetry: 5, retryInterval: 10, @@ -168,6 +171,7 @@ export const IterableAppProvider: FunctionComponent< // Initialize app return Iterable.initialize(key, config) .then((isSuccessful) => { + console.log('Iterable.initialize success', isSuccessful); setIsInitialized(isSuccessful); if (!isSuccessful) @@ -187,16 +191,6 @@ export const IterableAppProvider: FunctionComponent< setIsInitialized(false); setLoginInProgress(false); return Promise.reject(err); - }) - .finally(() => { - // For some reason, ios is throwing an error on initialize. - // To temporarily fix this, we're using the finally block to login. - // MOB-10419: Find out why initialize is throwing an error on ios - setIsInitialized(true); - if (getUserId()) { - login(); - } - return Promise.resolve(true); }); }, [apiKey, getUserId, login] diff --git a/example_implementation.md b/example_implementation.md new file mode 100644 index 000000000..e69de29bb diff --git a/ios/RNIterableAPI/ReactIterableAPI.swift b/ios/RNIterableAPI/ReactIterableAPI.swift index 4d1f52c3d..726fabca4 100644 --- a/ios/RNIterableAPI/ReactIterableAPI.swift +++ b/ios/RNIterableAPI/ReactIterableAPI.swift @@ -494,6 +494,9 @@ import React private var passedAuthToken: String? private var authHandlerSemaphore = DispatchSemaphore(value: 0) + // For new architecture: stored launch options + private var storedLaunchOptions: [UIApplication.LaunchOptionsKey: Any]? + private let inboxSessionManager = InboxSessionManager() @objc func initialize( @@ -505,7 +508,7 @@ import React rejecter: @escaping RCTPromiseRejectBlock ) { ITBInfo() - let launchOptions = createLaunchOptions() + // let launchOptions = createLaunchOptionsHybrid() guard let configDictTyped = configDict as? [AnyHashable: Any] else { rejecter("E_INVALID_CONFIG", "configDict could not be cast to [AnyHashable: Any]", nil) return @@ -540,16 +543,14 @@ import React name: Notification.Name.iterableInboxChanged, object: nil) DispatchQueue.main.async { - IterableAPI.initialize2( + IterableAPI.initialize( apiKey: apiKey, - launchOptions: launchOptions, - config: iterableConfig, - apiEndPointOverride: apiEndPointOverride - ) { result in - resolver(result) - } + launchOptions: nil, + config: iterableConfig + ) IterableAPI.setDeviceAttribute(name: "reactNativeSDKVersion", value: version) + resolver(true) } } @@ -568,26 +569,173 @@ import React IterableAPI.pauseAuthRetries(pauseRetry) } - private func createLaunchOptions() -> [UIApplication.LaunchOptionsKey: Any]? { - guard let bridge = self.bridge else { - return nil - } - return ReactIterableAPI.createLaunchOptions(bridgeLaunchOptions: bridge.launchOptions) - } - - private static func createLaunchOptions(bridgeLaunchOptions: [AnyHashable: Any]?) - -> [UIApplication.LaunchOptionsKey: Any]? - { - guard let bridgeLaunchOptions = bridgeLaunchOptions, - let remoteNotification = bridgeLaunchOptions[ - UIApplication.LaunchOptionsKey.remoteNotification.rawValue] - else { - return nil - } - var result = [UIApplication.LaunchOptionsKey: Any]() - result[UIApplication.LaunchOptionsKey.remoteNotification] = remoteNotification - return result - } + // @objc(setLaunchOptions:) + // public func setLaunchOptions(launchOptions: NSDictionary?) { + // ITBInfo() + // // Store launch options for new architecture + // // This allows the app to explicitly set launch options when using the new architecture + // self.storedLaunchOptions = launchOptions as? [UIApplication.LaunchOptionsKey: Any] + // } + + // @objc(detectLaunchOptions:rejecter:) + // public func detectLaunchOptions(resolver: @escaping RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) { + // ITBInfo() + // // Auto-detect launch options from the current app state + // if let detectedOptions = detectLaunchOptionsFromAppState() { + // resolver(detectedOptions) + // } else { + // resolver(nil) + // } + // } + + // private func createLaunchOptionsHybrid() -> [UIApplication.LaunchOptionsKey: Any]? { + // // First try: Bridge-based approach (works for old architecture) + // if let bridgeOptions = createLaunchOptions() { + // return bridgeOptions + // } + + // // Second try: For new architecture (bridgeless), use stored launch options + // if let storedOptions = storedLaunchOptions { + // return storedOptions + // } + + // // Third try: Auto-detect launch options from the system + // if let autoDetectedOptions = autoDetectLaunchOptions() { + // return autoDetectedOptions + // } + + // // Fourth try: Detect launch options from current app state + // if let appStateOptions = detectLaunchOptionsFromAppState() { + // return appStateOptions + // } + + // // Fallback: return nil if no launch options are available + // return nil + // } + + // private func createLaunchOptions() -> [UIApplication.LaunchOptionsKey: Any]? { + // // Safely access bridge to avoid null pointer crashes + // guard let bridge = self.bridge, bridge.launchOptions != nil else { + // return nil + // } + // return ReactIterableAPI.createLaunchOptions(bridgeLaunchOptions: bridge.launchOptions) + // } + + // private func autoDetectLaunchOptions() -> [UIApplication.LaunchOptionsKey: Any]? { + // var launchOptions: [UIApplication.LaunchOptionsKey: Any] = [:] + + // // Try to detect launch options from the current app state + // if #available(iOS 13.0, *) { + // // For iOS 13+, try to get launch options from connected scenes + // if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene { + + // // Check for ongoing user activities + // if let userActivity = UIApplication.shared.userActivity { + // launchOptions[.userActivityType] = userActivity.activityType + // if let userInfo = userActivity.userInfo { + // launchOptions[.userActivityUserInfo] = userInfo + // } + // } + + // // Try to detect if app was launched from a notification + // if let notificationResponse = getCurrentNotificationResponse() { + // launchOptions[.remoteNotification] = notificationResponse + // } + // } + // } else { + // // For iOS 12 and below, try to get from app delegate + // if let appDelegate = UIApplication.shared.delegate { + // // Check for ongoing user activities + // if let userActivity = UIApplication.shared.userActivity { + // launchOptions[.userActivityType] = userActivity.activityType + // if let userInfo = userActivity.userInfo { + // launchOptions[.userActivityUserInfo] = userInfo + // } + // } + + // // Try to detect if app was launched from a notification + // if let notificationResponse = getCurrentNotificationResponse() { + // launchOptions[.remoteNotification] = notificationResponse + // } + // } + // } + + // // Check for recent push notifications from Iterable SDK + // if let lastPushPayload = IterableAPI.lastPushPayload { + // launchOptions[.remoteNotification] = lastPushPayload + // } + + // // Return launch options if we found any + // return launchOptions.isEmpty ? nil : launchOptions + // } + + // private func getCurrentNotificationResponse() -> [AnyHashable: Any]? { + // // Try to get the current notification response from the app's state + // // This is a best-effort approach to detect if the app was launched from a notification + + // // Check if there's a recent notification in the app's state + // if let appDelegate = UIApplication.shared.delegate { + // // Try to access notification info from the app delegate + // // This is app-specific and may not always be available + // return nil + // } + + // return nil + // } + + // MARK: - Launch Options Detection from App State + + // private func detectLaunchOptionsFromAppState() -> [UIApplication.LaunchOptionsKey: Any]? { + // var launchOptions: [UIApplication.LaunchOptionsKey: Any] = [:] + + // // Check for ongoing user activities + // if let userActivity = UIApplication.shared.userActivity { + // launchOptions[.userActivityType] = userActivity.activityType + // if let userInfo = userActivity.userInfo { + // launchOptions[.userActivityUserInfo] = userInfo + // } + // } + + // // Check for recent push notifications from Iterable SDK + // if let lastPushPayload = IterableAPI.lastPushPayload { + // launchOptions[.remoteNotification] = lastPushPayload + // } + + // // Check for URL schemes that might have launched the app + // if let url = detectCurrentURL() { + // launchOptions[.url] = url + // } + + // return launchOptions.isEmpty ? nil : launchOptions + // } + + // private func detectCurrentURL() -> URL? { + // // Try to detect if the app was launched from a URL + // // This is a best-effort approach + + // // Check if there's a current URL in the app's state + // if let appDelegate = UIApplication.shared.delegate { + // // Try to access URL info from the app delegate + // // This is app-specific and may not always be available + // return nil + // } + + // return nil + // } + + // private static func createLaunchOptions(bridgeLaunchOptions: [AnyHashable: Any]?) + // -> [UIApplication.LaunchOptionsKey: Any]? + // { + // guard let bridgeLaunchOptions = bridgeLaunchOptions, + // let remoteNotification = bridgeLaunchOptions[ + // UIApplication.LaunchOptionsKey.remoteNotification.rawValue] + // else { + // return nil + // } + // var result = [UIApplication.LaunchOptionsKey: Any]() + // result[UIApplication.LaunchOptionsKey.remoteNotification] = remoteNotification + // return result + // } } extension ReactIterableAPI: IterableURLDelegate { diff --git a/src/api/NativeRNIterableAPI.ts b/src/api/NativeRNIterableAPI.ts index dd6921367..9b6caa896 100644 --- a/src/api/NativeRNIterableAPI.ts +++ b/src/api/NativeRNIterableAPI.ts @@ -119,6 +119,10 @@ export interface Spec extends TurboModule { onAuthFailure(authFailure: { userKey: string; failedAuthToken: string; failedRequestTime: number; failureReason: string }): void; pauseAuthRetries(pauseRetry: boolean): void; + // Launch options for new architecture + setLaunchOptions(launchOptions?: { [key: string]: unknown } | null): void; + detectLaunchOptions(): Promise<{ [key: string]: unknown } | null>; + // Wake app -- android only wakeApp(): void; diff --git a/src/core/classes/Iterable.ts b/src/core/classes/Iterable.ts index e9572f69c..3d0c8edcd 100644 --- a/src/core/classes/Iterable.ts +++ b/src/core/classes/Iterable.ts @@ -219,6 +219,47 @@ export class Iterable { RNIterableAPI.setEmail(email, authToken); } + /** + * Set launch options for the new architecture (bridgeless). + * This method should be called before initializing the SDK when using the new architecture. + * + * @param launchOptions - The launch options from the scene delegate + * + * @example + * ```typescript + * // Call this in your scene delegate before initializing the SDK + * Iterable.setLaunchOptions(launchOptions); + * Iterable.initialize(apiKey, config); + * ``` + */ + static setLaunchOptions(launchOptions?: { [key: string]: unknown } | null) { + Iterable?.logger?.log('setLaunchOptions: ' + JSON.stringify(launchOptions)); + + RNIterableAPI.setLaunchOptions(launchOptions); + } + + /** + * Auto-detect launch options from the current app state. + * This method attempts to detect launch options automatically without requiring manual setup. + * + * @returns Promise that resolves to detected launch options or null + * + * @example + * ```typescript + * // Auto-detect launch options before initializing + * const launchOptions = await Iterable.detectLaunchOptions(); + * if (launchOptions) { + * Iterable.setLaunchOptions(launchOptions); + * } + * Iterable.initialize(apiKey, config); + * ``` + */ + static async detectLaunchOptions(): Promise<{ [key: string]: unknown } | null> { + Iterable?.logger?.log('detectLaunchOptions: attempting to auto-detect launch options'); + + return await RNIterableAPI.detectLaunchOptions(); + } + /** * Get the email associated with the current user. * @@ -986,6 +1027,7 @@ export class Iterable { Iterable.savedConfig.authHandler!() .then((promiseResult) => { + console.log(`🚀 > Iterable > setupEventHandlers > promiseResult:`, promiseResult); // Promise result can be either just String OR of type AuthResponse. // If type AuthReponse, authToken will be parsed looking for `authToken` within promised object. Two additional listeners will be registered for success and failure callbacks sent by native bridge layer. // Else it will be looked for as a String. @@ -995,6 +1037,7 @@ export class Iterable { ); setTimeout(() => { + console.log(`🚀 > Iterable > setupEventHandlers > authResponseCallback`, authResponseCallback); if ( authResponseCallback === IterableAuthResponseResult.SUCCESS ) { @@ -1022,7 +1065,10 @@ export class Iterable { ); } }) - .catch((e) => Iterable?.logger?.log(e)); + .catch((e) => { + Iterable?.logger?.log(e); + console.log(`🚀 > Iterable > setupEventHandlers > catch`, e); + }); }); RNEventEmitter.addListener( @@ -1033,7 +1079,8 @@ export class Iterable { ); RNEventEmitter.addListener( IterableEventName.handleAuthFailureCalled, - () => { + (e: unknown) => { + console.log(`🚀 > Iterable > setupEventHandlers > handleAuthFailureCalled`, e); authResponseCallback = IterableAuthResponseResult.FAILURE; } ); diff --git a/yarn.lock b/yarn.lock index 5e6aee08c..813e22c08 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1797,11 +1797,11 @@ __metadata: linkType: hard "@evilmartians/lefthook@npm:^1.5.0": - version: 1.13.4 - resolution: "@evilmartians/lefthook@npm:1.13.4" + version: 1.13.6 + resolution: "@evilmartians/lefthook@npm:1.13.6" bin: lefthook: bin/index.js - checksum: 287bf75a46bdac72592141a7e56c494eee9de2ea049e7428e39dda6854634e7cc6d76a40f62b1cbc68fc68dd5fa014c37caffd83251f8c222574eeccdd0d1265 + checksum: 6cceca3e874015678f50818ae14a74d959816cfaba6638f8852d007332404d6819b15c71538985a3650a1ef057aa6975c17fadfe43ece7a0da1aeb9faaf02946 conditions: (os=darwin | os=linux | os=win32) & (cpu=x64 | cpu=arm64 | cpu=ia32) languageName: node linkType: hard @@ -3398,11 +3398,11 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 24.5.2 - resolution: "@types/node@npm:24.5.2" + version: 24.6.2 + resolution: "@types/node@npm:24.6.2" dependencies: - undici-types: ~7.12.0 - checksum: 5d859c117a3e15e2e7cca429ba2db9b7c5ef167eb6386ab3db9f9aad7f705baee45957ad11d6c3d7514dc189ee9ec311905944dfbe9823497ad80a9f15add048 + undici-types: ~7.13.0 + checksum: 95766998060f005403a1aea198c2c472fd1d695cb9e7cebb62adb0e3aceb871ae1201e90577df31a7c1d6a2c2fadccbd9a9868f9014cb77ebd3232104de8f4fb languageName: node linkType: hard @@ -3442,11 +3442,11 @@ __metadata: linkType: hard "@types/react@npm:^19.0.0": - version: 19.1.14 - resolution: "@types/react@npm:19.1.14" + version: 19.2.0 + resolution: "@types/react@npm:19.2.0" dependencies: csstype: ^3.0.2 - checksum: 6528ca368d3e209fe7c74d466f252e862e4ac3bbd61a414d48421a0e07525635acc927d4a2d5d2dabf8307beb493a0276ef0b3bf51554eaf685c5766461df7ac + checksum: 1bfef433bb4d237487835423eaf4789bad94bcf96d4106f5c53f3109dc8451edea6b04be3f6e9d374f1a76672bb66e58d68e64f45535f0b6c804930a731dd19e languageName: node linkType: hard @@ -3520,23 +3520,23 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^8.13.0": - version: 8.44.1 - resolution: "@typescript-eslint/eslint-plugin@npm:8.44.1" + version: 8.45.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.45.0" dependencies: "@eslint-community/regexpp": ^4.10.0 - "@typescript-eslint/scope-manager": 8.44.1 - "@typescript-eslint/type-utils": 8.44.1 - "@typescript-eslint/utils": 8.44.1 - "@typescript-eslint/visitor-keys": 8.44.1 + "@typescript-eslint/scope-manager": 8.45.0 + "@typescript-eslint/type-utils": 8.45.0 + "@typescript-eslint/utils": 8.45.0 + "@typescript-eslint/visitor-keys": 8.45.0 graphemer: ^1.4.0 ignore: ^7.0.0 natural-compare: ^1.4.0 ts-api-utils: ^2.1.0 peerDependencies: - "@typescript-eslint/parser": ^8.44.1 + "@typescript-eslint/parser": ^8.45.0 eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: e6d04ae8201af95cab838bd280f547d75a2d1f2301eed78990a6940ba82a1d74d1fd93b6d50ae310b9ce00497a94a968ca2215aa58a4bd9fdfa986f1e2fc5e39 + checksum: ad912b7a3d43c190f648ecdcdfa26217f5f948360b03c9501e112c92fa4bdf37c0d12aafbe73001f1e98eaa1fefa88f9ff4509eca988dd575ddd8a734b5010b1 languageName: node linkType: hard @@ -3559,31 +3559,31 @@ __metadata: linkType: hard "@typescript-eslint/parser@npm:^8.13.0": - version: 8.44.1 - resolution: "@typescript-eslint/parser@npm:8.44.1" + version: 8.45.0 + resolution: "@typescript-eslint/parser@npm:8.45.0" dependencies: - "@typescript-eslint/scope-manager": 8.44.1 - "@typescript-eslint/types": 8.44.1 - "@typescript-eslint/typescript-estree": 8.44.1 - "@typescript-eslint/visitor-keys": 8.44.1 + "@typescript-eslint/scope-manager": 8.45.0 + "@typescript-eslint/types": 8.45.0 + "@typescript-eslint/typescript-estree": 8.45.0 + "@typescript-eslint/visitor-keys": 8.45.0 debug: ^4.3.4 peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 0f25f1a677c7e3cc20423f15c48d35f28de6fe6171bc0314775620812c7025e54f887da886b60e8234a6dadc132730ed84960a52a08a2ee04ab7e559aa8c9bcb + checksum: c7d416625003c4322fccf4ce5761e0666c9511bbfd75830c3949eecf29663c9d4474d2aa47801df4e4ff54a1f44849b10c2a88c28b5566a288ff369609a63a83 languageName: node linkType: hard -"@typescript-eslint/project-service@npm:8.44.1": - version: 8.44.1 - resolution: "@typescript-eslint/project-service@npm:8.44.1" +"@typescript-eslint/project-service@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/project-service@npm:8.45.0" dependencies: - "@typescript-eslint/tsconfig-utils": ^8.44.1 - "@typescript-eslint/types": ^8.44.1 + "@typescript-eslint/tsconfig-utils": ^8.45.0 + "@typescript-eslint/types": ^8.45.0 debug: ^4.3.4 peerDependencies: typescript: ">=4.8.4 <6.0.0" - checksum: c7f006afe3690f0f44a2071cb0cf3b0ccebd56c72affe4c11238a3af315e6a12e16a08167f03e55671b817721a2ef838960963b67b16c2fb13981b2423750ae3 + checksum: 6bde077c1ce8bea3abf34f714389c3cd60a927ae9a6dd15815b2b0a69af57bebd1045a69bb7f38fea6c6ef7051344855a044b7ab42ccd7083f2dc7e89542adb2 languageName: node linkType: hard @@ -3607,22 +3607,22 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.44.1": - version: 8.44.1 - resolution: "@typescript-eslint/scope-manager@npm:8.44.1" +"@typescript-eslint/scope-manager@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/scope-manager@npm:8.45.0" dependencies: - "@typescript-eslint/types": 8.44.1 - "@typescript-eslint/visitor-keys": 8.44.1 - checksum: 10a179043d240825fa4b781b8f041d401c6c9736a8769bb5f52b83bce2a7a7ea970ef97e8a51c8a633ecefcfe5b23dca7ade4dff24490aab811ea100459d69ef + "@typescript-eslint/types": 8.45.0 + "@typescript-eslint/visitor-keys": 8.45.0 + checksum: b7e29552b81769b1be70e593a3e0e21d52ec8f8aa09a6f2f0f7c4dcd8e2a623488d1be0f43859c81ec5b2385992c9925a10d72780412fa29b3c78c7f6ead5486 languageName: node linkType: hard -"@typescript-eslint/tsconfig-utils@npm:8.44.1, @typescript-eslint/tsconfig-utils@npm:^8.44.1": - version: 8.44.1 - resolution: "@typescript-eslint/tsconfig-utils@npm:8.44.1" +"@typescript-eslint/tsconfig-utils@npm:8.45.0, @typescript-eslint/tsconfig-utils@npm:^8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.45.0" peerDependencies: typescript: ">=4.8.4 <6.0.0" - checksum: 942d4bb9ec3d0f1f6c7fe0dc0fef2ae83a12b43ff3537fbd74007d0c9b80f166db2e5fa2f422f0b10ade348e330204dc70fc50e235ee66dc13ba488ac1490778 + checksum: 105cf3dbf858f193d2983f12fdc238af706d5221a76c32b76dc7a219f2b4842e51268cefbe4a5cf4e820a8db000430fa5bef2c91891cd19b11e0c7bd0a86dcb7 languageName: node linkType: hard @@ -3643,19 +3643,19 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.44.1": - version: 8.44.1 - resolution: "@typescript-eslint/type-utils@npm:8.44.1" +"@typescript-eslint/type-utils@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/type-utils@npm:8.45.0" dependencies: - "@typescript-eslint/types": 8.44.1 - "@typescript-eslint/typescript-estree": 8.44.1 - "@typescript-eslint/utils": 8.44.1 + "@typescript-eslint/types": 8.45.0 + "@typescript-eslint/typescript-estree": 8.45.0 + "@typescript-eslint/utils": 8.45.0 debug: ^4.3.4 ts-api-utils: ^2.1.0 peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 5e0ecf096ba3f8924a6fa9e2beddf66fd2fd8df48383a02031a99f3273e8d704069f4100c3ebb02b5b69631e4b7588f1af55996ff06b0e3fb2d4105f0afe339a + checksum: 3ebf10396a9588f922d76d389764a30220ea20958a2b97f901c8b49c5a5ba10ff7c1c9a9b35e6d9a824b9e73d96e7517a8e0cadd3e4c31fb1ec1005aa04397c7 languageName: node linkType: hard @@ -3673,10 +3673,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:8.44.1, @typescript-eslint/types@npm:^8.44.1": - version: 8.44.1 - resolution: "@typescript-eslint/types@npm:8.44.1" - checksum: ced07574069e2118d125c5b6f9ca6ecd78530858922fcdd4202eb4c2f28eb0cdf1b4d853a834f81b9bfe54070dec5fa6b8b69d942612f916cedabc57f05814c1 +"@typescript-eslint/types@npm:8.45.0, @typescript-eslint/types@npm:^8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/types@npm:8.45.0" + checksum: 924750faa94b3a9456ec36f1a048fb270449985f52fbe558c8327c8f5beea4ccd5c0bf9a1b2063368f449340ea9348de9a2bac9d3aa67221f77696d55fa5cb8f languageName: node linkType: hard @@ -3717,14 +3717,14 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.44.1": - version: 8.44.1 - resolution: "@typescript-eslint/typescript-estree@npm:8.44.1" +"@typescript-eslint/typescript-estree@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.45.0" dependencies: - "@typescript-eslint/project-service": 8.44.1 - "@typescript-eslint/tsconfig-utils": 8.44.1 - "@typescript-eslint/types": 8.44.1 - "@typescript-eslint/visitor-keys": 8.44.1 + "@typescript-eslint/project-service": 8.45.0 + "@typescript-eslint/tsconfig-utils": 8.45.0 + "@typescript-eslint/types": 8.45.0 + "@typescript-eslint/visitor-keys": 8.45.0 debug: ^4.3.4 fast-glob: ^3.3.2 is-glob: ^4.0.3 @@ -3733,7 +3733,7 @@ __metadata: ts-api-utils: ^2.1.0 peerDependencies: typescript: ">=4.8.4 <6.0.0" - checksum: 453e67eb1d9fe7bdc5f78a4ae586cde35fc9799c429919ac3fe0bb806a0383ce91ebf620b50cadaa74d1096d24db1e2aea9feae3ca694d2cb3f752da078bd52b + checksum: c0149120ffb480fa5ce53af4321c8d1ee145c394f5206049fea517675e6dbf34805dca514d9e7a2d4db9142dd2b2a8e12b282904e73acb023d6e56464c049103 languageName: node linkType: hard @@ -3751,18 +3751,18 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.44.1, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0": - version: 8.44.1 - resolution: "@typescript-eslint/utils@npm:8.44.1" +"@typescript-eslint/utils@npm:8.45.0, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0": + version: 8.45.0 + resolution: "@typescript-eslint/utils@npm:8.45.0" dependencies: "@eslint-community/eslint-utils": ^4.7.0 - "@typescript-eslint/scope-manager": 8.44.1 - "@typescript-eslint/types": 8.44.1 - "@typescript-eslint/typescript-estree": 8.44.1 + "@typescript-eslint/scope-manager": 8.45.0 + "@typescript-eslint/types": 8.45.0 + "@typescript-eslint/typescript-estree": 8.45.0 peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: a2634244709258f27f32e32c2fa4bd939b9771db698c3076e4143c923f05bf83339bf0390c7c2d2eb732e158f21bee6f4bf3e7437fbe4400a3ac2bb0f95ffa2e + checksum: 76bff7c93661e5f0bcd2167b197dd1d81487f360b9e26ad1bf2ceb42226d5ee6170fb2f74d48a753433be352f4f44f5ed755ff3ad45f991756c3412f3ce6bedb languageName: node linkType: hard @@ -3804,13 +3804,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.44.1": - version: 8.44.1 - resolution: "@typescript-eslint/visitor-keys@npm:8.44.1" +"@typescript-eslint/visitor-keys@npm:8.45.0": + version: 8.45.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.45.0" dependencies: - "@typescript-eslint/types": 8.44.1 + "@typescript-eslint/types": 8.45.0 eslint-visitor-keys: ^4.2.1 - checksum: 5e336a3dbda5050470b8c9d46dbd6ef2b720a712bf7d74bc1ab501cfa211147488a0e6cd5f1d61228715bb8f2a2b55c62c4a98009ae36239484cec12c5f1e5f3 + checksum: 81df0a5dfcc569552ff962ff7529b077028a214ddc544557c41d88ae8c9ab21098f62f23efa4701ff21bce5ba99dae064465506f41bfe7c48c44e255a3a78edc languageName: node linkType: hard @@ -4229,6 +4229,13 @@ __metadata: languageName: node linkType: hard +"async-generator-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-generator-function@npm:1.0.0" + checksum: 74a71a4a2dd7afd06ebb612f6d612c7f4766a351bedffde466023bf6dae629e46b0d2cd38786239e0fbf245de0c7df76035465e16d1213774a0efb22fec0d713 + languageName: node + linkType: hard + "async-limiter@npm:~1.0.0": version: 1.0.1 resolution: "async-limiter@npm:1.0.1" @@ -4433,12 +4440,12 @@ __metadata: languageName: node linkType: hard -"baseline-browser-mapping@npm:^2.8.3": - version: 2.8.8 - resolution: "baseline-browser-mapping@npm:2.8.8" +"baseline-browser-mapping@npm:^2.8.9": + version: 2.8.11 + resolution: "baseline-browser-mapping@npm:2.8.11" bin: baseline-browser-mapping: dist/cli.js - checksum: d8cd9047549b7b54aed40f15036d9023e77a3919a1eea9db1bad9befb365321ff5bf580d8924de8ddf0022c037feb779f26d14bae4efb1dbc61042f3978d3311 + checksum: 250913ed3eeda6b6836ce7519ac52009627f021e1f6ac5994bc5a488df85c46836c8f00f2e08d46bfc7ca70a195f971f90ac26e5f5438125fff7ea8385f2b1e0 languageName: node linkType: hard @@ -4532,17 +4539,17 @@ __metadata: linkType: hard "browserslist@npm:^4.20.4, browserslist@npm:^4.24.0, browserslist@npm:^4.25.3": - version: 4.26.2 - resolution: "browserslist@npm:4.26.2" + version: 4.26.3 + resolution: "browserslist@npm:4.26.3" dependencies: - baseline-browser-mapping: ^2.8.3 - caniuse-lite: ^1.0.30001741 - electron-to-chromium: ^1.5.218 + baseline-browser-mapping: ^2.8.9 + caniuse-lite: ^1.0.30001746 + electron-to-chromium: ^1.5.227 node-releases: ^2.0.21 update-browserslist-db: ^1.1.3 bin: browserslist: cli.js - checksum: ebd96e8895cdfc72be074281eb377332b69ceb944ec0c063739d8eeb8e513b168ac1e27d26ce5cc260e69a340a44c6bb5e9408565449d7a16739e5844453d4c7 + checksum: aa5bbcda9db1eeb9952b4c2f11f9a5a2247da7bcce7fa14d3cc215e67246a93394eda2f86378a41c3f73e6e1a1561bf0e7eade93c5392cb6d37bc66f70d0c53f languageName: node linkType: hard @@ -4705,10 +4712,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001741": - version: 1.0.30001745 - resolution: "caniuse-lite@npm:1.0.30001745" - checksum: a018bfbf6eda6e2728184cd39f3d0438cea04011893664fc7de19568d8e6f26cbc09e59460137bb2f4e792d1cdb7f1a48ad35f31a1c1388c1d7f74b3c889d35b +"caniuse-lite@npm:^1.0.30001746": + version: 1.0.30001747 + resolution: "caniuse-lite@npm:1.0.30001747" + checksum: 1c0192838c384af64badc25a1380ec2d4c705dc37e84955634bfbe818b62a2596be2db75e1e9227887b25e57d06569960da542d2a7bcf7d35da8becb1365369a languageName: node linkType: hard @@ -5827,10 +5834,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.218": - version: 1.5.225 - resolution: "electron-to-chromium@npm:1.5.225" - checksum: 78051ebb8583117085db6cf3f5b9073d9c6e387e93e8281c3db9c2a88fd94bd6797b86dbaa630999aab0ef80194e637c5e09c91cfc63abe86a2c78e922b3f7dc +"electron-to-chromium@npm:^1.5.227": + version: 1.5.230 + resolution: "electron-to-chromium@npm:1.5.230" + checksum: a3fdb59b95950e75f4426212645b7852d91100ec64af249ff9a163fa50fe15e9bb1714f0467dda020394f453a9ec0a2f63969d9b131962373f93f56d1b52a4f6 languageName: node linkType: hard @@ -6908,6 +6915,13 @@ __metadata: languageName: node linkType: hard +"generator-function@npm:^2.0.0": + version: 2.0.1 + resolution: "generator-function@npm:2.0.1" + checksum: 3bf87f7b0230de5d74529677e6c3ceb3b7b5d9618b5a22d92b45ce3876defbaf5a77791b25a61b0fa7d13f95675b5ff67a7769f3b9af33f096e34653519e873d + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -6930,20 +6944,23 @@ __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.0 - resolution: "get-intrinsic@npm:1.3.0" + version: 1.3.1 + resolution: "get-intrinsic@npm:1.3.1" 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: 301008e4482bb9a9cb49e132b88fee093bff373b4e6def8ba219b1e96b60158a6084f273ef5cafe832e42cd93462f4accb46a618d35fe59a2b507f2388c5b79d + checksum: c02b3b6a445f9cd53e14896303794ac60f9751f58a69099127248abdb0251957174c6524245fc68579dc8e6a35161d3d94c93e665f808274716f4248b269436a languageName: node linkType: hard @@ -7887,14 +7904,15 @@ __metadata: linkType: hard "is-generator-function@npm:^1.0.10": - version: 1.1.0 - resolution: "is-generator-function@npm:1.1.0" + version: 1.1.2 + resolution: "is-generator-function@npm:1.1.2" dependencies: - call-bound: ^1.0.3 - get-proto: ^1.0.0 + call-bound: ^1.0.4 + generator-function: ^2.0.0 + get-proto: ^1.0.1 has-tostringtag: ^1.0.2 safe-regex-test: ^1.1.0 - checksum: f7f7276131bdf7e28169b86ac55a5b080012a597f9d85a0cbef6fe202a7133fa450a3b453e394870e3cb3685c5a764c64a9f12f614684b46969b1e6f297bed6b + checksum: 0b81c613752a5e534939e5b3835ff722446837a5b94c3a3934af5ded36a651d9aa31c3f11f8a3453884b9658bf26dbfb7eb855e744d920b07f084bd890a43414 languageName: node linkType: hard @@ -8811,11 +8829,11 @@ __metadata: linkType: hard "jiti@npm:^2.4.1": - version: 2.6.0 - resolution: "jiti@npm:2.6.0" + version: 2.6.1 + resolution: "jiti@npm:2.6.1" bin: jiti: lib/jiti-cli.mjs - checksum: 2bd869527bfbb23b5210344881b4f2f5fd86b7c9c703001036544762411af73fe0f95097ba025a738874085143939664173360aafea7d7cbc4ca3bbc325774a9 + checksum: 9394e29c5e40d1ca8267923160d8d86706173c9ff30c901097883434b0c4866de2c060427b6a9a5843bb3e42fa3a3c8b5b2228531d3dd4f4f10c5c6af355bb86 languageName: node linkType: hard @@ -10332,9 +10350,9 @@ __metadata: linkType: hard "node-releases@npm:^2.0.21": - version: 2.0.21 - resolution: "node-releases@npm:2.0.21" - checksum: 191f8245e18272971650eb45151c5891313bca27507a8f634085bd8c98a9cb9492686ef6182176866ceebff049646ef6cd5fb5ca46d5b5ca00ce2c69185d84c4 + version: 2.0.23 + resolution: "node-releases@npm:2.0.23" + checksum: dc3194ffdf04975f8525a5e175c03f5a95cecd7607b6b0e80d28aaa03900706d920722b5f2ae2e8e28e029e6ae75f0d0f7eae87e8ee2a363c704785e3118f13d languageName: node linkType: hard @@ -11316,9 +11334,9 @@ __metadata: linkType: hard "react-is@npm:^19.0.0, react-is@npm:^19.1.0": - version: 19.1.1 - resolution: "react-is@npm:19.1.1" - checksum: e60ed01c27fe4d22b08f8a31f18831d144a801d08a909ca31fb1d02721b4f4cde0759148d6341f660a4d6ce54a78e22b8b39520b67e2e76254e583885868ab43 + version: 19.2.0 + resolution: "react-is@npm:19.2.0" + checksum: 9a23e1c2d0bbc13b383bc59a05f54e6eb95dd87e01aec8aa92a88618364b7b0ee8a5b057ad813cf61e2f7ae7d24503b624706acb609d07c54754e5ad2c522568 languageName: node linkType: hard @@ -13257,22 +13275,22 @@ __metadata: linkType: hard "typescript@npm:^5.2.2": - version: 5.9.2 - resolution: "typescript@npm:5.9.2" + version: 5.6.3 + resolution: "typescript@npm:5.6.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: f619cf6773cfe31409279711afd68cdf0859780006c50bc2a7a0c3227f85dea89a3b97248846326f3a17dad72ea90ec27cf61a8387772c680b2252fd02d8497b + checksum: ba302f8822777ebefb28b554105f3e074466b671e7444ec6b75dadc008a62f46f373d9e57ceced1c433756d06c8b7dc569a7eefdf3a9573122a49205ff99021a languageName: node linkType: hard "typescript@patch:typescript@^5.2.2#~builtin": - version: 5.9.2 - resolution: "typescript@patch:typescript@npm%3A5.9.2#~builtin::version=5.9.2&hash=14eedb" + version: 5.6.3 + resolution: "typescript@patch:typescript@npm%3A5.6.3#~builtin::version=5.6.3&hash=14eedb" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: e42a701947325500008334622321a6ad073f842f5e7d5e7b588a6346b31fdf51d56082b9ce5cef24312ecd3e48d6c0d4d44da7555f65e2feec18cf62ec540385 + checksum: ade87bce2363ee963eed0e4ca8a312ea02c81873ebd53609bc3f6dc0a57f6e61ad7e3fb8cbb7f7ab8b5081cbee801b023f7c4823ee70b1c447eae050e6c7622b languageName: node linkType: hard @@ -13311,10 +13329,10 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~7.12.0": - version: 7.12.0 - resolution: "undici-types@npm:7.12.0" - checksum: 4ad2770b92835757eee6416e8518972d83fc77286c11af81d368a55578d9e4f7ab1b8a3b13c304b0e25a400583e66f3c58464a051f8b5c801ab5d092da13903e +"undici-types@npm:~7.13.0": + version: 7.13.0 + resolution: "undici-types@npm:7.13.0" + checksum: fcb3e1195a36615fce3935eb97c21ebe4dbafe968f831ed00e6f22e8e73c0655b8e3242acc6ba4ff0f3c34e3f3f860f19fbb59c00b261bd4e20b515abbc2de7c languageName: node linkType: hard @@ -13508,11 +13526,11 @@ __metadata: linkType: hard "use-sync-external-store@npm:^1.5.0": - version: 1.5.0 - resolution: "use-sync-external-store@npm:1.5.0" + version: 1.6.0 + resolution: "use-sync-external-store@npm:1.6.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 5e639c9273200adb6985b512c96a3a02c458bc8ca1a72e91da9cdc6426144fc6538dca434b0f99b28fb1baabc82e1c383ba7900b25ccdcb43758fb058dc66c34 + checksum: 61a62e910713adfaf91bdb72ff2cd30e5ba83687accaf3b6e75a903b45bf635f5722e3694af30d83a03e92cb533c0a5c699298d2fef639a03ffc86b469f4eee2 languageName: node linkType: hard